freedombone 465KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455545654575458545954605461546254635464546554665467546854695470547154725473547454755476547754785479548054815482548354845485548654875488548954905491549254935494549554965497549854995500550155025503550455055506550755085509551055115512551355145515551655175518551955205521552255235524552555265527552855295530553155325533553455355536553755385539554055415542554355445545554655475548554955505551555255535554555555565557555855595560556155625563556455655566556755685569557055715572557355745575557655775578557955805581558255835584558555865587558855895590559155925593559455955596559755985599560056015602560356045605560656075608560956105611561256135614561556165617561856195620562156225623562456255626562756285629563056315632563356345635563656375638563956405641564256435644564556465647564856495650565156525653565456555656565756585659566056615662566356645665566656675668566956705671567256735674567556765677567856795680568156825683568456855686568756885689569056915692569356945695569656975698569957005701570257035704570557065707570857095710571157125713571457155716571757185719572057215722572357245725572657275728572957305731573257335734573557365737573857395740574157425743574457455746574757485749575057515752575357545755575657575758575957605761576257635764576557665767576857695770577157725773577457755776577757785779578057815782578357845785578657875788578957905791579257935794579557965797579857995800580158025803580458055806580758085809581058115812581358145815581658175818581958205821582258235824582558265827582858295830583158325833583458355836583758385839584058415842584358445845584658475848584958505851585258535854585558565857585858595860586158625863586458655866586758685869587058715872587358745875587658775878587958805881588258835884588558865887588858895890589158925893589458955896589758985899590059015902590359045905590659075908590959105911591259135914591559165917591859195920592159225923592459255926592759285929593059315932593359345935593659375938593959405941594259435944594559465947594859495950595159525953595459555956595759585959596059615962596359645965596659675968596959705971597259735974597559765977597859795980598159825983598459855986598759885989599059915992599359945995599659975998599960006001600260036004600560066007600860096010601160126013601460156016601760186019602060216022602360246025602660276028602960306031603260336034603560366037603860396040604160426043604460456046604760486049605060516052605360546055605660576058605960606061606260636064606560666067606860696070607160726073607460756076607760786079608060816082608360846085608660876088608960906091609260936094609560966097609860996100610161026103610461056106610761086109611061116112611361146115611661176118611961206121612261236124612561266127612861296130613161326133613461356136613761386139614061416142614361446145614661476148614961506151615261536154615561566157615861596160616161626163616461656166616761686169617061716172617361746175617661776178617961806181618261836184618561866187618861896190619161926193619461956196619761986199620062016202620362046205620662076208620962106211621262136214621562166217621862196220622162226223622462256226622762286229623062316232623362346235623662376238623962406241624262436244624562466247624862496250625162526253625462556256625762586259626062616262626362646265626662676268626962706271627262736274627562766277627862796280628162826283628462856286628762886289629062916292629362946295629662976298629963006301630263036304630563066307630863096310631163126313631463156316631763186319632063216322632363246325632663276328632963306331633263336334633563366337633863396340634163426343634463456346634763486349635063516352635363546355635663576358635963606361636263636364636563666367636863696370637163726373637463756376637763786379638063816382638363846385638663876388638963906391639263936394639563966397639863996400640164026403640464056406640764086409641064116412641364146415641664176418641964206421642264236424642564266427642864296430643164326433643464356436643764386439644064416442644364446445644664476448644964506451645264536454645564566457645864596460646164626463646464656466646764686469647064716472647364746475647664776478647964806481648264836484648564866487648864896490649164926493649464956496649764986499650065016502650365046505650665076508650965106511651265136514651565166517651865196520652165226523652465256526652765286529653065316532653365346535653665376538653965406541654265436544654565466547654865496550655165526553655465556556655765586559656065616562656365646565656665676568656965706571657265736574657565766577657865796580658165826583658465856586658765886589659065916592659365946595659665976598659966006601660266036604660566066607660866096610661166126613661466156616661766186619662066216622662366246625662666276628662966306631663266336634663566366637663866396640664166426643664466456646664766486649665066516652665366546655665666576658665966606661666266636664666566666667666866696670667166726673667466756676667766786679668066816682668366846685668666876688668966906691669266936694669566966697669866996700670167026703670467056706670767086709671067116712671367146715671667176718671967206721672267236724672567266727672867296730673167326733673467356736673767386739674067416742674367446745674667476748674967506751675267536754675567566757675867596760676167626763676467656766676767686769677067716772677367746775677667776778677967806781678267836784678567866787678867896790679167926793679467956796679767986799680068016802680368046805680668076808680968106811681268136814681568166817681868196820682168226823682468256826682768286829683068316832683368346835683668376838683968406841684268436844684568466847684868496850685168526853685468556856685768586859686068616862686368646865686668676868686968706871687268736874687568766877687868796880688168826883688468856886688768886889689068916892689368946895689668976898689969006901690269036904690569066907690869096910691169126913691469156916691769186919692069216922692369246925692669276928692969306931693269336934693569366937693869396940694169426943694469456946694769486949695069516952695369546955695669576958695969606961696269636964696569666967696869696970697169726973697469756976697769786979698069816982698369846985698669876988698969906991699269936994699569966997699869997000700170027003700470057006700770087009701070117012701370147015701670177018701970207021702270237024702570267027702870297030703170327033703470357036703770387039704070417042704370447045704670477048704970507051705270537054705570567057705870597060706170627063706470657066706770687069707070717072707370747075707670777078707970807081708270837084708570867087708870897090709170927093709470957096709770987099710071017102710371047105710671077108710971107111711271137114711571167117711871197120712171227123712471257126712771287129713071317132713371347135713671377138713971407141714271437144714571467147714871497150715171527153715471557156715771587159716071617162716371647165716671677168716971707171717271737174717571767177717871797180718171827183718471857186718771887189719071917192719371947195719671977198719972007201720272037204720572067207720872097210721172127213721472157216721772187219722072217222722372247225722672277228722972307231723272337234723572367237723872397240724172427243724472457246724772487249725072517252725372547255725672577258725972607261726272637264726572667267726872697270727172727273727472757276727772787279728072817282728372847285728672877288728972907291729272937294729572967297729872997300730173027303730473057306730773087309731073117312731373147315731673177318731973207321732273237324732573267327732873297330733173327333733473357336733773387339734073417342734373447345734673477348734973507351735273537354735573567357735873597360736173627363736473657366736773687369737073717372737373747375737673777378737973807381738273837384738573867387738873897390739173927393739473957396739773987399740074017402740374047405740674077408740974107411741274137414741574167417741874197420742174227423742474257426742774287429743074317432743374347435743674377438743974407441744274437444744574467447744874497450745174527453745474557456745774587459746074617462746374647465746674677468746974707471747274737474747574767477747874797480748174827483748474857486748774887489749074917492749374947495749674977498749975007501750275037504750575067507750875097510751175127513751475157516751775187519752075217522752375247525752675277528752975307531753275337534753575367537753875397540754175427543754475457546754775487549755075517552755375547555755675577558755975607561756275637564756575667567756875697570757175727573757475757576757775787579758075817582758375847585758675877588758975907591759275937594759575967597759875997600760176027603760476057606760776087609761076117612761376147615761676177618761976207621762276237624762576267627762876297630763176327633763476357636763776387639764076417642764376447645764676477648764976507651765276537654765576567657765876597660766176627663766476657666766776687669767076717672767376747675767676777678767976807681768276837684768576867687768876897690769176927693769476957696769776987699770077017702770377047705770677077708770977107711771277137714771577167717771877197720772177227723772477257726772777287729773077317732773377347735773677377738773977407741774277437744774577467747774877497750775177527753775477557756775777587759776077617762776377647765776677677768776977707771777277737774777577767777777877797780778177827783778477857786778777887789779077917792779377947795779677977798779978007801780278037804780578067807780878097810781178127813781478157816781778187819782078217822782378247825782678277828782978307831783278337834783578367837783878397840784178427843784478457846784778487849785078517852785378547855785678577858785978607861786278637864786578667867786878697870787178727873787478757876787778787879788078817882788378847885788678877888788978907891789278937894789578967897789878997900790179027903790479057906790779087909791079117912791379147915791679177918791979207921792279237924792579267927792879297930793179327933793479357936793779387939794079417942794379447945794679477948794979507951795279537954795579567957795879597960796179627963796479657966796779687969797079717972797379747975797679777978797979807981798279837984798579867987798879897990799179927993799479957996799779987999800080018002800380048005800680078008800980108011801280138014801580168017801880198020802180228023802480258026802780288029803080318032803380348035803680378038803980408041804280438044804580468047804880498050805180528053805480558056805780588059806080618062806380648065806680678068806980708071807280738074807580768077807880798080808180828083808480858086808780888089809080918092809380948095809680978098809981008101810281038104810581068107810881098110811181128113811481158116811781188119812081218122812381248125812681278128812981308131813281338134813581368137813881398140814181428143814481458146814781488149815081518152815381548155815681578158815981608161816281638164816581668167816881698170817181728173817481758176817781788179818081818182818381848185818681878188818981908191819281938194819581968197819881998200820182028203820482058206820782088209821082118212821382148215821682178218821982208221822282238224822582268227822882298230823182328233823482358236823782388239824082418242824382448245824682478248824982508251825282538254825582568257825882598260826182628263826482658266826782688269827082718272827382748275827682778278827982808281828282838284828582868287828882898290829182928293829482958296829782988299830083018302830383048305830683078308830983108311831283138314831583168317831883198320832183228323832483258326832783288329833083318332833383348335833683378338833983408341834283438344834583468347834883498350835183528353835483558356835783588359836083618362836383648365836683678368836983708371837283738374837583768377837883798380838183828383838483858386838783888389839083918392839383948395839683978398839984008401840284038404840584068407840884098410841184128413841484158416841784188419842084218422842384248425842684278428842984308431843284338434843584368437843884398440844184428443844484458446844784488449845084518452845384548455845684578458845984608461846284638464846584668467846884698470847184728473847484758476847784788479848084818482848384848485848684878488848984908491849284938494849584968497849884998500850185028503850485058506850785088509851085118512851385148515851685178518851985208521852285238524852585268527852885298530853185328533853485358536853785388539854085418542854385448545854685478548854985508551855285538554855585568557855885598560856185628563856485658566856785688569857085718572857385748575857685778578857985808581858285838584858585868587858885898590859185928593859485958596859785988599860086018602860386048605860686078608860986108611861286138614861586168617861886198620862186228623862486258626862786288629863086318632863386348635863686378638863986408641864286438644864586468647864886498650865186528653865486558656865786588659866086618662866386648665866686678668866986708671867286738674867586768677867886798680868186828683868486858686868786888689869086918692869386948695869686978698869987008701870287038704870587068707870887098710871187128713871487158716871787188719872087218722872387248725872687278728872987308731873287338734873587368737873887398740874187428743874487458746874787488749875087518752875387548755875687578758875987608761876287638764876587668767876887698770877187728773877487758776877787788779878087818782878387848785878687878788878987908791879287938794879587968797879887998800880188028803880488058806880788088809881088118812881388148815881688178818881988208821882288238824882588268827882888298830883188328833883488358836883788388839884088418842884388448845884688478848884988508851885288538854885588568857885888598860886188628863886488658866886788688869887088718872887388748875887688778878887988808881888288838884888588868887888888898890889188928893889488958896889788988899890089018902890389048905890689078908890989108911891289138914891589168917891889198920892189228923892489258926892789288929893089318932893389348935893689378938893989408941894289438944894589468947894889498950895189528953895489558956895789588959896089618962896389648965896689678968896989708971897289738974897589768977897889798980898189828983898489858986898789888989899089918992899389948995899689978998899990009001900290039004900590069007900890099010901190129013901490159016901790189019902090219022902390249025902690279028902990309031903290339034903590369037903890399040904190429043904490459046904790489049905090519052905390549055905690579058905990609061906290639064906590669067906890699070907190729073907490759076907790789079908090819082908390849085908690879088908990909091909290939094909590969097909890999100910191029103910491059106910791089109911091119112911391149115911691179118911991209121912291239124912591269127912891299130913191329133913491359136913791389139914091419142914391449145914691479148914991509151915291539154915591569157915891599160916191629163916491659166916791689169917091719172917391749175917691779178917991809181918291839184918591869187918891899190919191929193919491959196919791989199920092019202920392049205920692079208920992109211921292139214921592169217921892199220922192229223922492259226922792289229923092319232923392349235923692379238923992409241924292439244924592469247924892499250925192529253925492559256925792589259926092619262926392649265926692679268926992709271927292739274927592769277927892799280928192829283928492859286928792889289929092919292929392949295929692979298929993009301930293039304930593069307930893099310931193129313931493159316931793189319932093219322932393249325932693279328932993309331933293339334933593369337933893399340934193429343934493459346934793489349935093519352935393549355935693579358935993609361936293639364936593669367936893699370937193729373937493759376937793789379938093819382938393849385938693879388938993909391939293939394939593969397939893999400940194029403940494059406940794089409941094119412941394149415941694179418941994209421942294239424942594269427942894299430943194329433943494359436943794389439944094419442944394449445944694479448944994509451945294539454945594569457945894599460946194629463946494659466946794689469947094719472947394749475947694779478947994809481948294839484948594869487948894899490949194929493949494959496949794989499950095019502950395049505950695079508950995109511951295139514951595169517951895199520952195229523952495259526952795289529953095319532953395349535953695379538953995409541954295439544954595469547954895499550
  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. # License
  14. # =======
  15. #
  16. # Copyright (C) 2014-2015 Bob Mottram <bob@robotics.uk.to>
  17. #
  18. # This program is free software: you can redistribute it and/or modify
  19. # it under the terms of the GNU General Public License as published by
  20. # the Free Software Foundation, either version 3 of the License, or
  21. # (at your option) any later version.
  22. #
  23. # This program is distributed in the hope that it will be useful,
  24. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  25. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  26. # GNU General Public License for more details.
  27. #
  28. # You should have received a copy of the GNU General Public License
  29. # along with this program. If not, see <http://www.gnu.org/licenses/>.
  30. NO_OF_ARGS=$#
  31. PROJECT_NAME='freedombone'
  32. export TEXTDOMAIN=$PROJECT_NAME
  33. export TEXTDOMAINDIR="/usr/share/locale"
  34. DEFAULT_LANGUAGE=$(echo $LANG)
  35. # username created by default within a debian image
  36. GENERIC_IMAGE_USERNAME='fbone'
  37. # Web site
  38. FREEDOMBONE_WEBSITE="http://${PROJECT_NAME}.uk.to"
  39. # Repo
  40. FREEDOMBONE_REPO="https://github.com/bashrc/${PROJECT_NAME}"
  41. # Contact details
  42. FREEDOMBONE_BITMESSAGE="BM-2cWuhmBvVdfrHhLoZTdspCkKeiTorUesSL"
  43. # Are we installing on a Beaglebone Black (BBB) or some other system?
  44. INSTALLING_ON_BBB="no"
  45. # Version number of this script
  46. VERSION="1.01"
  47. # if yes then this minimises the number of descisions presented during install
  48. MINIMAL_INSTALL="yes"
  49. # Whether web sites will be .onion addresses only
  50. ONION_ONLY="no"
  51. # Different system variants which may be specified within
  52. # the SYSTEM_TYPE option
  53. VARIANT_FULL="full"
  54. VARIANT_WRITER="writer"
  55. VARIANT_CLOUD="cloud"
  56. VARIANT_CHAT="chat"
  57. VARIANT_MAILBOX="mailbox"
  58. VARIANT_NONMAILBOX="nonmailbox"
  59. VARIANT_SOCIAL="social"
  60. VARIANT_MEDIA="media"
  61. VARIANT_DEVELOPER="developer"
  62. VARIANT_MESH="mesh"
  63. DEFAULT_DOMAIN_NAME=
  64. DEFAULT_DOMAIN_CODE=
  65. MY_USERNAME=
  66. SYSTEM_TYPE=$VARIANT_FULL
  67. # whether the system is being installed from a pre-created configuration file
  68. INSTALLING_FROM_CONFIGURATION_FILE="no"
  69. # An optional configuration file which overrides some of these variables
  70. CONFIGURATION_FILE="${PROJECT_NAME}.cfg"
  71. SSH_PORT=2222
  72. IRC_PORT=6697
  73. # An optional password to log into IRC. This applies to all users
  74. IRC_PASSWORD=
  75. # If this file exists it contains a global password used with
  76. # disk image installs. This simplifies password management for
  77. # deployment at scale
  78. IMAGE_PASSWORD_FILE=/root/login.txt
  79. # parameters used when adding a new domain
  80. DDNS_PROVIDER="default@freedns.afraid.org"
  81. DDNS_USERNAME=
  82. DDNS_PASSWORD=
  83. CURRENT_DDNS_DOMAIN=
  84. NGINX_ENSITE_REPO="https://github.com/perusio/nginx_ensite"
  85. NGINX_ENSITE_COMMIT='fa4d72ce1c0a490442c8474e9c8dc21ed52c93d0'
  86. CLEANUP_MAILDIR_REPO="https://github.com/bashrc/cleanup-maildir"
  87. CLEANUP_MAILDIR_COMMIT='33241d2e3861f901ba17f5c77ada007e1ec06a86'
  88. INADYN_REPO="https://github.com/bashrc/inadyn"
  89. INADYN_COMMIT='fadbe17f520d337dfb8d69ee4bf1fcaa23fce0d6'
  90. # Minimum number of characters in a password
  91. MINIMUM_PASSWORD_LENGTH=10
  92. # number of CPU cores
  93. CPU_CORES=1
  94. # If the system is on an IPv6 network
  95. IPV6_NETWORK='2001:470:26:307'
  96. # The static IP address of the system within the local network
  97. # By default the IP address is dynamic within your LAN
  98. LOCAL_NETWORK_STATIC_IP_ADDRESS=
  99. # IP address of the router (gateway)
  100. ROUTER_IP_ADDRESS="192.168.1.254"
  101. # DNS
  102. NAMESERVER1='213.73.91.35'
  103. NAMESERVER2='85.214.20.141'
  104. # whether to route outgoing traffic through Tor
  105. ROUTE_THROUGH_TOR="no"
  106. # Why use Google as a time source?
  107. # The thinking here is that it's likely to be reliable and fast.
  108. # The ping doesn't reveal any information other than that the server
  109. # is running, and if anyone maliciously alters the time on Google's
  110. # servers then that would certainly be newsworthy and they'd be
  111. # likely to do something about it quickly.
  112. # If you have better time sources then change them here.
  113. TLS_TIME_SOURCE1="google.com"
  114. TLS_TIME_SOURCE2="www.ptb.de"
  115. # The type of hardware random number generator being used
  116. # This can be empty, "beaglebone" or "onerng"
  117. HWRNG_TYPE=
  118. # Download location for OneRNG driver
  119. ONERNG_PACKAGE="onerng_3.4-1_all.deb"
  120. ONERNG_PACKAGE_DOWNLOAD="https://github.com/OneRNG/onerng.github.io/blob/master/sw/$ONERNG_PACKAGE?raw=true"
  121. # Hash for OneRNG driver
  122. ONERNG_PACKAGE_HASH='78f1c2f52ae573e3b398a695ece7ab9f41868252657ea269f0d5cf0bd4f2eb59'
  123. # device name for OneRNG
  124. ONERNG_DEVICE='ttyACM0'
  125. # Whether this system is being installed within a docker container
  126. INSTALLED_WITHIN_DOCKER="no"
  127. # If you want to run a public mailing list specify its name here.
  128. # There should be no spaces in the name
  129. PUBLIC_MAILING_LIST=
  130. # Optional different domain name for the public mailing list
  131. PUBLIC_MAILING_LIST_DOMAIN_NAME=
  132. # Directory where the public mailing list data is stored
  133. PUBLIC_MAILING_LIST_DIRECTORY="/var/spool/mlmmj"
  134. # If you want to run an encrypted mailing list specify its name here.
  135. # There should be no spaces in the name
  136. PRIVATE_MAILING_LIST=
  137. # Domain name for mediagoblin installation
  138. MEDIAGOBLIN_DOMAIN_NAME=
  139. MEDIAGOBLIN_CODE=
  140. MEDIAGOBLIN_REPO="https://gitorious.org/mediagoblin/mediagoblin.git"
  141. MEDIAGOBLIN_ADMIN_PASSWORD=
  142. # Domain name for microblog installation
  143. MICROBLOG_DOMAIN_NAME=
  144. MICROBLOG_CODE=
  145. MICROBLOG_ONION_PORT=8087
  146. MICROBLOG_REPO="git://gitorious.org/social/mainline.git"
  147. MICROBLOG_ADMIN_PASSWORD=
  148. GNUSOCIAL_COMMIT='5b847eff120264c3e9571e8a939e6b3a30e68032'
  149. # Domain name for hubzilla installation
  150. HUBZILLA_DOMAIN_NAME=
  151. HUBZILLA_CODE=
  152. HUBZILLA_ONION_PORT=8085
  153. HUBZILLA_REPO="https://github.com/redmatrix/hubzilla.git"
  154. HUBZILLA_ADDONS_REPO="https://github.com/redmatrix/hubzilla-addons.git"
  155. HUBZILLA_ADMIN_PASSWORD=
  156. HUBZILLA_COMMIT='6613275cc2f4103a17cc2bfe513dc20573df5aab'
  157. # Domain name for git hosting installation
  158. GIT_DOMAIN_NAME=
  159. GIT_CODE=
  160. GIT_ONION_PORT=8090
  161. GIT_DOMAIN_REPO="https://github.com/gogits/gogs.git"
  162. GIT_ADMIN_PASSWORD=
  163. GOGS_COMMIT='efea642d6cf419c9587d44b95ff2bc04e89f7bfe'
  164. # Domain name for Owncloud installation
  165. OWNCLOUD_DOMAIN_NAME=
  166. OWNCLOUD_CODE=
  167. OWNCLOUD_ONION_PORT=8088
  168. OWNCLOUD_ADMIN_PASSWORD=
  169. OWNCLOUD_MUSIC_APP_REPO="https://github.com/owncloud/music"
  170. OWNCLOUD_MUSIC_APP_COMMIT='7f79afb4ae9a6ecd8f530d87106f960306c0a15a'
  171. # Domain name for your wiki
  172. WIKI_DOMAIN_NAME=
  173. WIKI_ADMIN_PASSWORD=
  174. WIKI_TITLE="${PROJECT_NAME} Wiki"
  175. WIKI_CODE=
  176. WIKI_ONION_PORT=8089
  177. # Domain name for your blog
  178. FULLBLOG_DOMAIN_NAME=
  179. FULLBLOG_CODE=
  180. FULLBLOG_ONION_PORT=8086
  181. FULLBLOG_REPO="https://github.com/danpros/htmly"
  182. FULLBLOG_COMMIT='5f271a2370cc1bfde15f2a0d5ed6928cc74b0efa'
  183. MY_BLOG_TITLE="My Blog"
  184. MY_BLOG_SUBTITLE="Another ${PROJECT_NAME} Blog"
  185. GPG_KEYSERVER="hkp://keys.gnupg.net"
  186. # whether to encrypt all incoming email with your public key
  187. GPG_ENCRYPT_STORED_EMAIL="yes"
  188. # gets set to yes if gpg keys are imported from usb
  189. GPG_KEYS_IMPORTED="no"
  190. # optionally you can provide your exported GPG key pair here
  191. # Note that the private key file will be deleted after use
  192. # If these are unspecified then a new GPG key will be created
  193. MY_GPG_PUBLIC_KEY=
  194. MY_GPG_PRIVATE_KEY=
  195. # optionally specify your public key ID
  196. MY_GPG_PUBLIC_KEY_ID=
  197. # If you have existing mail within a Maildir
  198. # you can specify the directory here and the files
  199. # will be imported
  200. IMPORT_MAILDIR=
  201. # The Debian package repository to use.
  202. DEBIAN_REPO="ftp.us.debian.org"
  203. DEBIAN_VERSION="jessie"
  204. # Directory where source code is downloaded and compiled
  205. INSTALL_DIR=$HOME/build
  206. # device name for an attached usb drive
  207. USB_DRIVE=/dev/sda1
  208. # Location where the USB drive is mounted to
  209. USB_MOUNT=/mnt/usb
  210. # name of a script used to upgrade the system
  211. UPGRADE_SCRIPT_NAME="${PROJECT_NAME}-upgrade"
  212. # name of a script which keeps running processes going even if they crash
  213. WATCHDOG_SCRIPT_NAME="keepon"
  214. # Number of days to keep backups for
  215. BACKUP_MAX_DAYS=30
  216. # memory limit for php in MB
  217. MAX_PHP_MEMORY=64
  218. # default MariaDB password
  219. MARIADB_PASSWORD=
  220. # Directory where XMPP settings are stored
  221. XMPP_DIRECTORY="/var/lib/prosody"
  222. # file containing a list of remote locations to backup to
  223. # Format: [username@friendsdomain//home/username] [ssh_password]
  224. # With the only space character being between the server and the password
  225. FRIENDS_SERVERS_LIST=/home/$MY_USERNAME/backup.list
  226. # list of encryption protocols
  227. SSL_PROTOCOLS="TLSv1 TLSv1.1 TLSv1.2"
  228. # list of ciphers to use. See bettercrypto.org recommendations
  229. 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"
  230. # ssh (from https://stribika.github.io/2015/01/04/secure-secure-shell.html)
  231. SSH_CIPHERS="chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com,aes256-ctr,aes192-ctr,aes128-ctr"
  232. SSH_MACS="hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com,hmac-ripemd160-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-512,hmac-sha2-256,hmac-ripemd160,umac-128@openssh.com"
  233. SSH_KEX="curve25519-sha256@libssh.org,diffie-hellman-group-exchange-sha256"
  234. SSH_HOST_KEY_ALGORITHMS="ssh-ed25519-cert-v01@openssh.com,ssh-rsa-cert-v01@openssh.com,ssh-rsa-cert-v00@openssh.com,ssh-ed25519,ssh-rsa"
  235. # xmpp ciphers and curve
  236. XMPP_CIPHERS='"EDH+CAMELLIA:EDH+aRSA:EECDH+aRSA+AESGCM:EECDH+aRSA+SHA256:EECDH:+CAMELLIA128:+AES128:+SSLv3:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!DSS:!RC4:!SEED:!IDEA:!ECDSA:kEDH:CAMELLIA128-SHA:AES128-SHA"'
  237. XMPP_ECC_CURVE='"secp384r1"'
  238. # the default email address
  239. MY_EMAIL_ADDRESS=$MY_USERNAME@$DEFAULT_DOMAIN_NAME
  240. # optionally specify your name to appear on the blog
  241. MY_NAME=$DEFAULT_DOMAIN_NAME
  242. export DEBIAN_FRONTEND=noninteractive
  243. # logging level for Nginx
  244. WEBSERVER_LOG_LEVEL='warn'
  245. # used to limit CPU usage
  246. CPULIMIT='/usr/bin/cpulimit -l 20 -e'
  247. # command to create a git repository
  248. CREATE_GIT_PROJECT_COMMAND='create-project'
  249. # File which keeps track of what has already been installed
  250. COMPLETION_FILE=$HOME/${PROJECT_NAME}-completed.txt
  251. # Used to indicate whether the backup contains MariaDB databases or not
  252. BACKUP_INCLUDES_DATABASES="no"
  253. # contains the mysql root password which
  254. # is used for backups and repair
  255. DATABASE_PASSWORD_FILE=/root/dbpass
  256. # log file where details of remote backups are stored
  257. REMOTE_BACKUPS_LOG=/var/log/remotebackups.log
  258. # message if something fails to install
  259. 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."
  260. # web site used to obtain the external IP address of the system
  261. GET_IP_ADDRESS_URL="checkip.two-dns.de"
  262. # Password used for VoIP server
  263. VOIP_SERVER_PASSWORD=
  264. # Port on which VoIP server listens
  265. VOIP_PORT=64738
  266. SIP_SERVER_PASSWORD=
  267. SIP_PORT=5060
  268. # Location of VoIP database and configuration
  269. VOIP_DATABASE="mumble-server.sqlite"
  270. VOIP_CONFIG_FILE="mumble-server.ini"
  271. # other possible services to obtain the external IP address
  272. EXTERNAL_IP_SERVICES=( \
  273. 'https://check.torproject.org/' \
  274. 'https://www.whatsmydns.net/whats-my-ip-address.html' \
  275. 'https://www.privateinternetaccess.com/pages/whats-my-ip/' \
  276. 'http://checkip.two-dns.de' \
  277. 'http://ip.dnsexit.com' \
  278. 'http://ifconfig.me/ip' \
  279. 'http://ipecho.net/plain' \
  280. 'http://checkip.dyndns.org/plain' \
  281. 'http://ipogre.com/linux.php' \
  282. 'http://whatismyipaddress.com/' \
  283. 'http://ip.my-proxy.com/' \
  284. 'http://websiteipaddress.com/WhatIsMyIp' \
  285. 'http://getmyipaddress.org/' \
  286. 'http://www.my-ip-address.net/' \
  287. 'http://myexternalip.com/raw' \
  288. 'http://www.canyouseeme.org/' \
  289. 'http://www.trackip.net/' \
  290. 'http://icanhazip.com/' \
  291. 'http://www.iplocation.net/' \
  292. 'http://www.howtofindmyipaddress.com/' \
  293. 'http://www.ipchicken.com/' \
  294. 'http://whatsmyip.net/' \
  295. 'http://www.ip-adress.com/' \
  296. 'http://checkmyip.com/' \
  297. 'http://www.tracemyip.org/' \
  298. 'http://checkmyip.net/' \
  299. 'http://www.lawrencegoetz.com/programs/ipinfo/' \
  300. 'http://www.findmyip.co/' \
  301. 'http://ip-lookup.net/' \
  302. 'http://www.dslreports.com/whois' \
  303. 'http://www.mon-ip.com/en/my-ip/' \
  304. 'http://www.myip.ru' \
  305. 'http://ipgoat.com/' \
  306. 'http://www.myipnumber.com/my-ip-address.asp' \
  307. 'http://www.whatsmyipaddress.net/' \
  308. 'http://formyip.com/' \
  309. 'http://www.displaymyip.com/' \
  310. 'http://www.bobborst.com/tools/whatsmyip/' \
  311. 'http://www.geoiptool.com/' \
  312. 'http://checkip.dyndns.com/' \
  313. 'http://myexternalip.com/' \
  314. 'http://www.ip-adress.eu/' \
  315. 'http://www.infosniper.net/' \
  316. 'http://wtfismyip.com/' \
  317. 'http://ipinfo.io/' \
  318. 'http://httpbin.org/ip')
  319. WIFI_CHANNEL=2
  320. WIFI_INTERFACE=wlan0
  321. # cjdns settings
  322. ENABLE_CJDNS="no"
  323. CJDNS_PRIVATE_KEY=
  324. CJDNS_PUBLIC_KEY=
  325. CJDNS_IPV6=
  326. CJDNS_PASSWORD=
  327. CJDNS_PORT=
  328. CJDNS_REPO="https://github.com/cjdelisle/cjdns.git"
  329. CJDNS_COMMIT='13189fde111d0500427a7a0ce06a970753527bca'
  330. # B.A.T.M.A.N settings
  331. ENABLE_BATMAN="no"
  332. BATMAN_CELLID='any'
  333. ESSID='mesh'
  334. # Babel mesh
  335. ENABLE_BABEL="no"
  336. BABEL_PORT=6696
  337. # social key management
  338. ENABLE_SOCIAL_KEY_MANAGEMENT="no"
  339. TOX_PORT=33445
  340. TOX_REPO='git://github.com/irungentoo/toxcore.git'
  341. TOX_COMMIT='73b2144edcfd1ca617e9054479b66ab0c0361a14'
  342. TOX_BOOTSTRAP_ID_FILE=/var/lib/tox-bootstrapd/pubkey.txt
  343. # These are some default nodes, but you can replace them with trusted nodes
  344. # as you prefer. See https://wiki.tox.im/Nodes
  345. TOX_NODE=
  346. #TOX_NODES=(
  347. # '192.254.75.102,2607:5600:284::2,33445,951C88B7E75C867418ACDB5D273821372BB5BD652740BCDF623A4FA293E75D2F,Tox RELENG,US'
  348. # '144.76.60.215,2a01:4f8:191:64d6::1,33445,04119E835DF3E78BACF0F84235B300546AF8B936F035185E2A8E9E0A67C8924F,sonOfRa,DE'
  349. #)
  350. TOXIC_REPO="https://github.com/Tox/toxic"
  351. TOXIC_COMMIT='88270827a96b2082e254677f35585ed24581a42c'
  352. #ZERONET_REPO='https://github.com/HelloZeroNet/ZeroNet.git'
  353. ZERONET_REPO='https://github.com/HelloZeroNet/ZeroNet.git'
  354. ZERONET_COMMIT='675bd462556c541d65e2d95f91f899146a373aad'
  355. ZERONET_BLOG_REPO='https://github.com/HelloZeroNet/ZeroBlog'
  356. ZERONET_BLOG_COMMIT='bbb0d6c36465fed2e6df71f1aab45fcc9c6ad609'
  357. ZERONET_MAIL_REPO='https://github.com/HelloZeroNet/ZeroMail'
  358. ZERONET_MAIL_COMMIT='955af09d643c72b02e4983d71eca5c0c93a6c131'
  359. ZERONET_FORUM_REPO='https://github.com/HelloZeroNet/ZeroTalk'
  360. ZERONET_FORUM_COMMIT='e2d2c9cb1cfbfef91b244935efb5c14c2ad95faa'
  361. ZERONET_URL=http://127.0.0.1:43110
  362. ZERONET_PORT=15441
  363. TRACKER_PORT=6969
  364. ZERONET_DEFAULT_BLOG_TAGLINE="Blogging on the Mesh"
  365. ZERONET_DEFAULT_FORUM_TAGLINE="A decentralized discussion group"
  366. ZERONET_DEFAULT_MAIL_TAGLINE="Mail for the Mesh"
  367. # https://github.com/ipfs/go-ipfs
  368. IPFS_GO_REPO="github.com/ipfs/go-ipfs/cmd/ipfs"
  369. IPFS_COMMIT='20b06a4cbce8884f5b194da6e98cb11f2c77f166'
  370. IPFS_PORT=4001
  371. GPGIT_REPO="https://github.com/mikecardwell/gpgit"
  372. GPGIT_COMMIT='583dc76119f19420f8a33f606744faa7c8922738'
  373. # Default diffie-hellman key length in bits
  374. DH_KEYLENGTH=2048
  375. # repo for atheros AR9271 wifi driver
  376. ATHEROS_WIFI_REPO='https://github.com/qca/open-ath9k-htc-firmware.git'
  377. # Whether Let's Encrypt is enabled for all sites
  378. LETSENCRYPT_ENABLED="no"
  379. LETSENCRYPT_SERVER='https://acme-v01.api.letsencrypt.org/directory'
  380. function show_help {
  381. echo ''
  382. echo $"${PROJECT_NAME} -c [configuration file]"
  383. echo ''
  384. echo $' -h --help Show help'
  385. echo $' menuconfig Easy interactive installation'
  386. echo $' menuconfigfull Full interactive installation'
  387. echo $' -c --config Installing from a configuration file'
  388. echo $' --bbb Installing on Beaglebone Black'
  389. echo $' -u --user User to install the system as'
  390. echo $' -d --domain Default domain name'
  391. echo $' -s --system System type'
  392. echo $' --ip Static LAN IP address of the system'
  393. echo $' --iprouter LAN IP address of the internet router'
  394. echo $' --ddns Dynamic DNS provider domain'
  395. echo $' --ddnsuser Dynamic DNS provider username'
  396. echo $' --ddnspass Dynamic DNS provider password'
  397. echo ''
  398. echo $' --microblogdomain Microblog domain name'
  399. echo $' --wikidomain Wiki domain name'
  400. echo $' --blogdomain Blog domain name'
  401. echo $' --ownclouddomain Owncloud domain name'
  402. echo $' --hubzilladomain Hubzilla domain name'
  403. echo $' --gitdomain Git hosting domain name'
  404. echo $' -t --time Domain used as a TLS time source'
  405. echo $' --ssh ssh port number'
  406. echo $' --list Public mailing list name'
  407. echo $' --cores Number of CPU cores'
  408. echo $' --name Your name'
  409. echo $' --email Your email address'
  410. echo $' --usb Path for the USB drive (eg. /dev/sdb1)'
  411. echo $' --cjdns Enable CJDNS'
  412. echo $' --vpass VoIP server password'
  413. echo $' --vport VoIP server port'
  414. echo $' --ns1 First DNS nameserver'
  415. echo $' --ns2 Second DNS nameserver'
  416. echo $' --repo Debian repository'
  417. echo ''
  418. echo $'system types'
  419. echo '------------'
  420. echo $'This can either be blank if you wish to install the full system,'
  421. echo $"or for more specialised variants you can specify '$VARIANT_MAILBOX', '$VARIANT_CLOUD',"
  422. echo $"'$VARIANT_CHAT', '$VARIANT_SOCIAL', '$VARIANT_MEDIA', '$VARIANT_WRITER', '$VARIANT_DEVELOPER'"
  423. echo $"or '$VARIANT_MESH'."
  424. echo ''
  425. echo $"If you wish to install everything except email then use the '$VARIANT_NONMAILBOX' variaint."
  426. echo ''
  427. exit 0
  428. }
  429. function locale_setup {
  430. if grep -Fxq "locale_setup" $COMPLETION_FILE; then
  431. return
  432. fi
  433. apt-get -y install locales locales-all debconf
  434. if [ ! "$DEFAULT_LANGUAGE" ]; then
  435. DEFAULT_LANGUAGE='en_GB.UTF-8'
  436. fi
  437. if [ ${#DEFAULT_LANGUAGE} -lt 2 ]; then
  438. DEFAULT_LANGUAGE='en_GB.UTF-8'
  439. fi
  440. update-locale LANG=${DEFAULT_LANGUAGE}
  441. update-locale LANGUAGE=${DEFAULT_LANGUAGE}
  442. update-locale LC_MESSAGES=${DEFAULT_LANGUAGE}
  443. update-locale LC_ALL=${DEFAULT_LANGUAGE}
  444. update-locale LC_CTYPE=${DEFAULT_LANGUAGE}
  445. echo 'locale_setup' >> $COMPLETION_FILE
  446. }
  447. function interactive_configuration_remote_backups {
  448. if [[ $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  449. return
  450. fi
  451. if [ ! -f /usr/local/bin/${PROJECT_NAME}-remote ]; then
  452. if [ ! -f /usr/bin/${PROJECT_NAME}-remote ]; then
  453. echo $"The command ${PROJECT_NAME}-remote was not found"
  454. exit 87354
  455. fi
  456. fi
  457. ${PROJECT_NAME}-remote -u $MY_USERNAME -l $FRIENDS_SERVERS_LIST -m $MINIMUM_PASSWORD_LENGTH -r yes
  458. if [ ! "$?" = "0" ]; then
  459. echo $'Command failed:'
  460. echo ''
  461. echo $" ${PROJECT_NAME}-remote -u $MY_USERNAME -l $FRIENDS_SERVERS_LIST -m $MINIMUM_PASSWORD_LENGTH -r yes"
  462. echo ''
  463. exit 65892
  464. fi
  465. }
  466. # test a domain name to see if it's valid
  467. function validate_domain_name {
  468. # count the number of dots in the domain name
  469. dots=${TEST_DOMAIN_NAME//[^.]}
  470. no_of_dots=${#dots}
  471. if (( $no_of_dots > 3 )); then
  472. TEST_DOMAIN_NAME=$"The domain $TEST_DOMAIN_NAME has too many subdomains. It should be of the type w.x.y.z, x.y.z or y.z"
  473. fi
  474. if (( $no_of_dots == 0 )); then
  475. TEST_DOMAIN_NAME=$"The domain $TEST_DOMAIN_NAME has no top level domain. It should be of the type w.x.y.z, x.y.z or y.z"
  476. fi
  477. }
  478. function interactive_configuration {
  479. if [ ! -f /usr/local/bin/${PROJECT_NAME}-config ]; then
  480. if [ ! -f /usr/bin/${PROJECT_NAME}-config ]; then
  481. echo $"The command ${PROJECT_NAME}-config was not found"
  482. exit 63935
  483. fi
  484. fi
  485. if [ -f /tmp/meshuserdevice ]; then
  486. rm -f /tmp/meshuserdevice
  487. fi
  488. if [[ $MINIMAL_INSTALL == "no" ]]; then
  489. ${PROJECT_NAME}-config \
  490. -f $CONFIGURATION_FILE \
  491. -w $FREEDOMBONE_WEBSITE \
  492. -b $FREEDOMBONE_BITMESSAGE \
  493. -m $MINIMUM_PASSWORD_LENGTH
  494. else
  495. ${PROJECT_NAME}-config \
  496. -f $CONFIGURATION_FILE \
  497. -w $FREEDOMBONE_WEBSITE \
  498. -b $FREEDOMBONE_BITMESSAGE \
  499. -m $MINIMUM_PASSWORD_LENGTH \
  500. --minimal "yes"
  501. fi
  502. if [ -f /tmp/meshuserdevice ]; then
  503. # mesh network user device installation
  504. rm -f /tmp/meshuserdevice
  505. exit 0
  506. fi
  507. if [ ! "$?" = "0" ]; then
  508. echo $'Command failed:'
  509. echo ''
  510. echo $" ${PROJECT_NAME}-config -u $MY_USERNAME -f $CONFIGURATION_FILE -w $FREEDOMBONE_WEBSITE -b $FREEDOMBONE_BITMESSAGE -m $MINIMUM_PASSWORD_LENGTH --minimal [yes|no]"
  511. echo ''
  512. exit 73594
  513. fi
  514. if [[ $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  515. FRIENDS_SERVERS_LIST=/home/$MY_USERNAME/backup.list
  516. dialog --title $"Encrypted backup to other servers" \
  517. --backtitle $"${PROJECT_NAME} Configuration" \
  518. --defaultno \
  519. --yesno $"\nDo you wish to configure some remote backup locations?" 7 60
  520. sel=$?
  521. case $sel in
  522. 0) interactive_configuration_remote_backups;;
  523. esac
  524. fi
  525. }
  526. command_options=$1
  527. if [[ $command_options == "menuconfigfull" ]]; then
  528. MINIMAL_INSTALL="no"
  529. command_options="menuconfig"
  530. fi
  531. if [[ $command_options == "menuconfig" ]]; then
  532. interactive_configuration
  533. else
  534. while [[ $# > 1 ]]
  535. do
  536. key="$1"
  537. case $key in
  538. -h|--help)
  539. show_help
  540. ;;
  541. # load a configuration file
  542. -c|--config)
  543. shift
  544. CONFIGURATION_FILE="$1"
  545. INSTALLING_FROM_CONFIGURATION_FILE="yes"
  546. break
  547. ;;
  548. # username within /home
  549. -u|--user)
  550. shift
  551. MY_USERNAME="$1"
  552. ;;
  553. # microblog domain name
  554. --microblogdomain)
  555. shift
  556. MICROBLOG_DOMAIN_NAME="$1"
  557. ;;
  558. # wiki domain name
  559. --wikidomain)
  560. shift
  561. WIKI_DOMAIN_NAME="$1"
  562. ;;
  563. # blog domain name
  564. --blogdomain)
  565. shift
  566. FULLBLOG_DOMAIN_NAME="$1"
  567. ;;
  568. # owncloud domain name
  569. --ownclouddomain)
  570. shift
  571. OWNCLOUD_DOMAIN_NAME="$1"
  572. ;;
  573. # hubzilla domain name
  574. --hubzilladomain)
  575. shift
  576. HUBZILLA_DOMAIN_NAME="$1"
  577. ;;
  578. # git hosting domain name
  579. --gitdomain)
  580. shift
  581. GIT_DOMAIN_NAME="$1"
  582. ;;
  583. # default domain name
  584. -d|--domain)
  585. shift
  586. DEFAULT_DOMAIN_NAME="$1"
  587. ;;
  588. # The type of system
  589. -s|--system)
  590. shift
  591. SYSTEM_TYPE="$1"
  592. ;;
  593. # The dynamic DNS provider
  594. --ddns)
  595. shift
  596. DDNS_PROVIDER="$1"
  597. ;;
  598. # Username for the synamic DNS provider
  599. --ddnsuser)
  600. shift
  601. DDNS_USERNAME="$1"
  602. ;;
  603. # Password for the synamic DNS provider
  604. --ddnspass)
  605. shift
  606. DDNS_PASSWORD="$1"
  607. ;;
  608. # Whether this installation is on a Beaglebone Black
  609. --bbb)
  610. INSTALLING_ON_BBB="yes"
  611. ;;
  612. # Domain name to use as a TLS time source
  613. -t|--time)
  614. shift
  615. TLS_TIME_SOURCE1="$1"
  616. ;;
  617. # Static IP address for the system
  618. --ip)
  619. shift
  620. LOCAL_NETWORK_STATIC_IP_ADDRESS=$1
  621. ;;
  622. # IP address for the internet router
  623. --iprouter)
  624. shift
  625. ROUTER_IP_ADDRESS=$1
  626. ;;
  627. # ssh port
  628. --ssh)
  629. shift
  630. SSH_PORT=$1
  631. ;;
  632. # public mailing list name
  633. --list)
  634. shift
  635. PUBLIC_MAILING_LIST="$1"
  636. ;;
  637. # Number of CPU cores
  638. --cores)
  639. shift
  640. CPU_CORES=$1
  641. ;;
  642. # my name
  643. --name)
  644. shift
  645. MY_NAME="$1"
  646. ;;
  647. # my email address
  648. --email)
  649. shift
  650. MY_EMAIL_ADDRESS="$1"
  651. ;;
  652. # USB drive
  653. --usb)
  654. shift
  655. USB_DRIVE=$1
  656. ;;
  657. # Enable CJDNS
  658. --cjdns)
  659. shift
  660. ENABLE_CJDNS="yes"
  661. ;;
  662. # Enable B.A.T.M.A.N
  663. --batman)
  664. shift
  665. ENABLE_BATMAN="yes"
  666. ;;
  667. # Enable Babel
  668. --babel)
  669. shift
  670. ENABLE_BABEL="yes"
  671. ;;
  672. # VoIP server password
  673. --vpass)
  674. shift
  675. VOIP_SERVER_PASSWORD=$1
  676. ;;
  677. # VoIP server port
  678. --vport)
  679. shift
  680. VOIP_PORT=$1
  681. ;;
  682. # DNS Nameserver 1
  683. --ns1)
  684. shift
  685. NAMESERVER1=$1
  686. ;;
  687. # DNS Nameserver 2
  688. --ns2)
  689. shift
  690. NAMESERVER2=$1
  691. ;;
  692. # Debian repository
  693. --repo)
  694. shift
  695. DEBIAN_REPO=$1
  696. ;;
  697. # minimal install
  698. --minimal)
  699. shift
  700. MINIMAL_INSTALL=$1
  701. ;;
  702. *)
  703. # unknown option
  704. ;;
  705. esac
  706. shift
  707. done
  708. fi
  709. function parse_args {
  710. if [[ $NO_OF_ARGS == 0 ]]; then
  711. echo 'no_of_args = 0'
  712. show_help
  713. exit 0
  714. fi
  715. if [ ! -d /home/$MY_USERNAME ]; then
  716. echo $"There is no user '$MY_USERNAME' on the system. Use 'adduser $MY_USERNAME' to create the user."
  717. exit 1
  718. fi
  719. if [ ! "$DEFAULT_DOMAIN_NAME" ]; then
  720. if [[ $SYSTEM_TYPE != "$VARIANT_MESH" ]]; then
  721. echo 'No default domain specified'
  722. show_help
  723. exit 2
  724. fi
  725. fi
  726. if [ ! $MY_USERNAME ]; then
  727. echo 'No username specified'
  728. show_help
  729. exit 3
  730. fi
  731. if [[ $SYSTEM_TYPE != "$VARIANT_MESH" ]]; then
  732. if [ ! $DDNS_USERNAME ]; then
  733. echo $'Please provide the username for your dynamic DNS provider with the --ddnsuser option'
  734. exit 7823
  735. fi
  736. if [ ! $DDNS_PASSWORD ]; then
  737. echo $'Please provide the password for your dynamic DNS provider with the --ddnspass option'
  738. exit 6382
  739. fi
  740. fi
  741. if [ ! $SYSTEM_TYPE ]; then
  742. SYSTEM_TYPE=$VARIANT_FULL
  743. fi
  744. 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 && $SYSTEM_TYPE != $VARIANT_DEVELOPER && $SYSTEM_TYPE != $VARIANT_MESH && $SYSTEM_TYPE != $VARIANT_FULL ]]; then
  745. echo $"'$SYSTEM_TYPE' is an unrecognised ${PROJECT_NAME} variant."
  746. exit 30
  747. fi
  748. }
  749. function read_configuration {
  750. # if not installing on a Beaglebone then use sdb as the USB drive by default
  751. if [ ! $INSTALLING_ON_BBB ]; then
  752. if [[ $USB_DRIVE == /dev/sda1 ]]; then
  753. USB_DRIVE=/dev/sdb1
  754. fi
  755. fi
  756. if [[ $INSTALLING_FROM_CONFIGURATION_FILE == "yes" ]]; then
  757. if [ ! -f $CONFIGURATION_FILE ]; then
  758. echo $"The configuration file $CONFIGURATION_FILE was not found"
  759. exit 8935
  760. fi
  761. fi
  762. if [ -f $CONFIGURATION_FILE ]; then
  763. # Ensure that a copy of the config exists for upgrade purposes
  764. if [[ $CONFIGURATION_FILE != "/root/${PROJECT_NAME}.cfg" ]]; then
  765. cp $CONFIGURATION_FILE /root/${PROJECT_NAME}.cfg
  766. fi
  767. if grep -q "ONION_ONLY" $CONFIGURATION_FILE; then
  768. ONION_ONLY=$(grep "ONION_ONLY" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  769. fi
  770. if grep -q "IRC_PASSWORD" $CONFIGURATION_FILE; then
  771. IRC_PASSWORD=$(grep "IRC_PASSWORD" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  772. fi
  773. if grep -q "DEFAULT_LANGUAGE" $CONFIGURATION_FILE; then
  774. DEFAULT_LANGUAGE=$(grep "DEFAULT_LANGUAGE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  775. fi
  776. if grep -q "MINIMAL_INSTALL" $CONFIGURATION_FILE; then
  777. MINIMAL_INSTALL=$(grep "MINIMAL_INSTALL" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  778. fi
  779. if grep -q "LETSENCRYPT_SERVER" $CONFIGURATION_FILE; then
  780. LETSENCRYPT_SERVER=$(grep "LETSENCRYPT_SERVER" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  781. fi
  782. if grep -q "FULLBLOG_REPO" $CONFIGURATION_FILE; then
  783. FULLBLOG_REPO=$(grep "FULLBLOG_REPO" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  784. fi
  785. if grep -q "FULLBLOG_COMMIT" $CONFIGURATION_FILE; then
  786. FULLBLOG_COMMIT=$(grep "FULLBLOG_COMMIT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  787. fi
  788. if grep -q "GOGS_COMMIT" $CONFIGURATION_FILE; then
  789. GOGS_COMMIT=$(grep "GOGS_COMMIT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  790. fi
  791. if grep -q "TOX_COMMIT" $CONFIGURATION_FILE; then
  792. TOX_COMMIT=$(grep "TOX_COMMIT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  793. fi
  794. if grep -q "TOXIC_COMMIT" $CONFIGURATION_FILE; then
  795. TOXIC_COMMIT=$(grep "TOXIC_COMMIT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  796. fi
  797. if grep -q "GPGIT_REPO" $CONFIGURATION_FILE; then
  798. GPGIT_REPO=$(grep "GPGIT_REPO" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  799. fi
  800. if grep -q "GPGIT_COMMIT" $CONFIGURATION_FILE; then
  801. GPGIT_COMMIT=$(grep "GPGIT_COMMIT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  802. fi
  803. if grep -q "OWNCLOUD_MUSIC_APP_COMMIT" $CONFIGURATION_FILE; then
  804. OWNCLOUD_MUSIC_APP_COMMIT=$(grep "OWNCLOUD_MUSIC_APP_COMMIT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  805. fi
  806. if grep -q "HUBZILLA_COMMIT" $CONFIGURATION_FILE; then
  807. HUBZILLA_COMMIT=$(grep "HUBZILLA_COMMIT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  808. fi
  809. if grep -q "IPFS_COMMIT" $CONFIGURATION_FILE; then
  810. IPFS_COMMIT=$(grep "IPFS_COMMIT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  811. fi
  812. if grep -q "ZERONET_BLOG_COMMIT" $CONFIGURATION_FILE; then
  813. ZERONET_BLOG_COMMIT=$(grep "ZERONET_BLOG_COMMIT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  814. fi
  815. if grep -q "ZERONET_MAIL_COMMIT" $CONFIGURATION_FILE; then
  816. ZERONET_MAIL_COMMIT=$(grep "ZERONET_MAIL_COMMIT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  817. fi
  818. if grep -q "ZERONET_FORUM_COMMIT" $CONFIGURATION_FILE; then
  819. ZERONET_FORUM_COMMIT=$(grep "ZERONET_FORUM_COMMIT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  820. fi
  821. if grep -q "GNUSOCIAL_COMMIT" $CONFIGURATION_FILE; then
  822. GNUSOCIAL_COMMIT=$(grep "GNUSOCIAL_COMMIT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  823. fi
  824. if grep -q "NGINX_ENSITE_REPO" $CONFIGURATION_FILE; then
  825. NGINX_ENSITE_REPO=$(grep "NGINX_ENSITE_REPO" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  826. fi
  827. if grep -q "NGINX_ENSITE_COMMIT" $CONFIGURATION_FILE; then
  828. NGINX_ENSITE_COMMIT=$(grep "NGINX_ENSITE_COMMIT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  829. fi
  830. if grep -q "CLEANUP_MAILDIR_COMMIT" $CONFIGURATION_FILE; then
  831. CLEANUP_MAILDIR_COMMIT=$(grep "CLEANUP_MAILDIR_COMMIT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  832. fi
  833. if grep -q "CLEANUP_MAILDIR_REPO" $CONFIGURATION_FILE; then
  834. CLEANUP_MAILDIR_REPO=$(grep "CLEANUP_MAILDIR_REPO" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  835. fi
  836. if grep -q "ZERONET_COMMIT" $CONFIGURATION_FILE; then
  837. ZERONET_COMMIT=$(grep "ZERONET_COMMIT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  838. fi
  839. if grep -q "INADYN_REPO" $CONFIGURATION_FILE; then
  840. INADYN_REPO=$(grep "INADYN_REPO" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  841. fi
  842. if grep -q "INADYN_COMMIT" $CONFIGURATION_FILE; then
  843. INADYN_COMMIT=$(grep "INADYN_COMMIT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  844. fi
  845. if grep -q "GPG_KEYSERVER" $CONFIGURATION_FILE; then
  846. GPG_KEYSERVER=$(grep "GPG_KEYSERVER" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  847. fi
  848. if grep -q "IPFS_PORT" $CONFIGURATION_FILE; then
  849. IPFS_PORT=$(grep "IPFS_PORT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  850. fi
  851. if grep -q "TRACKER_PORT" $CONFIGURATION_FILE; then
  852. TRACKER_PORT=$(grep "TRACKER_PORT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  853. fi
  854. if grep -q "ZERONET_PORT" $CONFIGURATION_FILE; then
  855. ZERONET_PORT=$(grep "ZERONET_PORT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  856. fi
  857. if grep -q "DH_KEYLENGTH" $CONFIGURATION_FILE; then
  858. DH_KEYLENGTH=$(grep "DH_KEYLENGTH" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  859. fi
  860. if grep -q "WIFI_INTERFACE" $CONFIGURATION_FILE; then
  861. WIFI_INTERFACE=$(grep "WIFI_INTERFACE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  862. fi
  863. if grep -q "IRC_PORT" $CONFIGURATION_FILE; then
  864. IRC_PORT=$(grep "IRC_PORT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  865. fi
  866. if grep -q "WIFI_CHANNEL" $CONFIGURATION_FILE; then
  867. WIFI_CHANNEL=$(grep "WIFI_CHANNEL" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  868. fi
  869. if grep -q "BATMAN_CELLID" $CONFIGURATION_FILE; then
  870. BATMAN_CELLID=$(grep "BATMAN_CELLID" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  871. fi
  872. if grep -q "ESSID" $CONFIGURATION_FILE; then
  873. ESSID=$(grep "ESSID" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  874. fi
  875. if grep -q "TOX_PORT" $CONFIGURATION_FILE; then
  876. TOX_PORT=$(grep "TOX_PORT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  877. fi
  878. if grep -q "TOX_NODES" $CONFIGURATION_FILE; then
  879. TOX_NODES=$(grep "TOX_NODES" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  880. fi
  881. if grep -q "TOX_REPO" $CONFIGURATION_FILE; then
  882. TOX_REPO=$(grep "TOX_REPO" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  883. fi
  884. if grep -q "ENABLE_SOCIAL_KEY_MANAGEMENT" $CONFIGURATION_FILE; then
  885. ENABLE_SOCIAL_KEY_MANAGEMENT=$(grep "ENABLE_SOCIAL_KEY_MANAGEMENT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  886. fi
  887. if grep -q "IPV6_NETWORK" $CONFIGURATION_FILE; then
  888. IPV6_NETWORK=$(grep "IPV6_NETWORK" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  889. fi
  890. if grep -q "HWRNG_TYPE" $CONFIGURATION_FILE; then
  891. HWRNG_TYPE=$(grep "HWRNG_TYPE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  892. fi
  893. if grep -q "MEDIAGOBLIN_DOMAIN_NAME" $CONFIGURATION_FILE; then
  894. MEDIAGOBLIN_DOMAIN_NAME=$(grep "MEDIAGOBLIN_DOMAIN_NAME" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  895. fi
  896. if grep -q "MEDIAGOBLIN_CODE" $CONFIGURATION_FILE; then
  897. MEDIAGOBLIN_CODE=$(grep "MEDIAGOBLIN_CODE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  898. fi
  899. if grep -q "GIT_ADMIN_PASSWORD" $CONFIGURATION_FILE; then
  900. GIT_ADMIN_PASSWORD=$(grep "GIT_ADMIN_PASSWORD" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  901. fi
  902. if grep -q "GIT_DOMAIN_NAME" $CONFIGURATION_FILE; then
  903. GIT_DOMAIN_NAME=$(grep "GIT_DOMAIN_NAME" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  904. fi
  905. if grep -q "GIT_CODE" $CONFIGURATION_FILE; then
  906. GIT_CODE=$(grep "GIT_CODE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  907. fi
  908. if grep -q "SYSTEM_TYPE" $CONFIGURATION_FILE; then
  909. SYSTEM_TYPE=$(grep "SYSTEM_TYPE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  910. fi
  911. if grep -q "SSL_PROTOCOLS" $CONFIGURATION_FILE; then
  912. SSL_PROTOCOLS=$(grep "SSL_PROTOCOLS" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  913. fi
  914. if grep -q "SSL_CIPHERS" $CONFIGURATION_FILE; then
  915. SSL_CIPHERS=$(grep "SSL_CIPHERS" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  916. fi
  917. if grep -q "SSH_CIPHERS" $CONFIGURATION_FILE; then
  918. SSH_CIPHERS=$(grep "SSH_CIPHERS" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  919. fi
  920. if grep -q "SSH_MACS" $CONFIGURATION_FILE; then
  921. SSH_MACS=$(grep "SSH_MACS" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  922. fi
  923. if grep -q "SSH_KEX" $CONFIGURATION_FILE; then
  924. SSH_KEX=$(grep "SSH_KEX" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  925. fi
  926. if grep -q "SSH_HOST_KEY_ALGORITHMS" $CONFIGURATION_FILE; then
  927. SSH_HOST_KEY_ALGORITHMS=$(grep "SSH_HOST_KEY_ALGORITHMS" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  928. fi
  929. if grep -q "SSH_PASSWORDS" $CONFIGURATION_FILE; then
  930. SSH_PASSWORDS=$(grep "SSH_PASSWORDS" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  931. fi
  932. if grep -q "XMPP_CIPHERS" $CONFIGURATION_FILE; then
  933. XMPP_CIPHERS=$(grep "XMPP_CIPHERS" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  934. fi
  935. if grep -q "XMPP_ECC_CURVE" $CONFIGURATION_FILE; then
  936. XMPP_ECC_CURVE=$(grep "XMPP_ECC_CURVE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  937. fi
  938. if grep -q "MY_USERNAME" $CONFIGURATION_FILE; then
  939. MY_USERNAME=$(grep "MY_USERNAME" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  940. fi
  941. if grep -q "DOMAIN_NAME" $CONFIGURATION_FILE; then
  942. # for backwards compatability
  943. DEFAULT_DOMAIN_NAME=$(grep "DOMAIN_NAME" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  944. fi
  945. if grep -q "DEFAULT_DOMAIN_NAME" $CONFIGURATION_FILE; then
  946. DEFAULT_DOMAIN_NAME=$(grep "DEFAULT_DOMAIN_NAME" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  947. fi
  948. if grep -q "DEFAULT_DOMAIN_CODE" $CONFIGURATION_FILE; then
  949. DEFAULT_DOMAIN_CODE=$(grep "DEFAULT_DOMAIN_CODE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  950. fi
  951. if grep -q "NAMESERVER1" $CONFIGURATION_FILE; then
  952. NAMESERVER1=$(grep "NAMESERVER1" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  953. fi
  954. if grep -q "NAMESERVER2" $CONFIGURATION_FILE; then
  955. NAMESERVER2=$(grep "NAMESERVER2" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  956. fi
  957. if grep -q "DEBIAN_REPO" $CONFIGURATION_FILE; then
  958. DEBIAN_REPO=$(grep "DEBIAN_REPO" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  959. 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."
  960. fi
  961. if grep -q "VOIP_PORT" $CONFIGURATION_FILE; then
  962. VOIP_PORT=$(grep "VOIP_PORT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  963. fi
  964. if grep -q "VOIP_SERVER_PASSWORD" $CONFIGURATION_FILE; then
  965. VOIP_SERVER_PASSWORD=$(grep "VOIP_SERVER_PASSWORD" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  966. fi
  967. if grep -q "SIP_PORT" $CONFIGURATION_FILE; then
  968. SIP_PORT=$(grep "SIP_PORT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  969. fi
  970. if grep -q "SIP_SERVER_PASSWORD" $CONFIGURATION_FILE; then
  971. SIP_SERVER_PASSWORD=$(grep "SIP_SERVER_PASSWORD" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  972. fi
  973. if grep -q "GET_IP_ADDRESS_URL" $CONFIGURATION_FILE; then
  974. GET_IP_ADDRESS_URL=$(grep "GET_IP_ADDRESS_URL" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  975. fi
  976. if grep -q "DDNS_PROVIDER" $CONFIGURATION_FILE; then
  977. DDNS_PROVIDER=$(grep "DDNS_PROVIDER" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  978. fi
  979. if grep -q "DDNS_USERNAME" $CONFIGURATION_FILE; then
  980. DDNS_USERNAME=$(grep "DDNS_USERNAME" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  981. fi
  982. if grep -q "DDNS_PASSWORD" $CONFIGURATION_FILE; then
  983. DDNS_PASSWORD=$(grep "DDNS_PASSWORD" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  984. fi
  985. if grep -q "LOCAL_NETWORK_STATIC_IP_ADDRESS" $CONFIGURATION_FILE; then
  986. LOCAL_NETWORK_STATIC_IP_ADDRESS=$(grep "LOCAL_NETWORK_STATIC_IP_ADDRESS" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  987. fi
  988. if grep -q "ENABLE_BABEL" $CONFIGURATION_FILE; then
  989. ENABLE_BABEL=$(grep "ENABLE_BABEL" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  990. fi
  991. if grep -q "ENABLE_BATMAN" $CONFIGURATION_FILE; then
  992. ENABLE_BATMAN=$(grep "ENABLE_BATMAN" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  993. fi
  994. if grep -q "ENABLE_CJDNS" $CONFIGURATION_FILE; then
  995. ENABLE_CJDNS=$(grep "ENABLE_CJDNS" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  996. fi
  997. if grep -q "CJDNS_COMMIT" $CONFIGURATION_FILE; then
  998. CJDNS_COMMIT=$(grep "CJDNS_COMMIT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  999. fi
  1000. if grep -q "CJDNS_IPV6" $CONFIGURATION_FILE; then
  1001. CJDNS_IPV6=$(grep "CJDNS_IPV6" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1002. fi
  1003. if grep -q "CJDNS_PUBLIC_KEY" $CONFIGURATION_FILE; then
  1004. CJDNS_PUBLIC_KEY=$(grep "CJDNS_PUBLIC_KEY" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1005. fi
  1006. if grep -q "CJDNS_PRIVATE_KEY" $CONFIGURATION_FILE; then
  1007. CJDNS_PRIVATE_KEY=$(grep "CJDNS_PRIVATE_KEY" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1008. fi
  1009. if grep -q "ROUTER_IP_ADDRESS" $CONFIGURATION_FILE; then
  1010. ROUTER_IP_ADDRESS=$(grep "ROUTER_IP_ADDRESS" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1011. fi
  1012. if grep -q "CPU_CORES" $CONFIGURATION_FILE; then
  1013. CPU_CORES=$(grep "CPU_CORES" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1014. fi
  1015. if grep -q "WEBSERVER_LOG_LEVEL" $CONFIGURATION_FILE; then
  1016. WEBSERVER_LOG_LEVEL=$(grep "WEBSERVER_LOG_LEVEL" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1017. fi
  1018. if grep -q "ROUTE_THROUGH_TOR" $CONFIGURATION_FILE; then
  1019. ROUTE_THROUGH_TOR=$(grep "ROUTE_THROUGH_TOR" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1020. fi
  1021. if grep -q "WIKI_TITLE" $CONFIGURATION_FILE; then
  1022. WIKI_TITLE=$(grep "WIKI_TITLE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1023. fi
  1024. if grep -q "MY_NAME" $CONFIGURATION_FILE; then
  1025. MY_NAME=$(grep "MY_NAME" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1026. fi
  1027. if grep -q "MY_EMAIL_ADDRESS" $CONFIGURATION_FILE; then
  1028. MY_EMAIL_ADDRESS=$(grep "MY_EMAIL_ADDRESS" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1029. fi
  1030. if grep -q "INSTALLING_ON_BBB" $CONFIGURATION_FILE; then
  1031. INSTALLING_ON_BBB=$(grep "INSTALLING_ON_BBB" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1032. fi
  1033. if grep -q "SSH_PORT" $CONFIGURATION_FILE; then
  1034. SSH_PORT=$(grep "SSH_PORT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1035. fi
  1036. if grep -q "INSTALLED_WITHIN_DOCKER" $CONFIGURATION_FILE; then
  1037. INSTALLED_WITHIN_DOCKER=$(grep "INSTALLED_WITHIN_DOCKER" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1038. fi
  1039. if grep -q "PUBLIC_MAILING_LIST" $CONFIGURATION_FILE; then
  1040. PUBLIC_MAILING_LIST=$(grep "PUBLIC_MAILING_LIST" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1041. fi
  1042. if grep -q "MICROBLOG_DOMAIN_NAME" $CONFIGURATION_FILE; then
  1043. MICROBLOG_DOMAIN_NAME=$(grep "MICROBLOG_DOMAIN_NAME" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1044. fi
  1045. if grep -q "MICROBLOG_CODE" $CONFIGURATION_FILE; then
  1046. MICROBLOG_CODE=$(grep "MICROBLOG_CODE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1047. fi
  1048. if grep -q "HUBZILLA_DOMAIN_NAME" $CONFIGURATION_FILE; then
  1049. HUBZILLA_DOMAIN_NAME=$(grep "HUBZILLA_DOMAIN_NAME" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1050. fi
  1051. if grep -q "HUBZILLA_CODE" $CONFIGURATION_FILE; then
  1052. HUBZILLA_CODE=$(grep "HUBZILLA_CODE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1053. fi
  1054. if grep -q "OWNCLOUD_DOMAIN_NAME" $CONFIGURATION_FILE; then
  1055. OWNCLOUD_DOMAIN_NAME=$(grep "OWNCLOUD_DOMAIN_NAME" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1056. fi
  1057. if grep -q "OWNCLOUD_CODE" $CONFIGURATION_FILE; then
  1058. OWNCLOUD_CODE=$(grep "OWNCLOUD_CODE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1059. fi
  1060. if grep -q "WIKI_DOMAIN_NAME" $CONFIGURATION_FILE; then
  1061. WIKI_DOMAIN_NAME=$(grep "WIKI_DOMAIN_NAME" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1062. fi
  1063. if grep -q "WIKI_CODE" $CONFIGURATION_FILE; then
  1064. WIKI_CODE=$(grep "WIKI_CODE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1065. fi
  1066. if grep -q "FULLBLOG_DOMAIN_NAME" $CONFIGURATION_FILE; then
  1067. FULLBLOG_DOMAIN_NAME=$(grep "FULLBLOG_DOMAIN_NAME" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1068. fi
  1069. if grep -q "FULLBLOG_CODE" $CONFIGURATION_FILE; then
  1070. FULLBLOG_CODE=$(grep "FULLBLOG_CODE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1071. fi
  1072. if grep -q "MY_BLOG_TITLE" $CONFIGURATION_FILE; then
  1073. MY_BLOG_TITLE=$(grep "MY_BLOG_TITLE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1074. fi
  1075. if grep -q "MY_BLOG_SUBTITLE" $CONFIGURATION_FILE; then
  1076. MY_BLOG_SUBTITLE=$(grep "MY_BLOG_SUBTITLE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1077. fi
  1078. if grep -q "GPG_ENCRYPT_STORED_EMAIL" $CONFIGURATION_FILE; then
  1079. GPG_ENCRYPT_STORED_EMAIL=$(grep "GPG_ENCRYPT_STORED_EMAIL" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1080. fi
  1081. if grep -q "MY_GPG_PUBLIC_KEY" $CONFIGURATION_FILE; then
  1082. MY_GPG_PUBLIC_KEY=$(grep "MY_GPG_PUBLIC_KEY" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1083. fi
  1084. if grep -q "MY_GPG_PRIVATE_KEY" $CONFIGURATION_FILE; then
  1085. MY_GPG_PRIVATE_KEY=$(grep "MY_GPG_PRIVATE_KEY" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1086. fi
  1087. if grep -q "MY_GPG_PUBLIC_KEY_ID" $CONFIGURATION_FILE; then
  1088. MY_GPG_PUBLIC_KEY_ID=$(grep "MY_GPG_PUBLIC_KEY_ID" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1089. fi
  1090. if grep -q "USB_DRIVE" $CONFIGURATION_FILE; then
  1091. USB_DRIVE=$(grep "USB_DRIVE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1092. fi
  1093. if grep -q "MAX_PHP_MEMORY" $CONFIGURATION_FILE; then
  1094. MAX_PHP_MEMORY=$(grep "MAX_PHP_MEMORY" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1095. fi
  1096. if grep -q "TLS_TIME_SOURCE1" $CONFIGURATION_FILE; then
  1097. TLS_TIME_SOURCE1=$(grep "TLS_TIME_SOURCE1" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1098. fi
  1099. if grep -q "TLS_TIME_SOURCE2" $CONFIGURATION_FILE; then
  1100. TLS_TIME_SOURCE2=$(grep "TLS_TIME_SOURCE2" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1101. fi
  1102. fi
  1103. }
  1104. function set_default_onion_domains {
  1105. # If sites are only visible via Tor then for installation
  1106. # purposes assign them some default domain names
  1107. if [[ $ONION_ONLY == "no" ]]; then
  1108. return
  1109. fi
  1110. if [ $OWNCLOUD_DOMAIN_NAME ]; then
  1111. OWNCLOUD_DOMAIN_NAME='owncloud.local'
  1112. fi
  1113. if [ $MICROBLOG_DOMAIN_NAME ]; then
  1114. MICROBLOG_DOMAIN_NAME='microblog.local'
  1115. fi
  1116. if [ $FULLBLOG_DOMAIN_NAME ]; then
  1117. FULLBLOG_DOMAIN_NAME='blog.local'
  1118. fi
  1119. if [ $GIT_DOMAIN_NAME ]; then
  1120. GIT_DOMAIN_NAME='git.local'
  1121. fi
  1122. if [ $WIKI_DOMAIN_NAME ]; then
  1123. WIKI_DOMAIN_NAME='wiki.local'
  1124. fi
  1125. if [ $DEFAULT_DOMAIN_NAME ]; then
  1126. DEFAULT_DOMAIN_NAME="${PROJECT_NAME}.local"
  1127. fi
  1128. }
  1129. function create_avahi_onion_domains {
  1130. if [ $OWNCLOUD_DOMAIN_NAME ]; then
  1131. echo '<?xml version="1.0" standalone="no"?><!--*-nxml-*-->' > /etc/avahi/services/owncloud.service
  1132. echo '<!DOCTYPE service-group SYSTEM "avahi-service.dtd">' >> /etc/avahi/services/owncloud.service
  1133. echo '<service-group>' >> /etc/avahi/services/owncloud.service
  1134. echo ' <name replace-wildcards="yes">%h HTTP</name>' >> /etc/avahi/services/owncloud.service
  1135. echo ' <service>' >> /etc/avahi/services/owncloud.service
  1136. echo ' <type>_http._tcp</type>' >> /etc/avahi/services/owncloud.service
  1137. echo " <port>$OWNCLOUD_ONION_PORT</port>" >> /etc/avahi/services/owncloud.service
  1138. echo ' </service>' >> /etc/avahi/services/owncloud.service
  1139. echo '</service-group>' >> /etc/avahi/services/owncloud.service
  1140. fi
  1141. if [ $MICROBLOG_DOMAIN_NAME ]; then
  1142. echo '<?xml version="1.0" standalone="no"?><!--*-nxml-*-->' > /etc/avahi/services/microblog.service
  1143. echo '<!DOCTYPE service-group SYSTEM "avahi-service.dtd">' >> /etc/avahi/services/microblog.service
  1144. echo '<service-group>' >> /etc/avahi/services/microblog.service
  1145. echo ' <name replace-wildcards="yes">%h HTTP</name>' >> /etc/avahi/services/microblog.service
  1146. echo ' <service>' >> /etc/avahi/services/microblog.service
  1147. echo ' <type>_http._tcp</type>' >> /etc/avahi/services/microblog.service
  1148. echo " <port>$MICROBLOG_ONION_PORT</port>" >> /etc/avahi/services/microblog.service
  1149. echo ' </service>' >> /etc/avahi/services/microblog.service
  1150. echo '</service-group>' >> /etc/avahi/services/microblog.service
  1151. fi
  1152. if [ $FULLBLOG_DOMAIN_NAME ]; then
  1153. echo '<?xml version="1.0" standalone="no"?><!--*-nxml-*-->' > /etc/avahi/services/blog.service
  1154. echo '<!DOCTYPE service-group SYSTEM "avahi-service.dtd">' >> /etc/avahi/services/blog.service
  1155. echo '<service-group>' >> /etc/avahi/services/blog.service
  1156. echo ' <name replace-wildcards="yes">%h HTTP</name>' >> /etc/avahi/services/blog.service
  1157. echo ' <service>' >> /etc/avahi/services/blog.service
  1158. echo ' <type>_http._tcp</type>' >> /etc/avahi/services/blog.service
  1159. echo " <port>$BLOG_ONION_PORT</port>" >> /etc/avahi/services/blog.service
  1160. echo ' </service>' >> /etc/avahi/services/blog.service
  1161. echo '</service-group>' >> /etc/avahi/services/blog.service
  1162. fi
  1163. if [ $GIT_DOMAIN_NAME ]; then
  1164. echo '<?xml version="1.0" standalone="no"?><!--*-nxml-*-->' > /etc/avahi/services/git.service
  1165. echo '<!DOCTYPE service-group SYSTEM "avahi-service.dtd">' >> /etc/avahi/services/git.service
  1166. echo '<service-group>' >> /etc/avahi/services/git.service
  1167. echo ' <name replace-wildcards="yes">%h HTTP</name>' >> /etc/avahi/services/git.service
  1168. echo ' <service>' >> /etc/avahi/services/git.service
  1169. echo ' <type>_http._tcp</type>' >> /etc/avahi/services/git.service
  1170. echo " <port>$GIT_ONION_PORT</port>" >> /etc/avahi/services/git.service
  1171. echo ' </service>' >> /etc/avahi/services/git.service
  1172. echo '</service-group>' >> /etc/avahi/services/git.service
  1173. fi
  1174. if [ $WIKI_DOMAIN_NAME ]; then
  1175. echo '<?xml version="1.0" standalone="no"?><!--*-nxml-*-->' > /etc/avahi/services/wiki.service
  1176. echo '<!DOCTYPE service-group SYSTEM "avahi-service.dtd">' >> /etc/avahi/services/wiki.service
  1177. echo '<service-group>' >> /etc/avahi/services/wiki.service
  1178. echo ' <name replace-wildcards="yes">%h HTTP</name>' >> /etc/avahi/services/wiki.service
  1179. echo ' <service>' >> /etc/avahi/services/wiki.service
  1180. echo ' <type>_http._tcp</type>' >> /etc/avahi/services/wiki.service
  1181. echo " <port>$WIKI_ONION_PORT</port>" >> /etc/avahi/services/wiki.service
  1182. echo ' </service>' >> /etc/avahi/services/wiki.service
  1183. echo '</service-group>' >> /etc/avahi/services/wiki.service
  1184. fi
  1185. }
  1186. # check an individual domain name
  1187. function test_domain_name {
  1188. if [ $1 ]; then
  1189. TEST_DOMAIN_NAME=$1
  1190. validate_domain_name
  1191. if [[ $TEST_DOMAIN_NAME != $1 ]]; then
  1192. echo $TEST_DOMAIN_NAME
  1193. exit 8528
  1194. fi
  1195. fi
  1196. }
  1197. # check that domain names are sensible
  1198. function check_domains {
  1199. if [ $WIKI_DOMAIN_NAME ]; then
  1200. test_domain_name "$WIKI_DOMAIN_NAME"
  1201. if [[ "$test_domain_name" == "$OWNCLOUD_DOMAIN_NAME" ]]; then
  1202. echo $'Wiki domain name is the same as Owncloud domain name. They must be different'
  1203. exit 73863
  1204. fi
  1205. if [[ "$test_domain_name" == "$FULLBLOG_DOMAIN_NAME" ]]; then
  1206. echo $'Wiki domain name is the same as blog domain name. They must be different'
  1207. exit 97326
  1208. fi
  1209. if [[ "$test_domain_name" == "$MICROBLOG_DOMAIN_NAME" ]]; then
  1210. echo $'Wiki domain name is the same as microblog domain name. They must be different'
  1211. exit 36827
  1212. fi
  1213. if [[ "$test_domain_name" == "$HUBZILLA_DOMAIN_NAME" ]]; then
  1214. echo $'Wiki domain name is the same as hubzilla domain name. They must be different'
  1215. exit 65848
  1216. fi
  1217. if [ $GIT_DOMAIN_NAME ]; then
  1218. if [[ "$test_domain_name" == "$GIT_DOMAIN_NAME" ]]; then
  1219. echo $'Wiki domain name is the same as Gogs domain name. They must be different'
  1220. exit 73529
  1221. fi
  1222. fi
  1223. fi
  1224. if [ $OWNCLOUD_DOMAIN_NAME ]; then
  1225. test_domain_name "$OWNCLOUD_DOMAIN_NAME"
  1226. if [[ "$test_domain_name" == "$WIKI_DOMAIN_NAME" ]]; then
  1227. echo $'Owncloud domain name is the same as wiki domain name. They must be different'
  1228. exit 37994
  1229. fi
  1230. if [[ "$test_domain_name" == "$FULLBLOG_DOMAIN_NAME" ]]; then
  1231. echo $'Owncloud domain name is the same as blog domain name. They must be different'
  1232. exit 37936
  1233. fi
  1234. if [[ "$test_domain_name" == "$MICROBLOG_DOMAIN_NAME" ]]; then
  1235. echo $'Owncloud domain name is the same as microblog domain name. They must be different'
  1236. exit 36896
  1237. fi
  1238. if [[ "$test_domain_name" == "$HUBZILLA_DOMAIN_NAME" ]]; then
  1239. echo $'Owncloud domain name is the same as hubzilla domain name. They must be different'
  1240. exit 68365
  1241. fi
  1242. if [ $GIT_DOMAIN_NAME ]; then
  1243. if [[ "$test_domain_name" == "$GIT_DOMAIN_NAME" ]]; then
  1244. echo $'Owncloud domain name is the same as Gogs domain name. They must be different'
  1245. exit 27692
  1246. fi
  1247. fi
  1248. fi
  1249. if [ $FULLBLOG_DOMAIN_NAME ]; then
  1250. test_domain_name "$FULLBLOG_DOMAIN_NAME"
  1251. if [[ "$test_domain_name" == "$WIKI_DOMAIN_NAME" ]]; then
  1252. echo $'Blog domain name is the same as wiki domain name. They must be different'
  1253. exit 62348
  1254. fi
  1255. if [[ "$test_domain_name" == "$OWNCLOUD_DOMAIN_NAME" ]]; then
  1256. echo $'Blog domain name is the same as Owncloud domain name. They must be different'
  1257. exit 84682
  1258. fi
  1259. if [[ "$test_domain_name" == "$MICROBLOG_DOMAIN_NAME" ]]; then
  1260. echo $'Blog domain name is the same as microblog domain name. They must be different'
  1261. exit 38236
  1262. fi
  1263. if [[ "$test_domain_name" == "$HUBZILLA_DOMAIN_NAME" ]]; then
  1264. echo $'Blog domain name is the same as hubzilla domain name. They must be different'
  1265. exit 35483
  1266. fi
  1267. if [ $GIT_DOMAIN_NAME ]; then
  1268. if [[ "$test_domain_name" == "$GIT_DOMAIN_NAME" ]]; then
  1269. echo $'Blog domain name is the same as Gogs domain name. They must be different'
  1270. exit 84695
  1271. fi
  1272. fi
  1273. fi
  1274. if [ $MICROBLOG_DOMAIN_NAME ]; then
  1275. test_domain_name "$MICROBLOG_DOMAIN_NAME"
  1276. if [[ "$test_domain_name" == "$WIKI_DOMAIN_NAME" ]]; then
  1277. echo $'Microblog domain name is the same as wiki domain name. They must be different'
  1278. exit 73924
  1279. fi
  1280. if [[ "$test_domain_name" == "$OWNCLOUD_DOMAIN_NAME" ]]; then
  1281. echo $'Microblog domain name is the same as Owncloud domain name. They must be different'
  1282. exit 73683
  1283. fi
  1284. if [[ "$test_domain_name" == "$FULLBLOG_DOMAIN_NAME" ]]; then
  1285. echo $'Microblog domain name is the same as blog domain name. They must be different'
  1286. exit 26832
  1287. fi
  1288. if [[ "$test_domain_name" == "$HUBZILLA_DOMAIN_NAME" ]]; then
  1289. echo $'Microblog domain name is the same as hubzilla domain name. They must be different'
  1290. exit 678382
  1291. fi
  1292. if [ $GIT_DOMAIN_NAME ]; then
  1293. if [[ "$test_domain_name" == "$GIT_DOMAIN_NAME" ]]; then
  1294. echo $'Microblog domain name is the same as Gogs domain name. They must be different'
  1295. exit 684325
  1296. fi
  1297. fi
  1298. fi
  1299. if [ $HUBZILLA_DOMAIN_NAME ]; then
  1300. test_domain_name "$HUBZILLA_DOMAIN_NAME"
  1301. if [[ "$test_domain_name" == "$WIKI_DOMAIN_NAME" ]]; then
  1302. echo $'Hubzilla domain name is the same as wiki domain name. They must be different'
  1303. exit 83682
  1304. fi
  1305. if [[ "$test_domain_name" == "$OWNCLOUD_DOMAIN_NAME" ]]; then
  1306. echo $'Hubzilla domain name is the same as Owncloud domain name. They must be different'
  1307. exit 65192
  1308. fi
  1309. if [[ "$test_domain_name" == "$FULLBLOG_DOMAIN_NAME" ]]; then
  1310. echo $'Hubzilla domain name is the same as blog domain name. They must be different'
  1311. exit 74817
  1312. fi
  1313. if [[ "$test_domain_name" == "$MICROBLOG_DOMAIN_NAME" ]]; then
  1314. echo $'Hubzilla domain name is the same as microblog domain name. They must be different'
  1315. exit 83683
  1316. fi
  1317. if [ $GIT_DOMAIN_NAME ]; then
  1318. if [[ "$test_domain_name" == "$GIT_DOMAIN_NAME" ]]; then
  1319. echo $'Hubzilla domain name is the same as Gogs domain name. They must be different'
  1320. exit 135523
  1321. fi
  1322. fi
  1323. fi
  1324. if [ $GIT_DOMAIN_NAME ]; then
  1325. test_domain_name "$GIT_DOMAIN_NAME"
  1326. if [[ "$test_domain_name" == "$WIKI_DOMAIN_NAME" ]]; then
  1327. echo $'Hubzilla domain name is the same as wiki domain name. They must be different'
  1328. exit 83682
  1329. fi
  1330. if [[ "$test_domain_name" == "$OWNCLOUD_DOMAIN_NAME" ]]; then
  1331. echo $'Hubzilla domain name is the same as Owncloud domain name. They must be different'
  1332. exit 65192
  1333. fi
  1334. if [[ "$test_domain_name" == "$FULLBLOG_DOMAIN_NAME" ]]; then
  1335. echo $'Hubzilla domain name is the same as blog domain name. They must be different'
  1336. exit 74817
  1337. fi
  1338. if [[ "$test_domain_name" == "$MICROBLOG_DOMAIN_NAME" ]]; then
  1339. echo $'Hubzilla domain name is the same as microblog domain name. They must be different'
  1340. exit 83683
  1341. fi
  1342. if [[ "$test_domain_name" == "$HUBZILLA_DOMAIN_NAME" ]]; then
  1343. echo $'Microblog domain name is the same as hubzilla domain name. They must be different'
  1344. exit 678382
  1345. fi
  1346. fi
  1347. }
  1348. # Checks whether certificates were generated for the given hostname
  1349. function check_certificates {
  1350. if [ ! $1 ]; then
  1351. return
  1352. fi
  1353. if [[ $LETSENCRYPT_ENABLED != "yes" ]]; then
  1354. if [ ! -f /etc/ssl/private/$1.key ]; then
  1355. echo $"Private certificate for $CHECK_HOSTNAME was not created"
  1356. exit 63959
  1357. fi
  1358. if [ ! -f /etc/ssl/certs/$1.crt ]; then
  1359. echo $"Public certificate for $CHECK_HOSTNAME was not created"
  1360. exit 7679
  1361. fi
  1362. else
  1363. if [ ! -f /etc/letsencrypt/live/${1}/privkey.pem ]; then
  1364. echo $"Private certificate for $CHECK_HOSTNAME was not created"
  1365. exit 6282
  1366. fi
  1367. if [ ! -f /etc/letsencrypt/live/${1}/fullchain.pem ]; then
  1368. echo $"Public certificate for $CHECK_HOSTNAME was not created"
  1369. exit 5328
  1370. fi
  1371. fi
  1372. if [ ! -f /etc/ssl/certs/$1.dhparam ]; then
  1373. echo $"Diffie–Hellman parameters for $CHECK_HOSTNAME were not created"
  1374. exit 5989
  1375. fi
  1376. }
  1377. function install_not_on_BBB {
  1378. if grep -Fxq "install_not_on_BBB" $COMPLETION_FILE; then
  1379. return
  1380. fi
  1381. if [[ INSTALLING_ON_BBB == "yes" ]]; then
  1382. return
  1383. fi
  1384. if [ ! $LOCAL_NETWORK_STATIC_IP_ADDRESS ]; then
  1385. return
  1386. fi
  1387. echo '# The loopback network interface' > /etc/network/interfaces
  1388. echo 'auto lo' >> /etc/network/interfaces
  1389. echo 'iface lo inet loopback' >> /etc/network/interfaces
  1390. echo '' >> /etc/network/interfaces
  1391. echo '# The primary network interface' >> /etc/network/interfaces
  1392. echo 'auto eth0' >> /etc/network/interfaces
  1393. echo 'iface eth0 inet static' >> /etc/network/interfaces
  1394. echo " address $LOCAL_NETWORK_STATIC_IP_ADDRESS" >> /etc/network/interfaces
  1395. echo ' netmask 255.255.255.0' >> /etc/network/interfaces
  1396. echo " gateway $ROUTER_IP_ADDRESS" >> /etc/network/interfaces
  1397. echo " dns-nameservers $NAMESERVER1 $NAMESERVER2" >> /etc/network/interfaces
  1398. echo '# Example to keep MAC address between reboots' >> /etc/network/interfaces
  1399. echo '#hwaddress ether DE:AD:BE:EF:CA:FE' >> /etc/network/interfaces
  1400. echo '' >> /etc/network/interfaces
  1401. echo '# The secondary network interface' >> /etc/network/interfaces
  1402. echo '#auto eth1' >> /etc/network/interfaces
  1403. echo '#iface eth1 inet dhcp' >> /etc/network/interfaces
  1404. echo '' >> /etc/network/interfaces
  1405. echo '# WiFi Example' >> /etc/network/interfaces
  1406. echo "#auto $WIFI_INTERFACE" >> /etc/network/interfaces
  1407. echo "#iface $WIFI_INTERFACE inet dhcp" >> /etc/network/interfaces
  1408. echo '# wpa-ssid "essid"' >> /etc/network/interfaces
  1409. echo '# wpa-psk "password"' >> /etc/network/interfaces
  1410. echo '' >> /etc/network/interfaces
  1411. echo '# Ethernet/RNDIS gadget (g_ether)' >> /etc/network/interfaces
  1412. echo '# ... or on host side, usbnet and random hwaddr' >> /etc/network/interfaces
  1413. echo '# Note on some boards, usb0 is automaticly setup with an init script' >> /etc/network/interfaces
  1414. echo '#iface usb0 inet static' >> /etc/network/interfaces
  1415. echo '# address 192.168.7.2' >> /etc/network/interfaces
  1416. echo '# netmask 255.255.255.0' >> /etc/network/interfaces
  1417. echo '# network 192.168.7.0' >> /etc/network/interfaces
  1418. echo '# gateway 192.168.7.1' >> /etc/network/interfaces
  1419. echo 'install_not_on_BBB' >> $COMPLETION_FILE
  1420. }
  1421. function mark_admin_user_account {
  1422. if ! grep -q "Admin user:" $COMPLETION_FILE; then
  1423. echo "Admin user:$MY_USERNAME" >> $COMPLETION_FILE
  1424. fi
  1425. }
  1426. function mark_blog_domain {
  1427. if [[ $SYSTEM_TYPE == "$VARIANT_CLOUD" || $SYSTEM_TYPE == "$VARIANT_MAILBOX" || $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_SOCIAL" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_DEVELOPER" || $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  1428. return
  1429. fi
  1430. if ! grep -q "Blog domain:" $COMPLETION_FILE; then
  1431. echo "Blog domain:$FULLBLOG_DOMAIN_NAME" >> $COMPLETION_FILE
  1432. fi
  1433. }
  1434. function randomize_cron {
  1435. # The predictable default timing of Debian cron jobs might
  1436. # be exploitable knowledge. Avoid too much predictability
  1437. # by randomizing the times when cron jobs run
  1438. if grep -Fxq "randomize_cron" $COMPLETION_FILE; then
  1439. return
  1440. fi
  1441. # randomize the day on which the weekly cron job runs
  1442. randdow=$(($RANDOM%6+1))
  1443. sed -i "s|\* \* 7|* * $randdow|g" /etc/crontab
  1444. # randomize the time when the weekly cron job runs
  1445. randmin=$(($RANDOM%60))
  1446. randhr=$(($RANDOM%3+1))
  1447. sed -i "s|47 6|$randmin $randhr|g" /etc/crontab
  1448. # randomize the time when the daily cron job runs
  1449. randmin=$(($RANDOM%60))
  1450. randhr=$(($RANDOM%3+4))
  1451. sed -i "s|25 6\t\* \* \*|$randmin $randhr\t* * *|g" /etc/crontab
  1452. # randomize the time when the hourly cron job runs
  1453. randmin=$(($RANDOM%60))
  1454. sed -i "s|17 \*\t|$randmin *\t|g" /etc/crontab
  1455. # randomize monthly cron job time and day
  1456. randmin=$(($RANDOM%60))
  1457. randhr=$(($RANDOM%22+1))
  1458. randdom=$(($RANDOM%27+1))
  1459. sed -i "s|52 6\t|$randmin $randhr\t|g" /etc/crontab
  1460. sed -i "s|\t1 \* \*|\t$randdom * *|g" /etc/crontab
  1461. service cron restart
  1462. echo 'randomize_cron' >> $COMPLETION_FILE
  1463. }
  1464. function get_cjdns_public_key {
  1465. if [ -f /home/$MY_USERNAME/README ]; then
  1466. if grep -q "cjdns public key" /home/$MY_USERNAME/README; then
  1467. if [ ! $CJDNS_PUBLIC_KEY ]; then
  1468. CJDNS_PUBLIC_KEY=$(cat /home/$MY_USERNAME/README | grep "cjdns public key" | awk -F ':' '{print $2}' | sed 's/^ *//')
  1469. fi
  1470. fi
  1471. fi
  1472. }
  1473. function get_cjdns_private_key {
  1474. if [ -f /home/$MY_USERNAME/README ]; then
  1475. if grep -q "cjdns private key" /home/$MY_USERNAME/README; then
  1476. if [ ! $CJDNS_PRIVATE_KEY ]; then
  1477. CJDNS_PRIVATE_KEY=$(cat /home/$MY_USERNAME/README | grep "cjdns private key" | awk -F ':' '{print $2}' | sed 's/^ *//')
  1478. fi
  1479. fi
  1480. fi
  1481. }
  1482. function get_cjdns_ipv6_address {
  1483. if [ -f /home/$MY_USERNAME/README ]; then
  1484. if grep -q "cjdns IPv6 address" /home/$MY_USERNAME/README; then
  1485. if [ ! $CJDNS_IPV6 ]; then
  1486. CJDNS_IPV6=$(cat /home/$MY_USERNAME/README | grep "cjdns IPv6 address" | awk -F ':' '{print $2}' | sed 's/^ *//')
  1487. fi
  1488. fi
  1489. fi
  1490. }
  1491. function get_cjdns_port {
  1492. if [ -f /home/$MY_USERNAME/README ]; then
  1493. if grep -q "cjdns port" /home/$MY_USERNAME/README; then
  1494. if [ ! $CJDNS_PORT ]; then
  1495. CJDNS_PORT=$(cat /home/$MY_USERNAME/README | grep "cjdns port" | awk -F ':' '{print $2}' | sed 's/^ *//')
  1496. fi
  1497. fi
  1498. fi
  1499. }
  1500. function get_cjdns_password {
  1501. if [ -f /home/$MY_USERNAME/README ]; then
  1502. if grep -q "cjdns password" /home/$MY_USERNAME/README; then
  1503. if [ ! $CJDNS_PASSWORD ]; then
  1504. CJDNS_PASSWORD=$(cat /home/$MY_USERNAME/README | grep "cjdns password" | awk -F ':' '{print $2}' | sed 's/^ *//')
  1505. fi
  1506. fi
  1507. fi
  1508. }
  1509. # script to automatically renew any Let's Encrypt certificates
  1510. function letsencrypt_renewals {
  1511. renewals_script=/etc/cron.monthly/letsencrypt
  1512. renewal_failure_msg=$'The certificate for $LETSENCRYPT_DOMAIN could not be renewed'
  1513. renewal_email_title=$'${PROJECT_NAME} Lets Encrypt certificate renewal'
  1514. echo '#!/bin/bash' > $renewals_script
  1515. echo '' >> $renewals_script
  1516. echo "PROJECT_NAME='${PROJECT_NAME}'" >> $renewals_script
  1517. echo 'COMPLETION_FILE=$HOME/${PROJECT_NAME}-completed.txt' >> $renewals_script
  1518. echo '' >> $renewals_script
  1519. echo 'if [ -d /etc/letsencrypt ]; then' >> $renewals_script
  1520. echo -n ' ADMIN_USERNAME=$(cat $COMPLETION_FILE | grep "Admin user" | ' >> $renewals_script
  1521. echo -n "awk -F ':' '{print " >> $renewals_script
  1522. echo -n '$2' >> $renewals_script
  1523. echo "}')" >> $renewals_script
  1524. echo ' ADMIN_EMAIL_ADDRESS=$ADMIN_USERNAME@$HOSTNAME' >> $renewals_script
  1525. echo ' for d in /etc/letsencrypt/live/*/ ; do' >> $renewals_script
  1526. echo -n ' LETSENCRYPT_DOMAIN=$(echo "$d" | ' >> $renewals_script
  1527. echo -n "awk -F '/' '{print " >> $renewals_script
  1528. echo -n '$5' >> $renewals_script
  1529. echo "}')" >> $renewals_script
  1530. echo ' if [ -f /etc/nginx/sites-available/$LETSENCRYPT_DOMAIN ]; then' >> $renewals_script
  1531. echo ' ${PROJECT_NAME}-renew-cert -h $LETSENCRYPT_DOMAIN -p letsencrypt' >> $renewals_script
  1532. echo ' if [ ! "$?" = "0" ]; then' >> $renewals_script
  1533. echo -n " echo '$renewal_failure_msg' | mail -s '$renewal_email_title' " >> $renewals_script
  1534. echo '$ADMIN_EMAIL_ADDRESS' >> $renewals_script
  1535. echo ' fi' >> $renewals_script
  1536. echo ' fi' >> $renewals_script
  1537. echo ' done' >> $renewals_script
  1538. echo 'fi' >> $renewals_script
  1539. chmod +x $renewals_script
  1540. }
  1541. function save_firewall_settings {
  1542. iptables-save > /etc/firewall.conf
  1543. ip6tables-save > /etc/firewall6.conf
  1544. printf '#!/bin/sh\n' > /etc/network/if-up.d/iptables
  1545. printf 'iptables-restore < /etc/firewall.conf\n' >> /etc/network/if-up.d/iptables
  1546. printf 'ip6tables-restore < /etc/firewall6.conf\n' >> /etc/network/if-up.d/iptables
  1547. chmod +x /etc/network/if-up.d/iptables
  1548. }
  1549. function enable_ipv6 {
  1550. # endure that ipv6 is enabled and can route
  1551. sed -i 's/net.ipv6.conf.all.disable_ipv6.*/net.ipv6.conf.all.disable_ipv6 = 0/g' /etc/sysctl.conf
  1552. #sed -i "s/net.ipv6.conf.all.accept_redirects.*/net.ipv6.conf.all.accept_redirects = 1/g" /etc/sysctl.conf
  1553. #sed -i "s/net.ipv6.conf.all.accept_source_route.*/net.ipv6.conf.all.accept_source_route = 1/g" /etc/sysctl.conf
  1554. sed -i "s/net.ipv6.conf.all.forwarding.*/net.ipv6.conf.all.forwarding=1/g" /etc/sysctl.conf
  1555. echo 1 > /proc/sys/net/ipv6/conf/all/forwarding
  1556. }
  1557. function mesh_cjdns {
  1558. if [[ $ENABLE_CJDNS != "yes" ]]; then
  1559. return
  1560. fi
  1561. # update to the next commit
  1562. if [ -d /etc/cjdns ]; then
  1563. if grep -q "cjdns commit" $COMPLETION_FILE; then
  1564. CURRENT_CJDNS_COMMIT=$(grep "cjdns commit" $COMPLETION_FILE | awk -F ':' '{print $2}')
  1565. if [[ "$CURRENT_CJDNS_COMMIT" != "$CJDNS_COMMIT" ]]; then
  1566. cd /etc/cjdns
  1567. git stash
  1568. git checkout master
  1569. git pull
  1570. git checkout $CJDNS_COMMIT -b $CJDNS_COMMIT
  1571. sed -i "s/cjdns commit.*/cjdns commit:$CJDNS_COMMIT/g" $COMPLETION_FILE
  1572. ./do
  1573. fi
  1574. fi
  1575. fi
  1576. if grep -Fxq "mesh_cjdns" $COMPLETION_FILE; then
  1577. return
  1578. fi
  1579. apt-get -y install nodejs git build-essential nmap
  1580. # if a README exists then obtain the cjdns parameters
  1581. get_cjdns_ipv6_address
  1582. get_cjdns_public_key
  1583. get_cjdns_private_key
  1584. get_cjdns_port
  1585. get_cjdns_password
  1586. # special compile settings for running ./do on the Beaglebone Black
  1587. if [[ $INSTALLING_ON_BBB == "yes" ]]; then
  1588. CFLAGS="-O2 -march=armv7-a -mtune=cortex-a8 -mfpu=neon -ftree-vectorize -ffast-math -mfloat-abi=hard -marm -Wno-error=maybe-uninitialized"
  1589. export LDFLAGS="$CFLAGS"
  1590. fi
  1591. if [ ! -d /etc/cjdns ]; then
  1592. git clone $CJDNS_REPO /etc/cjdns
  1593. cd /etc/cjdns
  1594. git checkout $CJDNS_COMMIT -b $CJDNS_COMMIT
  1595. if ! grep -q "cjdns commit" $COMPLETION_FILE; then
  1596. echo "cjdns commit:$CJDNS_COMMIT" >> $COMPLETION_FILE
  1597. else
  1598. sed -i "s/cjdns commit.*/cjdns commit:$CJDNS_COMMIT/g" $COMPLETION_FILE
  1599. fi
  1600. ./do
  1601. if [ ! "$?" = "0" ]; then
  1602. exit 7439
  1603. fi
  1604. # create a configuration
  1605. if [ ! -f /etc/cjdns/cjdroute.conf ]; then
  1606. ./cjdroute --genconf > /etc/cjdns/cjdroute.conf
  1607. if [ ! "$?" = "0" ]; then
  1608. exit 5922
  1609. fi
  1610. fi
  1611. # create a user to run as
  1612. useradd cjdns
  1613. else
  1614. cd /etc/cjdns
  1615. git pull
  1616. ./do
  1617. if [ ! "$?" = "0" ]; then
  1618. exit 9926
  1619. fi
  1620. fi
  1621. # set permissions
  1622. chown -R cjdns:cjdns /etc/cjdns
  1623. chmod 600 /etc/cjdns/cjdroute.conf
  1624. /sbin/ip tuntap add mode tun user cjdns dev cjdroute0
  1625. # insert values into the configuration file
  1626. if [ $CJDNS_PRIVATE_KEY ]; then
  1627. sed -i "s/\"privateKey\":.*/\"privateKey\": \"$CJDNS_PRIVATE_KEY\",/g" /etc/cjdns/cjdroute.conf
  1628. else
  1629. CJDNS_PRIVATE_KEY=$(cat /etc/cjdns/cjdroute.conf | grep '"privateKey"' | awk -F '"' '{print $4}' | sed -n 1p)
  1630. fi
  1631. if [ $CJDNS_PUBLIC_KEY ]; then
  1632. sed -i "s/\"publicKey\":.*/\"publicKey\": \"$CJDNS_PUBLIC_KEY\",/g" /etc/cjdns/cjdroute.conf
  1633. else
  1634. CJDNS_PUBLIC_KEY=$(cat /etc/cjdns/cjdroute.conf | grep '"publicKey"' | awk -F '"' '{print $4}' | sed -n 1p)
  1635. fi
  1636. if [ $CJDNS_IPV6 ]; then
  1637. sed -i "s/\"ipv6\":.*/\"ipv6\": \"$CJDNS_IPV6\",/g" /etc/cjdns/cjdroute.conf
  1638. else
  1639. CJDNS_IPV6=$(cat /etc/cjdns/cjdroute.conf | grep '"ipv6"' | awk -F '"' '{print $4}' | sed -n 1p)
  1640. fi
  1641. if [ $CJDNS_PASSWORD ]; then
  1642. sed -i "0,/{\"password\":.*/s//{\"password\": \"$CJDNS_PASSWORD\"}/g" /etc/cjdns/cjdroute.conf
  1643. else
  1644. CJDNS_PASSWORD=$(cat /etc/cjdns/cjdroute.conf | grep '"password"' | awk -F '"' '{print $4}' | sed -n 1p)
  1645. fi
  1646. if [ $CJDNS_PORT ]; then
  1647. sed -i "s/\"bind\": \"0.0.0.0:.*/\"bind\": \"0.0.0.0:$CJDNS_PORT\",/g" /etc/cjdns/cjdroute.conf
  1648. else
  1649. CJDNS_PORT=$(cat /etc/cjdns/cjdroute.conf | grep '"bind": "0.0.0.0:' | awk -F '"' '{print $4}' | awk -F ':' '{print $2}' | sed -n 1p)
  1650. fi
  1651. enable_ipv6
  1652. echo '#!/bin/sh -e' > /etc/init.d/cjdns
  1653. echo '### BEGIN INIT INFO' >> /etc/init.d/cjdns
  1654. echo '# hyperboria.sh - An init script (/etc/init.d/) for cjdns' >> /etc/init.d/cjdns
  1655. echo '# Provides: cjdroute' >> /etc/init.d/cjdns
  1656. echo '# Required-Start: $remote_fs $network' >> /etc/init.d/cjdns
  1657. echo '# Required-Stop: $remote_fs $network' >> /etc/init.d/cjdns
  1658. echo '# Default-Start: 2 3 4 5' >> /etc/init.d/cjdns
  1659. echo '# Default-Stop: 0 1 6' >> /etc/init.d/cjdns
  1660. echo '# Short-Description: Cjdns router' >> /etc/init.d/cjdns
  1661. echo '# Description: A routing engine designed for security, scalability, speed and ease of use.' >> /etc/init.d/cjdns
  1662. echo '# cjdns git repo: https://github.com/cjdelisle/cjdns/' >> /etc/init.d/cjdns
  1663. echo '### END INIT INFO' >> /etc/init.d/cjdns
  1664. echo '' >> /etc/init.d/cjdns
  1665. echo 'PROG="cjdroute"' >> /etc/init.d/cjdns
  1666. echo 'GIT_PATH="/etc/cjdns"' >> /etc/init.d/cjdns
  1667. echo 'PROG_PATH="/etc/cjdns"' >> /etc/init.d/cjdns
  1668. echo 'CJDNS_CONFIG="cjdroute.conf"' >> /etc/init.d/cjdns
  1669. echo 'CJDNS_USER="cjdns"' >> /etc/init.d/cjdns
  1670. echo "CJDNS_IP='$CJDNS_IPV6'" >> /etc/init.d/cjdns
  1671. echo '' >> /etc/init.d/cjdns
  1672. echo 'start() {' >> /etc/init.d/cjdns
  1673. echo ' # Start it up with the user cjdns' >> /etc/init.d/cjdns
  1674. echo ' if [ $(pgrep cjdroute | wc -l) != 0 ];' >> /etc/init.d/cjdns
  1675. echo ' then' >> /etc/init.d/cjdns
  1676. echo ' echo "cjdroute is already running. Doing nothing..."' >> /etc/init.d/cjdns
  1677. echo ' else' >> /etc/init.d/cjdns
  1678. echo ' echo " * Starting cjdroute"' >> /etc/init.d/cjdns
  1679. echo ' su -c "$PROG_PATH/$PROG < $PROG_PATH/$CJDNS_CONFIG" - $CJDNS_USER' >> /etc/init.d/cjdns
  1680. echo ' /sbin/ip addr add $CJDNS_IP/8 dev tun0' >> /etc/init.d/cjdns
  1681. echo ' /sbin/ip link set mtu 1312 dev tun0' >> /etc/init.d/cjdns
  1682. echo ' /sbin/ip link set tun0 up' >> /etc/init.d/cjdns
  1683. echo ' /sbin/ip tuntap add mode tun user cjdns dev tun0' >> /etc/init.d/cjdns
  1684. echo ' fi' >> /etc/init.d/cjdns
  1685. echo '}' >> /etc/init.d/cjdns
  1686. echo '' >> /etc/init.d/cjdns
  1687. echo 'stop() {' >> /etc/init.d/cjdns
  1688. echo '' >> /etc/init.d/cjdns
  1689. echo ' if [ $(pgrep cjdroute | wc -l) != 2 ];' >> /etc/init.d/cjdns
  1690. echo ' then' >> /etc/init.d/cjdns
  1691. echo ' echo "cjdns isnt running."' >> /etc/init.d/cjdns
  1692. echo ' else' >> /etc/init.d/cjdns
  1693. echo ' echo "Killing cjdroute"' >> /etc/init.d/cjdns
  1694. echo ' killall cjdroute' >> /etc/init.d/cjdns
  1695. echo ' fi' >> /etc/init.d/cjdns
  1696. echo '}' >> /etc/init.d/cjdns
  1697. echo '' >> /etc/init.d/cjdns
  1698. echo 'status() {' >> /etc/init.d/cjdns
  1699. echo ' if [ $(pgrep cjdroute | wc -l) != 0 ];' >> /etc/init.d/cjdns
  1700. echo ' then' >> /etc/init.d/cjdns
  1701. echo ' echo "Cjdns is running"' >> /etc/init.d/cjdns
  1702. echo ' else' >> /etc/init.d/cjdns
  1703. echo ' echo "Cjdns is not running"' >> /etc/init.d/cjdns
  1704. echo ' fi' >> /etc/init.d/cjdns
  1705. echo '}' >> /etc/init.d/cjdns
  1706. echo '' >> /etc/init.d/cjdns
  1707. echo ' update() {' >> /etc/init.d/cjdns
  1708. echo ' cd $GIT_PATH' >> /etc/init.d/cjdns
  1709. echo ' echo "Updating..."' >> /etc/init.d/cjdns
  1710. echo ' git pull' >> /etc/init.d/cjdns
  1711. echo ' ./do' >> /etc/init.d/cjdns
  1712. echo '}' >> /etc/init.d/cjdns
  1713. echo '' >> /etc/init.d/cjdns
  1714. echo '## Check to see if we are running as root first.' >> /etc/init.d/cjdns
  1715. echo 'if [ "$(id -u)" != "0" ]; then' >> /etc/init.d/cjdns
  1716. echo ' echo "This script must be run as root" 1>&2' >> /etc/init.d/cjdns
  1717. echo ' exit 1' >> /etc/init.d/cjdns
  1718. echo 'fi' >> /etc/init.d/cjdns
  1719. echo '' >> /etc/init.d/cjdns
  1720. echo 'case $1 in' >> /etc/init.d/cjdns
  1721. echo ' start)' >> /etc/init.d/cjdns
  1722. echo ' start' >> /etc/init.d/cjdns
  1723. echo ' exit 0' >> /etc/init.d/cjdns
  1724. echo ' ;;' >> /etc/init.d/cjdns
  1725. echo ' stop)' >> /etc/init.d/cjdns
  1726. echo ' stop' >> /etc/init.d/cjdns
  1727. echo ' exit 0' >> /etc/init.d/cjdns
  1728. echo ' ;;' >> /etc/init.d/cjdns
  1729. echo ' reload|restart|force-reload)' >> /etc/init.d/cjdns
  1730. echo ' stop' >> /etc/init.d/cjdns
  1731. echo ' sleep 1' >> /etc/init.d/cjdns
  1732. echo ' start' >> /etc/init.d/cjdns
  1733. echo ' exit 0' >> /etc/init.d/cjdns
  1734. echo ' ;;' >> /etc/init.d/cjdns
  1735. echo ' status)' >> /etc/init.d/cjdns
  1736. echo ' status' >> /etc/init.d/cjdns
  1737. echo ' exit 0' >> /etc/init.d/cjdns
  1738. echo ' ;;' >> /etc/init.d/cjdns
  1739. echo ' update|upgrade)' >> /etc/init.d/cjdns
  1740. echo ' update' >> /etc/init.d/cjdns
  1741. echo ' stop' >> /etc/init.d/cjdns
  1742. echo ' sleep 2' >> /etc/init.d/cjdns
  1743. echo ' start' >> /etc/init.d/cjdns
  1744. echo ' exit 0' >> /etc/init.d/cjdns
  1745. echo ' ;;' >> /etc/init.d/cjdns
  1746. echo ' **)' >> /etc/init.d/cjdns
  1747. echo ' echo "Usage: $0 (start|stop|restart|status|update)" 1>&2' >> /etc/init.d/cjdns
  1748. echo ' exit 1' >> /etc/init.d/cjdns
  1749. echo ' ;;' >> /etc/init.d/cjdns
  1750. echo 'esac' >> /etc/init.d/cjdns
  1751. chmod +x /etc/init.d/cjdns
  1752. update-rc.d cjdns defaults
  1753. service cjdns start
  1754. if [ ! "$?" = "0" ]; then
  1755. systemctl status cjdns.service
  1756. exit 8260
  1757. fi
  1758. apt-get -y install radvd
  1759. echo 'interface eth0' > /etc/radvd.conf
  1760. echo '{' >> /etc/radvd.conf
  1761. echo ' AdvSendAdvert on;' >> /etc/radvd.conf
  1762. echo ' prefix fdfc::1/64' >> /etc/radvd.conf
  1763. echo ' {' >> /etc/radvd.conf
  1764. echo ' AdvRouterAddr on;' >> /etc/radvd.conf
  1765. echo ' };' >> /etc/radvd.conf
  1766. echo '};' >> /etc/radvd.conf
  1767. service radvd restart
  1768. if [ ! "$?" = "0" ]; then
  1769. systemctl status radvd.service
  1770. exit 4395
  1771. fi
  1772. if ! grep -q "# Mesh Networking (cjdns)" /etc/network/interfaces; then
  1773. echo '' >> /etc/network/interfaces
  1774. echo '# Mesh Networking (cjdns)' >> /etc/network/interfaces
  1775. echo 'iface eth0 inet6 static' >> /etc/network/interfaces
  1776. echo ' pre-up modprobe ipv6' >> /etc/network/interfaces
  1777. echo ' address fdfc:0000:0000:0000:0000:0000:0000:0001' >> /etc/network/interfaces
  1778. echo ' netmask 64' >> /etc/network/interfaces
  1779. service network-manager restart
  1780. if [ ! "$?" = "0" ]; then
  1781. systemctl status networking.service
  1782. exit 6949
  1783. fi
  1784. fi
  1785. ip6tables -A INPUT -p udp --dport $CJDNS_PORT -j ACCEPT
  1786. ip6tables -A INPUT -p tcp --dport $CJDNS_PORT -j ACCEPT
  1787. save_firewall_settings
  1788. if ! grep -q $"Mesh Networking (cjdns)" /home/$MY_USERNAME/README; then
  1789. CURRENT_IP_ADDRESS=$(ip addr show | grep "inet " | sed -n 2p | awk -F ' ' '{print $2}' | awk -F '/' '{print $1}')
  1790. echo '' >> /home/$MY_USERNAME/README
  1791. echo '' >> /home/$MY_USERNAME/README
  1792. echo $'Mesh Networking (cjdns)' >> /home/$MY_USERNAME/README
  1793. echo '=======================' >> /home/$MY_USERNAME/README
  1794. echo $"cjdns IPv6 address: $CJDNS_IPV6" >> /home/$MY_USERNAME/README
  1795. echo $"cjdns public key: $CJDNS_PUBLIC_KEY" >> /home/$MY_USERNAME/README
  1796. echo $"cjdns private key: $CJDNS_PRIVATE_KEY" >> /home/$MY_USERNAME/README
  1797. echo $"cjdns password: $CJDNS_PASSWORD" >> /home/$MY_USERNAME/README
  1798. echo $"cjdns port: $CJDNS_PORT" >> /home/$MY_USERNAME/README
  1799. echo '' >> /home/$MY_USERNAME/README
  1800. echo $"Forward port $CJDNS_PORT from your internet router to the ${PROJECT_NAME}" >> /home/$MY_USERNAME/README
  1801. echo '' >> /home/$MY_USERNAME/README
  1802. echo $'Below is an example of your connection credentials' >> /home/$MY_USERNAME/README
  1803. echo $'that you can give to other people so they can connect' >> /home/$MY_USERNAME/README
  1804. echo $'to you using your default password' >> /home/$MY_USERNAME/README
  1805. echo $'Adding a unique password for each user is advisable' >> /home/$MY_USERNAME/README
  1806. echo $'so that leaks can be isolated.' >> /home/$MY_USERNAME/README
  1807. echo '' >> /home/$MY_USERNAME/README
  1808. echo "\"$CURRENT_IP_ADDRESS:$CJDNS_PORT\":{\"password\":\"$CJDNS_PASSWORD\",\"publicKey\":\"$CJDNS_PUBLIC_KEY\"}" >> /home/$MY_USERNAME/README
  1809. echo '' >> /home/$MY_USERNAME/README
  1810. echo $'More is not better. 3-5 cjdns peers is good. 30 peers is bad.' >> /home/$MY_USERNAME/README
  1811. echo '' >> /home/$MY_USERNAME/README
  1812. echo $'NEVER USE A PUBLIC PEER. These degrade the network and make it centralized.' >> /home/$MY_USERNAME/README
  1813. echo $'Each node can handle many peers, but no node can handle the entire internet.' >> /home/$MY_USERNAME/README
  1814. echo $'As this network grows any public peer will simply become saturated and' >> /home/$MY_USERNAME/README
  1815. echo $'useless causing issues for the entire network.' >> /home/$MY_USERNAME/README
  1816. echo $'Please report anyone offering you a public peer as they are promoting shared' >> /home/$MY_USERNAME/README
  1817. echo $'passwords which could lead to people pretending to be you. A peering pass' >> /home/$MY_USERNAME/README
  1818. echo $'should not contain someone elses nickname or info but should contain yours' >> /home/$MY_USERNAME/README
  1819. echo $'to ensure it is not shared. It also helps when editing the conf to know who' >> /home/$MY_USERNAME/README
  1820. echo $'each password is for.' >> /home/$MY_USERNAME/README
  1821. echo '' >> /home/$MY_USERNAME/README
  1822. echo $'Possible cjdns destinations of interest:' >> /home/$MY_USERNAME/README
  1823. echo ' http://transitiontech.ca/faq' >> /home/$MY_USERNAME/README
  1824. echo ' http://cjdns.ca/hypeirc.txt' >> /home/$MY_USERNAME/README
  1825. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
  1826. chmod 600 /home/$MY_USERNAME/README
  1827. fi
  1828. echo 'mesh_cjdns' >> $COMPLETION_FILE
  1829. }
  1830. function mesh_cjdns_tools {
  1831. if grep -Fxq "mesh_cjdns_tools" $COMPLETION_FILE; then
  1832. return
  1833. fi
  1834. if [[ $ENABLE_CJDNS != "yes" ]]; then
  1835. return
  1836. fi
  1837. if [ ! -d /etc/cjdns ]; then
  1838. mesh_cjdns
  1839. fi
  1840. apt-get -y install golang mercurial
  1841. if [ ! -f ~/.bashrc ]; then
  1842. touch ~/.bashrc
  1843. fi
  1844. if ! grep -q "export GOPATH=" ~/.bashrc; then
  1845. echo 'export GOPATH=$HOME/projects/go' >> ~/.bashrc
  1846. fi
  1847. if ! grep -q "export PATH=$PATH:$HOME/projects/go/bin" ~/.bashrc; then
  1848. echo 'export PATH=$PATH:$HOME/projects/go/bin' >> ~/.bashrc
  1849. fi
  1850. . ~/.bashrc
  1851. export GOPATH=$HOME/projects/go
  1852. export PATH=$PATH:$HOME/projects/go/bin
  1853. go get github.com/inhies/cjdcmd
  1854. if [ ! -f $HOME/projects/go/bin/cjdcmd ]; then
  1855. echo $'cjdcmd was not compiled. Check your golang installation'
  1856. exit 7439
  1857. fi
  1858. cp $HOME/projects/go/bin/cjdcmd /usr/bin
  1859. # initialise from the cjdns config
  1860. /usr/bin/cjdcmd cjdnsadmin -file /etc/cjdns/cjdroute.conf
  1861. echo 'mesh_cjdns_tools' >> $COMPLETION_FILE
  1862. }
  1863. function install_zeronet_blog {
  1864. if [[ $SYSTEM_TYPE != "$VARIANT_MESH" ]]; then
  1865. return
  1866. fi
  1867. if [ -d /opt/zeronet/ZeroBlog ]; then
  1868. if grep -q "ZeroNet Blog commit" $COMPLETION_FILE; then
  1869. CURRENT_ZERONET_BLOG_COMMIT=$(grep "ZeroNet Blog commit" $COMPLETION_FILE | awk -F ':' '{print $2}')
  1870. if [[ "$CURRENT_ZERONET_BLOG_COMMIT" != "$ZERONET_BLOG_COMMIT" ]]; then
  1871. cd /opt/zeronet/ZeroBlog
  1872. git stash
  1873. git checkout master
  1874. git pull
  1875. git checkout $ZERONET_BLOG_COMMIT -b $ZERONET_BLOG_COMMIT
  1876. sed -i "s/ZeroNet Blog commit.*/ZeroNet Blog commit:$ZERONET_BLOG_COMMIT/g" $COMPLETION_FILE
  1877. fi
  1878. else
  1879. echo "ZeroNet Blog commit:$ZERONET_BLOG_COMMIT" >> $COMPLETION_FILE
  1880. fi
  1881. fi
  1882. if grep -Fxq "install_zeronet_blog" $COMPLETION_FILE; then
  1883. return
  1884. fi
  1885. if [ ! -f /home/$MY_USERNAME/README ]; then
  1886. touch /home/$MY_USERNAME/README
  1887. fi
  1888. if grep -q "ZeroNet Blog address" /home/$MY_USERNAME/README; then
  1889. return
  1890. fi
  1891. if [ ! -d /etc/avahi ]; then
  1892. echo $'Avahi is not installed'
  1893. exit 736
  1894. fi
  1895. ZERONET_DEFAULT_BLOG_TITLE="${MY_USERNAME}'s Blog"
  1896. cd /opt/zeronet
  1897. python zeronet.py --batch siteCreate 2> /opt/zeronet/blog.txt
  1898. if [ ! -f /opt/zeronet/blog.txt ]; then
  1899. echo $'Unable to create blog'
  1900. exit 479
  1901. fi
  1902. blog_address=$(cat blog.txt | grep "Site address" | awk -F ':' '{print $2}')
  1903. blog_private_key=$(cat blog.txt | grep "Site private key" | awk -F ':' '{print $2}')
  1904. ZERONET_BLOG_ADDRESS=${blog_address//[[:blank:]]/}
  1905. ZERONET_BLOG_PRIVATE_KEY=${blog_private_key//[[:blank:]]/}
  1906. if [ ${#ZERONET_BLOG_ADDRESS} -lt 20 ]; then
  1907. echo $"Address: $ZERONET_BLOG_ADDRESS"
  1908. echo $"Public key: $ZERONET_BLOG_PRIVATE_KEY"
  1909. echo $'Unable to create zeronet blog address'
  1910. exit 7358
  1911. fi
  1912. if [ ${#ZERONET_BLOG_PRIVATE_KEY} -lt 20 ]; then
  1913. echo $"Address: $ZERONET_BLOG_ADDRESS"
  1914. echo $"Public key: $ZERONET_BLOG_PRIVATE_KEY"
  1915. echo $'Unable to create zeronet blog private key'
  1916. exit 1639
  1917. fi
  1918. if [ ! -d "/opt/zeronet/data/$ZERONET_BLOG_ADDRESS" ]; then
  1919. echo $"Unable to find site directory: /opt/zeronet/data/$ZERONET_BLOG_ADDRESS"
  1920. exit 7638
  1921. fi
  1922. git clone $ZERONET_BLOG_REPO ZeroBlog
  1923. if [ ! -d /opt/zeronet/ZeroBlog ]; then
  1924. echo $'ZeroBlog repo could not be cloned'
  1925. exit 6739
  1926. fi
  1927. cd /opt/zeronet/ZeroBlog
  1928. git checkout $ZERONET_BLOG_COMMIT -b $ZERONET_BLOG_COMMIT
  1929. if ! grep -q "ZeroNet Blog commit" $COMPLETION_FILE; then
  1930. echo "ZeroNet Blog commit:$ZERONET_BLOG_COMMIT" >> $COMPLETION_FILE
  1931. else
  1932. sed -i "s/ZeroNet Blog commit.*/ZeroNet Blog commit:$ZERONET_BLOG_COMMIT/g" $COMPLETION_FILE
  1933. fi
  1934. echo $"ZeroNet Blog address: $ZERONET_BLOG_ADDRESS"
  1935. echo $"ZeroNet Blog private key: $ZERONET_BLOG_PRIVATE_KEY"
  1936. cp -r /opt/zeronet/ZeroBlog/* /opt/zeronet/data/$ZERONET_BLOG_ADDRESS
  1937. if [ ! -d /opt/zeronet/data/$ZERONET_BLOG_ADDRESS/data ]; then
  1938. mkdir /opt/zeronet/data/$ZERONET_BLOG_ADDRESS/data
  1939. fi
  1940. cp /opt/zeronet/data/$ZERONET_BLOG_ADDRESS/data-default/data.json /opt/zeronet/data/$ZERONET_BLOG_ADDRESS/data
  1941. sed -i "s/MyZeroBlog/$ZERONET_DEFAULT_BLOG_TITLE/g" /opt/zeronet/data/$ZERONET_BLOG_ADDRESS/data/data.json
  1942. sed -i "s/My ZeroBlog./$ZERONET_DEFAULT_BLOG_TAGLINE/g" /opt/zeronet/data/$ZERONET_BLOG_ADDRESS/data/data.json
  1943. sed -i "s/ZeroBlog Demo/$ZERONET_DEFAULT_BLOG_TITLE/g" /opt/zeronet/data/$ZERONET_BLOG_ADDRESS/index.html
  1944. sed -i "s|<h3 class=\"description\">.*|<h3 class=\"description\">$ZERONET_DEFAULT_BLOG_TAGLINE</h3>|g" /opt/zeronet/data/$ZERONET_BLOG_ADDRESS/index.html
  1945. sed -i "s/Blogging platform Demo/Blogging platform/g" /opt/zeronet/data/$ZERONET_BLOG_ADDRESS/content.json
  1946. python zeronet.py siteSign $ZERONET_BLOG_ADDRESS $ZERONET_BLOG_PRIVATE_KEY
  1947. # Add an avahi service
  1948. echo '<?xml version="1.0" standalone="no"?><!--*-nxml-*-->' > /tmp/zeronet-blog.service
  1949. echo '<!DOCTYPE service-group SYSTEM "avahi-service.dtd">' >> /tmp/zeronet-blog.service
  1950. echo '<service-group>' >> /tmp/zeronet-blog.service
  1951. echo ' <name replace-wildcards="yes">%h ZeroNet Blog</name>' >> /tmp/zeronet-blog.service
  1952. echo ' <service>' >> /tmp/zeronet-blog.service
  1953. echo ' <type>_zeronet._udp</type>' >> /tmp/zeronet-blog.service
  1954. echo " <port>$ZERONET_PORT</port>" >> /tmp/zeronet-blog.service
  1955. echo " <txt-record>$ZERONET_URL/$ZERONET_BLOG_ADDRESS</txt-record>" >> /tmp/zeronet-blog.service
  1956. echo ' </service>' >> /tmp/zeronet-blog.service
  1957. echo '</service-group>' >> /tmp/zeronet-blog.service
  1958. cp /tmp/zeronet-blog.service /etc/avahi/services/zeronet-blog.service
  1959. if [ ! -d /home/$MY_USERNAME/.config/zeronet ]; then
  1960. mkdir -p /home/$MY_USERNAME/.config/zeronet
  1961. chown -R $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.config
  1962. fi
  1963. echo "$ZERONET_URL/$ZERONET_BLOG_ADDRESS" > /home/$MY_USERNAME/.config/zeronet/myblog
  1964. if ! grep -q "ZeroNet Blog address" /home/$MY_USERNAME/README; then
  1965. echo '' >> /home/$MY_USERNAME/README
  1966. echo "ZeroNet Blog address: $ZERONET_BLOG_ADDRESS" >> /home/$MY_USERNAME/README
  1967. echo "ZeroNet Blog private key: $ZERONET_BLOG_PRIVATE_KEY" >> /home/$MY_USERNAME/README
  1968. fi
  1969. echo 'install_zeronet_blog' >> $COMPLETION_FILE
  1970. }
  1971. function install_zeronet_mail {
  1972. if [[ $SYSTEM_TYPE != "$VARIANT_MESH" ]]; then
  1973. return
  1974. fi
  1975. if [ -d /opt/zeronet/ZeroMail ]; then
  1976. if grep -q "ZeroNet Mail commit" $COMPLETION_FILE; then
  1977. CURRENT_ZERONET_MAIL_COMMIT=$(grep "ZeroNet Mail commit" $COMPLETION_FILE | awk -F ':' '{print $2}')
  1978. if [[ "$CURRENT_ZERONET_MAIL_COMMIT" != "$ZERONET_MAIL_COMMIT" ]]; then
  1979. cd /opt/zeronet/ZeroMail
  1980. git stash
  1981. git checkout master
  1982. git pull
  1983. git checkout $ZERONET_MAIL_COMMIT -b $ZERONET_MAIL_COMMIT
  1984. sed -i "s/ZeroNet Mail commit.*/ZeroNet Mail commit:$ZERONET_MAIL_COMMIT/g" $COMPLETION_FILE
  1985. fi
  1986. else
  1987. echo "ZeroNet Mail commit:$ZERONET_MAIL_COMMIT" >> $COMPLETION_FILE
  1988. fi
  1989. fi
  1990. if grep -Fxq "install_zeronet_mail" $COMPLETION_FILE; then
  1991. return
  1992. fi
  1993. if [ ! -f /home/$MY_USERNAME/README ]; then
  1994. touch /home/$MY_USERNAME/README
  1995. fi
  1996. if grep -q "ZeroNet Mail address" /home/$MY_USERNAME/README; then
  1997. return
  1998. fi
  1999. if [ ! -d /etc/avahi ]; then
  2000. echo 'Avahi is not installed'
  2001. exit 736
  2002. fi
  2003. ZERONET_DEFAULT_MAIL_TITLE="${MY_USERNAME}'s Mail"
  2004. cd /opt/zeronet
  2005. python zeronet.py --batch siteCreate 2> /opt/zeronet/mail.txt
  2006. if [ ! -f /opt/zeronet/mail.txt ]; then
  2007. echo $'Unable to create mail'
  2008. exit 479
  2009. fi
  2010. mail_address=$(cat mail.txt | grep "Site address" | awk -F ':' '{print $2}')
  2011. mail_private_key=$(cat mail.txt | grep "Site private key" | awk -F ':' '{print $2}')
  2012. ZERONET_MAIL_ADDRESS=${mail_address//[[:blank:]]/}
  2013. ZERONET_MAIL_PRIVATE_KEY=${mail_private_key//[[:blank:]]/}
  2014. if [ ${#ZERONET_MAIL_ADDRESS} -lt 20 ]; then
  2015. echo $"Address: $ZERONET_MAIL_ADDRESS"
  2016. echo $"Public key: $ZERONET_MAIL_PRIVATE_KEY"
  2017. echo $'Unable to create zeronet mail address'
  2018. exit 7358
  2019. fi
  2020. if [ ${#ZERONET_MAIL_PRIVATE_KEY} -lt 20 ]; then
  2021. echo $"Address: $ZERONET_MAIL_ADDRESS"
  2022. echo $"Public key: $ZERONET_MAIL_PRIVATE_KEY"
  2023. echo $'Unable to create zeronet mail private key'
  2024. exit 1639
  2025. fi
  2026. if [ ! -d "/opt/zeronet/data/$ZERONET_MAIL_ADDRESS" ]; then
  2027. echo $"Unable to find site directory: /opt/zeronet/data/$ZERONET_MAIL_ADDRESS"
  2028. exit 7638
  2029. fi
  2030. git clone $ZERONET_MAIL_REPO ZeroMail
  2031. if [ ! -d /opt/zeronet/ZeroMail ]; then
  2032. echo $'ZeroMail repo could not be cloned'
  2033. exit 6739
  2034. fi
  2035. cd /opt/zeronet/ZeroMail
  2036. git checkout $ZERONET_MAIL_COMMIT -b $ZERONET_MAIL_COMMIT
  2037. if ! grep -q "ZeroNet Mail commit" $COMPLETION_FILE; then
  2038. echo "ZeroNet Mail commit:$ZERONET_MAIL_COMMIT" >> $COMPLETION_FILE
  2039. else
  2040. sed -i "s/ZeroNet Mail commit.*/ZeroNet Mail commit:$ZERONET_MAIL_COMMIT/g" $COMPLETION_FILE
  2041. fi
  2042. echo $"ZeroNet Mail address: $ZERONET_MAIL_ADDRESS"
  2043. echo $"ZeroNet Mail private key: $ZERONET_MAIL_PRIVATE_KEY"
  2044. cp -r /opt/zeronet/ZeroMail/* /opt/zeronet/data/$ZERONET_MAIL_ADDRESS
  2045. if [ ! -d /opt/zeronet/data/$ZERONET_MAIL_ADDRESS/data ]; then
  2046. mkdir /opt/zeronet/data/$ZERONET_MAIL_ADDRESS/data
  2047. fi
  2048. cp /opt/zeronet/data/$ZERONET_MAIL_ADDRESS/data-default/data.json /opt/zeronet/data/$ZERONET_MAIL_ADDRESS/data
  2049. sed -i "s/MyZeroMail/$ZERONET_DEFAULT_MAIL_TITLE/g" /opt/zeronet/data/$ZERONET_MAIL_ADDRESS/data/data.json
  2050. sed -i "s/My ZeroMail./$ZERONET_DEFAULT_MAIL_TAGLINE/g" /opt/zeronet/data/$ZERONET_MAIL_ADDRESS/data/data.json
  2051. sed -i "s/ZeroMail Demo/$ZERONET_DEFAULT_MAIL_TITLE/g" /opt/zeronet/data/$ZERONET_MAIL_ADDRESS/index.html
  2052. sed -i "s|<h3 class=\"description\">.*|<h3 class=\"description\">$ZERONET_DEFAULT_MAIL_TAGLINE</h3>|g" /opt/zeronet/data/$ZERONET_MAIL_ADDRESS/index.html
  2053. sed -i "s/Mailging platform Demo/Mailging platform/g" /opt/zeronet/data/$ZERONET_MAIL_ADDRESS/content.json
  2054. python zeronet.py siteSign $ZERONET_MAIL_ADDRESS $ZERONET_MAIL_PRIVATE_KEY
  2055. # Add an avahi service
  2056. echo '<?xml version="1.0" standalone="no"?><!--*-nxml-*-->' > /tmp/zeronet-mail.service
  2057. echo '<!DOCTYPE service-group SYSTEM "avahi-service.dtd">' >> /tmp/zeronet-mail.service
  2058. echo '<service-group>' >> /tmp/zeronet-mail.service
  2059. echo ' <name replace-wildcards="yes">%h ZeroNet Mail</name>' >> /tmp/zeronet-mail.service
  2060. echo ' <service>' >> /tmp/zeronet-mail.service
  2061. echo ' <type>_zeronet._udp</type>' >> /tmp/zeronet-mail.service
  2062. echo " <port>$ZERONET_PORT</port>" >> /tmp/zeronet-mail.service
  2063. echo " <txt-record>$ZERONET_URL/$ZERONET_MAIL_ADDRESS</txt-record>" >> /tmp/zeronet-mail.service
  2064. echo ' </service>' >> /tmp/zeronet-mail.service
  2065. echo '</service-group>' >> /tmp/zeronet-mail.service
  2066. cp /tmp/zeronet-mail.service /etc/avahi/services/zeronet-mail.service
  2067. if [ ! -d /home/$MY_USERNAME/.config/zeronet ]; then
  2068. mkdir -p /home/$MY_USERNAME/.config/zeronet
  2069. chown -R $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.config
  2070. fi
  2071. echo "$ZERONET_URL/$ZERONET_MAIL_ADDRESS" > /home/$MY_USERNAME/.config/zeronet/mymail
  2072. if ! grep -q $"ZeroNet Mail address" /home/$MY_USERNAME/README; then
  2073. echo '' >> /home/$MY_USERNAME/README
  2074. echo $"ZeroNet Mail address: $ZERONET_MAIL_ADDRESS" >> /home/$MY_USERNAME/README
  2075. echo $"ZeroNet Mail private key: $ZERONET_MAIL_PRIVATE_KEY" >> /home/$MY_USERNAME/README
  2076. fi
  2077. echo 'install_zeronet_mail' >> $COMPLETION_FILE
  2078. }
  2079. function install_zeronet_forum {
  2080. if [[ $SYSTEM_TYPE != "$VARIANT_MESH" ]]; then
  2081. return
  2082. fi
  2083. # update to the next commit
  2084. if [ -d /opt/zeronet/ZeroTalk ]; then
  2085. if grep -q "ZeroNet Forum commit" $COMPLETION_FILE; then
  2086. CURRENT_ZERONET_FORUM_COMMIT=$(grep "ZeroNet Forum commit" $COMPLETION_FILE | awk -F ':' '{print $2}')
  2087. if [[ "$CURRENT_ZERONET_FORUM_COMMIT" != "$ZERONET_FORUM_COMMIT" ]]; then
  2088. cd /opt/zeronet/ZeroTalk
  2089. git stash
  2090. git checkout master
  2091. git pull
  2092. git checkout $ZERONET_FORUM_COMMIT -b $ZERONET_FORUM_COMMIT
  2093. sed -i "s/ZeroNet Forum commit.*/ZeroNet Forum commit:$ZERONET_FORUM_COMMIT/g" $COMPLETION_FILE
  2094. fi
  2095. else
  2096. echo "ZeroNet Forum commit:$ZERONET_FORUM_COMMIT" >> $COMPLETION_FILE
  2097. fi
  2098. fi
  2099. if grep -Fxq "install_zeronet_forum" $COMPLETION_FILE; then
  2100. return
  2101. fi
  2102. if [ ! -f /home/$MY_USERNAME/README ]; then
  2103. touch /home/$MY_USERNAME/README
  2104. fi
  2105. if grep -q "ZeroNet Forum address" /home/$MY_USERNAME/README; then
  2106. return
  2107. fi
  2108. if [ ! -d /etc/avahi ]; then
  2109. echo $'Avahi is not installed'
  2110. exit 736
  2111. fi
  2112. ZERONET_DEFAULT_FORUM_TITLE=$"${MY_USERNAME}'s Forum"
  2113. cd /opt/zeronet
  2114. python zeronet.py --batch siteCreate 2> /opt/zeronet/forum.txt
  2115. if [ ! -f /opt/zeronet/forum.txt ]; then
  2116. echo $'Unable to create forum'
  2117. exit 479
  2118. fi
  2119. forum_address=$(cat forum.txt | grep "Site address" | awk -F ':' '{print $2}')
  2120. forum_private_key=$(cat forum.txt | grep "Site private key" | awk -F ':' '{print $2}')
  2121. ZERONET_FORUM_ADDRESS=${forum_address//[[:blank:]]/}
  2122. ZERONET_FORUM_PRIVATE_KEY=${forum_private_key//[[:blank:]]/}
  2123. if [ ${#ZERONET_FORUM_ADDRESS} -lt 20 ]; then
  2124. echo $"Address: $ZERONET_FORUM_ADDRESS"
  2125. echo $"Public key: $ZERONET_FORUM_PRIVATE_KEY"
  2126. echo $'Unable to create zeronet forum address'
  2127. exit 76352
  2128. fi
  2129. if [ ${#ZERONET_FORUM_PRIVATE_KEY} -lt 20 ]; then
  2130. echo $"Address: $ZERONET_FORUM_ADDRESS"
  2131. echo $"Public key: $ZERONET_FORUM_PRIVATE_KEY"
  2132. echo $'Unable to create zeronet forum private key'
  2133. exit 87356
  2134. fi
  2135. if [ ! -d "/opt/zeronet/data/$ZERONET_FORUM_ADDRESS" ]; then
  2136. echo $"Unable to find site directory: /opt/zeronet/data/$ZERONET_FORUM_ADDRESS"
  2137. exit 7638
  2138. fi
  2139. git clone $ZERONET_FORUM_REPO ZeroTalk
  2140. if [ ! -d /opt/zeronet/ZeroTalk ]; then
  2141. echo $'ZeroTalk repo could not be cloned'
  2142. exit 6739
  2143. fi
  2144. git checkout $ZERONET_FORUM_COMMIT -b $ZERONET_FORUM_COMMIT
  2145. if ! grep -q "ZeroNet Forum commit" $COMPLETION_FILE; then
  2146. echo "ZeroNet Forum commit:$ZERONET_FORUM_COMMIT" >> $COMPLETION_FILE
  2147. else
  2148. sed -i "s/ZeroNet Forum commit.*/ZeroNet Forum commit:$ZERONET_FORUM_COMMIT/g" $COMPLETION_FILE
  2149. fi
  2150. echo $"Forum address: $ZERONET_FORUM_ADDRESS"
  2151. echo $"Forum private key: $ZERONET_FORUM_PRIVATE_KEY"
  2152. cp -r /opt/zeronet/ZeroTalk/* /opt/zeronet/data/$ZERONET_FORUM_ADDRESS
  2153. sed -i "s/ZeroBoard/$ZERONET_DEFAULT_FORUM_TITLE/g" /opt/zeronet/data/$ZERONET_FORUM_ADDRESS/index.html
  2154. sed -i "s/ZeroTalk/$ZERONET_DEFAULT_FORUM_TITLE/g" /opt/zeronet/data/$ZERONET_FORUM_ADDRESS/index.html
  2155. sed -i "s|Demo for dynamic, decentralized content publishing.|$ZERONET_DEFAULT_FORUM_TAGLINE|g" /opt/zeronet/data/$ZERONET_FORUM_ADDRESS/index.html
  2156. sed -i 's/Messaging Board Demo/Messaging Board/g' /opt/zeronet/data/$ZERONET_FORUM_ADDRESS/content.json
  2157. sed -i "s/ZeroBoard/$ZERONET_DEFAULT_FORUM_TITLE/g" /opt/zeronet/data/$ZERONET_FORUM_ADDRESS/content.json
  2158. python zeronet.py siteSign $ZERONET_FORUM_ADDRESS $ZERONET_FORUM_PRIVATE_KEY --inner_path data/users/content.json
  2159. # Add an avahi service
  2160. echo '<?xml version="1.0" standalone="no"?><!--*-nxml-*-->' > /tmp/zeronet-forum.service
  2161. echo '<!DOCTYPE service-group SYSTEM "avahi-service.dtd">' >> /tmp/zeronet-forum.service
  2162. echo '<service-group>' >> /tmp/zeronet-forum.service
  2163. echo ' <name replace-wildcards="yes">%h ZeroNet Forum</name>' >> /tmp/zeronet-forum.service
  2164. echo ' <service>' >> /tmp/zeronet-forum.service
  2165. echo ' <type>_zeronet._udp</type>' >> /tmp/zeronet-forum.service
  2166. echo " <port>$ZERONET_PORT</port>" >> /tmp/zeronet-forum.service
  2167. echo " <txt-record>$ZERONET_URL/$ZERONET_FORUM_ADDRESS</txt-record>" >> /tmp/zeronet-forum.service
  2168. echo ' </service>' >> /tmp/zeronet-forum.service
  2169. echo '</service-group>' >> /tmp/zeronet-forum.service
  2170. sudo cp /tmp/zeronet-forum.service /etc/avahi/services/zeronet-forum.service
  2171. if [ ! -d /home/$MY_USERNAME/.config/zeronet ]; then
  2172. mkdir -p /home/$MY_USERNAME/.config/zeronet
  2173. chown -R $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.config
  2174. fi
  2175. echo "$ZERONET_URL/$ZERONET_FORUM_ADDRESS" > /home/$MY_USERNAME/.config/zeronet/myforum
  2176. if ! grep -q $"ZeroNet Forum address" /home/$MY_USERNAME/README; then
  2177. echo '' >> /home/$MY_USERNAME/README
  2178. echo $"ZeroNet Forum address: $ZERONET_FORUM_ADDRESS" >> /home/$MY_USERNAME/README
  2179. echo $"ZeroNet Forum private key: $ZERONET_FORUM_PRIVATE_KEY" >> /home/$MY_USERNAME/README
  2180. fi
  2181. echo 'install_zeronet_forum' >> $COMPLETION_FILE
  2182. }
  2183. function install_zeronet {
  2184. if [[ $SYSTEM_TYPE != "$VARIANT_MESH" ]]; then
  2185. return
  2186. fi
  2187. # update to the next commit
  2188. if [ -d /opt/zeronet ]; then
  2189. if grep -q "ZeroNet commit" $COMPLETION_FILE; then
  2190. CURRENT_ZERONET_COMMIT=$(grep "ZeroNet commit" $COMPLETION_FILE | awk -F ':' '{print $2}')
  2191. if [[ "$CURRENT_ZERONET_COMMIT" != "$ZERONET_COMMIT" ]]; then
  2192. cd /opt/zeronet
  2193. git stash
  2194. git checkout master
  2195. git pull
  2196. git checkout $ZERONET_COMMIT -b $ZERONET_COMMIT
  2197. sed -i "s/ZeroNet commit.*/ZeroNet commit:$ZERONET_COMMIT/g" $COMPLETION_FILE
  2198. systemctl restart zeronet.service
  2199. fi
  2200. else
  2201. echo "ZeroNet commit:$ZERONET_COMMIT" >> $COMPLETION_FILE
  2202. fi
  2203. fi
  2204. if grep -Fxq "install_zeronet" $COMPLETION_FILE; then
  2205. return
  2206. fi
  2207. apt-get -y install python python-msgpack python-gevent
  2208. apt-get -y install python-pip bittornado
  2209. pip install msgpack-python --upgrade
  2210. useradd -d /opt/zeronet/ -s /bin/false zeronet
  2211. git clone $ZERONET_REPO /opt/zeronet
  2212. if [ ! -d /opt/zeronet ]; then
  2213. exit 56823
  2214. fi
  2215. cd /opt/zeronet
  2216. git checkout $ZERONET_COMMIT -b $ZERONET_COMMIT
  2217. if ! grep -q "ZeroNet commit" $COMPLETION_FILE; then
  2218. echo "ZeroNet commit:$ZERONET_COMMIT" >> $COMPLETION_FILE
  2219. else
  2220. sed -i "s/ZeroNet commit.*/ZeroNet commit:$ZERONET_COMMIT/g" $COMPLETION_FILE
  2221. fi
  2222. sudo chown -R zeronet:zeronet /opt/zeronet
  2223. #git checkout bashrc/bootstrap-file
  2224. # Hack to ensure that the file access port is opened
  2225. # This is because zeronet normally relies on an internet site
  2226. # to do this, but on a purely local mesh the internet isn't available
  2227. sed -i 's|fileserver_port = 0|fileserver_port = config.fileserver_port\n sys.modules["main"].file_server.port_opened = True|g' /opt/zeronet/src/Site/Site.py
  2228. echo '[Unit]' > /etc/systemd/system/zeronet.service
  2229. echo 'Description=Zeronet Server' >> /etc/systemd/system/zeronet.service
  2230. echo 'After=syslog.target' >> /etc/systemd/system/zeronet.service
  2231. echo 'After=network.target' >> /etc/systemd/system/zeronet.service
  2232. echo '[Service]' >> /etc/systemd/system/zeronet.service
  2233. echo 'Type=simple' >> /etc/systemd/system/zeronet.service
  2234. echo 'User=zeronet' >> /etc/systemd/system/zeronet.service
  2235. echo 'Group=zeronet' >> /etc/systemd/system/zeronet.service
  2236. echo 'WorkingDirectory=/opt/zeronet' >> /etc/systemd/system/zeronet.service
  2237. echo "ExecStart=/usr/bin/python zeronet.py --ip_external ${DEFAULT_DOMAIN_NAME}.local --trackers_file /opt/zeronet/bootstrap" >> /etc/systemd/system/zeronet.service
  2238. echo '' >> /etc/systemd/system/zeronet.service
  2239. echo 'TimeoutSec=300' >> /etc/systemd/system/zeronet.service
  2240. echo '' >> /etc/systemd/system/zeronet.service
  2241. echo '[Install]' >> /etc/systemd/system/zeronet.service
  2242. echo 'WantedBy=multi-user.target' >> /etc/systemd/system/zeronet.service
  2243. echo '[Unit]' > /etc/systemd/system/tracker.service
  2244. echo 'Description=Torrent Tracker' >> /etc/systemd/system/tracker.service
  2245. echo 'After=syslog.target' >> /etc/systemd/system/tracker.service
  2246. echo 'After=network.target' >> /etc/systemd/system/tracker.service
  2247. echo '[Service]' >> /etc/systemd/system/tracker.service
  2248. echo 'Type=simple' >> /etc/systemd/system/tracker.service
  2249. echo 'User=tracker' >> /etc/systemd/system/tracker.service
  2250. echo 'Group=tracker' >> /etc/systemd/system/tracker.service
  2251. echo 'WorkingDirectory=/opt/tracker' >> /etc/systemd/system/tracker.service
  2252. echo "ExecStart=/usr/bin/bttrack --port $TRACKER_PORT --dfile /opt/tracker/dstate --logfile /opt/tracker/tracker.log --nat_check 0 --scrape_allowed full --ipv6_enabled 0" >> /etc/systemd/system/tracker.service
  2253. echo '' >> /etc/systemd/system/tracker.service
  2254. echo 'TimeoutSec=300' >> /etc/systemd/system/tracker.service
  2255. echo '' >> /etc/systemd/system/tracker.service
  2256. echo '[Install]' >> /etc/systemd/system/tracker.service
  2257. echo 'WantedBy=multi-user.target' >> /etc/systemd/system/tracker.service
  2258. useradd -d /opt/tracker/ -s /bin/false tracker
  2259. if [ ! -d /opt/tracker ]; then
  2260. mkdir /opt/tracker
  2261. fi
  2262. chown -R tracker:tracker /opt/tracker
  2263. # publish regularly
  2264. if ! grep -q "zeronetavahi" /etc/crontab; then
  2265. echo "* * * * * root zeronetavahi > /dev/null" >> /etc/crontab
  2266. fi
  2267. systemctl enable tracker.service
  2268. systemctl enable zeronet.service
  2269. systemctl daemon-reload
  2270. systemctl start tracker.service
  2271. systemctl start zeronet.service
  2272. echo 'mesh_zeronet' >> $COMPLETION_FILE
  2273. }
  2274. function install_vpn_tunnel {
  2275. if ! grep -q "repo.universe-factory.net" /etc/apt/sources.list; then
  2276. echo 'deb http://repo.universe-factory.net/debian/ sid main' >> /etc/apt/sources.list
  2277. gpg --keyserver pgpkeys.mit.edu --recv-key 16EF3F64CB201D9C
  2278. if [ ! "$?" = "0" ]; then
  2279. exit 76272
  2280. fi
  2281. gpg -a --export 16EF3F64CB201D9C | sudo apt-key add -
  2282. apt-get update
  2283. apt-get -y install fastd
  2284. if [ ! "$?" = "0" ]; then
  2285. exit 52026
  2286. fi
  2287. fi
  2288. }
  2289. # ath9k_htc driver
  2290. function install_atheros_wifi {
  2291. if grep -Fxq "install_atheros_wifi" $COMPLETION_FILE; then
  2292. return
  2293. fi
  2294. if [ $INSTALLING_ON_BBB != "yes" ]; then
  2295. return
  2296. fi
  2297. if [[ $ENABLE_BABEL != "yes" && $ENABLE_BATMAN != "yes" && $ENABLE_CJDNS != "yes" ]]; then
  2298. return
  2299. fi
  2300. if [ -d $INSTALL_DIR/open-ath9k-htc-firmware ]; then
  2301. return
  2302. fi
  2303. # have drivers already been installed ?
  2304. if [ -f /lib/firmware/htc_9271.fw ]; then
  2305. return
  2306. fi
  2307. apt-get -y install build-essential cmake git m4 texinfo
  2308. if [ ! -d $INSTALL_DIR ]; then
  2309. mkdir -p $INSTALL_DIR
  2310. fi
  2311. cd $INSTALL_DIR
  2312. if [ ! -d $INSTALL_DIR/open-ath9k-htc-firmware ]; then
  2313. git clone $ATHEROS_WIFI_REPO
  2314. if [ ! "$?" = "0" ]; then
  2315. rm -rf $INSTALL_DIR/open-ath9k-htc-firmware
  2316. exit 74283
  2317. fi
  2318. fi
  2319. cd $INSTALL_DIR/open-ath9k-htc-firmware
  2320. git checkout 1.4.0
  2321. make toolchain
  2322. if [ ! "$?" = "0" ]; then
  2323. rm -rf $INSTALL_DIR/open-ath9k-htc-firmware
  2324. exit 24820
  2325. fi
  2326. make firmware
  2327. if [ ! "$?" = "0" ]; then
  2328. rm -rf $INSTALL_DIR/open-ath9k-htc-firmware
  2329. exit 63412
  2330. fi
  2331. cp target_firmware/*.fw /lib/firmware/
  2332. if [ ! "$?" = "0" ]; then
  2333. exit 74681
  2334. fi
  2335. echo 'install_atheros_wifi' >> $COMPLETION_FILE
  2336. }
  2337. function configure_avahi {
  2338. if grep -Fxq "configure_avahi" $COMPLETION_FILE; then
  2339. return
  2340. fi
  2341. # only enable avahi if we're doing mesh networking
  2342. if [[ $ENABLE_BABEL != "yes" && $ENABLE_BATMAN != "yes" && $ENABLE_CJDNS != "yes" ]]; then
  2343. return
  2344. fi
  2345. apt-get -y install avahi-utils avahi-autoipd avahi-dnsconfd
  2346. if [ $DEFAULT_DOMAIN_NAME ]; then
  2347. sed -i "s|#host-name=.*|host-name=$DEFAULT_DOMAIN_NAME|g" /etc/avahi/avahi-daemon.conf
  2348. else
  2349. decarray=( 1 2 3 4 5 6 7 8 9 0 )
  2350. PEER_ID=${decarray[$RANDOM%10]}${decarray[$RANDOM%10]}${decarray[$RANDOM%10]}${decarray[$RANDOM%10]}${decarray[$RANDOM%10]}${decarray[$RANDOM%10]}${decarray[$RANDOM%10]}${decarray[$RANDOM%10]}
  2351. sed -i "s|#host-name=.*|host-name=P$PEER_ID|g" /etc/avahi/avahi-daemon.conf
  2352. fi
  2353. if [ ! -d /etc/avahi/services ]; then
  2354. mkdir -p /etc/avahi/services
  2355. fi
  2356. # remove an avahi service which isn't used
  2357. if [ -f /etc/avahi/services/udisks.service ]; then
  2358. rm /etc/avahi/services/udisks.service
  2359. fi
  2360. # Add an ssh service
  2361. echo '<?xml version="1.0" standalone="no"?><!--*-nxml-*-->' > /etc/avahi/services/ssh.service
  2362. echo '<!DOCTYPE service-group SYSTEM "avahi-service.dtd">' >> /etc/avahi/services/ssh.service
  2363. echo '<service-group>' >> /etc/avahi/services/ssh.service
  2364. echo ' <name replace-wildcards="yes">%h SSH</name>' >> /etc/avahi/services/ssh.service
  2365. echo ' <service>' >> /etc/avahi/services/ssh.service
  2366. echo ' <type>_ssh._tcp</type>' >> /etc/avahi/services/ssh.service
  2367. echo " <port>$SSH_PORT</port>" >> /etc/avahi/services/ssh.service
  2368. echo ' </service>' >> /etc/avahi/services/ssh.service
  2369. echo '</service-group>' >> /etc/avahi/services/ssh.service
  2370. # keep the daemon running
  2371. echo '' >> /usr/bin/$WATCHDOG_SCRIPT_NAME
  2372. echo '# keep avahi daemon running' >> /usr/bin/$WATCHDOG_SCRIPT_NAME
  2373. echo 'AVAHI_RUNNING=$(pgrep avahi-daemon > /dev/null && echo Running)' >> /usr/bin/$WATCHDOG_SCRIPT_NAME
  2374. echo 'if [ ! $AVAHI_RUNNING ]; then' >> /usr/bin/$WATCHDOG_SCRIPT_NAME
  2375. echo ' systemctl start avahi-daemon' >> /usr/bin/$WATCHDOG_SCRIPT_NAME
  2376. echo ' echo -n $CURRENT_DATE >> $LOGFILE' >> /usr/bin/$WATCHDOG_SCRIPT_NAME
  2377. echo ' echo " Avahi daemon restarted" >> $LOGFILE' >> /usr/bin/$WATCHDOG_SCRIPT_NAME
  2378. echo 'fi' >> /usr/bin/$WATCHDOG_SCRIPT_NAME
  2379. systemctl restart avahi-daemon
  2380. echo 'configure_avahi' >> $COMPLETION_FILE
  2381. }
  2382. function mesh_babel {
  2383. if grep -Fxq "mesh_babel" $COMPLETION_FILE; then
  2384. return
  2385. fi
  2386. if [[ $ENABLE_BABEL != "yes" ]]; then
  2387. return
  2388. fi
  2389. apt-get -y install babeld
  2390. babel_script=/var/lib/babel
  2391. echo '#!/bin/bash' > $babel_script
  2392. echo '' >> $babel_script
  2393. echo 'if [[ $1 == "ls" || $1 == "list" ]]; then' >> $babel_script
  2394. echo ' avahi-browse -atl' >> $babel_script
  2395. echo ' exit 0' >> $babel_script
  2396. echo 'fi' >> $babel_script
  2397. echo '' >> $babel_script
  2398. echo 'if [[ $1 == "start" ]]; then' >> $babel_script
  2399. echo ' sed -i "s|#host-name=.*|host-name=$(hostname)|g" /etc/avahi/avahi-daemon.conf' >> $babel_script
  2400. echo ' sed -i "s|host-name=.*|host-name=$(hostname)|g" /etc/avahi/avahi-daemon.conf' >> $babel_script
  2401. echo ' sed -i "s|use-ipv4=.*|use-ipv4=yes|g" /etc/avahi/avahi-daemon.conf' >> $babel_script
  2402. echo ' sed -i "s|use-ipv6=.*|use-ipv6=no|g" /etc/avahi/avahi-daemon.conf' >> $babel_script
  2403. echo ' sed -i "s|hosts:.*|hosts: files mdns4_minimal dns mdns4 mdns|g" /etc/nsswitch.conf' >> $babel_script
  2404. echo ' systemctl restart avahi-daemon' >> $babel_script
  2405. echo 'fi' >> $babel_script
  2406. echo '' >> $babel_script
  2407. echo "IFACE=$WIFI_INTERFACE" >> $babel_script
  2408. echo 'if [[ $IFACE == "wlan0" ]]; then' >> $babel_script
  2409. echo ' if grep -q "wlan1" /proc/net/dev; then' >> $babel_script
  2410. echo ' IFACE=wlan1' >> $babel_script
  2411. echo ' fi' >> $babel_script
  2412. echo 'fi' >> $babel_script
  2413. echo 'if [[ $IFACE == "wlan0" ]]; then' >> $babel_script
  2414. echo ' if grep -q "wlan2" /proc/net/dev; then' >> $babel_script
  2415. echo ' IFACE=wlan2' >> $babel_script
  2416. echo ' fi' >> $babel_script
  2417. echo 'fi' >> $babel_script
  2418. echo 'if [[ $IFACE == "wlan0" ]]; then' >> $babel_script
  2419. echo ' if grep -q "wlan3" /proc/net/dev; then' >> $babel_script
  2420. echo ' IFACE=wlan3' >> $babel_script
  2421. echo ' fi' >> $babel_script
  2422. echo 'fi' >> $babel_script
  2423. echo '' >> $babel_script
  2424. echo 'if [[ ! grep -q "$IFACE" /proc/net/dev || $1 == "stop" ]]; then' >> $babel_script
  2425. echo ' if ! grep -q "$IFACE" /proc/net/dev; then' >> $babel_script
  2426. echo ' echo "Interface $IFACE was not found"' >> $babel_script
  2427. echo ' else' >> $babel_script
  2428. echo ' echo "Stopping"' >> $babel_script
  2429. echo ' fi' >> $babel_script
  2430. echo ' ifconfig $IFACE down' >> $babel_script
  2431. echo ' pkill babeld' >> $babel_script
  2432. echo ' systemctl restart network-manager' >> $babel_script
  2433. echo ' exit 1' >> $babel_script
  2434. echo 'fi' >> $babel_script
  2435. echo '' >> $babel_script
  2436. echo 'systemctl stop network-manager' >> $babel_script
  2437. echo 'ifconfig $IFACE down' >> $babel_script
  2438. echo -n 'iwconfig $IFACE mode ad-hoc channel ' >> $babel_script
  2439. echo "$WIFI_CHANNEL essid \"$ESSID\"" >> $babel_script
  2440. echo 'ifconfig $IFACE up' >> $babel_script
  2441. echo -n 'ifconfig $IFACE:avahi ' >> $babel_script
  2442. echo -n "$LOCAL_NETWORK_STATIC_IP_ADDRESS netmask " >> $babel_script
  2443. echo '255.255.255.0 broadcast 192.168.13.255' >> $babel_script
  2444. echo -n 'babeld -D $IFACE:avahi -p ' >> $babel_script
  2445. echo -n "$BABEL_PORT -d 5 " >> $babel_script
  2446. echo '$IFACE' >> $babel_script
  2447. echo 'exit 0' >> $babel_script
  2448. chmod +x $babel_script
  2449. echo '[Unit]' > /etc/systemd/system/babel.service
  2450. echo 'Description=Babel Mesh' >> /etc/systemd/system/babel.service
  2451. echo '' >> /etc/systemd/system/babel.service
  2452. echo '[Service]' >> /etc/systemd/system/babel.service
  2453. echo 'Type=oneshot' >> /etc/systemd/system/babel.service
  2454. echo "ExecStart=$babel_script start" >> /etc/systemd/system/babel.service
  2455. echo "ExecStop=$babel_script stop" >> /etc/systemd/system/babel.service
  2456. echo 'RemainAfterExit=yes' >> /etc/systemd/system/babel.service
  2457. echo '' >> /etc/systemd/system/babel.service
  2458. echo '# Allow time for the server to start/stop' >> /etc/systemd/system/babel.service
  2459. echo 'TimeoutSec=300' >> /etc/systemd/system/babel.service
  2460. echo '' >> /etc/systemd/system/babel.service
  2461. echo '[Install]' >> /etc/systemd/system/babel.service
  2462. echo 'WantedBy=multi-user.target' >> /etc/systemd/system/babel.service
  2463. systemctl enable babel
  2464. echo 'mesh_babel' >> $COMPLETION_FILE
  2465. }
  2466. function mesh_batman_bridge {
  2467. # https://sudoroom.org/wiki/Mesh/Relay_setup
  2468. # also see http://www.netlore.co.uk/airmesh/
  2469. # https://www.youtube.com/watch?v=CLKHWfQlFqQ
  2470. # http://pastebin.com/4U9vdFFm
  2471. # http://pastebin.com/eeTmL5XL
  2472. if grep -Fxq "mesh_batman_bridge" $COMPLETION_FILE; then
  2473. return
  2474. fi
  2475. if [[ $ENABLE_BATMAN != "yes" ]]; then
  2476. return
  2477. fi
  2478. apt-get -y install iproute bridge-utils libnetfilter-conntrack3 batctl
  2479. apt-get -y install python-dev libevent-dev ebtables python-pip git
  2480. apt-get -y install wireless-tools rfkill
  2481. #install_vpn_tunnel
  2482. modprobe batman-adv
  2483. [ $? -ne 0 ] && echo "B.A.T.M.A.N module not available" && exit 76482
  2484. if ! grep -q "batman_adv" /etc/modules; then
  2485. echo 'batman_adv' >> /etc/modules
  2486. fi
  2487. batman_script=/var/lib/batman
  2488. echo '#!/bin/bash' > $batman_script
  2489. echo '' >> $batman_script
  2490. echo 'if [[ $1 == "start" ]]; then' >> $batman_script
  2491. echo ' # install avahi' >> $batman_script
  2492. echo ' sed -i "s|#host-name=.*|host-name=$(hostname)|g" /etc/avahi/avahi-daemon.conf' >> $batman_script
  2493. echo ' sed -i "s|host-name=.*|host-name=$(hostname)|g" /etc/avahi/avahi-daemon.conf' >> $batman_script
  2494. echo ' sed -i "s|use-ipv4=.*|use-ipv4=yes|g" /etc/avahi/avahi-daemon.conf' >> $batman_script
  2495. echo ' sed -i "s|use-ipv6=.*|use-ipv6=no|g" /etc/avahi/avahi-daemon.conf' >> $batman_script
  2496. echo ' sed -i "s|#disallow-other-stacks=.*|disallow-other-stacks=yes|g" /etc/avahi/avahi-daemon.conf' >> $batman_script
  2497. echo ' sed -i "s|hosts:.*|hosts: files mdns4_minimal dns mdns4 mdns|g" /etc/nsswitch.conf' >> $batman_script
  2498. echo 'fi' >> $batman_script
  2499. echo '' >> $batman_script
  2500. echo '# Mesh definition' >> $batman_script
  2501. echo "ESSID=$ESSID" >> $batman_script
  2502. echo "CELLID=$BATMAN_CELLID" >> $batman_script
  2503. echo "CHANNEL=$WIFI_CHANNEL" >> $batman_script
  2504. echo '' >> $batman_script
  2505. echo '# Ethernet bridge definition (bridged to bat0)' >> $batman_script
  2506. echo 'BRIDGE=br-mesh' >> $batman_script
  2507. echo "IFACE=$WIFI_INTERFACE" >> $batman_script
  2508. echo 'EIFACE=eth0' >> $batman_script
  2509. echo '' >> $batman_script
  2510. echo 'if [[ $IFACE == "wlan0" ]]; then' >> $batman_script
  2511. echo ' if grep -q "wlan1" /proc/net/dev; then' >> $batman_script
  2512. echo ' IFACE=wlan1' >> $batman_script
  2513. echo ' fi' >> $batman_script
  2514. echo 'fi' >> $batman_script
  2515. echo 'if [[ $IFACE == "wlan0" ]]; then' >> $batman_script
  2516. echo ' if grep -q "wlan2" /proc/net/dev; then' >> $batman_script
  2517. echo ' IFACE=wlan2' >> $batman_script
  2518. echo ' fi' >> $batman_script
  2519. echo 'fi' >> $batman_script
  2520. echo 'if [[ $IFACE == "wlan0" ]]; then' >> $batman_script
  2521. echo ' if grep -q "wlan3" /proc/net/dev; then' >> $batman_script
  2522. echo ' IFACE=wlan3' >> $batman_script
  2523. echo ' fi' >> $batman_script
  2524. echo 'fi' >> $batman_script
  2525. echo '' >> $batman_script
  2526. echo 'if [ -e /etc/default/batctl ]; then' >> $batman_script
  2527. echo ' . /etc/default/batctl' >> $batman_script
  2528. echo 'fi' >> $batman_script
  2529. echo '' >> $batman_script
  2530. echo 'start() {' >> $batman_script
  2531. echo ' if [ -z "$IFACE" ] ; then' >> $batman_script
  2532. echo ' echo "error: unable to find wifi interface, not enabling batman-adv mesh"' >> $batman_script
  2533. echo ' return' >> $batman_script
  2534. echo ' fi' >> $batman_script
  2535. echo ' echo "info: enabling batman-adv mesh network $ESSID on $IFACE"' >> $batman_script
  2536. echo ' systemctl stop network-manager' >> $batman_script
  2537. echo ' sleep 5' >> $batman_script
  2538. echo '' >> $batman_script
  2539. echo " # remove an avahi service which isn't used" >> $batman_script
  2540. echo ' if [ -f /etc/avahi/services/udisks.service ]; then' >> $batman_script
  2541. echo ' sudo rm /etc/avahi/services/udisks.service' >> $batman_script
  2542. echo ' fi' >> $batman_script
  2543. echo '' >> $batman_script
  2544. echo ' # Might have to re-enable wifi' >> $batman_script
  2545. echo ' rfkill unblock $(rfkill list|awk -F: "/phy/ {print $1}") || true' >> $batman_script
  2546. echo '' >> $batman_script
  2547. echo ' ifconfig $IFACE down' >> $batman_script
  2548. echo ' ifconfig $IFACE mtu 1532' >> $batman_script
  2549. echo ' iwconfig $IFACE enc off' >> $batman_script
  2550. echo ' iwconfig $IFACE mode ad-hoc essid $ESSID channel $CHANNEL' >> $batman_script
  2551. echo ' sleep 1' >> $batman_script
  2552. echo ' iwconfig $IFACE ap $CELLID' >> $batman_script
  2553. echo '' >> $batman_script
  2554. echo ' modprobe batman-adv' >> $batman_script
  2555. echo ' batctl if add $IFACE' >> $batman_script
  2556. echo ' ifconfig $IFACE up' >> $batman_script
  2557. echo ' avahi-autoipd --force-bind --daemonize --wait $BRIDGE' >> $batman_script
  2558. echo ' avahi-autoipd --force-bind --daemonize --wait $IFACE' >> $batman_script
  2559. echo ' ifconfig bat0 up promisc' >> $batman_script
  2560. echo '' >> $batman_script
  2561. echo ' #Use persistent HWAddr' >> $batman_script
  2562. echo ' ether_new=$(ifconfig eth0 | grep HWaddr | sed -e "s/.*HWaddr //")' >> $batman_script
  2563. echo ' if [ ! -f /var/lib/mesh-node/bat0 ]; then' >> $batman_script
  2564. echo ' mkdir /var/lib/mesh-node' >> $batman_script
  2565. echo ' echo "${ether_new}" > /var/lib/mesh-node/bat0' >> $batman_script
  2566. echo ' else' >> $batman_script
  2567. echo ' ether=$(cat /var/lib/mesh-node/bat0)' >> $batman_script
  2568. echo ' ifconfig bat0 hw ether ${ether}' >> $batman_script
  2569. echo ' fi' >> $batman_script
  2570. echo '' >> $batman_script
  2571. echo ' if [ "$EIFACE" ] ; then' >> $batman_script
  2572. echo ' brctl addbr $BRIDGE' >> $batman_script
  2573. echo ' brctl addif $BRIDGE bat0' >> $batman_script
  2574. echo ' brctl addif $BRIDGE $EIFACE' >> $batman_script
  2575. echo ' ifconfig bat0 0.0.0.0' >> $batman_script
  2576. echo ' ifconfig $EIFACE 0.0.0.0' >> $batman_script
  2577. echo ' ifconfig $EIFACE up promisc' >> $batman_script
  2578. echo ' ifconfig $BRIDGE up' >> $batman_script
  2579. echo ' fi' >> $batman_script
  2580. echo '' >> $batman_script
  2581. echo ' iptables -A INPUT -p tcp --dport 548 -j ACCEPT' >> $batman_script
  2582. echo ' iptables -A INPUT -p udp --dport 548 -j ACCEPT' >> $batman_script
  2583. echo ' iptables -A INPUT -p tcp --dport 5353 -j ACCEPT' >> $batman_script
  2584. echo ' iptables -A INPUT -p udp --dport 5353 -j ACCEPT' >> $batman_script
  2585. echo ' iptables -A INPUT -p tcp --dport 5354 -j ACCEPT' >> $batman_script
  2586. echo ' iptables -A INPUT -p udp --dport 5354 -j ACCEPT' >> $batman_script
  2587. echo " iptables -A INPUT -p tcp --dport $ZERONET_PORT -j ACCEPT" >> $batman_script
  2588. echo " iptables -A INPUT -p udp --dport $ZERONET_PORT -j ACCEPT" >> $batman_script
  2589. echo " iptables -A INPUT -p tcp --dport $IPFS_PORT -j ACCEPT" >> $batman_script
  2590. echo '' >> $batman_script
  2591. echo ' systemctl restart avahi-daemon' >> $batman_script
  2592. echo '}' >> $batman_script
  2593. echo '' >> $batman_script
  2594. echo 'stop() {' >> $batman_script
  2595. echo ' if [ -z "$IFACE" ]; then' >> $batman_script
  2596. echo ' echo "error: unable to find wifi interface, not enabling batman-adv mesh"' >> $batman_script
  2597. echo ' return' >> $batman_script
  2598. echo ' fi' >> $batman_script
  2599. echo ' if [ "$EIFACE" ]; then' >> $batman_script
  2600. echo ' brctl delif $BRIDGE bat0' >> $batman_script
  2601. echo ' brctl delif $BRIDGE $EIFACE' >> $batman_script
  2602. echo ' ifconfig $BRIDGE down || true' >> $batman_script
  2603. echo ' brctl delbr $BRIDGE' >> $batman_script
  2604. echo ' ifconfig $EIFACE down -promisc' >> $batman_script
  2605. echo ' fi' >> $batman_script
  2606. echo '' >> $batman_script
  2607. echo ' avahi-autoipd -k $BRIDGE' >> $batman_script
  2608. echo ' avahi-autoipd -k $IFACE' >> $batman_script
  2609. echo ' ifconfig bat0 down -promisc' >> $batman_script
  2610. echo '' >> $batman_script
  2611. echo ' batctl if del $IFACE' >> $batman_script
  2612. echo ' rmmod batman-adv' >> $batman_script
  2613. echo ' ifconfig $IFACE mtu 1500' >> $batman_script
  2614. echo ' ifconfig $IFACE down' >> $batman_script
  2615. echo ' iwconfig $IFACE mode managed' >> $batman_script
  2616. echo '' >> $batman_script
  2617. echo ' iptables -D INPUT -p tcp --dport 548 -j ACCEPT' >> $batman_script
  2618. echo ' iptables -D INPUT -p udp --dport 548 -j ACCEPT' >> $batman_script
  2619. echo ' iptables -D INPUT -p tcp --dport 5353 -j ACCEPT' >> $batman_script
  2620. echo ' iptables -D INPUT -p udp --dport 5353 -j ACCEPT' >> $batman_script
  2621. echo ' iptables -D INPUT -p tcp --dport 5354 -j ACCEPT' >> $batman_script
  2622. echo ' iptables -D INPUT -p udp --dport 5354 -j ACCEPT' >> $batman_script
  2623. echo " iptables -D INPUT -p tcp --dport $ZERONET_PORT -j ACCEPT" >> $batman_script
  2624. echo " iptables -D INPUT -p udp --dport $ZERONET_PORT -j ACCEPT" >> $batman_script
  2625. echo " iptables -D INPUT -p tcp --dport $IPFS_PORT -j ACCEPT" >> $batman_script
  2626. echo '' >> $batman_script
  2627. echo ' systemctl restart network-manager' >> $batman_script
  2628. echo '}' >> $batman_script
  2629. echo '' >> $batman_script
  2630. echo 'if ! grep -q "$IFACE" /proc/net/dev; then' >> $batman_script
  2631. echo ' echo "Interface $IFACE was not found"' >> $batman_script
  2632. echo ' stop' >> $batman_script
  2633. echo ' exit 1' >> $batman_script
  2634. echo 'fi' >> $batman_script
  2635. echo '' >> $batman_script
  2636. echo 'case "$1" in' >> $batman_script
  2637. echo ' start|stop)' >> $batman_script
  2638. echo ' $1' >> $batman_script
  2639. echo ' ;;' >> $batman_script
  2640. echo ' restart)' >> $batman_script
  2641. echo ' stop' >> $batman_script
  2642. echo ' sleep 10' >> $batman_script
  2643. echo ' start' >> $batman_script
  2644. echo ' ;;' >> $batman_script
  2645. echo ' status)' >> $batman_script
  2646. echo ' batctl o' >> $batman_script
  2647. echo ' ;;' >> $batman_script
  2648. echo ' ping)' >> $batman_script
  2649. echo ' batctl ping $2' >> $batman_script
  2650. echo ' ;;' >> $batman_script
  2651. echo ' ls|list)' >> $batman_script
  2652. echo ' avahi-browse -atl' >> $batman_script
  2653. echo ' ;;' >> $batman_script
  2654. echo ' *)' >> $batman_script
  2655. echo ' echo "error: invalid parameter $1"' >> $batman_script
  2656. echo ' echo "usage: $0 {start|stop|restart|status|ping|ls|list}"' >> $batman_script
  2657. echo ' exit 2' >> $batman_script
  2658. echo ' ;;' >> $batman_script
  2659. echo 'esac' >> $batman_script
  2660. echo 'exit 0' >> $batman_script
  2661. chmod +x $batman_script
  2662. echo '[Unit]' > /etc/systemd/system/batman.service
  2663. echo 'Description=B.A.T.M.A.N. Advanced' >> /etc/systemd/system/batman.service
  2664. echo '' >> /etc/systemd/system/batman.service
  2665. echo '[Service]' >> /etc/systemd/system/batman.service
  2666. echo 'Type=oneshot' >> /etc/systemd/system/batman.service
  2667. echo "ExecStart=$batman_script start" >> /etc/systemd/system/batman.service
  2668. echo "ExecStop=$batman_script stop" >> /etc/systemd/system/batman.service
  2669. echo 'RemainAfterExit=yes' >> /etc/systemd/system/batman.service
  2670. echo '' >> /etc/systemd/system/batman.service
  2671. echo '# Allow time for the server to start/stop' >> /etc/systemd/system/batman.service
  2672. echo 'TimeoutSec=300' >> /etc/systemd/system/batman.service
  2673. echo '' >> /etc/systemd/system/batman.service
  2674. echo '[Install]' >> /etc/systemd/system/batman.service
  2675. echo 'WantedBy=multi-user.target' >> /etc/systemd/system/batman.service
  2676. systemctl enable batman
  2677. if ! grep -q "Mesh Networking (B.A.T.M.A.N)" /home/$MY_USERNAME/README; then
  2678. echo '' >> /home/$MY_USERNAME/README
  2679. echo '' >> /home/$MY_USERNAME/README
  2680. echo 'Mesh Networking (B.A.T.M.A.N)' >> /home/$MY_USERNAME/README
  2681. echo '=============================' >> /home/$MY_USERNAME/README
  2682. echo "Mesh ESSID: $ESSID" >> /home/$MY_USERNAME/README
  2683. echo "Mesh cell ID: $BATMAN_CELLID" >> /home/$MY_USERNAME/README
  2684. echo "Mesh wifi channel: $WIFI_CHANNEL" >> /home/$MY_USERNAME/README
  2685. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
  2686. chmod 600 /home/$MY_USERNAME/README
  2687. fi
  2688. echo 'mesh_batman_bridge' >> $COMPLETION_FILE
  2689. }
  2690. function remove_instructions_from_motd {
  2691. sed -i '/## /d' /etc/motd
  2692. }
  2693. function check_hwrng {
  2694. if [[ $HWRNG_TYPE == "beaglebone" ]]; then
  2695. # If hardware random number generation was enabled then make sure that the device exists.
  2696. # if /dev/hwrng is not found then any subsequent cryptographic key generation would
  2697. # suffer from low entropy and might be insecure
  2698. if [ ! -e /dev/hwrng ]; then
  2699. ls /dev/hw*
  2700. echo $'The hardware random number generator is enabled but could not be detected on'
  2701. echo $'/dev/hwrng. There may be a problem with the installation or the Beaglebone hardware.'
  2702. exit 75
  2703. fi
  2704. fi
  2705. # If a OneRNG device was installed then verify its firmware
  2706. #check_onerng_verification
  2707. }
  2708. function get_mariadb_password {
  2709. if [ -f /home/$MY_USERNAME/README ]; then
  2710. if grep -q "MariaDB password" /home/$MY_USERNAME/README; then
  2711. if [ -f $DATABASE_PASSWORD_FILE ]; then
  2712. MARIADB_PASSWORD=$(cat $DATABASE_PASSWORD_FILE)
  2713. else
  2714. MARIADB_PASSWORD=$(cat /home/$MY_USERNAME/README | grep "MariaDB password" | awk -F ':' '{print $2}' | sed 's/^ *//')
  2715. echo "$MARIADB_PASSWORD" > $DATABASE_PASSWORD_FILE
  2716. chmod 600 $DATABASE_PASSWORD_FILE
  2717. fi
  2718. fi
  2719. fi
  2720. }
  2721. function get_mariadb_gnusocial_admin_password {
  2722. if [ -f /home/$MY_USERNAME/README ]; then
  2723. if grep -q "MariaDB gnusocial admin password" /home/$MY_USERNAME/README; then
  2724. MICROBLOG_ADMIN_PASSWORD=$(cat /home/$MY_USERNAME/README | grep "MariaDB gnusocial admin password" | awk -F ':' '{print $2}' | sed 's/^ *//')
  2725. fi
  2726. fi
  2727. }
  2728. function get_mariadb_git_admin_password {
  2729. if [ -f /home/$MY_USERNAME/README ]; then
  2730. if grep -q "Gogs admin user password" /home/$MY_USERNAME/README; then
  2731. GIT_ADMIN_PASSWORD=$(cat /home/$MY_USERNAME/README | grep "Gogs admin user password" | awk -F ':' '{print $2}' | sed 's/^ *//')
  2732. fi
  2733. fi
  2734. }
  2735. function get_mariadb_hubzilla_admin_password {
  2736. if [ -f /home/$MY_USERNAME/README ]; then
  2737. if grep -q "MariaDB Hubzilla admin password" /home/$MY_USERNAME/README; then
  2738. HUBZILLA_ADMIN_PASSWORD=$(cat /home/$MY_USERNAME/README | grep "MariaDB Hubzilla admin password" | awk -F ':' '{print $2}' | sed 's/^ *//')
  2739. fi
  2740. fi
  2741. }
  2742. function get_mariadb_owncloud_admin_password {
  2743. if [ -f /home/$MY_USERNAME/README ]; then
  2744. if grep -q "Owncloud database password" /home/$MY_USERNAME/README; then
  2745. OWNCLOUD_ADMIN_PASSWORD=$(cat /home/$MY_USERNAME/README | grep "Owncloud database password" | awk -F ':' '{print $2}' | sed 's/^ *//')
  2746. fi
  2747. fi
  2748. }
  2749. function create_freedns_updater {
  2750. if [[ $ONION_ONLY != "no" ]]; then
  2751. return
  2752. fi
  2753. # currently inadyn doesn't work as expected with freeDNS, so this is a workaround
  2754. if grep -Fxq "create_freedns_updater" $COMPLETION_FILE; then
  2755. return
  2756. fi
  2757. if [[ $DDNS_PROVIDER != "default@freedns.afraid.org" ]]; then
  2758. return
  2759. fi
  2760. if [[ $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  2761. return
  2762. fi
  2763. FREEDNS_WGET='wget -q --read-timeout=0.0 --waitretry=5 --tries=4 https://freedns.afraid.org/dynamic/update.php?'
  2764. echo '#!/bin/bash' > /usr/bin/dynamicdns
  2765. echo 'cd /tmp' >> /usr/bin/dynamicdns
  2766. if [ $DEFAULT_DOMAIN_CODE ]; then
  2767. echo "# $DEFAULT_DOMAIN_NAME" >> /usr/bin/dynamicdns
  2768. echo "$FREEDNS_WGET$DEFAULT_DOMAIN_CODE=" >> /usr/bin/dynamicdns
  2769. fi
  2770. if [ $WIKI_CODE ]; then
  2771. if [[ $WIKI_CODE != "$DEFAULT_DOMAIN_CODE" ]]; then
  2772. echo "# $WIKI_DOMAIN_NAME" >> /usr/bin/dynamicdns
  2773. echo "$FREEDNS_WGET$WIKI_CODE=" >> /usr/bin/dynamicdns
  2774. fi
  2775. fi
  2776. if [ $FULLBLOG_CODE ]; then
  2777. if [[ $FULLBLOG_CODE != "$DEFAULT_DOMAIN_CODE" ]]; then
  2778. echo "# $FULLBLOG_DOMAIN_NAME" >> /usr/bin/dynamicdns
  2779. echo "$FREEDNS_WGET$FULLBLOG_CODE=" >> /usr/bin/dynamicdns
  2780. fi
  2781. fi
  2782. if [ $HUBZILLA_CODE ]; then
  2783. if [[ $HUBZILLA_CODE != "$DEFAULT_DOMAIN_CODE" ]]; then
  2784. echo "# $HUBZILLA_DOMAIN_NAME" >> /usr/bin/dynamicdns
  2785. echo "$FREEDNS_WGET$HUBZILLA_CODE=" >> /usr/bin/dynamicdns
  2786. fi
  2787. fi
  2788. if [ $OWNCLOUD_CODE ]; then
  2789. if [[ $OWNCLOUD_CODE != "$DEFAULT_DOMAIN_CODE" ]]; then
  2790. echo "# $OWNCLOUD_DOMAIN_NAME" >> /usr/bin/dynamicdns
  2791. echo "$FREEDNS_WGET$OWNCLOUD_CODE=" >> /usr/bin/dynamicdns
  2792. fi
  2793. fi
  2794. if [ $MICROBLOG_CODE ]; then
  2795. if [[ $MICROBLOG_CODE != "$DEFAULT_DOMAIN_CODE" ]]; then
  2796. echo "# $MICROBLOG_DOMAIN_NAME" >> /usr/bin/dynamicdns
  2797. echo "$FREEDNS_WGET$MICROBLOG_CODE=" >> /usr/bin/dynamicdns
  2798. fi
  2799. fi
  2800. if [ $GIT_CODE ]; then
  2801. if [[ $GIT_CODE != "$DEFAULT_DOMAIN_CODE" ]]; then
  2802. echo "# $GIT_DOMAIN_NAME" >> /usr/bin/dynamicdns
  2803. echo "$FREEDNS_WGET$GIT_CODE=" >> /usr/bin/dynamicdns
  2804. fi
  2805. fi
  2806. if [ $MEDIAGOBLIN_CODE ]; then
  2807. if [[ $MEDIAGOBLIN_CODE != "$DEFAULT_DOMAIN_CODE" ]]; then
  2808. echo "# $MEDIAGOBLIN_DOMAIN_NAME" >> /usr/bin/dynamicdns
  2809. echo "$FREEDNS_WGET$MEDIAGOBLIN_CODE=" >> /usr/bin/dynamicdns
  2810. fi
  2811. fi
  2812. echo 'exit 0' >> /usr/bin/dynamicdns
  2813. chmod 600 /usr/bin/dynamicdns
  2814. chmod +x /usr/bin/dynamicdns
  2815. if ! grep -q "/usr/bin/dynamicdns" /etc/crontab; then
  2816. echo '*/3 * * * * root /usr/bin/dynamicdns' >> /etc/crontab
  2817. service cron restart
  2818. fi
  2819. echo 'create_freedns_updater' >> $COMPLETION_FILE
  2820. }
  2821. function backup_to_friends_servers {
  2822. # update crontab
  2823. echo '#!/bin/bash' > /etc/cron.daily/backuptofriends
  2824. echo "if [ -f /usr/local/bin/${PROJECT_NAME}-backup-remote ]; then" >> /etc/cron.daily/backuptofriends
  2825. echo " /usr/local/bin/${PROJECT_NAME}-backup-remote" >> /etc/cron.daily/backuptofriends
  2826. echo 'else' >> /etc/cron.daily/backuptofriends
  2827. echo " /usr/bin/${PROJECT_NAME}-backup-remote" >> /etc/cron.daily/backuptofriends
  2828. echo 'fi' >> /etc/cron.daily/backuptofriends
  2829. chmod +x /etc/cron.daily/backuptofriends
  2830. }
  2831. function remove_default_user {
  2832. # make sure you don't use the default user account
  2833. if [[ $MY_USERNAME == "debian" ]]; then
  2834. echo 'Do not use the default debian user account. Create a different user with: adduser [username]'
  2835. exit 68
  2836. fi
  2837. # remove the default debian user to prevent it from becoming an attack vector
  2838. if [ -d /home/debian ]; then
  2839. userdel -r debian
  2840. echo 'Default debian user account removed'
  2841. fi
  2842. }
  2843. function enforce_good_passwords {
  2844. # because humans are generally bad at choosing passwords
  2845. if grep -Fxq "enforce_good_passwords" $COMPLETION_FILE; then
  2846. return
  2847. fi
  2848. apt-get -y install libpam-cracklib
  2849. 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
  2850. echo 'enforce_good_passwords' >> $COMPLETION_FILE
  2851. }
  2852. function change_login_message {
  2853. if grep -Fxq "change_login_message" $COMPLETION_FILE; then
  2854. return
  2855. fi
  2856. # remove automatic motd creator if it exists
  2857. if [ -f /etc/init.d/motd ]; then
  2858. rm -f /etc/init.d/motd
  2859. fi
  2860. echo '' > /etc/motd
  2861. echo ".---. . . " >> /etc/motd
  2862. echo "| | | " >> /etc/motd
  2863. echo "|--- .--. .-. .-. .-.| .-. .--.--. |.-. .-. .--. .-. " >> /etc/motd
  2864. echo "| | (.-' (.-' ( | ( )| | | | )( )| | (.-' " >> /etc/motd
  2865. echo "' ' --' --' -' - -' ' ' -' -' -' ' - --'" >> /etc/motd
  2866. if [[ $SYSTEM_TYPE == "$VARIANT_MAILBOX" ]]; then
  2867. echo $' M A I L B O X E D I T I O N' >> /etc/motd
  2868. fi
  2869. if [[ $SYSTEM_TYPE == "$VARIANT_SOCIAL" ]]; then
  2870. echo $' S O C I A L E D I T I O N' >> /etc/motd
  2871. fi
  2872. if [[ $SYSTEM_TYPE == "$VARIANT_CHAT" ]]; then
  2873. echo $' C H A T E D I T I O N' >> /etc/motd
  2874. fi
  2875. if [[ $SYSTEM_TYPE == "$VARIANT_CLOUD" ]]; then
  2876. echo $' C L O U D E D I T I O N' >> /etc/motd
  2877. fi
  2878. if [[ $SYSTEM_TYPE == "$VARIANT_WRITER" ]]; then
  2879. echo $' W R I T E R E D I T I O N ' >> /etc/motd
  2880. fi
  2881. if [[ $SYSTEM_TYPE == "$VARIANT_MEDIA" ]]; then
  2882. echo $' M E D I A E D I T I O N' >> /etc/motd
  2883. fi
  2884. if [[ $SYSTEM_TYPE == "$VARIANT_DEVELOPER" ]]; then
  2885. echo $' D E V E L O P E R E D I T I O N' >> /etc/motd
  2886. fi
  2887. echo '' >> /etc/motd
  2888. if [[ $SYSTEM_TYPE != "$VARIANT_MESH" ]]; then
  2889. echo $' Freedom in the Cloud' >> /etc/motd
  2890. else
  2891. echo $' Freedom in the Mesh' >> /etc/motd
  2892. fi
  2893. echo '' >> /etc/motd
  2894. echo 'change_login_message' >> $COMPLETION_FILE
  2895. }
  2896. function search_for_attached_usb_drive {
  2897. # If a USB drive is attached then search for email,
  2898. # gpg, ssh keys and emacs configuration
  2899. if grep -Fxq "search_for_attached_usb_drive" $COMPLETION_FILE; then
  2900. return
  2901. fi
  2902. if [ -b $USB_DRIVE ]; then
  2903. if [ ! -d $USB_MOUNT ]; then
  2904. echo $'Mounting USB drive'
  2905. mkdir $USB_MOUNT
  2906. mount $USB_DRIVE $USB_MOUNT
  2907. fi
  2908. if ! [[ $SYSTEM_TYPE == "$VARIANT_WRITER" || $SYSTEM_TYPE == "$VARIANT_CLOUD" || $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_SOCIAL" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_DEVELOPER" || $SYSTEM_TYPE == "$VARIANT_MESH" || $SYSTEM_TYPE == "$VARIANT_NONMAILBOX" ]]; then
  2909. if [ -d $USB_MOUNT/Maildir ]; then
  2910. echo $'Maildir found on USB drive'
  2911. IMPORT_MAILDIR=$USB_MOUNT/Maildir
  2912. fi
  2913. if [ -d $USB_MOUNT/.gnupg ]; then
  2914. echo $'Importing GPG keyring'
  2915. cp -r $USB_MOUNT/.gnupg /home/$MY_USERNAME
  2916. chown -R $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.gnupg
  2917. GPG_KEYS_IMPORTED="yes"
  2918. if [ ! -f /home/$MY_USERNAME/.gnupg/secring.gpg ]; then
  2919. echo $'GPG files did not copy'
  2920. exit 73529
  2921. fi
  2922. fi
  2923. if [ -f $USB_MOUNT/.procmailrc ]; then
  2924. echo $'Importing procmail settings'
  2925. cp $USB_MOUNT/.procmailrc /home/$MY_USERNAME
  2926. chown -R $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.procmailrc
  2927. fi
  2928. if [ -f $USB_MOUNT/private_key.gpg ]; then
  2929. echo $'GPG private key found on USB drive'
  2930. MY_GPG_PRIVATE_KEY=$USB_MOUNT/private_key.gpg
  2931. fi
  2932. if [ -f $USB_MOUNT/public_key.gpg ]; then
  2933. echo $'GPG public key found on USB drive'
  2934. MY_GPG_PUBLIC_KEY=$USB_MOUNT/public_key.gpg
  2935. fi
  2936. fi
  2937. if [ -d $USB_MOUNT/prosody ]; then
  2938. if [ ! -d $XMPP_DIRECTORY ]; then
  2939. mkdir $XMPP_DIRECTORY
  2940. fi
  2941. cp -r $USB_MOUNT/prosody/* $XMPP_DIRECTORY
  2942. chown -R prosody:prosody $XMPP_DIRECTORY
  2943. fi
  2944. if [ -d $USB_MOUNT/.ssh ]; then
  2945. echo $'Importing ssh keys'
  2946. cp -r $USB_MOUNT/.ssh /home/$MY_USERNAME
  2947. chown -R $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.ssh
  2948. # for security delete the ssh keys from the usb drive
  2949. if [ ! -f /home/$MY_USERNAME/.ssh/id_rsa ]; then
  2950. echo $'ssh files did not copy'
  2951. exit 8
  2952. fi
  2953. fi
  2954. if [ -f $USB_MOUNT/.emacs ]; then
  2955. echo $'Importing .emacs file'
  2956. cp -f $USB_MOUNT/.emacs /home/$MY_USERNAME/.emacs
  2957. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.emacs
  2958. fi
  2959. if [ -d $USB_MOUNT/.emacs.d ]; then
  2960. echo $'Importing .emacs.d directory'
  2961. cp -r $USB_MOUNT/.emacs.d /home/$MY_USERNAME
  2962. chown -R $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.emacs.d
  2963. fi
  2964. if [ -d $USB_MOUNT/ssl ]; then
  2965. echo $'Importing SSL certificates'
  2966. cp -r $USB_MOUNT/ssl/* /etc/ssl
  2967. chmod 640 /etc/ssl/certs/*
  2968. chmod 400 /etc/ssl/private/*
  2969. # change ownership of some certificates
  2970. if [ -d /etc/prosody ]; then
  2971. chown prosody:prosody /etc/ssl/private/xmpp.*
  2972. chown prosody:prosody /etc/ssl/certs/xmpp.*
  2973. fi
  2974. if [ -d /etc/dovecot ]; then
  2975. chown root:dovecot /etc/ssl/certs/dovecot.*
  2976. chown root:dovecot /etc/ssl/private/dovecot.*
  2977. fi
  2978. if [ -f /etc/ssl/private/exim.key ]; then
  2979. chown root:Debian-exim /etc/ssl/private/exim.key /etc/ssl/certs/exim.crt /etc/ssl/certs/exim.dhparam
  2980. fi
  2981. fi
  2982. if [ -d $USB_MOUNT/personal ]; then
  2983. echo $'Importing personal directory'
  2984. cp -r $USB_MOUNT/personal /home/$MY_USERNAME
  2985. chown -R $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/personal
  2986. fi
  2987. else
  2988. if [ -d $USB_MOUNT ]; then
  2989. umount $USB_MOUNT
  2990. rm -rf $USB_MOUNT
  2991. fi
  2992. echo $'No USB drive attached'
  2993. fi
  2994. echo 'search_for_attached_usb_drive' >> $COMPLETION_FILE
  2995. }
  2996. function remove_proprietary_repos {
  2997. if grep -Fxq "remove_proprietary_repos" $COMPLETION_FILE; then
  2998. return
  2999. fi
  3000. sed -i 's/ non-free//g' /etc/apt/sources.list
  3001. echo 'remove_proprietary_repos' >> $COMPLETION_FILE
  3002. }
  3003. function change_debian_repos {
  3004. if grep -Fxq "change_debian_repos" $COMPLETION_FILE; then
  3005. return
  3006. fi
  3007. rm -rf /var/lib/apt/lists/*
  3008. apt-get clean
  3009. sed -i "s/ftp.us.debian.org/$DEBIAN_REPO/g" /etc/apt/sources.list
  3010. # ensure that there is a security repo
  3011. if ! grep -q "security" /etc/apt/sources.list; then
  3012. echo "deb http://security.debian.org/ $DEBIAN_VERSION/updates main contrib" >> /etc/apt/sources.list
  3013. echo "#deb-src http://security.debian.org/ $DEBIAN_VERSION/updates main contrib" >> /etc/apt/sources.list
  3014. fi
  3015. apt-get update
  3016. apt-get -y install apt-transport-https
  3017. echo 'change_debian_repos' >> $COMPLETION_FILE
  3018. }
  3019. function initial_setup {
  3020. if grep -Fxq "initial_setup" $COMPLETION_FILE; then
  3021. return
  3022. fi
  3023. apt-get -y remove --purge apache*
  3024. apt-get -y dist-upgrade
  3025. apt-get -y install ca-certificates emacs24 cpulimit
  3026. apt-get -y install cryptsetup libgfshare-bin obnam sshpass wget
  3027. apt-get -y install avahi-daemon avahi-utils avahi-discover
  3028. echo 'initial_setup' >> $COMPLETION_FILE
  3029. }
  3030. function install_tor {
  3031. if [[ $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  3032. return
  3033. fi
  3034. apt-get install tor
  3035. }
  3036. function install_editor {
  3037. if grep -Fxq "install_editor" $COMPLETION_FILE; then
  3038. return
  3039. fi
  3040. update-alternatives --set editor /usr/bin/emacs24
  3041. # A minimal emacs configuration
  3042. #echo -n "(add-to-list 'load-path " > /home/$MY_USERNAME/.emacs
  3043. #echo '"~/.emacs.d/")' >> /home/$MY_USERNAME/.emacs
  3044. #echo '' >> /home/$MY_USERNAME/.emacs
  3045. echo $';; ===== Remove trailing whitepace ======================================' >> /home/$MY_USERNAME/.emacs
  3046. echo '' >> /home/$MY_USERNAME/.emacs
  3047. echo ";;(add-hook 'before-save-hook 'delete-trailing-whitespace)" >> /home/$MY_USERNAME/.emacs
  3048. echo '' >> /home/$MY_USERNAME/.emacs
  3049. echo ';; Goto a line number with CTRL-l' >> /home/$MY_USERNAME/.emacs
  3050. echo -n '(global-set-key "\C-l" ' >> /home/$MY_USERNAME/.emacs
  3051. echo "'goto-line)" >> /home/$MY_USERNAME/.emacs
  3052. echo '' >> /home/$MY_USERNAME/.emacs
  3053. echo $';; ===== Show line numbers ==============================================' >> /home/$MY_USERNAME/.emacs
  3054. echo '' >> /home/$MY_USERNAME/.emacs
  3055. echo "(add-hook 'find-file-hook (lambda () (linum-mode 1)))" >> /home/$MY_USERNAME/.emacs
  3056. echo '' >> /home/$MY_USERNAME/.emacs
  3057. echo $';; ===== Enable line wrapping in org-mode ===============================' >> /home/$MY_USERNAME/.emacs
  3058. echo '' >> /home/$MY_USERNAME/.emacs
  3059. echo " (add-hook 'org-mode-hook" >> /home/$MY_USERNAME/.emacs
  3060. echo " '(lambda ()" >> /home/$MY_USERNAME/.emacs
  3061. echo " (visual-line-mode 1)))" >> /home/$MY_USERNAME/.emacs
  3062. echo '' >> /home/$MY_USERNAME/.emacs
  3063. echo $';; ===== Enable shift select in org mode ================================' >> /home/$MY_USERNAME/.emacs
  3064. echo '' >> /home/$MY_USERNAME/.emacs
  3065. echo '(setq org-support-shift-select t)' >> /home/$MY_USERNAME/.emacs
  3066. echo '' >> /home/$MY_USERNAME/.emacs
  3067. echo $';; ===== Set standard indent to 4 rather that 4 =========================' >> /home/$MY_USERNAME/.emacs
  3068. echo '' >> /home/$MY_USERNAME/.emacs
  3069. echo '(setq standard-indent 4)' >> /home/$MY_USERNAME/.emacs
  3070. echo '(setq-default tab-width 4)' >> /home/$MY_USERNAME/.emacs
  3071. echo '(setq c-basic-offset 4)' >> /home/$MY_USERNAME/.emacs
  3072. echo '' >> /home/$MY_USERNAME/.emacs
  3073. echo $';; ===== Support Wheel Mouse Scrolling ==================================' >> /home/$MY_USERNAME/.emacs
  3074. echo '' >> /home/$MY_USERNAME/.emacs
  3075. echo '(mouse-wheel-mode t)' >> /home/$MY_USERNAME/.emacs
  3076. echo '' >> /home/$MY_USERNAME/.emacs
  3077. echo $';; ===== Place Backup Files in Specific Directory =======================' >> /home/$MY_USERNAME/.emacs
  3078. echo '' >> /home/$MY_USERNAME/.emacs
  3079. echo '(setq make-backup-files t)' >> /home/$MY_USERNAME/.emacs
  3080. echo '(setq version-control t)' >> /home/$MY_USERNAME/.emacs
  3081. echo '(setq backup-directory-alist (quote ((".*" . "~/.emacs_backups/"))))' >> /home/$MY_USERNAME/.emacs
  3082. echo '' >> /home/$MY_USERNAME/.emacs
  3083. echo $';; ===== Make Text mode the default mode for new buffers ================' >> /home/$MY_USERNAME/.emacs
  3084. echo '' >> /home/$MY_USERNAME/.emacs
  3085. echo "(setq default-major-mode 'text-mode)" >> /home/$MY_USERNAME/.emacs
  3086. echo '' >> /home/$MY_USERNAME/.emacs
  3087. echo $';; ===== Line length ====================================================' >> /home/$MY_USERNAME/.emacs
  3088. echo '' >> /home/$MY_USERNAME/.emacs
  3089. echo '(setq-default fill-column 72)' >> /home/$MY_USERNAME/.emacs
  3090. echo '' >> /home/$MY_USERNAME/.emacs
  3091. echo $';; ===== Enable Line and Column Numbering ===============================' >> /home/$MY_USERNAME/.emacs
  3092. echo '' >> /home/$MY_USERNAME/.emacs
  3093. echo '(line-number-mode 1)' >> /home/$MY_USERNAME/.emacs
  3094. echo '(column-number-mode 1)' >> /home/$MY_USERNAME/.emacs
  3095. echo '' >> /home/$MY_USERNAME/.emacs
  3096. echo $';; ===== Turn on Auto Fill mode automatically in all modes ==============' >> /home/$MY_USERNAME/.emacs
  3097. echo '' >> /home/$MY_USERNAME/.emacs
  3098. echo ';; Auto-fill-mode the the automatic wrapping of lines and insertion of' >> /home/$MY_USERNAME/.emacs
  3099. echo ';; newlines when the cursor goes over the column limit.' >> /home/$MY_USERNAME/.emacs
  3100. echo '' >> /home/$MY_USERNAME/.emacs
  3101. echo ';; This should actually turn on auto-fill-mode by default in all major' >> /home/$MY_USERNAME/.emacs
  3102. echo ';; modes. The other way to do this is to turn on the fill for specific modes' >> /home/$MY_USERNAME/.emacs
  3103. echo ';; via hooks.' >> /home/$MY_USERNAME/.emacs
  3104. echo '' >> /home/$MY_USERNAME/.emacs
  3105. echo '(setq auto-fill-mode 1)' >> /home/$MY_USERNAME/.emacs
  3106. echo '' >> /home/$MY_USERNAME/.emacs
  3107. echo $';; ===== Enable GPG encryption =========================================' >> /home/$MY_USERNAME/.emacs
  3108. echo '' >> /home/$MY_USERNAME/.emacs
  3109. echo "(require 'epa)" >> /home/$MY_USERNAME/.emacs
  3110. echo '(epa-file-enable)' >> /home/$MY_USERNAME/.emacs
  3111. cp /home/$MY_USERNAME/.emacs /root/.emacs
  3112. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.emacs
  3113. echo 'install_editor' >> $COMPLETION_FILE
  3114. }
  3115. function enable_backports {
  3116. if grep -Fxq "enable_backports" $COMPLETION_FILE; then
  3117. return
  3118. fi
  3119. if ! grep -Fxq "deb http://$DEBIAN_REPO/debian $DEBIAN_VERSION-backports main" /etc/apt/sources.list; then
  3120. echo "deb http://$DEBIAN_REPO/debian $DEBIAN_VERSION-backports main" >> /etc/apt/sources.list
  3121. fi
  3122. echo 'enable_backports' >> $COMPLETION_FILE
  3123. }
  3124. function enable_zram {
  3125. if grep -Fxq "enable_zram" $COMPLETION_FILE; then
  3126. return
  3127. fi
  3128. if [[ $INSTALLED_WITHIN_DOCKER == "yes" || $INSTALLING_ON_BBB != "yes" ]]; then
  3129. ${PROJECT_NAME}-zram off
  3130. return
  3131. fi
  3132. ${PROJECT_NAME}-zram on
  3133. echo 'enable_zram' >> $COMPLETION_FILE
  3134. }
  3135. function check_onerng_verification {
  3136. if grep -Fxq "check_onerng_verification" $COMPLETION_FILE; then
  3137. return
  3138. fi
  3139. if [[ $HWRNG_TYPE != "onerng" ]]; then
  3140. return
  3141. fi
  3142. echo $'Checking OneRNG firmware verification'
  3143. last_onerng_validation=$(cat /var/log/syslog.1 | grep "OneRNG: firmware verification" | awk '/./{line=$0} END{print line}')
  3144. if [[ $last_onerng_validation != *"passed OK"* ]]; then
  3145. last_onerng_validation=$(cat /var/log/syslog | grep "OneRNG: firmware verification" | awk '/./{line=$0} END{print line}')
  3146. if [[ $last_onerng_validation != *"passed OK"* ]]; then
  3147. echo $last_onerng_validation
  3148. echo $'OneRNG firmware verification failed'
  3149. exit 735026
  3150. fi
  3151. fi
  3152. echo $'OneRNG firmware verification passed'
  3153. # if haveged was previously installed then remove it
  3154. apt-get -y remove haveged
  3155. echo 'check_onerng_verification' >> $COMPLETION_FILE
  3156. }
  3157. function install_onerng {
  3158. apt-get -y install rng-tools at python-gnupg
  3159. # Move to the installation directory
  3160. if [ ! -d $INSTALL_DIR ]; then
  3161. mkdir $INSTALL_DIR
  3162. fi
  3163. cd $INSTALL_DIR
  3164. # Download the package
  3165. if [ ! -f $ONERNG_PACKAGE ]; then
  3166. wget $ONERNG_PACKAGE_DOWNLOAD
  3167. mv "$ONERNG_PACKAGE?raw=true" $ONERNG_PACKAGE
  3168. fi
  3169. if [ ! -f $ONERNG_PACKAGE ]; then
  3170. echo $"OneRNG package could not be downloaded"
  3171. exit 59249
  3172. fi
  3173. # Check the hash
  3174. hash=$(sha256sum $ONERNG_PACKAGE | awk -F ' ' '{print $1}')
  3175. if [[ $hash != $ONERNG_PACKAGE_HASH ]]; then
  3176. echo $"OneRNG package: $ONERNG_PACKAGE"
  3177. echo $"Hash does not match. This could indicate that the package has been tampered with."
  3178. echo $"OneRNG expected package hash: $ONERNG_PACKAGE_HASH"
  3179. echo $"OneRNG actual hash: $hash"
  3180. exit 25934
  3181. fi
  3182. # install the package
  3183. dpkg -i $ONERNG_PACKAGE
  3184. # Check that the install worked
  3185. if [ ! -f /etc/onerng.conf ]; then
  3186. echo $'OneRNG configuration file not found. The package may not have installed successfully.'
  3187. exit 42904
  3188. fi
  3189. dialog --title $"OneRNG Device" \
  3190. --msgbox $"Please plug in the OneRNG device" 6 40
  3191. # check rng-tools configuration
  3192. if ! grep -q "/dev/$ONERNG_DEVICE" /etc/default/rng-tools; then
  3193. echo "HRNGDEVICE=/dev/$ONERNG_DEVICE" >> /etc/default/rng-tools
  3194. fi
  3195. systemctl restart rng-tools
  3196. }
  3197. function random_number_generator {
  3198. if grep -Fxq "random_number_generator" $COMPLETION_FILE; then
  3199. return
  3200. fi
  3201. if [[ $INSTALLED_WITHIN_DOCKER == "yes" ]]; then
  3202. # it is assumed that docker uses the random number
  3203. # generator of the host system
  3204. return
  3205. fi
  3206. # if the hrng type has not been set but /dev/hwrng is detected
  3207. if [[ $HWRNG_TYPE != "beaglebone" ]]; then
  3208. if [ -e /dev/hwrng ]; then
  3209. HWRNG_TYPE="beaglebone"
  3210. fi
  3211. fi
  3212. case $HWRNG_TYPE in
  3213. beaglebone)
  3214. apt-get -y install rng-tools
  3215. sed -i 's|#HRNGDEVICE=/dev/hwrng|HRNGDEVICE=/dev/hwrng|g' /etc/default/rng-tools
  3216. ;;
  3217. onerng)
  3218. install_onerng
  3219. ;;
  3220. *)
  3221. apt-get -y install haveged
  3222. ;;
  3223. esac
  3224. echo 'random_number_generator' >> $COMPLETION_FILE
  3225. }
  3226. function configure_ssh {
  3227. if grep -Fxq "configure_ssh" $COMPLETION_FILE; then
  3228. return
  3229. fi
  3230. sed -i "s/Port .*/Port $SSH_PORT/g" /etc/ssh/sshd_config
  3231. sed -i 's/PermitRootLogin.*/PermitRootLogin no/g' /etc/ssh/sshd_config
  3232. sed -i 's/X11Forwarding.*/X11Forwarding no/g' /etc/ssh/sshd_config
  3233. sed -i 's/ServerKeyBits.*/ServerKeyBits 4096/g' /etc/ssh/sshd_config
  3234. sed -i 's/TCPKeepAlive.*/TCPKeepAlive no/g' /etc/ssh/sshd_config
  3235. sed -i 's|HostKey /etc/ssh/ssh_host_dsa_key|#HostKey /etc/ssh/ssh_host_dsa_key|g' /etc/ssh/sshd_config
  3236. sed -i 's|HostKey /etc/ssh/ssh_host_ecdsa_key|#HostKey /etc/ssh/ssh_host_ecdsa_key|g' /etc/ssh/sshd_config
  3237. if ! grep -q 'DebianBanner' /etc/ssh/sshd_config; then
  3238. echo 'DebianBanner no' >> /etc/ssh/sshd_config
  3239. else
  3240. sed -i 's|DebianBanner.*|DebianBanner no|g' /etc/ssh/sshd_config
  3241. fi
  3242. if grep -q 'ClientAliveInterval' /etc/ssh/sshd_config; then
  3243. sed -i 's/ClientAliveInterval.*/ClientAliveInterval 60/g' /etc/ssh/sshd_config
  3244. else
  3245. echo 'ClientAliveInterval 60' >> /etc/ssh/sshd_config
  3246. fi
  3247. if grep -q 'ClientAliveCountMax' /etc/ssh/sshd_config; then
  3248. sed -i 's/ClientAliveCountMax.*/ClientAliveCountMax 3/g' /etc/ssh/sshd_config
  3249. else
  3250. echo 'ClientAliveCountMax 3' >> /etc/ssh/sshd_config
  3251. fi
  3252. if grep -q 'Ciphers' /etc/ssh/sshd_config; then
  3253. sed -i "s|Ciphers.*|Ciphers $SSH_CIPHERS|g" /etc/ssh/sshd_config
  3254. else
  3255. echo "Ciphers $SSH_CIPHERS" >> /etc/ssh/sshd_config
  3256. fi
  3257. if grep -q 'MACs' /etc/ssh/sshd_config; then
  3258. sed -i "s|MACs.*|MACs $SSH_MACS|g" /etc/ssh/sshd_config
  3259. else
  3260. echo "MACs $SSH_MACS" >> /etc/ssh/sshd_config
  3261. fi
  3262. if grep -q 'KexAlgorithms' /etc/ssh/sshd_config; then
  3263. sed -i "s|KexAlgorithms.*|KexAlgorithms $SSH_KEX|g" /etc/ssh/sshd_config
  3264. else
  3265. echo "KexAlgorithms $SSH_KEX" >> /etc/ssh/sshd_config
  3266. fi
  3267. apt-get -y install fail2ban
  3268. echo 'configure_ssh' >> $COMPLETION_FILE
  3269. }
  3270. # see https://stribika.github.io/2015/01/04/secure-secure-shell.html
  3271. function ssh_remove_small_moduli {
  3272. awk '$5 > 2000' /etc/ssh/moduli > ~/moduli
  3273. mv ~/moduli /etc/ssh/moduli
  3274. }
  3275. function configure_ssh_client {
  3276. if grep -Fxq "configure_ssh_client" $COMPLETION_FILE; then
  3277. return
  3278. fi
  3279. #sed -i 's/# PasswordAuthentication.*/ PasswordAuthentication no/g' /etc/ssh/ssh_config
  3280. #sed -i 's/# ChallengeResponseAuthentication.*/ ChallengeResponseAuthentication no/g' /etc/ssh/ssh_config
  3281. sed -i "s/# HostKeyAlgorithms.*/ HostKeyAlgorithms $SSH_HOST_KEY_ALGORITHMS/g" /etc/ssh/ssh_config
  3282. sed -i "s/# Ciphers.*/ Ciphers $SSH_CIPHERS/g" /etc/ssh/ssh_config
  3283. sed -i "s/# MACs.*/ MACs $SSH_MACS/g" /etc/ssh/ssh_config
  3284. if ! grep -q "HostKeyAlgorithms" /etc/ssh/ssh_config; then
  3285. echo " HostKeyAlgorithms $SSH_HOST_KEY_ALGORITHMS" >> /etc/ssh/ssh_config
  3286. fi
  3287. sed -i "s/Ciphers.*/Ciphers $SSH_CIPHERS/g" /etc/ssh/ssh_config
  3288. if ! grep -q "Ciphers " /etc/ssh/ssh_config; then
  3289. echo " Ciphers $SSH_CIPHERS" >> /etc/ssh/ssh_config
  3290. fi
  3291. sed -i "s/MACs.*/MACs $SSH_MACS/g" /etc/ssh/ssh_config
  3292. if ! grep -q "MACs " /etc/ssh/ssh_config; then
  3293. echo " MACs $SSH_MACS" >> /etc/ssh/ssh_config
  3294. fi
  3295. # Create ssh keys
  3296. if [ ! -f ~/.ssh/id_ed25519 ]; then
  3297. ssh-keygen -t ed25519 -o -a 100
  3298. fi
  3299. if [ ! -f ~/.ssh/id_rsa ]; then
  3300. ssh-keygen -t rsa -b 4096 -o -a 100
  3301. fi
  3302. ssh_remove_small_moduli
  3303. echo 'configure_ssh_client' >> $COMPLETION_FILE
  3304. }
  3305. function regenerate_ssh_keys {
  3306. if grep -Fxq "regenerate_ssh_keys" $COMPLETION_FILE; then
  3307. return
  3308. fi
  3309. rm -f /etc/ssh/ssh_host_*
  3310. dpkg-reconfigure openssh-server
  3311. ssh_remove_small_moduli
  3312. service ssh restart
  3313. echo 'regenerate_ssh_keys' >> $COMPLETION_FILE
  3314. }
  3315. function configure_dns {
  3316. if grep -Fxq "configure_dns" $COMPLETION_FILE; then
  3317. return
  3318. fi
  3319. echo 'domain localdomain' > /etc/resolv.conf
  3320. echo 'search localdomain' >> /etc/resolv.conf
  3321. echo "nameserver $NAMESERVER1" >> /etc/resolv.conf
  3322. echo "nameserver $NAMESERVER2" >> /etc/resolv.conf
  3323. echo 'configure_dns' >> $COMPLETION_FILE
  3324. }
  3325. function set_your_domain_name {
  3326. if grep -Fxq "set_your_domain_name" $COMPLETION_FILE; then
  3327. return
  3328. fi
  3329. echo "$DEFAULT_DOMAIN_NAME" > /etc/hostname
  3330. hostname $DEFAULT_DOMAIN_NAME
  3331. if grep -q "127.0.1.1" /etc/hosts; then
  3332. sed -i "s/127.0.1.1.*/127.0.1.1 $DEFAULT_DOMAIN_NAME/g" /etc/hosts
  3333. else
  3334. echo "127.0.1.1 $DEFAULT_DOMAIN_NAME" >> /etc/hosts
  3335. fi
  3336. echo 'set_your_domain_name' >> $COMPLETION_FILE
  3337. }
  3338. function time_synchronisation {
  3339. # mesh peers typically don't sync over the internet
  3340. if [[ $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  3341. return
  3342. fi
  3343. if [ -f /usr/local/bin/${PROJECT_NAME}-update-date ]; then
  3344. cp /usr/local/bin/${PROJECT_NAME}-update-date /usr/bin/updatedate
  3345. else
  3346. cp /usr/bin/${PROJECT_NAME}-update-date /usr/bin/updatedate
  3347. fi
  3348. chmod +x /usr/bin/updatedate
  3349. if grep -Fxq "time_synchronisation" $COMPLETION_FILE; then
  3350. return
  3351. fi
  3352. apt-get -y install tlsdate
  3353. apt-get -y remove ntpdate
  3354. echo '*/15 * * * * root /usr/bin/updatedate' >> /etc/crontab
  3355. service cron restart
  3356. echo 'time_synchronisation' >> $COMPLETION_FILE
  3357. }
  3358. function configure_firewall {
  3359. if grep -Fxq "configure_firewall" $COMPLETION_FILE; then
  3360. return
  3361. fi
  3362. if [[ $INSTALLED_WITHIN_DOCKER == "yes" ]]; then
  3363. # docker does its own firewalling
  3364. return
  3365. fi
  3366. iptables -P INPUT ACCEPT
  3367. ip6tables -P INPUT ACCEPT
  3368. iptables -F
  3369. ip6tables -F
  3370. iptables -t nat -F
  3371. ip6tables -t nat -F
  3372. iptables -X
  3373. ip6tables -X
  3374. iptables -P INPUT DROP
  3375. ip6tables -P INPUT DROP
  3376. iptables -A INPUT -i lo -j ACCEPT
  3377. iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
  3378. # Make sure incoming tcp connections are SYN packets
  3379. iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
  3380. # Drop packets with incoming fragments
  3381. iptables -A INPUT -f -j DROP
  3382. # Drop bogons
  3383. iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
  3384. iptables -A INPUT -p tcp --tcp-flags ALL FIN,PSH,URG -j DROP
  3385. iptables -A INPUT -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP
  3386. # Incoming malformed NULL packets:
  3387. iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
  3388. echo 'configure_firewall' >> $COMPLETION_FILE
  3389. }
  3390. function configure_firewall_ping {
  3391. if grep -Fxq "configure_firewall_ping" $COMPLETION_FILE; then
  3392. return
  3393. fi
  3394. # Only allow ping for mesh installs
  3395. if [[ $SYSTEM_TYPE != "$VARIANT_MESH" ]]; then
  3396. return
  3397. fi
  3398. iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
  3399. iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT
  3400. save_firewall_settings
  3401. echo 'configure_firewall_ping' >> $COMPLETION_FILE
  3402. }
  3403. function configure_firewall_for_voip {
  3404. if [[ $SYSTEM_TYPE == "$VARIANT_WRITER" || $SYSTEM_TYPE == "$VARIANT_MAILBOX" || $SYSTEM_TYPE == "$VARIANT_CLOUD" || $SYSTEM_TYPE == "$VARIANT_SOCIAL" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_DEVELOPER" ]]; then
  3405. return
  3406. fi
  3407. if grep -Fxq "configure_firewall_for_voip" $COMPLETION_FILE; then
  3408. return
  3409. fi
  3410. iptables -A INPUT -p udp --dport $VOIP_PORT -j ACCEPT
  3411. iptables -A INPUT -p tcp --dport $VOIP_PORT -j ACCEPT
  3412. save_firewall_settings
  3413. echo 'configure_firewall_for_voip' >> $COMPLETION_FILE
  3414. }
  3415. function configure_firewall_for_sip {
  3416. if [[ $SYSTEM_TYPE == "$VARIANT_WRITER" || $SYSTEM_TYPE == "$VARIANT_MAILBOX" || $SYSTEM_TYPE == "$VARIANT_CLOUD" || $SYSTEM_TYPE == "$VARIANT_SOCIAL" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_DEVELOPER" ]]; then
  3417. return
  3418. fi
  3419. if grep -Fxq "configure_firewall_for_sip" $COMPLETION_FILE; then
  3420. return
  3421. fi
  3422. iptables -A INPUT -p udp --dport $SIP_PORT -j ACCEPT
  3423. iptables -A INPUT -p tcp --dport $SIP_PORT -j ACCEPT
  3424. save_firewall_settings
  3425. echo 'configure_firewall_for_sip' >> $COMPLETION_FILE
  3426. }
  3427. function configure_firewall_for_ipfs {
  3428. if [[ $SYSTEM_TYPE == "$VARIANT_MAILBOX" || $SYSTEM_TYPE == "$VARIANT_CHAT" ]]; then
  3429. return
  3430. fi
  3431. if grep -Fxq "configure_firewall_for_ipfs" $COMPLETION_FILE; then
  3432. return
  3433. fi
  3434. iptables -A INPUT -p tcp --dport $IPFS_PORT -j ACCEPT
  3435. save_firewall_settings
  3436. echo 'configure_firewall_for_ipfs' >> $COMPLETION_FILE
  3437. }
  3438. function configure_firewall_for_avahi {
  3439. if grep -Fxq "configure_firewall_for_avahi" $COMPLETION_FILE; then
  3440. return
  3441. fi
  3442. iptables -A INPUT -p tcp --dport 548 -j ACCEPT
  3443. iptables -A INPUT -p udp --dport 548 -j ACCEPT
  3444. iptables -A INPUT -p tcp --dport 5353 -j ACCEPT
  3445. iptables -A INPUT -p udp --dport 5353 -j ACCEPT
  3446. iptables -A INPUT -p tcp --dport 5354 -j ACCEPT
  3447. iptables -A INPUT -p udp --dport 5354 -j ACCEPT
  3448. save_firewall_settings
  3449. echo 'configure_firewall_for_avahi' >> $COMPLETION_FILE
  3450. }
  3451. function configure_firewall_for_cjdns {
  3452. if grep -Fxq "configure_firewall_for_cjdns" $COMPLETION_FILE; then
  3453. return
  3454. fi
  3455. if [[ $ENABLE_CJDNS != "yes" ]]; then
  3456. return
  3457. fi
  3458. ip6tables -t nat -A POSTROUTING -o tun0 -j MASQUERADE
  3459. ip6tables -A FORWARD -i tun0 -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
  3460. save_firewall_settings
  3461. echo 'configure_firewall_for_cjdns' >> $COMPLETION_FILE
  3462. }
  3463. function configure_firewall_for_batman {
  3464. if grep -Fxq "configure_firewall_for_batman" $COMPLETION_FILE; then
  3465. return
  3466. fi
  3467. if [[ $ENABLE_BATMAN != "yes" ]]; then
  3468. return
  3469. fi
  3470. save_firewall_settings
  3471. echo 'configure_firewall_for_batman' >> $COMPLETION_FILE
  3472. }
  3473. function configure_firewall_for_babel {
  3474. if grep -Fxq "configure_firewall_for_babel" $COMPLETION_FILE; then
  3475. return
  3476. fi
  3477. if [[ $ENABLE_BABEL != "yes" ]]; then
  3478. return
  3479. fi
  3480. iptables -A INPUT -i $WIFI_INTERFACE -p udp --dport $BABEL_PORT -j ACCEPT
  3481. save_firewall_settings
  3482. echo 'configure_firewall_for_babel' >> $COMPLETION_FILE
  3483. }
  3484. function configure_firewall_for_zeronet {
  3485. if grep -Fxq "configure_firewall_for_zeronet" $COMPLETION_FILE; then
  3486. return
  3487. fi
  3488. if [[ $SYSTEM_TYPE != "$VARIANT_MESH" ]]; then
  3489. return
  3490. fi
  3491. iptables -A INPUT -i $WIFI_INTERFACE -p udp --dport $ZERONET_PORT -j ACCEPT
  3492. iptables -A INPUT -i $WIFI_INTERFACE -p tcp --dport $ZERONET_PORT -j ACCEPT
  3493. iptables -A INPUT -i $WIFI_INTERFACE -p udp --dport $TRACKER_PORT -j ACCEPT
  3494. iptables -A INPUT -i $WIFI_INTERFACE -p tcp --dport $TRACKER_PORT -j ACCEPT
  3495. iptables -A INPUT -i $WIFI_INTERFACE -p udp --dport 1900 -j ACCEPT
  3496. save_firewall_settings
  3497. echo 'configure_firewall_for_zeronet' >> $COMPLETION_FILE
  3498. }
  3499. function configure_firewall_for_dlna {
  3500. if grep -Fxq "configure_firewall_for_dlna" $COMPLETION_FILE; then
  3501. return
  3502. fi
  3503. if [[ $INSTALLED_WITHIN_DOCKER == "yes" ]]; then
  3504. # docker does its own firewalling
  3505. return
  3506. fi
  3507. if [[ $SYSTEM_TYPE == "$VARIANT_CLOUD" || $SYSTEM_TYPE == "$VARIANT_MAILBOX" || $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_WRITER" || $SYSTEM_TYPE == "$VARIANT_SOCIAL" ]]; then
  3508. return
  3509. fi
  3510. iptables -A INPUT -p udp --dport 1900 -j ACCEPT
  3511. iptables -A INPUT -p tcp --dport 8200 -j ACCEPT
  3512. save_firewall_settings
  3513. echo 'configure_firewall_for_dlna' >> $COMPLETION_FILE
  3514. }
  3515. function configure_firewall_for_dns {
  3516. if grep -Fxq "configure_firewall_for_dns" $COMPLETION_FILE; then
  3517. return
  3518. fi
  3519. if [[ $INSTALLED_WITHIN_DOCKER == "yes" ]]; then
  3520. # docker does its own firewalling
  3521. return
  3522. fi
  3523. iptables -A INPUT -p udp -m udp --dport 1024:65535 --sport 53 -j ACCEPT
  3524. save_firewall_settings
  3525. echo 'configure_firewall_for_dns' >> $COMPLETION_FILE
  3526. }
  3527. function configure_firewall_for_xmpp {
  3528. if [ ! -d /etc/prosody ]; then
  3529. return
  3530. fi
  3531. if grep -Fxq "configure_firewall_for_xmpp" $COMPLETION_FILE; then
  3532. return
  3533. fi
  3534. if [[ $INSTALLED_WITHIN_DOCKER == "yes" ]]; then
  3535. # docker does its own firewalling
  3536. return
  3537. fi
  3538. iptables -A INPUT -p tcp --dport 5222:5223 -j ACCEPT
  3539. iptables -A INPUT -p tcp --dport 5269 -j ACCEPT
  3540. iptables -A INPUT -p tcp --dport 5280:5281 -j ACCEPT
  3541. save_firewall_settings
  3542. echo 'configure_firewall_for_xmpp' >> $COMPLETION_FILE
  3543. }
  3544. function configure_firewall_for_irc {
  3545. if [ ! -d /etc/ngircd ]; then
  3546. return
  3547. fi
  3548. if grep -Fxq "configure_firewall_for_irc" $COMPLETION_FILE; then
  3549. return
  3550. fi
  3551. if [[ $INSTALLED_WITHIN_DOCKER == "yes" ]]; then
  3552. # docker does its own firewalling
  3553. return
  3554. fi
  3555. iptables -A INPUT -p tcp --dport $IRC_PORT -j ACCEPT
  3556. iptables -I INPUT -p tcp --dport 1024:65535 --sport $IRC_PORT -j ACCEPT
  3557. iptables -A INPUT -p tcp --dport 9999 -j ACCEPT
  3558. save_firewall_settings
  3559. echo 'configure_firewall_for_irc' >> $COMPLETION_FILE
  3560. }
  3561. function configure_firewall_for_ftp {
  3562. if grep -Fxq "configure_firewall_for_ftp" $COMPLETION_FILE; then
  3563. return
  3564. fi
  3565. if [[ $INSTALLED_WITHIN_DOCKER == "yes" ]]; then
  3566. # docker does its own firewalling
  3567. return
  3568. fi
  3569. iptables -I INPUT -p tcp --dport 1024:65535 --sport 20:21 -j ACCEPT
  3570. save_firewall_settings
  3571. echo 'configure_firewall_for_ftp' >> $COMPLETION_FILE
  3572. }
  3573. function configure_firewall_for_web_access {
  3574. if grep -Fxq "configure_firewall_for_web_access" $COMPLETION_FILE; then
  3575. return
  3576. fi
  3577. if [[ $INSTALLED_WITHIN_DOCKER == "yes" ]]; then
  3578. # docker does its own firewalling
  3579. return
  3580. fi
  3581. iptables -A INPUT -p tcp --dport 32768:61000 --sport 80 -j ACCEPT
  3582. iptables -A INPUT -p tcp --dport 32768:61000 --sport 443 -j ACCEPT
  3583. save_firewall_settings
  3584. echo 'configure_firewall_for_web_access' >> $COMPLETION_FILE
  3585. }
  3586. function configure_firewall_for_web_server {
  3587. if grep -Fxq "configure_firewall_for_web_server" $COMPLETION_FILE; then
  3588. return
  3589. fi
  3590. if [[ $INSTALLED_WITHIN_DOCKER == "yes" ]]; then
  3591. # docker does its own firewalling
  3592. return
  3593. fi
  3594. iptables -A INPUT -p tcp --dport 80 -j ACCEPT
  3595. iptables -A INPUT -p tcp --dport 443 -j ACCEPT
  3596. save_firewall_settings
  3597. echo 'configure_firewall_for_web_server' >> $COMPLETION_FILE
  3598. }
  3599. function configure_firewall_for_tox {
  3600. if grep -Fxq "configure_firewall_for_tox" $COMPLETION_FILE; then
  3601. return
  3602. fi
  3603. if [[ $INSTALLED_WITHIN_DOCKER == "yes" ]]; then
  3604. # docker does its own firewalling
  3605. return
  3606. fi
  3607. iptables -A INPUT -p tcp --dport $TOX_PORT -j ACCEPT
  3608. save_firewall_settings
  3609. echo 'configure_firewall_for_tox' >> $COMPLETION_FILE
  3610. }
  3611. function configure_firewall_for_ssh {
  3612. if grep -Fxq "configure_firewall_for_ssh" $COMPLETION_FILE; then
  3613. return
  3614. fi
  3615. if [[ $INSTALLED_WITHIN_DOCKER == "yes" ]]; then
  3616. # docker does its own firewalling
  3617. return
  3618. fi
  3619. iptables -A INPUT -p tcp --dport 22 -j ACCEPT
  3620. iptables -A INPUT -p tcp --dport $SSH_PORT -j ACCEPT
  3621. save_firewall_settings
  3622. echo 'configure_firewall_for_ssh' >> $COMPLETION_FILE
  3623. }
  3624. function configure_firewall_for_git {
  3625. if grep -Fxq "configure_firewall_for_git" $COMPLETION_FILE; then
  3626. return
  3627. fi
  3628. if [[ $INSTALLED_WITHIN_DOCKER == "yes" ]]; then
  3629. # docker does its own firewalling
  3630. return
  3631. fi
  3632. iptables -A INPUT -p tcp --dport 9418 -j ACCEPT
  3633. save_firewall_settings
  3634. echo 'configure_firewall_for_git' >> $COMPLETION_FILE
  3635. }
  3636. function configure_firewall_for_email {
  3637. if [[ $SYSTEM_TYPE == "$VARIANT_WRITER" || $SYSTEM_TYPE == "$VARIANT_CLOUD" || $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_SOCIAL" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_DEVELOPER" || $SYSTEM_TYPE == "$VARIANT_MESH" || $SYSTEM_TYPE == "$VARIANT_NONMAILBOX" ]]; then
  3638. return
  3639. fi
  3640. if grep -Fxq "configure_firewall_for_email" $COMPLETION_FILE; then
  3641. return
  3642. fi
  3643. if [[ $INSTALLED_WITHIN_DOCKER == "yes" ]]; then
  3644. # docker does its own firewalling
  3645. return
  3646. fi
  3647. iptables -A INPUT -p tcp --dport 25 -j ACCEPT
  3648. iptables -A INPUT -p tcp --dport 587 -j ACCEPT
  3649. iptables -A INPUT -p tcp --dport 465 -j ACCEPT
  3650. iptables -A INPUT -p tcp --dport 993 -j ACCEPT
  3651. save_firewall_settings
  3652. echo 'configure_firewall_for_email' >> $COMPLETION_FILE
  3653. }
  3654. function configure_internet_protocol {
  3655. if grep -Fxq "configure_internet_protocol" $COMPLETION_FILE; then
  3656. return
  3657. fi
  3658. if [[ $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  3659. return
  3660. fi
  3661. sed -i "s/#net.ipv4.tcp_syncookies=1/net.ipv4.tcp_syncookies=1/g" /etc/sysctl.conf
  3662. sed -i "s/#net.ipv4.conf.all.accept_redirects = 0/net.ipv4.conf.all.accept_redirects = 0/g" /etc/sysctl.conf
  3663. sed -i "s/#net.ipv6.conf.all.accept_redirects = 0/net.ipv6.conf.all.accept_redirects = 0/g" /etc/sysctl.conf
  3664. sed -i "s/#net.ipv4.conf.all.send_redirects = 0/net.ipv4.conf.all.send_redirects = 0/g" /etc/sysctl.conf
  3665. sed -i "s/#net.ipv4.conf.all.accept_source_route = 0/net.ipv4.conf.all.accept_source_route = 0/g" /etc/sysctl.conf
  3666. sed -i "s/#net.ipv6.conf.all.accept_source_route = 0/net.ipv6.conf.all.accept_source_route = 0/g" /etc/sysctl.conf
  3667. sed -i "s/#net.ipv4.conf.default.rp_filter=1/net.ipv4.conf.default.rp_filter=1/g" /etc/sysctl.conf
  3668. sed -i "s/#net.ipv4.conf.all.rp_filter=1/net.ipv4.conf.all.rp_filter=1/g" /etc/sysctl.conf
  3669. sed -i "s/#net.ipv4.ip_forward=1/net.ipv4.ip_forward=0/g" /etc/sysctl.conf
  3670. sed -i "s/#net.ipv6.conf.all.forwarding=1/net.ipv6.conf.all.forwarding=0/g" /etc/sysctl.conf
  3671. if ! grep -q "ignore pings" /etc/sysctl.conf; then
  3672. echo '# ignore pings' >> /etc/sysctl.conf
  3673. echo 'net.ipv4.icmp_echo_ignore_all = 1' >> /etc/sysctl.conf
  3674. echo 'net.ipv6.icmp_echo_ignore_all = 1' >> /etc/sysctl.conf
  3675. fi
  3676. if ! grep -q "disable ipv6" /etc/sysctl.conf; then
  3677. echo '# disable ipv6' >> /etc/sysctl.conf
  3678. echo 'net.ipv6.conf.all.disable_ipv6 = 1' >> /etc/sysctl.conf
  3679. fi
  3680. if ! grep -q "net.ipv4.tcp_synack_retries" /etc/sysctl.conf; then
  3681. echo 'net.ipv4.tcp_synack_retries = 2' >> /etc/sysctl.conf
  3682. echo 'net.ipv4.tcp_syn_retries = 1' >> /etc/sysctl.conf
  3683. fi
  3684. if ! grep -q "keepalive" /etc/sysctl.conf; then
  3685. echo '# keepalive' >> /etc/sysctl.conf
  3686. echo 'net.ipv4.tcp_keepalive_probes = 9' >> /etc/sysctl.conf
  3687. echo 'net.ipv4.tcp_keepalive_intvl = 75' >> /etc/sysctl.conf
  3688. echo 'net.ipv4.tcp_keepalive_time = 7200' >> /etc/sysctl.conf
  3689. fi
  3690. echo 'configure_internet_protocol' >> $COMPLETION_FILE
  3691. }
  3692. function configure_email {
  3693. if [[ $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  3694. return
  3695. fi
  3696. if grep -Fxq "configure_email" $COMPLETION_FILE; then
  3697. return
  3698. fi
  3699. apt-get -y remove postfix
  3700. apt-get -y install exim4 sasl2-bin swaks libnet-ssleay-perl procmail
  3701. if [ ! -d /etc/exim4 ]; then
  3702. echo $"ERROR: Exim does not appear to have installed. $CHECK_MESSAGE"
  3703. exit 48
  3704. fi
  3705. # configure for Maildir format
  3706. sed -i 's/MAIL_DIR/#MAIL_DIR/g' /etc/login.defs
  3707. sed -i 's|#MAIL_FILE.*|MAIL_FILE Maildir/|g' /etc/login.defs
  3708. if ! grep -q "export MAIL" /etc/profile; then
  3709. echo 'export MAIL=~/Maildir' >> /etc/profile
  3710. fi
  3711. sed -i 's|pam_mail.so standard|pam_mail.so dir=~/Maildir standard|g' /etc/pam.d/login
  3712. sed -i 's|pam_mail.so standard noenv|pam_mail.so dir=~/Maildir standard|g' /etc/pam.d/sshd
  3713. sed -i 's|pam_mail.so nopen|pam_mail.so dir=~/Maildir nopen|g' /etc/pam.d/su
  3714. echo 'dc_eximconfig_configtype="internet"' > /etc/exim4/update-exim4.conf.conf
  3715. echo "dc_other_hostnames='$DEFAULT_DOMAIN_NAME'" >> /etc/exim4/update-exim4.conf.conf
  3716. echo "dc_local_interfaces=''" >> /etc/exim4/update-exim4.conf.conf
  3717. echo "dc_readhost=''" >> /etc/exim4/update-exim4.conf.conf
  3718. echo "dc_relay_domains=''" >> /etc/exim4/update-exim4.conf.conf
  3719. echo "dc_minimaldns='false'" >> /etc/exim4/update-exim4.conf.conf
  3720. RELAY_NETS='192.168.1.0/24'
  3721. if [ $LOCAL_NETWORK_STATIC_IP_ADDRESS ]; then
  3722. RELAY_NETS=$(echo $LOCAL_NETWORK_STATIC_IP_ADDRESS | awk -F '.' '{print $1 "." $2 "." $3 ".0/24"}')
  3723. fi
  3724. echo "dc_relay_nets='$RELAY_NETS'" >> /etc/exim4/update-exim4.conf.conf
  3725. echo "dc_smarthost=''" >> /etc/exim4/update-exim4.conf.conf
  3726. echo "CFILEMODE='644'" >> /etc/exim4/update-exim4.conf.conf
  3727. echo "dc_use_split_config='false'" >> /etc/exim4/update-exim4.conf.conf
  3728. echo "dc_hide_mailname=''" >> /etc/exim4/update-exim4.conf.conf
  3729. echo "dc_mailname_in_oh='true'" >> /etc/exim4/update-exim4.conf.conf
  3730. echo "dc_localdelivery='maildir_home'" >> /etc/exim4/update-exim4.conf.conf
  3731. update-exim4.conf
  3732. sed -i "s/START=no/START=yes/g" /etc/default/saslauthd
  3733. /etc/init.d/saslauthd start
  3734. # make a tls certificate for email
  3735. if [ ! -f /etc/ssl/certs/exim.dhparam ]; then
  3736. ${PROJECT_NAME}-addcert -h exim --dhkey $DH_KEYLENGTH
  3737. check_certificates exim
  3738. fi
  3739. cp /etc/ssl/private/exim.key /etc/exim4
  3740. cp /etc/ssl/certs/exim.crt /etc/exim4
  3741. cp /etc/ssl/certs/exim.dhparam /etc/exim4
  3742. chown root:Debian-exim /etc/exim4/exim.key /etc/exim4/exim.crt /etc/exim4/exim.dhparam
  3743. chmod 640 /etc/exim4/exim.key /etc/exim4/exim.crt /etc/exim4/exim.dhparam
  3744. sed -i '/login_saslauthd_server/,/.endif/ s/# *//' /etc/exim4/exim4.conf.template
  3745. sed -i "/.ifdef MAIN_HARDCODE_PRIMARY_HOSTNAME/i\MAIN_HARDCODE_PRIMARY_HOSTNAME = $DEFAULT_DOMAIN_NAME\nMAIN_TLS_ENABLE = true" /etc/exim4/exim4.conf.template
  3746. sed -i "s|SMTPLISTENEROPTIONS=''|SMTPLISTENEROPTIONS='-oX 465:25:587 -oP /var/run/exim4/exim.pid'|g" /etc/default/exim4
  3747. if ! grep -q "tls_on_connect_ports=465" /etc/exim4/exim4.conf.template; then
  3748. sed -i '/SSL configuration for exim/i\tls_on_connect_ports=465' /etc/exim4/exim4.conf.template
  3749. fi
  3750. adduser $MY_USERNAME sasl
  3751. addgroup Debian-exim sasl
  3752. /etc/init.d/exim4 restart
  3753. if [ ! -d /etc/skel/Maildir ]; then
  3754. mkdir -m 700 /etc/skel/.mutt
  3755. mkdir -m 700 /etc/skel/Maildir
  3756. mkdir -m 700 /etc/skel/Maildir/new
  3757. mkdir -m 700 /etc/skel/Maildir/cur
  3758. mkdir -m 700 /etc/skel/Maildir/Sent
  3759. mkdir -m 700 /etc/skel/Maildir/Sent/tmp
  3760. mkdir -m 700 /etc/skel/Maildir/Sent/cur
  3761. mkdir -m 700 /etc/skel/Maildir/Sent/new
  3762. mkdir -m 700 /etc/skel/Maildir/.learn-spam
  3763. mkdir -m 700 /etc/skel/Maildir/.learn-spam/cur
  3764. mkdir -m 700 /etc/skel/Maildir/.learn-spam/new
  3765. mkdir -m 700 /etc/skel/Maildir/.learn-spam/tmp
  3766. mkdir -m 700 /etc/skel/Maildir/.learn-ham
  3767. mkdir -m 700 /etc/skel/Maildir/.learn-ham/cur
  3768. mkdir -m 700 /etc/skel/Maildir/.learn-ham/new
  3769. mkdir -m 700 /etc/skel/Maildir/.learn-ham/tmp
  3770. ln -s /etc/skel/Maildir/.learn-spam /etc/skel/Maildir/spam
  3771. ln -s /etc/skel/Maildir/.learn-ham /etc/skel/Maildir/ham
  3772. fi
  3773. if [ ! -d /home/$MY_USERNAME/Maildir ]; then
  3774. mkdir -m 700 /home/$MY_USERNAME/.mutt
  3775. mkdir -m 700 /home/$MY_USERNAME/Maildir
  3776. mkdir -m 700 /home/$MY_USERNAME/Maildir/cur
  3777. mkdir -m 700 /home/$MY_USERNAME/Maildir/tmp
  3778. mkdir -m 700 /home/$MY_USERNAME/Maildir/new
  3779. mkdir -m 700 /home/$MY_USERNAME/Maildir/Sent
  3780. mkdir -m 700 /home/$MY_USERNAME/Maildir/Sent/cur
  3781. mkdir -m 700 /home/$MY_USERNAME/Maildir/Sent/tmp
  3782. mkdir -m 700 /home/$MY_USERNAME/Maildir/Sent/new
  3783. mkdir -m 700 /home/$MY_USERNAME/Maildir/.learn-spam
  3784. mkdir -m 700 /home/$MY_USERNAME/Maildir/.learn-spam/cur
  3785. mkdir -m 700 /home/$MY_USERNAME/Maildir/.learn-spam/new
  3786. mkdir -m 700 /home/$MY_USERNAME/Maildir/.learn-spam/tmp
  3787. mkdir -m 700 /home/$MY_USERNAME/Maildir/.learn-ham
  3788. mkdir -m 700 /home/$MY_USERNAME/Maildir/.learn-ham/cur
  3789. mkdir -m 700 /home/$MY_USERNAME/Maildir/.learn-ham/new
  3790. mkdir -m 700 /home/$MY_USERNAME/Maildir/.learn-ham/tmp
  3791. ln -s /home/$MY_USERNAME/Maildir/.learn-spam /home/$MY_USERNAME/Maildir/spam
  3792. ln -s /home/$MY_USERNAME/Maildir/.learn-ham /home/$MY_USERNAME/Maildir/ham
  3793. chown -R $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/Maildir
  3794. fi
  3795. echo 'configure_email' >> $COMPLETION_FILE
  3796. }
  3797. function create_procmail {
  3798. if [[ $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_NONMAILBOX" || $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  3799. return
  3800. fi
  3801. if grep -Fxq "create_procmail" $COMPLETION_FILE; then
  3802. return
  3803. fi
  3804. if [ ! -f /home/$MY_USERNAME/.procmailrc ]; then
  3805. echo 'MAILDIR=$HOME/Maildir' > /home/$MY_USERNAME/.procmailrc
  3806. echo 'DEFAULT=$MAILDIR/' >> /home/$MY_USERNAME/.procmailrc
  3807. echo 'LOGFILE=$HOME/log/procmail.log' >> /home/$MY_USERNAME/.procmailrc
  3808. echo 'LOGABSTRACT=all' >> /home/$MY_USERNAME/.procmailrc
  3809. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.procmailrc
  3810. fi
  3811. if [ ! -f /etc/skel/.procmailrc ]; then
  3812. cp /home/$MY_USERNAME/.procmailrc /etc/skel/.procmailrc
  3813. chown root:root /etc/skel/.procmailrc
  3814. fi
  3815. echo 'create_procmail' >> $COMPLETION_FILE
  3816. }
  3817. function spam_filtering {
  3818. if [[ $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_NONMAILBOX" || $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  3819. return
  3820. fi
  3821. if grep -Fxq "spam_filtering" $COMPLETION_FILE; then
  3822. return
  3823. fi
  3824. apt-get -y install exim4-daemon-heavy
  3825. apt-get -y install spamassassin
  3826. sa-update -v
  3827. sed -i 's/ENABLED=0/ENABLED=1/g' /etc/default/spamassassin
  3828. sed -i 's/# spamd_address = 127.0.0.1 783/spamd_address = 127.0.0.1 783/g' /etc/exim4/exim4.conf.template
  3829. # This configuration is based on https://wiki.debian.org/DebianSpamAssassin
  3830. sed -i 's/local_parts = postmaster/local_parts = postmaster:abuse/g' /etc/exim4/conf.d/acl/30_exim4-config_check_rcpt
  3831. sed -i '/domains = +local_domains : +relay_to_domains/a\ set acl_m0 = rfcnames' /etc/exim4/conf.d/acl/30_exim4-config_check_rcpt
  3832. sed -i 's/accept/accept condition = ${if eq{$acl_m0}{rfcnames} {1}{0}}/g' /etc/exim4/conf.d/acl/40_exim4-config_check_data
  3833. echo 'warn message = X-Spam-Score: $spam_score ($spam_bar)' >> /etc/exim4/conf.d/acl/40_exim4-config_check_data
  3834. echo ' spam = nobody:true' >> /etc/exim4/conf.d/acl/40_exim4-config_check_data
  3835. echo 'warn message = X-Spam-Flag: YES' >> /etc/exim4/conf.d/acl/40_exim4-config_check_data
  3836. echo ' spam = nobody' >> /etc/exim4/conf.d/acl/40_exim4-config_check_data
  3837. echo 'warn message = X-Spam-Report: $spam_report' >> /etc/exim4/conf.d/acl/40_exim4-config_check_data
  3838. echo ' spam = nobody' >> /etc/exim4/conf.d/acl/40_exim4-config_check_data
  3839. echo '# reject spam at high scores (> 12)' >> /etc/exim4/conf.d/acl/40_exim4-config_check_data
  3840. echo 'deny message = This message scored $spam_score spam points.' >> /etc/exim4/conf.d/acl/40_exim4-config_check_data
  3841. echo ' spam = nobody:true' >> /etc/exim4/conf.d/acl/40_exim4-config_check_data
  3842. echo ' condition = ${if >{$spam_score_int}{120}{1}{0}}' >> /etc/exim4/conf.d/acl/40_exim4-config_check_data
  3843. # procmail configuration
  3844. echo '# get spamassassin to check emails' >> /home/$MY_USERNAME/.procmailrc
  3845. echo ':0fw: .spamassassin.lock' >> /home/$MY_USERNAME/.procmailrc
  3846. echo ' * < 256000' >> /home/$MY_USERNAME/.procmailrc
  3847. echo '| spamc' >> /home/$MY_USERNAME/.procmailrc
  3848. echo '# strong spam are discarded' >> /home/$MY_USERNAME/.procmailrc
  3849. echo ':0' >> /home/$MY_USERNAME/.procmailrc
  3850. echo ' * ^X-Spam-Level: \*\*\*\*\*\*' >> /home/$MY_USERNAME/.procmailrc
  3851. echo '/dev/null' >> /home/$MY_USERNAME/.procmailrc
  3852. echo '# weak spam are kept just in case - clear this out every now and then' >> /home/$MY_USERNAME/.procmailrc
  3853. echo ':0' >> /home/$MY_USERNAME/.procmailrc
  3854. echo ' * ^X-Spam-Level: \*\*\*\*\*' >> /home/$MY_USERNAME/.procmailrc
  3855. echo 'maybe-spam/' >> /home/$MY_USERNAME/.procmailrc
  3856. echo '# otherwise, marginal spam goes here for revision' >> /home/$MY_USERNAME/.procmailrc
  3857. echo ':0' >> /home/$MY_USERNAME/.procmailrc
  3858. echo ' * ^X-Spam-Level: \*\*' >> /home/$MY_USERNAME/.procmailrc
  3859. echo 'spam/' >> /home/$MY_USERNAME/.procmailrc
  3860. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.procmailrc
  3861. echo '# get spamassassin to check emails' >> /etc/skel/.procmailrc
  3862. echo ':0fw: .spamassassin.lock' >> /etc/skel/.procmailrc
  3863. echo ' * < 256000' >> /etc/skel/.procmailrc
  3864. echo '| spamc' >> /etc/skel/.procmailrc
  3865. echo '# strong spam are discarded' >> /etc/skel/.procmailrc
  3866. echo ':0' >> /etc/skel/.procmailrc
  3867. echo ' * ^X-Spam-Level: \*\*\*\*\*\*' >> /etc/skel/.procmailrc
  3868. echo '/dev/null' >> /etc/skel/.procmailrc
  3869. echo '# weak spam are kept just in case - clear this out every now and then' >> /etc/skel/.procmailrc
  3870. echo ':0' >> /etc/skel/.procmailrc
  3871. echo ' * ^X-Spam-Level: \*\*\*\*\*' >> /etc/skel/.procmailrc
  3872. echo 'maybe-spam/' >> /etc/skel/.procmailrc
  3873. echo '# otherwise, marginal spam goes here for revision' >> /etc/skel/.procmailrc
  3874. echo ':0' >> /etc/skel/.procmailrc
  3875. echo ' * ^X-Spam-Level: \*\*' >> /etc/skel/.procmailrc
  3876. echo 'spam/' >> /etc/skel/.procmailrc
  3877. # filtering scripts
  3878. echo '#!/bin/bash' > /usr/bin/filterspam
  3879. echo 'for d in /home/*/ ; do' >> /usr/bin/filterspam
  3880. echo ' USERNAME=$(echo "$d" | awk -F '"'"'/'"'"' '"'"'{print $3}'"'"')' >> /usr/bin/filterspam
  3881. echo ' if [[ $USERNAME != "git" ]]; then' >> /usr/bin/filterspam
  3882. echo ' MAILDIR=/home/$USERNAME/Maildir/.learn-spam' >> /usr/bin/filterspam
  3883. echo ' if [ ! -d "$MAILDIR" ]; then' >> /usr/bin/filterspam
  3884. echo ' exit' >> /usr/bin/filterspam
  3885. echo ' fi' >> /usr/bin/filterspam
  3886. echo ' for f in `ls $MAILDIR/cur`' >> /usr/bin/filterspam
  3887. echo ' do' >> /usr/bin/filterspam
  3888. echo ' spamc -L spam < "$MAILDIR/cur/$f" > /dev/null' >> /usr/bin/filterspam
  3889. echo ' rm "$MAILDIR/cur/$f"' >> /usr/bin/filterspam
  3890. echo ' done' >> /usr/bin/filterspam
  3891. echo ' for f in `ls $MAILDIR/new`' >> /usr/bin/filterspam
  3892. echo ' do' >> /usr/bin/filterspam
  3893. echo ' spamc -L spam < "$MAILDIR/new/$f" > /dev/null' >> /usr/bin/filterspam
  3894. echo ' rm "$MAILDIR/new/$f"' >> /usr/bin/filterspam
  3895. echo ' done' >> /usr/bin/filterspam
  3896. echo ' fi' >> /usr/bin/filterspam
  3897. echo 'done' >> /usr/bin/filterspam
  3898. echo 'exit 0' >> /usr/bin/filterspam
  3899. echo '#!/bin/bash' > /usr/bin/filterham
  3900. echo 'for d in /home/*/ ; do' >> /usr/bin/filterham
  3901. echo ' USERNAME=$(echo "$d" | awk -F '"'"'/'"'"' '"'"'{print $3}'"'"')' >> /usr/bin/filterham
  3902. echo ' if [[ $USERNAME != "git" ]]; then' >> /usr/bin/filterham
  3903. echo ' MAILDIR=/home/$USERNAME/Maildir/.learn-ham' >> /usr/bin/filterham
  3904. echo ' if [ ! -d "$MAILDIR" ]; then' >> /usr/bin/filterham
  3905. echo ' exit' >> /usr/bin/filterham
  3906. echo ' fi' >> /usr/bin/filterham
  3907. echo ' for f in `ls $MAILDIR/cur`' >> /usr/bin/filterham
  3908. echo ' do' >> /usr/bin/filterham
  3909. echo ' spamc -L ham < "$MAILDIR/cur/$f" > /dev/null' >> /usr/bin/filterham
  3910. echo ' rm "$MAILDIR/cur/$f"' >> /usr/bin/filterham
  3911. echo ' done' >> /usr/bin/filterham
  3912. echo ' for f in `ls $MAILDIR/new`' >> /usr/bin/filterham
  3913. echo ' do' >> /usr/bin/filterham
  3914. echo ' spamc -L ham < "$MAILDIR/new/$f" > /dev/null' >> /usr/bin/filterham
  3915. echo ' rm "$MAILDIR/new/$f"' >> /usr/bin/filterham
  3916. echo ' done' >> /usr/bin/filterham
  3917. echo ' fi' >> /usr/bin/filterham
  3918. echo 'done' >> /usr/bin/filterham
  3919. echo 'exit 0' >> /usr/bin/filterham
  3920. if ! grep -q "filterspam" /etc/crontab; then
  3921. echo "*/3 * * * * root /usr/bin/timeout 120 /usr/bin/filterspam" >> /etc/crontab
  3922. fi
  3923. if ! grep -q "filterham" /etc/crontab; then
  3924. echo "*/3 * * * * root /usr/bin/timeout 120 /usr/bin/filterham" >> /etc/crontab
  3925. fi
  3926. chmod 655 /usr/bin/filterspam /usr/bin/filterham
  3927. sed -i 's/# use_bayes 1/use_bayes 1/g' /etc/mail/spamassassin/local.cf
  3928. sed -i 's/# bayes_auto_learn 1/bayes_auto_learn 1/g' /etc/mail/spamassassin/local.cf
  3929. # user preferences
  3930. if [ ! -d /home/$MY_USERNAME/.spamassassin ]; then
  3931. mkdir /home/$MY_USERNAME/.spamassassin
  3932. echo $'# How many points before a mail is considered spam.' > /home/$MY_USERNAME/.spamassassin/user_prefs
  3933. echo '# required_score 5' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  3934. echo '' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  3935. echo $'# Whitelist and blacklist addresses are now file-glob-style patterns, so' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  3936. echo $'# "friend@somewhere.com", "*@isp.com", or "*.domain.net" will all work.' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  3937. echo '# whitelist_from someone@somewhere.com' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  3938. echo '' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  3939. echo $'# Add your own customised scores for some tests below. The default scores are' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  3940. echo $'# read from the installed spamassassin rules files, but you can override them' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  3941. echo $'# here. To see the list of tests and their default scores, go to' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  3942. echo '# http://spamassassin.apache.org/tests.html .' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  3943. echo '#' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  3944. echo '# score SYMBOLIC_TEST_NAME n.nn' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  3945. echo '' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  3946. echo $'# Speakers of Asian languages, like Chinese, Japanese and Korean, will almost' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  3947. echo $'# definitely want to uncomment the following lines. They will switch off some' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  3948. echo $'# rules that detect 8-bit characters, which commonly trigger on mails using CJK' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  3949. echo $'# character sets, or that assume a western-style charset is in use. ' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  3950. echo '# ' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  3951. echo '# score HTML_COMMENT_8BITS 0' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  3952. echo '# score UPPERCASE_25_50 0' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  3953. echo '# score UPPERCASE_50_75 0' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  3954. echo '# score UPPERCASE_75_100 0' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  3955. echo '# score OBSCURED_EMAIL 0' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  3956. echo '' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  3957. echo $'# Speakers of any language that uses non-English, accented characters may wish' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  3958. echo $'# to uncomment the following lines. They turn off rules that fire on' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  3959. echo $'# misformatted messages generated by common mail apps in contravention of the' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  3960. echo $'# email RFCs.' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  3961. echo '' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  3962. echo '# score SUBJ_ILLEGAL_CHARS 0' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  3963. fi
  3964. # this must be accessible by root
  3965. chown -R $MY_USERNAME:root /home/$MY_USERNAME/.spamassassin
  3966. service spamassassin restart
  3967. service exim4 restart
  3968. service cron restart
  3969. echo 'spam_filtering' >> $COMPLETION_FILE
  3970. }
  3971. function configure_imap {
  3972. if [[ $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_NONMAILBOX" || $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  3973. return
  3974. fi
  3975. if grep -Fxq "configure_imap" $COMPLETION_FILE; then
  3976. return
  3977. fi
  3978. dpkg -P dovecot-imapd
  3979. dpkg -P dovecot-core
  3980. apt-get -y install dovecot-imapd
  3981. if [ ! -d /etc/dovecot ]; then
  3982. echo $"ERROR: Dovecot does not appear to have installed. $CHECK_MESSAGE"
  3983. exit 48
  3984. fi
  3985. if [ ! -f /etc/ssl/certs/dovecot.dhparam ]; then
  3986. ${PROJECT_NAME}-addcert -h dovecot --dhkey $DH_KEYLENGTH
  3987. check_certificates dovecot
  3988. fi
  3989. chown root:dovecot /etc/ssl/certs/dovecot.*
  3990. chown root:dovecot /etc/ssl/private/dovecot.*
  3991. if [ ! -f /etc/dovecot/conf.d/10-ssl.conf ]; then
  3992. echo $'Unable to find /etc/dovecot/conf.d/10-ssl.conf'
  3993. exit 83629
  3994. fi
  3995. sed -i 's|#ssl =.*|ssl = required|g' /etc/dovecot/conf.d/10-ssl.conf
  3996. sed -i 's|ssl = no|ssl = required|g' /etc/dovecot/conf.d/10-ssl.conf
  3997. sed -i 's|ssl = yes|ssl = required|g' /etc/dovecot/conf.d/10-ssl.conf
  3998. sed -i 's|#ssl_cert =.*|ssl_cert = </etc/ssl/certs/dovecot.crt|g' /etc/dovecot/conf.d/10-ssl.conf
  3999. sed -i 's|ssl_cert =.*|ssl_cert = </etc/ssl/certs/dovecot.crt|g' /etc/dovecot/conf.d/10-ssl.conf
  4000. sed -i 's|#ssl_key =.*|ssl_key = </etc/ssl/private/dovecot.key|g' /etc/dovecot/conf.d/10-ssl.conf
  4001. sed -i 's|ssl_key =.*|ssl_key = </etc/ssl/private/dovecot.key|g' /etc/dovecot/conf.d/10-ssl.conf
  4002. sed -i 's|#ssl_dh_parameters_length.*|ssl_dh_parameters_length = 2048|g' /etc/dovecot/conf.d/10-ssl.conf
  4003. sed -i 's/#ssl_prefer_server_ciphers.*/ssl_prefer_server_ciphers = yes/g' /etc/dovecot/conf.d/10-ssl.conf
  4004. sed -i "s|#ssl_protocols =.*|ssl_protocols = '$SSL_PROTOCOLS'|g" /etc/dovecot/conf.d/10-ssl.conf
  4005. sed -i "s|ssl_protocols =.*|ssl_protocols = '$SSL_PROTOCOLS'|g" /etc/dovecot/conf.d/10-ssl.conf
  4006. echo "ssl_cipher_list = '$SSL_CIPHERS'" >> /etc/dovecot/conf.d/10-ssl.conf
  4007. if [ ! -f /etc/dovecot/conf.d/10-master.conf ]; then
  4008. echo $'Unable to find /etc/dovecot/conf.d/10-master.conf'
  4009. exit 49259
  4010. fi
  4011. sed -i 's/#process_limit =.*/process_limit = 100/g' /etc/dovecot/conf.d/10-master.conf
  4012. sed -i 's/#default_client_limit.*/default_client_limit = 100/g' /etc/dovecot/conf.d/10-master.conf
  4013. sed -i 's|#default_process_limit =.*|default_process_limit = 100|g' /etc/dovecot/conf.d/10-master.conf
  4014. if [ ! -f /etc/dovecot/conf.d/10-logging.conf ]; then
  4015. echo $'Unable to find /etc/dovecot/conf.d/10-logging.conf'
  4016. exit 48936
  4017. fi
  4018. sed -i 's/#auth_verbose.*/auth_verbose = yes/g' /etc/dovecot/conf.d/10-logging.conf
  4019. if [ ! -f /etc/dovecot/dovecot.conf ]; then
  4020. echo $'Unable to find /etc/dovecot/dovecot.conf'
  4021. exit 43890
  4022. fi
  4023. sed -i 's/#listen =.*/listen = */g' /etc/dovecot/dovecot.conf
  4024. if [ ! -f /etc/dovecot/conf.d/10-auth.conf ]; then
  4025. echo $'Unable to find /etc/dovecot/conf.d/10-auth.conf'
  4026. exit 843256
  4027. fi
  4028. sed -i 's/#disable_plaintext_auth =.*/disable_plaintext_auth = no/g' /etc/dovecot/conf.d/10-auth.conf
  4029. sed -i 's/auth_mechanisms =.*/auth_mechanisms = plain login/g' /etc/dovecot/conf.d/10-auth.conf
  4030. if [ ! -f /etc/dovecot/conf.d/10-mail.conf ]; then
  4031. echo $'Unable to find /etc/dovecot/conf.d/10-mail.conf'
  4032. exit 42036
  4033. fi
  4034. sed -i 's|mail_location =.*|mail_location = maildir:~/Maildir:LAYOUT=fs|g' /etc/dovecot/conf.d/10-mail.conf
  4035. # This long notify interval makes the system more suited for use with
  4036. # battery powered mobile devices
  4037. sed -i 's|#imap_idle_notify_interval =.*|imap_idle_notify_interval = 29|g' /etc/dovecot/conf.d/20-imap.conf
  4038. if [ -f /var/lib/dovecot/ssl-parameters.dat ]; then
  4039. rm /var/lib/dovecot/ssl-parameters.dat
  4040. fi
  4041. service dovecot restart
  4042. echo 'configure_imap' >> $COMPLETION_FILE
  4043. }
  4044. function configure_imap_client_certs {
  4045. if [[ $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_NONMAILBOX" || $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  4046. return
  4047. fi
  4048. if grep -Fxq "configure_imap_client_certs" $COMPLETION_FILE; then
  4049. return
  4050. fi
  4051. # http://strange.systems/certificate-based-auth-with-dovecot-sendmail/
  4052. sed -i 's|#default_process_limit =.*|default_process_limit = 100|g' /etc/dovecot/conf.d/10-master.conf
  4053. sed -i 's/disable_plaintext_auth =.*/disable_plaintext_auth = yes/g' /etc/dovecot/conf.d/10-auth.conf
  4054. sed -i 's|#auth_ssl_require_client_cert =.*|auth_ssl_require_client_cert = yes|g' /etc/dovecot/conf.d/10-auth.conf
  4055. sed -i 's|#auth_ssl_username_from_cert =.*|auth_ssl_username_from_cert = yes|g' /etc/dovecot/conf.d/10-auth.conf
  4056. sed -i "s|#ssl_ca =.*|ssl_ca = /etc/ssl/certs/ca-$DEFAULT_DOMAIN_NAME.crt|g" /etc/dovecot/conf.d/10-ssl.conf
  4057. sed -i 's|#ssl_cert_username_field =.*|ssl_cert_username_field = commonName|g' /etc/dovecot/conf.d/10-ssl.conf
  4058. sed -i 's|#ssl_verify_client_cert =.*|ssl_verify_client_cert = yes|g' /etc/dovecot/conf.d/10-ssl.conf
  4059. if ! grep -q "passdb {" /etc/dovecot/conf.d/10-auth.conf; then
  4060. echo '' >> /etc/dovecot/conf.d/10-auth.conf
  4061. echo 'passdb {' >> /etc/dovecot/conf.d/10-auth.conf
  4062. echo ' driver = passwd-file' >> /etc/dovecot/conf.d/10-auth.conf
  4063. echo ' args = /etc/dovecot/passwd-file' >> /etc/dovecot/conf.d/10-auth.conf
  4064. echo ' deny = no' >> /etc/dovecot/conf.d/10-auth.conf
  4065. echo ' master = no' >> /etc/dovecot/conf.d/10-auth.conf
  4066. echo ' pass = no' >> /etc/dovecot/conf.d/10-auth.conf
  4067. echo '}' >> /etc/dovecot/conf.d/10-auth.conf
  4068. fi
  4069. if [[ $ONION_ONLY == "no" ]]; then
  4070. # make a CA cert
  4071. if [ ! -f /etc/ssl/private/ca-$DEFAULT_DOMAIN_NAME.key ]; then
  4072. if [[ $LETSENCRYPT_ENABLED != "yes" ]]; then
  4073. ${PROJECT_NAME}-addcert -h $DEFAULT_DOMAIN_NAME --ca "" --dhkey $DH_KEYLENGTH
  4074. else
  4075. ${PROJECT_NAME}-addcert -e $DEFAULT_DOMAIN_NAME -s $LETSENCRYPT_SERVER --ca "" --dhkey $DH_KEYLENGTH
  4076. fi
  4077. fi
  4078. fi
  4079. # CA configuration
  4080. echo '[ ca ]' > /etc/ssl/dovecot-ca.cnf
  4081. echo "default_ca = dovecot-ca" >> /etc/ssl/dovecot-ca.cnf
  4082. echo '' >> /etc/ssl/dovecot-ca.cnf
  4083. echo '[ crl_ext ]' >> /etc/ssl/dovecot-ca.cnf
  4084. echo 'authorityKeyIdentifier=keyid:always' >> /etc/ssl/dovecot-ca.cnf
  4085. echo '' >> /etc/ssl/dovecot-ca.cnf
  4086. echo '[ dovecot-ca ]' >> /etc/ssl/dovecot-ca.cnf
  4087. echo 'new_certs_dir = .' >> /etc/ssl/dovecot-ca.cnf
  4088. echo 'unique_subject = no' >> /etc/ssl/dovecot-ca.cnf
  4089. echo "certificate = /etc/ssl/certs/ca-$DEFAULT_DOMAIN_NAME.crt" >> /etc/ssl/dovecot-ca.cnf
  4090. echo 'database = ssldb' >> /etc/ssl/dovecot-ca.cnf
  4091. echo "private_key = /etc/ssl/private/ca-$DEFAULT_DOMAIN_NAME.key" >> /etc/ssl/dovecot-ca.cnf
  4092. echo 'serial = sslserial' >> /etc/ssl/dovecot-ca.cnf
  4093. echo 'default_days = 3650' >> /etc/ssl/dovecot-ca.cnf
  4094. echo 'default_md = sha256' >> /etc/ssl/dovecot-ca.cnf
  4095. echo 'default_bits = 4096' >> /etc/ssl/dovecot-ca.cnf
  4096. echo 'policy = dovecot-ca_policy' >> /etc/ssl/dovecot-ca.cnf
  4097. echo 'x509_extensions = dovecot-ca_extensions' >> /etc/ssl/dovecot-ca.cnf
  4098. echo '' >> /etc/ssl/dovecot-ca.cnf
  4099. echo '[ dovecot-ca_policy ]' >> /etc/ssl/dovecot-ca.cnf
  4100. echo 'commonName = supplied' >> /etc/ssl/dovecot-ca.cnf
  4101. echo 'stateOrProvinceName = supplied' >> /etc/ssl/dovecot-ca.cnf
  4102. echo 'countryName = supplied' >> /etc/ssl/dovecot-ca.cnf
  4103. echo 'emailAddress = optional' >> /etc/ssl/dovecot-ca.cnf
  4104. echo 'organizationName = supplied' >> /etc/ssl/dovecot-ca.cnf
  4105. echo 'organizationalUnitName = optional' >> /etc/ssl/dovecot-ca.cnf
  4106. echo '' >> /etc/ssl/dovecot-ca.cnf
  4107. echo '[ dovecot-ca_extensions ]' >> /etc/ssl/dovecot-ca.cnf
  4108. echo 'basicConstraints = CA:false' >> /etc/ssl/dovecot-ca.cnf
  4109. echo 'subjectKeyIdentifier = hash' >> /etc/ssl/dovecot-ca.cnf
  4110. echo 'authorityKeyIdentifier = keyid:always' >> /etc/ssl/dovecot-ca.cnf
  4111. echo 'keyUsage = digitalSignature,keyEncipherment' >> /etc/ssl/dovecot-ca.cnf
  4112. echo 'extendedKeyUsage = clientAuth' >> /etc/ssl/dovecot-ca.cnf
  4113. if [ -f /etc/ssl/ssldb ]; then
  4114. rm /etc/ssl/ssldb
  4115. fi
  4116. if [ -f /etc/ssl/sslserial ]; then
  4117. rm /etc/ssl/sslserial
  4118. fi
  4119. touch /etc/ssl/ssldb
  4120. echo 0001 > /etc/ssl/sslserial
  4121. #${PROJECT_NAME}-clientcert -u $MY_USERNAME
  4122. service dovecot restart
  4123. echo 'configure_imap_client_certs' >> $COMPLETION_FILE
  4124. }
  4125. function create_gpg_subkey {
  4126. if [[ $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_NONMAILBOX" || $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  4127. return
  4128. fi
  4129. if grep -Fxq "create_gpg_subkey" $COMPLETION_FILE; then
  4130. return
  4131. fi
  4132. apt-get -y install gnupg
  4133. GPG_KEY_USAGE=$1
  4134. if [[ $GPG_KEY_USAGE != "sign" && $GPG_KEY_USAGE != "auth" && $GPG_KEY_USAGE != "encrypt" ]]; then
  4135. echo $"Unknown subkey usage: $GPG_KEY_USAGE"
  4136. echo $'Available types: sign|auth|encrypt'
  4137. exit 14783
  4138. fi
  4139. KEYGRIP=$(gpg --fingerprint --fingerprint $MY_EMAIL_ADDRESS | grep fingerprint | tail -1 | cut -d= -f2 | sed -e 's/ //g')
  4140. # Generate a GPG subkey
  4141. # Here a 2048bit length is used to be compatible with yubikey
  4142. echo 'Key-Type: 1' > /home/$MY_USERNAME/gpg-genkey.conf
  4143. echo "Key-Grip: $KEYGRIP" > /home/$MY_USERNAME/gpg-genkey.conf
  4144. echo 'Subkey-Type: 1' >> /home/$MY_USERNAME/gpg-genkey.conf
  4145. echo 'Subkey-Length: 2048' >> /home/$MY_USERNAME/gpg-genkey.conf
  4146. echo "subkey-Usage: $GPG_KEY_USAGE" > /home/$MY_USERNAME/gpg-genkey.conf
  4147. echo "Name-Real: $MY_NAME" >> /home/$MY_USERNAME/gpg-genkey.conf
  4148. echo "Name-Email: $MY_EMAIL_ADDRESS" >> /home/$MY_USERNAME/gpg-genkey.conf
  4149. echo "Name-Comment: $GPG_KEY_USAGE" >> /home/$MY_USERNAME/gpg-genkey.conf
  4150. echo 'Expire-Date: 0' >> /home/$MY_USERNAME/gpg-genkey.conf
  4151. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/gpg-genkey.conf
  4152. su -c "gpg --batch --gen-key /home/$MY_USERNAME/gpg-genkey.conf" - $MY_USERNAME
  4153. shred -zu /home/$MY_USERNAME/gpg-genkey.conf
  4154. MY_GPG_SUBKEY_ID=$(su -c "gpg --list-keys $MY_EMAIL_ADDRESS | grep 'pub '" - $MY_USERNAME | awk -F ' ' '{print $2}' | awk -F '/' '{print $2}')
  4155. echo 'create_gpg_subkey' >> $COMPLETION_FILE
  4156. }
  4157. function gpg_key_exists {
  4158. key_owner_username=$1
  4159. key_search_text=$2
  4160. if [[ $key_owner_username != "root" ]]; then
  4161. KEY_EXISTS=$(su -c "gpg --list-keys \"${key_search_text}\"" - $key_owner_username)
  4162. else
  4163. KEY_EXISTS=$(gpg --list-keys "${key_search_text}")
  4164. fi
  4165. if [ ! "$KEY_EXISTS" ]; then
  4166. echo "no"
  4167. return
  4168. fi
  4169. if [ "$KEY_EXISTS" == *"error"* ]; then
  4170. echo "no"
  4171. return
  4172. fi
  4173. echo "yes"
  4174. }
  4175. function gpg_pubkey_from_email {
  4176. key_owner_username=$1
  4177. key_email_address=$2
  4178. key_id=
  4179. if [[ $key_owner_username != "root" ]]; then
  4180. key_id=$(su -c "gpg --list-keys $key_email_address | grep 'pub '" - $key_owner_username | awk -F ' ' '{print $2}' | awk -F '/' '{print $2}')
  4181. else
  4182. key_id=$(gpg --list-keys $key_email_address | grep 'pub ' | awk -F ' ' '{print $2}' | awk -F '/' '{print $2}')
  4183. fi
  4184. echo $key_id
  4185. }
  4186. function configure_gpg {
  4187. if [[ $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_NONMAILBOX" || $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  4188. return
  4189. fi
  4190. if grep -Fxq "configure_gpg" $COMPLETION_FILE; then
  4191. return
  4192. fi
  4193. apt-get -y install gnupg
  4194. gpg_dir=/home/$MY_USERNAME/.gnupg
  4195. # if gpg keys directory was previously imported from usb
  4196. if [[ $GPG_KEYS_IMPORTED == "yes" && -d $gpg_dir ]]; then
  4197. echo $'GPG keys were imported'
  4198. sed -i "s|keyserver hkp://keys.gnupg.net|keyserver $GPG_KEYSERVER|g" $gpg_dir/gpg.conf
  4199. MY_GPG_PUBLIC_KEY_ID=$(gpg_pubkey_from_email "$MY_USERNAME" "$MY_EMAIL_ADDRESS")
  4200. if [ ${#MY_GPG_PUBLIC_KEY_ID} -lt 4 ]; then
  4201. echo $'GPG public key ID could not be obtained'
  4202. fi
  4203. chown -R $MY_USERNAME:$MY_USERNAME $gpg_dir
  4204. chmod 700 $gpg_dir
  4205. chmod 600 $gpg_dir/*
  4206. echo 'configure_gpg' >> $COMPLETION_FILE
  4207. return
  4208. fi
  4209. if [ ! -d $gpg_dir ]; then
  4210. mkdir $gpg_dir
  4211. echo "keyserver $GPG_KEYSERVER" >> $gpg_dir/gpg.conf
  4212. echo 'keyserver-options auto-key-retrieve' >> $gpg_dir/gpg.conf
  4213. fi
  4214. sed -i "s|keyserver hkp://keys.gnupg.net|keyserver $GPG_KEYSERVER|g" $gpg_dir/gpg.conf
  4215. if ! grep -q "# default preferences" $gpg_dir/gpg.conf; then
  4216. echo '' >> $gpg_dir/gpg.conf
  4217. echo '# default preferences' >> $gpg_dir/gpg.conf
  4218. echo 'personal-digest-preferences SHA256' >> $gpg_dir/gpg.conf
  4219. echo 'cert-digest-algo SHA256' >> $gpg_dir/gpg.conf
  4220. echo 'default-preference-list SHA512 SHA384 SHA256 SHA224 AES256 AES192 AES CAST5 ZLIB BZIP2 ZIP Uncompressed' >> $gpg_dir/gpg.conf
  4221. fi
  4222. chown -R $MY_USERNAME:$MY_USERNAME $gpg_dir
  4223. chmod 700 $gpg_dir
  4224. chmod 600 $gpg_dir/*
  4225. if [[ $MY_GPG_PUBLIC_KEY && $MY_GPG_PRIVATE_KEY ]]; then
  4226. echo $'Importing GPG keys from file'
  4227. echo $"Public key: $MY_GPG_PUBLIC_KEY"
  4228. echo $"Private key: $MY_GPG_PRIVATE_KEY"
  4229. # use your existing GPG keys which were exported
  4230. if [ ! -f $MY_GPG_PUBLIC_KEY ]; then
  4231. echo $"GPG public key file $MY_GPG_PUBLIC_KEY was not found"
  4232. exit 2483
  4233. fi
  4234. if [ ! -f $MY_GPG_PRIVATE_KEY ]; then
  4235. echo $"GPG private key file $MY_GPG_PRIVATE_KEY was not found"
  4236. exit 5383
  4237. fi
  4238. su -c "gpg --import $MY_GPG_PUBLIC_KEY" - $MY_USERNAME
  4239. su -c "gpg --allow-secret-key-import --import $MY_GPG_PRIVATE_KEY" - $MY_USERNAME
  4240. KEY_EXISTS=$(gpg_key_exists "$MY_USERNAME" "$MY_EMAIL_ADDRESS")
  4241. if [[ $KEY_EXISTS == "no" ]]; then
  4242. echo $"The GPG key for $MY_EMAIL_ADDRESS could not be imported"
  4243. exit 13821
  4244. fi
  4245. # for security ensure that the private key file doesn't linger around
  4246. shred -zu $MY_GPG_PRIVATE_KEY
  4247. MY_GPG_PUBLIC_KEY_ID=$(gpg_pubkey_from_email "$MY_USERNAME" "$MY_EMAIL_ADDRESS")
  4248. if [ ${#MY_GPG_PUBLIC_KEY_ID} -lt 4 ]; then
  4249. echo $'GPG public key ID could not be obtained'
  4250. fi
  4251. else
  4252. # Generate a GPG key
  4253. echo 'Key-Type: 1' > /home/$MY_USERNAME/gpg-genkey.conf
  4254. echo 'Key-Length: 4096' >> /home/$MY_USERNAME/gpg-genkey.conf
  4255. echo 'Subkey-Type: 1' >> /home/$MY_USERNAME/gpg-genkey.conf
  4256. echo 'Subkey-Length: 4096' >> /home/$MY_USERNAME/gpg-genkey.conf
  4257. echo "Name-Real: $MY_NAME" >> /home/$MY_USERNAME/gpg-genkey.conf
  4258. echo "Name-Email: $MY_EMAIL_ADDRESS" >> /home/$MY_USERNAME/gpg-genkey.conf
  4259. echo 'Expire-Date: 0' >> /home/$MY_USERNAME/gpg-genkey.conf
  4260. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/gpg-genkey.conf
  4261. echo $'Generating a new GPG key'
  4262. su -c "gpg --batch --gen-key /home/$MY_USERNAME/gpg-genkey.conf" - $MY_USERNAME
  4263. KEY_EXISTS=$(gpg_key_exists "$MY_USERNAME" "$MY_EMAIL_ADDRESS")
  4264. if [[ $KEY_EXISTS == "no" ]]; then
  4265. echo $"A GPG key for $MY_EMAIL_ADDRESS could not be created"
  4266. exit 6362
  4267. fi
  4268. shred -zu /home/$MY_USERNAME/gpg-genkey.conf
  4269. MY_GPG_PUBLIC_KEY_ID=$(gpg_pubkey_from_email "$MY_USERNAME" "$MY_EMAIL_ADDRESS")
  4270. if [ ${#MY_GPG_PUBLIC_KEY_ID} -lt 4 ]; then
  4271. echo $'GPG public key ID could not be obtained'
  4272. fi
  4273. MY_GPG_PUBLIC_KEY=/tmp/public_key.gpg
  4274. su -c "gpg --output $MY_GPG_PUBLIC_KEY --armor --export $MY_GPG_PUBLIC_KEY_ID" - $MY_USERNAME
  4275. if grep -q "configure_email" $COMPLETION_FILE; then
  4276. if ! grep -q $"Change your GPG password" /home/$MY_USERNAME/README; then
  4277. echo '' >> /home/$MY_USERNAME/README
  4278. echo '' >> /home/$MY_USERNAME/README
  4279. echo $'Change your GPG password' >> /home/$MY_USERNAME/README
  4280. echo '========================' >> /home/$MY_USERNAME/README
  4281. echo $"It's very important to add a password to your GPG key so that" >> /home/$MY_USERNAME/README
  4282. echo $"if anyone does get access to your email they still won't be able" >> /home/$MY_USERNAME/README
  4283. echo $'to read them without knowning the GPG password.' >> /home/$MY_USERNAME/README
  4284. echo $'You can change the it with:' >> /home/$MY_USERNAME/README
  4285. echo '' >> /home/$MY_USERNAME/README
  4286. echo " gpg --edit-key $MY_GPG_PUBLIC_KEY_ID" >> /home/$MY_USERNAME/README
  4287. echo ' passwd' >> /home/$MY_USERNAME/README
  4288. echo ' save' >> /home/$MY_USERNAME/README
  4289. echo ' quit' >> /home/$MY_USERNAME/README
  4290. fi
  4291. if ! grep -q $"Publish your GPG public key" /home/$MY_USERNAME/README; then
  4292. echo '' >> /home/$MY_USERNAME/README
  4293. echo '' >> /home/$MY_USERNAME/README
  4294. echo $'Publish your GPG public key' >> /home/$MY_USERNAME/README
  4295. echo '===========================' >> /home/$MY_USERNAME/README
  4296. echo $'So that others can send emails to you securely you should' >> /home/$MY_USERNAME/README
  4297. echo $'publish your GPG public key with the command:' >> /home/$MY_USERNAME/README
  4298. echo '' >> /home/$MY_USERNAME/README
  4299. echo " gpg --send-keys $MY_GPG_PUBLIC_KEY_ID" >> /home/$MY_USERNAME/README
  4300. fi
  4301. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
  4302. chmod 600 /home/$MY_USERNAME/README
  4303. fi
  4304. fi
  4305. echo 'configure_gpg' >> $COMPLETION_FILE
  4306. }
  4307. function configure_backup_key {
  4308. if grep -Fxq "configure_backup_key" $COMPLETION_FILE; then
  4309. return
  4310. fi
  4311. apt-get -y install gnupg
  4312. BACKUP_KEY_EXISTS=$(gpg_key_exists "root" "$MY_NAME (backup key)")
  4313. if [[ $BACKUP_KEY_EXISTS == "yes" ]]; then
  4314. return
  4315. fi
  4316. # Generate a GPG key for backups
  4317. BACKUP_KEY_EXISTS=$(gpg_key_exists "$MY_USERNAME" "$MY_NAME (backup key)")
  4318. if [[ $BACKUP_KEY_EXISTS == "no" ]]; then
  4319. echo 'Key-Type: 1' > /home/$MY_USERNAME/gpg-genkey.conf
  4320. echo 'Key-Length: 4096' >> /home/$MY_USERNAME/gpg-genkey.conf
  4321. echo 'Subkey-Type: 1' >> /home/$MY_USERNAME/gpg-genkey.conf
  4322. echo 'Subkey-Length: 4096' >> /home/$MY_USERNAME/gpg-genkey.conf
  4323. echo "Name-Real: $MY_NAME" >> /home/$MY_USERNAME/gpg-genkey.conf
  4324. echo "Name-Email: $MY_EMAIL_ADDRESS" >> /home/$MY_USERNAME/gpg-genkey.conf
  4325. echo "Name-Comment: backup key" >> /home/$MY_USERNAME/gpg-genkey.conf
  4326. echo 'Expire-Date: 0' >> /home/$MY_USERNAME/gpg-genkey.conf
  4327. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/gpg-genkey.conf
  4328. echo $'Backup key does not exist. Creating it.'
  4329. su -c "gpg --batch --gen-key /home/$MY_USERNAME/gpg-genkey.conf" - $MY_USERNAME
  4330. shred -zu /home/$MY_USERNAME/gpg-genkey.conf
  4331. echo $'Checking that the Backup key was created'
  4332. BACKUP_KEY_EXISTS=$(gpg_key_exists "$MY_USERNAME" "$MY_NAME (backup key)")
  4333. if [[ $BACKUP_KEY_EXISTS == "no" ]]; then
  4334. echo $'Backup key could not be created'
  4335. exit 43382
  4336. fi
  4337. fi
  4338. MY_BACKUP_KEY_ID=$(su -c "gpg --list-keys \"$MY_NAME (backup key)\" | grep 'pub '" - $MY_USERNAME | awk -F ' ' '{print $2}' | awk -F '/' '{print $2}')
  4339. echo "Backup key: $MY_BACKUP_KEY_ID"
  4340. MY_BACKUP_KEY=/home/$MY_USERNAME/backup_key
  4341. su -c "gpg --output ${MY_BACKUP_KEY}_public.asc --armor --export $MY_BACKUP_KEY_ID" - $MY_USERNAME
  4342. su -c "gpg --output ${MY_BACKUP_KEY}_private.asc --armor --export-secret-key $MY_BACKUP_KEY_ID" - $MY_USERNAME
  4343. if [ ! -f ${MY_BACKUP_KEY}_public.asc ]; then
  4344. echo 'Public backup key could not be exported'
  4345. exit 36829
  4346. fi
  4347. if [ ! -f ${MY_BACKUP_KEY}_private.asc ]; then
  4348. echo 'Private backup key could not be exported'
  4349. exit 29235
  4350. fi
  4351. # import backup key to root user
  4352. gpg --import --import ${MY_BACKUP_KEY}_public.asc
  4353. gpg --allow-secret-key-import --import ${MY_BACKUP_KEY}_private.asc
  4354. shred -zu ${MY_BACKUP_KEY}_public.asc
  4355. shred -zu ${MY_BACKUP_KEY}_private.asc
  4356. echo 'configure_backup_key' >> $COMPLETION_FILE
  4357. }
  4358. function encrypt_incoming_email {
  4359. # encrypts incoming mail using your GPG public key
  4360. # so even if an attacker gains access to the data at rest they still need
  4361. # to know your GPG key password to be able to read anything
  4362. if [[ $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_NONMAILBOX" || $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  4363. return
  4364. fi
  4365. # update to the next commit
  4366. if [ -f /usr/bin/gpgit.pl ]; then
  4367. if grep -q "gpgit commit" $COMPLETION_FILE; then
  4368. CURRENT_GPGIT_COMMIT=$(grep "gpgit commit" $COMPLETION_FILE | awk -F ':' '{print $2}')
  4369. if [[ "$CURRENT_GPGIT_COMMIT" != "$GPGIT_COMMIT" ]]; then
  4370. cd $INSTALL_DIR/gpgit
  4371. git stash
  4372. git checkout master
  4373. git pull
  4374. git checkout $GPGIT_COMMIT -b $GPGIT_COMMIT
  4375. sed -i "s/gpgit commit.*/gpgit commit:$GPGIT_COMMIT/g" $COMPLETION_FILE
  4376. cp gpgit.pl /usr/bin/gpgit.pl
  4377. fi
  4378. else
  4379. echo "gpgit commit:$GPGIT_COMMIT" >> $COMPLETION_FILE
  4380. fi
  4381. fi
  4382. if grep -Fxq "encrypt_incoming_email" $COMPLETION_FILE; then
  4383. return
  4384. fi
  4385. if [[ $GPG_ENCRYPT_STORED_EMAIL != "yes" ]]; then
  4386. return
  4387. fi
  4388. if [ ! -f /usr/bin/gpgit.pl ]; then
  4389. apt-get -y install git libmail-gnupg-perl
  4390. cd $INSTALL_DIR
  4391. git clone $GPGIT_REPO
  4392. cd $INSTALL_DIR/gpgit
  4393. git checkout $GPGIT_COMMIT -b $GPGIT_COMMIT
  4394. if ! grep -q "gpgit commit" $COMPLETION_FILE; then
  4395. echo "gpgit commit:$GPGIT_COMMIT" >> $COMPLETION_FILE
  4396. else
  4397. sed -i "s/gpgit commit.*/gpgit commit:$GPGIT_COMMIT/g" $COMPLETION_FILE
  4398. fi
  4399. cp gpgit.pl /usr/bin
  4400. fi
  4401. # add a procmail rule
  4402. if ! grep -q "/usr/bin/gpgit.pl" /home/$MY_USERNAME/.procmailrc; then
  4403. echo '' >> /home/$MY_USERNAME/.procmailrc
  4404. echo ':0 f' >> /home/$MY_USERNAME/.procmailrc
  4405. echo "| /usr/bin/gpgit.pl --encrypt-mode prefer-inline --inline-flatten $MY_EMAIL_ADDRESS" >> /home/$MY_USERNAME/.procmailrc
  4406. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.procmailrc
  4407. echo '' >> /etc/skel/.procmailrc
  4408. echo ':0 f' >> /etc/skel/.procmailrc
  4409. echo -n '| /usr/bin/gpgit.pl --encrypt-mode prefer-inline --inline-flatten $USER@' >> /etc/skel/.procmailrc
  4410. echo "$DEFAULT_DOMAIN_NAME" >> /etc/skel/.procmailrc
  4411. fi
  4412. echo 'encrypt_incoming_email' >> $COMPLETION_FILE
  4413. }
  4414. function encrypt_outgoing_email {
  4415. # encrypts outgoing mail using your GPG public key
  4416. # so even if an attacker gains access to the data at rest they still need
  4417. # to know your GPG key password to be able to read sent mail
  4418. if [[ $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_NONMAILBOX" || $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  4419. return
  4420. fi
  4421. if grep -Fxq "encrypt_outgoing_email" $COMPLETION_FILE; then
  4422. return
  4423. fi
  4424. if [[ $GPG_ENCRYPT_STORED_EMAIL != "yes" ]]; then
  4425. return
  4426. fi
  4427. if [ ! -d /home/$MY_USERNAME/.gnupg ]; then
  4428. return
  4429. fi
  4430. if [ ! -f /home/$MY_USERNAME/.muttrc ]; then
  4431. return
  4432. fi
  4433. # obtain your public key ID
  4434. if [ ! $MY_GPG_PUBLIC_KEY_ID ]; then
  4435. MY_GPG_PUBLIC_KEY_ID=$(gpg_pubkey_from_email "$MY_USERNAME" "$MY_EMAIL_ADDRESS")
  4436. if [ ! $MY_GPG_PUBLIC_KEY_ID ]; then
  4437. return
  4438. fi
  4439. if [ ${#MY_GPG_PUBLIC_KEY_ID} -lt 4 ]; then
  4440. return
  4441. fi
  4442. fi
  4443. if ! grep -q "pgp_encrypt_only_command" /home/$MY_USERNAME/.muttrc; then
  4444. echo '' >> /home/$MY_USERNAME/.muttrc
  4445. echo $'# Encrypt items in the Sent folder' >> /home/$MY_USERNAME/.muttrc
  4446. echo "set pgp_encrypt_only_command=\"/usr/lib/mutt/pgpewrap gpg --batch --quiet --no-verbose --output - --encrypt --textmode --armor --always-trust --encrypt-to 0x$MY_GPG_PUBLIC_KEY_ID -- -r %r -- %f\"" >> /home/$MY_USERNAME/.muttrc
  4447. else
  4448. sed -i "s|set pgp_encrypt_only_command.*|set pgp_encrypt_only_command=\"/usr/lib/mutt/pgpewrap gpg --batch --quiet --no-verbose --output - --encrypt --textmode --armor --always-trust --encrypt-to 0x$MY_GPG_PUBLIC_KEY_ID -- -r %r -- %f\"|g" /home/$MY_USERNAME/.muttrc
  4449. fi
  4450. if ! grep -q "pgp_encrypt_sign_command" /home/$MY_USERNAME/.muttrc; then
  4451. echo "set pgp_encrypt_sign_command=\"/usr/lib/mutt/pgpewrap gpg %?p?--passphrase-fd 0? --batch --quiet --no-verbose --textmode --output - --encrypt --sign %?a?-u %a? --armor --always-trust --encrypt-to 0x$MY_GPG_PUBLIC_KEY_ID -- -r %r -- %f\"" >> /home/$MY_USERNAME/.muttrc
  4452. else
  4453. sed -i "s|set pgp_encrypt_sign_command.*|set pgp_encrypt_sign_command=\"/usr/lib/mutt/pgpewrap gpg %?p?--passphrase-fd 0? --batch --quiet --no-verbose --textmode --output - --encrypt --sign %?a?-u %a? --armor --always-trust --encrypt-to 0x$MY_GPG_PUBLIC_KEY_ID -- -r %r -- %f\"|g" /home/$MY_USERNAME/.muttrc
  4454. fi
  4455. echo 'encrypt_outgoing_email' >> $COMPLETION_FILE
  4456. }
  4457. function encrypt_all_email {
  4458. if [[ $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_NONMAILBOX" || $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  4459. return
  4460. fi
  4461. if [[ $GPG_ENCRYPT_STORED_EMAIL != "yes" ]]; then
  4462. return
  4463. fi
  4464. if [ -f /usr/local/bin/${PROJECT_NAME}-encrypt-mail ]; then
  4465. cp /usr/local/bin/${PROJECT_NAME}-encrypt-mail /usr/bin/encmaildir
  4466. else
  4467. cp /usr/bin/${PROJECT_NAME}-encrypt-mail /usr/bin/encmaildir
  4468. fi
  4469. chmod +x /usr/bin/encmaildir
  4470. if grep -Fxq "encrypt_all_email" $COMPLETION_FILE; then
  4471. return
  4472. fi
  4473. if [ ! /home/$MY_USERNAME/README ]; then
  4474. touch /home/$MY_USERNAME/README
  4475. fi
  4476. if ! grep -q $"If you have imported legacy email which is not encrypted" /home/$MY_USERNAME/README; then
  4477. echo '' >> /home/$MY_USERNAME/README
  4478. echo '' >> /home/$MY_USERNAME/README
  4479. echo $'Encrypting legacy email' >> /home/$MY_USERNAME/README
  4480. echo '=======================' >> /home/$MY_USERNAME/README
  4481. echo $'If you have imported legacy email which is not encrypted' >> /home/$MY_USERNAME/README
  4482. echo $'then it can be encrypted with the command:' >> /home/$MY_USERNAME/README
  4483. echo '' >> /home/$MY_USERNAME/README
  4484. echo ' encmaildir' >> /home/$MY_USERNAME/README
  4485. echo '' >> /home/$MY_USERNAME/README
  4486. echo $'But be warned that depending upon how much email you have' >> /home/$MY_USERNAME/README
  4487. echo $'this could take a seriously LONG time on the Beaglebone' >> /home/$MY_USERNAME/README
  4488. echo $'and may be better done on a faster machine.' >> /home/$MY_USERNAME/README
  4489. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
  4490. chmod 600 /home/$MY_USERNAME/README
  4491. fi
  4492. echo 'encrypt_all_email' >> $COMPLETION_FILE
  4493. }
  4494. function email_client {
  4495. if [[ $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_NONMAILBOX" || $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  4496. return
  4497. fi
  4498. if grep -Fxq "email_client" $COMPLETION_FILE; then
  4499. return
  4500. fi
  4501. apt-get -y install mutt-patched lynx abook
  4502. if [ ! -f /etc/Muttrc ]; then
  4503. echo $"ERROR: Mutt does not appear to have installed. $CHECK_MESSAGE"
  4504. exit 49
  4505. fi
  4506. if [ ! -d /home/$MY_USERNAME/.mutt ]; then
  4507. mkdir /home/$MY_USERNAME/.mutt
  4508. fi
  4509. echo "text/html; lynx -dump -width=78 -nolist %s | sed ‘s/^ //’; copiousoutput; needsterminal; nametemplate=%s.html" > /home/$MY_USERNAME/.mutt/mailcap
  4510. cp /home/$MY_USERNAME/.mutt/mailcap /etc/skel/.mutt
  4511. chown -R $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.mutt
  4512. chown -R root:root /etc/skel/.mutt
  4513. echo 'set mbox_type=Maildir' >> /etc/Muttrc
  4514. echo 'set folder="~/Maildir"' >> /etc/Muttrc
  4515. echo 'set mask="!^\\.[^.]"' >> /etc/Muttrc
  4516. echo 'set mbox="~/Maildir"' >> /etc/Muttrc
  4517. echo 'set record="+Sent"' >> /etc/Muttrc
  4518. echo 'set postponed="+Drafts"' >> /etc/Muttrc
  4519. echo 'set trash="+Trash"' >> /etc/Muttrc
  4520. echo 'set spoolfile="~/Maildir"' >> /etc/Muttrc
  4521. echo 'auto_view text/x-vcard text/html text/enriched' >> /etc/Muttrc
  4522. echo 'set editor="emacs -q --load ~/.emacs-mutt"' >> /etc/Muttrc
  4523. echo 'set header_cache="+.cache"' >> /etc/Muttrc
  4524. echo '' >> /etc/Muttrc
  4525. echo 'macro index S "<tag-prefix><decode-save>=.learn-spam<enter>" "move to learn-spam"' >> /etc/Muttrc
  4526. echo 'macro pager S "<decode-save>=.learn-spam<enter>" "move to learn-spam"' >> /etc/Muttrc
  4527. echo 'macro index H "<tag-prefix><decode-copy>=.learn-ham<enter>" "copy to learn-ham"' >> /etc/Muttrc
  4528. echo 'macro pager H "<decode-copy>=.learn-ham<enter>" "copy to learn-ham"' >> /etc/Muttrc
  4529. echo '' >> /etc/Muttrc
  4530. echo '# set up the sidebar' >> /etc/Muttrc
  4531. echo 'set sidebar_width=22' >> /etc/Muttrc
  4532. echo 'set sidebar_visible=yes' >> /etc/Muttrc
  4533. echo "set sidebar_delim='|'" >> /etc/Muttrc
  4534. echo 'set sidebar_sort=yes' >> /etc/Muttrc
  4535. echo '' >> /etc/Muttrc
  4536. echo 'set rfc2047_parameters' >> /etc/Muttrc
  4537. echo '' >> /etc/Muttrc
  4538. echo '# Show inbox and sent items' >> /etc/Muttrc
  4539. echo 'mailboxes = =Sent =maybe-spam =spam' >> /etc/Muttrc
  4540. echo '' >> /etc/Muttrc
  4541. echo '# Alter these colours as needed for maximum bling' >> /etc/Muttrc
  4542. echo 'color sidebar_new yellow default' >> /etc/Muttrc
  4543. echo 'color normal white default' >> /etc/Muttrc
  4544. echo 'color hdrdefault brightcyan default' >> /etc/Muttrc
  4545. echo 'color signature green default' >> /etc/Muttrc
  4546. echo 'color attachment brightyellow default' >> /etc/Muttrc
  4547. echo 'color quoted green default' >> /etc/Muttrc
  4548. echo 'color quoted1 white default' >> /etc/Muttrc
  4549. echo 'color tilde blue default' >> /etc/Muttrc
  4550. echo '' >> /etc/Muttrc
  4551. echo '# ctrl-n, ctrl-p to select next, prev folder' >> /etc/Muttrc
  4552. echo '# ctrl-o to open selected folder' >> /etc/Muttrc
  4553. echo 'bind index \Cp sidebar-prev' >> /etc/Muttrc
  4554. echo 'bind index \Cn sidebar-next' >> /etc/Muttrc
  4555. echo 'bind index \Co sidebar-open' >> /etc/Muttrc
  4556. echo 'bind pager \Cp sidebar-prev' >> /etc/Muttrc
  4557. echo 'bind pager \Cn sidebar-next' >> /etc/Muttrc
  4558. echo 'bind pager \Co sidebar-open' >> /etc/Muttrc
  4559. echo '' >> /etc/Muttrc
  4560. echo '# ctrl-b toggles sidebar visibility' >> /etc/Muttrc
  4561. echo "macro index,pager \Cb '<enter-command>toggle sidebar_visible<enter><redraw-screen>' 'toggle sidebar'" >> /etc/Muttrc
  4562. echo '' >> /etc/Muttrc
  4563. echo '# esc-m Mark new messages as read' >> /etc/Muttrc
  4564. echo 'macro index <esc>m "T~N<enter>;WNT~O<enter>;WO\CT~T<enter>" "mark all messages read"' >> /etc/Muttrc
  4565. echo '' >> /etc/Muttrc
  4566. echo '# Collapsing threads' >> /etc/Muttrc
  4567. echo 'macro index [ "<collapse-thread>" "collapse/uncollapse thread"' >> /etc/Muttrc
  4568. echo 'macro index ] "<collapse-all>" "collapse/uncollapse all threads"' >> /etc/Muttrc
  4569. echo '' >> /etc/Muttrc
  4570. echo '# threads containing new messages' >> /etc/Muttrc
  4571. echo 'uncolor index "~(~N)"' >> /etc/Muttrc
  4572. echo 'color index brightblue default "~(~N)"' >> /etc/Muttrc
  4573. echo '' >> /etc/Muttrc
  4574. echo '# new messages themselves' >> /etc/Muttrc
  4575. echo 'uncolor index "~N"' >> /etc/Muttrc
  4576. echo 'color index brightyellow default "~N"' >> /etc/Muttrc
  4577. echo '' >> /etc/Muttrc
  4578. echo '# GPG/PGP integration' >> /etc/Muttrc
  4579. echo '# this set the number of seconds to keep in memory the passphrase used to encrypt/sign' >> /etc/Muttrc
  4580. echo 'set pgp_timeout=1800' >> /etc/Muttrc
  4581. echo '' >> /etc/Muttrc
  4582. echo '# automatically sign and encrypt with PGP/MIME' >> /etc/Muttrc
  4583. echo 'set pgp_autosign # autosign all outgoing mails' >> /etc/Muttrc
  4584. echo 'set pgp_autoencrypt # Try to encrypt automatically' >> /etc/Muttrc
  4585. echo 'set pgp_replyencrypt # autocrypt replies to crypted' >> /etc/Muttrc
  4586. echo 'set pgp_replysign # autosign replies to signed' >> /etc/Muttrc
  4587. echo 'set pgp_auto_decode=yes # decode attachments' >> /etc/Muttrc
  4588. echo 'set fcc_clear=no # Keep encrypted copy of sent encrypted mail' >> /etc/Muttrc
  4589. echo 'unset smime_is_default' >> /etc/Muttrc
  4590. echo '' >> /etc/Muttrc
  4591. echo 'set alias_file=~/.mutt-alias' >> /etc/Muttrc
  4592. echo 'source ~/.mutt-alias' >> /etc/Muttrc
  4593. echo 'set query_command= "abook --mutt-query \"%s\""' >> /etc/Muttrc
  4594. echo 'macro index,pager A "<pipe-message>abook --add-email-quiet<return>" "add the sender address to abook"' >> /etc/Muttrc
  4595. # create an Emacs configuration specifically for use with Mutt, which
  4596. # has word wrap and spell checking on by default
  4597. echo "(add-hook 'before-save-hook 'delete-trailing-whitespace)" > /home/$MY_USERNAME/.emacs-mutt
  4598. echo '(setq org-support-shift-select t)' >> /home/$MY_USERNAME/.emacs-mutt
  4599. echo '(setq standard-indent 4)' >> /home/$MY_USERNAME/.emacs-mutt
  4600. echo '(setq-default tab-width 4)' >> /home/$MY_USERNAME/.emacs-mutt
  4601. echo '(setq c-basic-offset 4)' >> /home/$MY_USERNAME/.emacs-mutt
  4602. echo '(mouse-wheel-mode t)' >> /home/$MY_USERNAME/.emacs-mutt
  4603. echo '(setq make-backup-files t)' >> /home/$MY_USERNAME/.emacs-mutt
  4604. echo '(setq version-control t)' >> /home/$MY_USERNAME/.emacs-mutt
  4605. echo '(setq backup-directory-alist (quote ((".*" . "~/.emacs_backups/"))))' >> /home/$MY_USERNAME/.emacs-mutt
  4606. echo "(setq default-major-mode 'text-mode)" >> /home/$MY_USERNAME/.emacs-mutt
  4607. echo "(dolist (hook '(text-mode-hook))" >> /home/$MY_USERNAME/.emacs-mutt
  4608. echo ' (add-hook hook (lambda () (flyspell-mode 1))))' >> /home/$MY_USERNAME/.emacs-mutt
  4609. echo '(setq-default fill-column 72)' >> /home/$MY_USERNAME/.emacs-mutt
  4610. echo '(setq auto-fill-mode 0)' >> /home/$MY_USERNAME/.emacs-mutt
  4611. echo "(add-hook 'text-mode-hook 'turn-on-auto-fill)" >> /home/$MY_USERNAME/.emacs-mutt
  4612. echo "(setq-default auto-fill-function 'do-auto-fill)" >> /home/$MY_USERNAME/.emacs-mutt
  4613. # add the emacs mutt configuration to the user profile skeleton
  4614. if [ ! -f /etc/skel/.emacs-mutt ]; then
  4615. cp /home/$MY_USERNAME/.emacs-mutt /etc/skel/.emacs-mutt
  4616. chown root:root /etc/skel/.emacs-mutt
  4617. fi
  4618. cp -f /etc/Muttrc /home/$MY_USERNAME/.muttrc
  4619. cp -f /etc/Muttrc /etc/skel/.muttrc
  4620. touch /home/$MY_USERNAME/.mutt-alias
  4621. cp /home/$MY_USERNAME/.mutt-alias /etc/skel/.mutt-alias
  4622. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.emacs-mutt
  4623. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.muttrc
  4624. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.mutt-alias
  4625. # default user on generic images
  4626. if [ -d /home/${GENERIC_IMAGE_USERNAME} ]; then
  4627. cp -f /etc/Muttrc /home/${GENERIC_IMAGE_USERNAME}/.muttrc
  4628. chown ${GENERIC_IMAGE_USERNAME}:${GENERIC_IMAGE_USERNAME} /home/${GENERIC_IMAGE_USERNAME}/.muttrc
  4629. touch /home/${GENERIC_IMAGE_USERNAME}/.mutt-alias
  4630. chown ${GENERIC_IMAGE_USERNAME}:${GENERIC_IMAGE_USERNAME} /home/${GENERIC_IMAGE_USERNAME}/.mutt-alias
  4631. cp /etc/skel/.emacs-mutt /home/${GENERIC_IMAGE_USERNAME}/.emacs-mutt
  4632. chown ${GENERIC_IMAGE_USERNAME}:${GENERIC_IMAGE_USERNAME} /home/${GENERIC_IMAGE_USERNAME}/.emacs-mutt
  4633. fi
  4634. echo 'email_client' >> $COMPLETION_FILE
  4635. }
  4636. function email_archiving {
  4637. if [[ $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_NONMAILBOX" || $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  4638. return
  4639. fi
  4640. # ensure that the mail archive script is up to date
  4641. if [ -f /usr/local/bin/${PROJECT_NAME}-archive-mail ]; then
  4642. cp /usr/local/bin/${PROJECT_NAME}-archive-mail /etc/cron.daily/archivemail
  4643. else
  4644. if [ -f /usr/bin/${PROJECT_NAME}-archive-mail ]; then
  4645. cp /usr/bin/${PROJECT_NAME}-archive-mail /etc/cron.daily/archivemail
  4646. else
  4647. echo "/usr/bin/${PROJECT_NAME}-archive-email was not found. ${PROJECT_NAME} might not have fully installed."
  4648. exit 62379
  4649. fi
  4650. fi
  4651. chmod +x /etc/cron.daily/archivemail
  4652. # update to the next commit
  4653. if [ -d $INSTALL_DIR/cleanup-maildir ]; then
  4654. if grep -q "cleanup-maildir commit" $COMPLETION_FILE; then
  4655. CURRENT_CLEANUP_MAILDIR_COMMIT=$(grep "cleanup-maildir commit" $COMPLETION_FILE | awk -F ':' '{print $2}')
  4656. if [[ "$CURRENT_CLEANUP_MAILDIR_COMMIT" != "$CLEANUP_MAILDIR_COMMIT" ]]; then
  4657. cd $INSTALL_DIR/cleanup-maildir
  4658. git stash
  4659. git checkout master
  4660. git pull
  4661. git checkout $CLEANUP_MAILDIR_COMMIT -b $CLEANUP_MAILDIR_COMMIT
  4662. sed -i "s/cleanup-maildir commit.*/cleanup-maildir commit:$CLEANUP_MAILDIR_COMMIT/g" $COMPLETION_FILE
  4663. cp $INSTALL_DIR/cleanup-maildir/cleanup-maildir /usr/bin
  4664. fi
  4665. else
  4666. echo "cleanup-maildir commit:$CLEANUP_MAILDIR_COMMIT" >> $COMPLETION_FILE
  4667. fi
  4668. fi
  4669. if grep -Fxq "email_archiving" $COMPLETION_FILE; then
  4670. return
  4671. fi
  4672. if [ ! -d $INSTALL_DIR ]; then
  4673. mkdir $INSTALL_DIR
  4674. fi
  4675. cd $INSTALL_DIR
  4676. git clone $CLEANUP_MAILDIR_REPO $INSTALL_DIR/cleanup-maildir
  4677. git checkout $CLEANUP_MAILDIR_COMMIT -b $CLEANUP_MAILDIR_COMMIT
  4678. if ! grep -q "cleanup-maildir commit" $COMPLETION_FILE; then
  4679. echo "cleanup-maildir commit:$CLEANUP_MAILDIR_COMMIT" >> $COMPLETION_FILE
  4680. else
  4681. sed -i "s/cleanup-maildir commit.*/cleanup-maildir commit:$CLEANUP_MAILDIR_COMMIT/g" $COMPLETION_FILE
  4682. fi
  4683. cp $INSTALL_DIR/cleanup-maildir/cleanup-maildir /usr/bin
  4684. echo 'email_archiving' >> $COMPLETION_FILE
  4685. }
  4686. # Ensure that the from field is correct when sending email from Mutt
  4687. function email_from_address {
  4688. if grep -Fxq "email_from_address" $COMPLETION_FILE; then
  4689. return
  4690. fi
  4691. if [ ! -f /home/$MY_USERNAME/.muttrc ]; then
  4692. return
  4693. fi
  4694. if grep -q "set from=" /home/$MY_USERNAME/.muttrc; then
  4695. sed -i "s|set from=.*|set from='$MY_NAME <$MY_EMAIL_ADDRESS>'|g" /home/$MY_USERNAME/.muttrc
  4696. else
  4697. echo "set from='$MY_NAME <$MY_EMAIL_ADDRESS>'" >> /home/$MY_USERNAME/.muttrc
  4698. fi
  4699. echo 'email_from_address' >> $COMPLETION_FILE
  4700. }
  4701. function create_public_mailing_list {
  4702. if [[ $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_NONMAILBOX" || $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  4703. return
  4704. fi
  4705. if grep -Fxq "create_public_mailing_list" $COMPLETION_FILE; then
  4706. return
  4707. fi
  4708. if [ ! $PUBLIC_MAILING_LIST ]; then
  4709. return
  4710. fi
  4711. # does the mailing list have a separate domain name?
  4712. if [ ! $PUBLIC_MAILING_LIST_DOMAIN_NAME ]; then
  4713. PUBLIC_MAILING_LIST_DOMAIN_NAME=$DEFAULT_DOMAIN_NAME
  4714. fi
  4715. PUBLIC_MAILING_LIST_USER="mlmmj"
  4716. apt-get -y install mlmmj
  4717. adduser --system $PUBLIC_MAILING_LIST_USER
  4718. addgroup $PUBLIC_MAILING_LIST_USER
  4719. adduser $PUBLIC_MAILING_LIST_USER $PUBLIC_MAILING_LIST_USER
  4720. echo ''
  4721. echo $"Creating the $PUBLIC_MAILING_LIST mailing list"
  4722. echo ''
  4723. # create the list
  4724. mlmmj-make-ml -a -L "$PUBLIC_MAILING_LIST" -c $PUBLIC_MAILING_LIST_USER
  4725. echo 'SYSTEM_ALIASES_PIPE_TRANSPORT = address_pipe' > /etc/exim4/conf.d/main/000_localmacros
  4726. echo "SYSTEM_ALIASES_USER = $PUBLIC_MAILING_LIST_USER" >> /etc/exim4/conf.d/main/000_localmacros
  4727. echo "SYSTEM_ALIASES_GROUP = $PUBLIC_MAILING_LIST_USER" >> /etc/exim4/conf.d/main/000_localmacros
  4728. # router
  4729. echo 'mlmmj_router:' > /etc/exim4/conf.d/router/750_exim4-config_mlmmj
  4730. echo ' debug_print = "R: mlmmj_router for $local_part@$domain"' >> /etc/exim4/conf.d/router/750_exim4-config_mlmmj
  4731. echo ' driver = accept' >> /etc/exim4/conf.d/router/750_exim4-config_mlmmj
  4732. echo ' domains = +mlmmj_domains' >> /etc/exim4/conf.d/router/750_exim4-config_mlmmj
  4733. echo ' #require_files = MLMMJ_HOME/${lc::$local_part}' >> /etc/exim4/conf.d/router/750_exim4-config_mlmmj
  4734. 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
  4735. echo ' # Exim will then spawn a new process running under the UID of "mlmmj".' >> /etc/exim4/conf.d/router/750_exim4-config_mlmmj
  4736. echo ' require_files = mlmmj:MLMMJ_HOME/${lc::$local_part}' >> /etc/exim4/conf.d/router/750_exim4-config_mlmmj
  4737. echo ' local_part_suffix = +*' >> /etc/exim4/conf.d/router/750_exim4-config_mlmmj
  4738. echo ' local_part_suffix_optional' >> /etc/exim4/conf.d/router/750_exim4-config_mlmmj
  4739. echo ' headers_remove = Delivered-To' >> /etc/exim4/conf.d/router/750_exim4-config_mlmmj
  4740. echo ' headers_add = Delivered-To: $local_part$local_part_suffix@$domain' >> /etc/exim4/conf.d/router/750_exim4-config_mlmmj
  4741. echo ' transport = mlmmj_transport' >> /etc/exim4/conf.d/router/750_exim4-config_mlmmj
  4742. # transport
  4743. echo 'mlmmj_transport:' > /etc/exim4/conf.d/transport/40_exim4-config_mlmmj
  4744. echo ' debug_print = "T: mlmmj_transport for $local_part@$domain"' >> /etc/exim4/conf.d/transport/40_exim4-config_mlmmj
  4745. echo ' driver = pipe' >> /etc/exim4/conf.d/transport/40_exim4-config_mlmmj
  4746. echo ' return_path_add' >> /etc/exim4/conf.d/transport/40_exim4-config_mlmmj
  4747. echo ' user = mlmmj' >> /etc/exim4/conf.d/transport/40_exim4-config_mlmmj
  4748. echo ' group = mlmmj' >> /etc/exim4/conf.d/transport/40_exim4-config_mlmmj
  4749. echo ' home_directory = MLMMJ_HOME' >> /etc/exim4/conf.d/transport/40_exim4-config_mlmmj
  4750. echo ' current_directory = MLMMJ_HOME' >> /etc/exim4/conf.d/transport/40_exim4-config_mlmmj
  4751. echo ' command = /usr/bin/mlmmj-receive -F -L MLMMJ_HOME/${lc:$local_part}' >> /etc/exim4/conf.d/transport/40_exim4-config_mlmmj
  4752. if ! grep -q "MLMMJ_HOME=/var/spool/mlmmj" /etc/exim4/conf.d/main/01_exim4-config_listmacrosdefs; then
  4753. sed -i '/MAIN CONFIGURATION SETTINGS/a\MLMMJ_HOME=/var/spool/mlmmj' /etc/exim4/conf.d/main/01_exim4-config_listmacrosdefs
  4754. fi
  4755. if ! grep -q "domainlist mlmmj_domains =" /etc/exim4/conf.d/main/01_exim4-config_listmacrosdefs; then
  4756. sed -i "/MLMMJ_HOME/a\domainlist mlmmj_domains = $PUBLIC_MAILING_LIST_DOMAIN_NAME" /etc/exim4/conf.d/main/01_exim4-config_listmacrosdefs
  4757. fi
  4758. if ! grep -q "delay_warning_condition =" /etc/exim4/conf.d/main/01_exim4-config_listmacrosdefs; then
  4759. 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
  4760. fi
  4761. if ! grep -q ": +mlmmj_domains" /etc/exim4/conf.d/main/01_exim4-config_listmacrosdefs; then
  4762. 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
  4763. fi
  4764. if ! grep -q "! +mlmmj_domains" /etc/exim4/conf.d/router/200_exim4-config_primary; then
  4765. sed -i 's/domains = ! +local_domains/domains = ! +mlmmj_domains : ! +local_domains/g' /etc/exim4/conf.d/router/200_exim4-config_primary
  4766. fi
  4767. newaliases
  4768. update-exim4.conf.template -r
  4769. update-exim4.conf
  4770. service exim4 restart
  4771. if ! grep -q $"$PUBLIC_MAILING_LIST mailing list" /home/$MY_USERNAME/README; then
  4772. echo '' >> /home/$MY_USERNAME/README
  4773. echo '' >> /home/$MY_USERNAME/README
  4774. echo $"$PUBLIC_MAILING_LIST mailing list" >> /home/$MY_USERNAME/README
  4775. echo '=================================' >> /home/$MY_USERNAME/README
  4776. echo $"To subscribe to the $PUBLIC_MAILING_LIST mailing list send a" >> /home/$MY_USERNAME/README
  4777. echo $"cleartext email to $PUBLIC_MAILING_LIST+subscribe@$DEFAULT_DOMAIN_NAME" >> /home/$MY_USERNAME/README
  4778. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
  4779. chmod 600 /home/$MY_USERNAME/README
  4780. fi
  4781. ${PROJECT_NAME}-addlist -u $MY_USERNAME -l "$PUBLIC_MAILING_LIST" -s "$PUBLIC_MAILING_LIST"
  4782. echo 'create_public_mailing_list' >> $COMPLETION_FILE
  4783. }
  4784. function create_private_mailing_list {
  4785. if [[ $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_NONMAILBOX" || $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  4786. return
  4787. fi
  4788. # This installation doesn't work, results in ruby errors
  4789. # There is currently no schleuder package for Debian jessie
  4790. if grep -Fxq "create_private_mailing_list" $COMPLETION_FILE; then
  4791. return
  4792. fi
  4793. if [ ! $PRIVATE_MAILING_LIST ]; then
  4794. return
  4795. fi
  4796. if [[ $PRIVATE_MAILING_LIST == $MY_USERNAME ]]; then
  4797. echo $'The name of the private mailing list should not be the same as your username'
  4798. exit 10
  4799. fi
  4800. if [ ! $MY_GPG_PUBLIC_KEY ]; then
  4801. echo $'To create a private mailing list you need to specify a file'
  4802. echo $'containing your exported GPG key within MY_GPG_PUBLIC_KEY at'
  4803. echo $'the top of the script'
  4804. exit 11
  4805. fi
  4806. apt-get -y install ruby ruby-dev ruby-gpgme libgpgme11-dev libmagic-dev
  4807. gem install schleuder
  4808. schleuder-fix-gem-dependencies
  4809. schleuder-init-setup --gem
  4810. # NOTE: this is version number sensitive and so might need changing
  4811. ln -s /var/lib/gems/2.1.0/gems/schleuder-2.2.4 /var/lib/schleuder
  4812. sed -i 's/#smtp_port: 25/smtp_port: 465/g' /etc/schleuder/schleuder.conf
  4813. sed -i 's/#superadminaddr: root@localhost/superadminaddr: root@localhost' /etc/schleuder/schleuder.conf
  4814. schleuder-newlist $PRIVATE_MAILING_LIST@$DEFAULT_DOMAIN_NAME -realname "$PRIVATE_MAILING_LIST" -adminaddress $MY_EMAIL_ADDRESS -initmember $MY_EMAIL_ADDRESS -initmemberkey $MY_GPG_PUBLIC_KEY -nointeractive
  4815. ${PROJECT_NAME}-addemail -u $MY_USERNAME -e $PRIVATE_MAILING_LIST@$DEFAULT_DOMAIN_NAME -l $PRIVATE_MAILING_LIST
  4816. echo 'schleuder:' > /etc/exim4/conf.d/router/550_exim4-config_schleuder
  4817. echo ' debug_print = "R: schleuder for $local_part@$domain"' >> /etc/exim4/conf.d/router/550_exim4-config_schleuder
  4818. echo ' driver = accept' >> /etc/exim4/conf.d/router/550_exim4-config_schleuder
  4819. echo ' local_part_suffix_optional' >> /etc/exim4/conf.d/router/550_exim4-config_schleuder
  4820. echo ' local_part_suffix = +* : -bounce : -sendkey' >> /etc/exim4/conf.d/router/550_exim4-config_schleuder
  4821. echo ' domains = +local_domains' >> /etc/exim4/conf.d/router/550_exim4-config_schleuder
  4822. echo ' user = schleuder' >> /etc/exim4/conf.d/router/550_exim4-config_schleuder
  4823. echo ' group = schleuder' >> /etc/exim4/conf.d/router/550_exim4-config_schleuder
  4824. echo ' require_files = schleuder:+/var/lib/schleuder/$domain/${local_part}' >> /etc/exim4/conf.d/router/550_exim4-config_schleuder
  4825. echo ' transport = schleuder_transport' >> /etc/exim4/conf.d/router/550_exim4-config_schleuder
  4826. echo 'schleuder_transport:' > /etc/exim4/conf.d/transport/30_exim4-config_schleuder
  4827. echo ' debug_print = "T: schleuder_transport for $local_part@$domain"' >> /etc/exim4/conf.d/transport/30_exim4-config_schleuder
  4828. echo ' driver = pipe' >> /etc/exim4/conf.d/transport/30_exim4-config_schleuder
  4829. echo ' home_directory = "/var/lib/schleuder/$domain/$local_part"' >> /etc/exim4/conf.d/transport/30_exim4-config_schleuder
  4830. echo ' command = "/usr/bin/schleuder $local_part@$domain"' >> /etc/exim4/conf.d/transport/30_exim4-config_schleuder
  4831. chown -R schleuder:schleuder /var/lib/schleuder
  4832. update-exim4.conf.template -r
  4833. update-exim4.conf
  4834. service exim4 restart
  4835. useradd -d /var/schleuderlists -s /bin/false schleuder
  4836. adduser Debian-exim schleuder
  4837. usermod -a -G mail schleuder
  4838. #exim -d -bt $PRIVATE_MAILING_LIST@$DEFAULT_DOMAIN_NAME
  4839. echo 'create_private_mailing_list' >> $COMPLETION_FILE
  4840. }
  4841. function split_gpg_key_into_fragments {
  4842. # split the gpg key into fragments if social key management is enabled
  4843. if [[ $ENABLE_SOCIAL_KEY_MANAGEMENT == "yes" ]]; then
  4844. echo 'Splitting GPG key. You may need to enter your passphrase.'
  4845. ${PROJECT_NAME}-splitkey -u $MY_USERNAME -e $MY_EMAIL_ADDRESS --fullname "$MY_NAME"
  4846. if [ ! -d /home/$MY_USERNAME/.gnupg_fragments ]; then
  4847. echo 'Yhe GPG key could not be split'
  4848. exit 86548
  4849. fi
  4850. fi
  4851. }
  4852. function import_email {
  4853. if [[ $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_NONMAILBOX" || $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  4854. return
  4855. fi
  4856. EMAIL_COMPLETE_MSG=$"
  4857. *** ${PROJECT_NAME} mailbox installation is complete ***
  4858. Now on your internet router forward ports
  4859. 25, 587, 465, 993 and 2222 to the ${PROJECT_NAME}
  4860. "
  4861. if grep -Fxq "import_email" $COMPLETION_FILE; then
  4862. if [[ $SYSTEM_TYPE == "$VARIANT_MAILBOX" ]]; then
  4863. backup_to_friends_servers
  4864. intrusion_detection
  4865. split_gpg_key_into_fragments
  4866. clear
  4867. echo ''
  4868. echo "$EMAIL_COMPLETE_MSG"
  4869. if [ -d $USB_MOUNT ]; then
  4870. umount $USB_MOUNT
  4871. rm -rf $USB_MOUNT
  4872. echo $' You can now remove the USB drive'
  4873. fi
  4874. exit 0
  4875. fi
  4876. return
  4877. fi
  4878. if [ $IMPORT_MAILDIR ]; then
  4879. if [ -d $IMPORT_MAILDIR ]; then
  4880. echo $'Transfering email files'
  4881. cp -r $IMPORT_MAILDIR /home/$MY_USERNAME
  4882. chown -R $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/Maildir
  4883. else
  4884. echo $"Email import directory $IMPORT_MAILDIR not found"
  4885. exit 9
  4886. fi
  4887. fi
  4888. echo 'import_email' >> $COMPLETION_FILE
  4889. if [[ $SYSTEM_TYPE == "$VARIANT_MAILBOX" ]]; then
  4890. backup_to_friends_servers
  4891. intrusion_detection
  4892. split_gpg_key_into_fragments
  4893. # unmount any attached usb drive
  4894. clear
  4895. echo ''
  4896. echo "$EMAIL_COMPLETE_MSG"
  4897. echo ''
  4898. if [ -d $USB_MOUNT ]; then
  4899. umount $USB_MOUNT
  4900. rm -rf $USB_MOUNT
  4901. echo $' You can now remove the USB drive'
  4902. fi
  4903. exit 0
  4904. fi
  4905. }
  4906. function install_web_server {
  4907. if [[ $SYSTEM_TYPE == "$VARIANT_CHAT" ]]; then
  4908. return
  4909. fi
  4910. # update to the next commit
  4911. if [ -d $INSTALL_DIR/nginx_ensite ]; then
  4912. if grep -q "Nginx-ensite commit" $COMPLETION_FILE; then
  4913. CURRENT_NGINX_ENSITE_COMMIT=$(grep "Nginx-ensite commit" $COMPLETION_FILE | awk -F ':' '{print $2}')
  4914. if [[ "$CURRENT_NGINX_ENSITE_COMMIT" != "$NGINX_ENSITE_COMMIT" ]]; then
  4915. cd /var/www/$MICROBLOG_DOMAIN_NAME/htdocs
  4916. git stash
  4917. git checkout master
  4918. git pull
  4919. git checkout $NGINX_ENSITE_COMMIT -b $NGINX_ENSITE_COMMIT
  4920. sed -i "s/Nginx-ensite commit.*/Nginx-ensite commit:$NGINX_ENSITE_COMMIT/g" $COMPLETION_FILE
  4921. make install
  4922. fi
  4923. else
  4924. echo "Nginx-ensite commit:$NGINX_ENSITE_COMMIT" >> $COMPLETION_FILE
  4925. fi
  4926. fi
  4927. if grep -Fxq "install_web_server" $COMPLETION_FILE; then
  4928. return
  4929. fi
  4930. # remove apache
  4931. apt-get -y remove --purge apache2
  4932. if [ -d /etc/apache2 ]; then
  4933. rm -rf /etc/apache2
  4934. fi
  4935. # install nginx
  4936. apt-get -y install nginx php5-fpm git
  4937. # limit the number of php processes
  4938. sed -i 's/; process.max =.*/process.max = 32/g' /etc/php5/fpm/php-fpm.conf
  4939. sed -i 's/;process_control_timeout =.*/process_control_timeout = 300/g' /etc/php5/fpm/php-fpm.conf
  4940. if ! grep -q "pm.max_children" /etc/php5/fpm/php-fpm.conf; then
  4941. echo 'pm.max_children = 10' >> /etc/php5/fpm/php-fpm.conf
  4942. echo 'pm.start_servers = 2' >> /etc/php5/fpm/php-fpm.conf
  4943. echo 'pm.min_spare_servers = 2' >> /etc/php5/fpm/php-fpm.conf
  4944. echo 'pm.max_spare_servers = 5' >> /etc/php5/fpm/php-fpm.conf
  4945. echo 'pm.max_requests = 50' >> /etc/php5/fpm/php-fpm.conf
  4946. fi
  4947. if [ ! -d /etc/nginx ]; then
  4948. echo $"ERROR: nginx does not appear to have installed. $CHECK_MESSAGE"
  4949. exit 51
  4950. fi
  4951. # Nginx settings
  4952. echo 'user www-data;' > /etc/nginx/nginx.conf
  4953. #echo "worker_processes; $CPU_CORES" >> /etc/nginx/nginx.conf
  4954. echo 'pid /run/nginx.pid;' >> /etc/nginx/nginx.conf
  4955. echo '' >> /etc/nginx/nginx.conf
  4956. echo 'events {' >> /etc/nginx/nginx.conf
  4957. echo ' worker_connections 50;' >> /etc/nginx/nginx.conf
  4958. echo ' # multi_accept on;' >> /etc/nginx/nginx.conf
  4959. echo '}' >> /etc/nginx/nginx.conf
  4960. echo '' >> /etc/nginx/nginx.conf
  4961. echo 'http {' >> /etc/nginx/nginx.conf
  4962. echo ' # limit the number of connections per single IP' >> /etc/nginx/nginx.conf
  4963. echo ' limit_conn_zone $binary_remote_addr zone=conn_limit_per_ip:10m;' >> /etc/nginx/nginx.conf
  4964. echo '' >> /etc/nginx/nginx.conf
  4965. echo ' # limit the number of requests for a given session' >> /etc/nginx/nginx.conf
  4966. echo ' # Note that the Owncloud web interface seems to require a rate of around 140r/s' >> /etc/nginx/nginx.conf
  4967. echo ' limit_req_zone $binary_remote_addr zone=req_limit_per_ip:10m rate=140r/s;' >> /etc/nginx/nginx.conf
  4968. echo '' >> /etc/nginx/nginx.conf
  4969. echo ' # if the request body size is more than the buffer size, then the entire (or partial) request body is written into a temporary file' >> /etc/nginx/nginx.conf
  4970. echo ' client_body_buffer_size 128k;' >> /etc/nginx/nginx.conf
  4971. echo '' >> /etc/nginx/nginx.conf
  4972. echo ' # headerbuffer size for the request header from client, its set for testing purpose' >> /etc/nginx/nginx.conf
  4973. echo ' client_header_buffer_size 3m;' >> /etc/nginx/nginx.conf
  4974. echo '' >> /etc/nginx/nginx.conf
  4975. echo ' # maximum number and size of buffers for large headers to read from client request' >> /etc/nginx/nginx.conf
  4976. echo ' large_client_header_buffers 4 256k;' >> /etc/nginx/nginx.conf
  4977. echo '' >> /etc/nginx/nginx.conf
  4978. echo ' # read timeout for the request body from client, its set for testing purpose' >> /etc/nginx/nginx.conf
  4979. echo ' client_body_timeout 3m;' >> /etc/nginx/nginx.conf
  4980. echo '' >> /etc/nginx/nginx.conf
  4981. echo ' # how long to wait for the client to send a request header, its set for testing purpose' >> /etc/nginx/nginx.conf
  4982. echo ' client_header_timeout 3m;' >> /etc/nginx/nginx.conf
  4983. echo '' >> /etc/nginx/nginx.conf
  4984. echo ' ##' >> /etc/nginx/nginx.conf
  4985. echo ' # Basic Settings' >> /etc/nginx/nginx.conf
  4986. echo ' ##' >> /etc/nginx/nginx.conf
  4987. echo '' >> /etc/nginx/nginx.conf
  4988. echo ' sendfile on;' >> /etc/nginx/nginx.conf
  4989. echo ' tcp_nopush on;' >> /etc/nginx/nginx.conf
  4990. echo ' tcp_nodelay on;' >> /etc/nginx/nginx.conf
  4991. echo ' keepalive_timeout 65;' >> /etc/nginx/nginx.conf
  4992. echo ' types_hash_max_size 2048;' >> /etc/nginx/nginx.conf
  4993. echo ' server_tokens off;' >> /etc/nginx/nginx.conf
  4994. echo '' >> /etc/nginx/nginx.conf
  4995. echo ' # server_names_hash_bucket_size 64;' >> /etc/nginx/nginx.conf
  4996. echo ' # server_name_in_redirect off;' >> /etc/nginx/nginx.conf
  4997. echo '' >> /etc/nginx/nginx.conf
  4998. echo ' include /etc/nginx/mime.types;' >> /etc/nginx/nginx.conf
  4999. echo ' default_type application/octet-stream;' >> /etc/nginx/nginx.conf
  5000. echo '' >> /etc/nginx/nginx.conf
  5001. echo ' ##' >> /etc/nginx/nginx.conf
  5002. echo ' # Logging Settings' >> /etc/nginx/nginx.conf
  5003. echo ' ##' >> /etc/nginx/nginx.conf
  5004. echo '' >> /etc/nginx/nginx.conf
  5005. echo ' access_log /var/log/nginx/access.log;' >> /etc/nginx/nginx.conf
  5006. echo ' error_log /var/log/nginx/error.log;' >> /etc/nginx/nginx.conf
  5007. echo '' >> /etc/nginx/nginx.conf
  5008. echo ' ###' >> /etc/nginx/nginx.conf
  5009. echo ' # Gzip Settings' >> /etc/nginx/nginx.conf
  5010. echo ' ##' >> /etc/nginx/nginx.conf
  5011. echo ' gzip on;' >> /etc/nginx/nginx.conf
  5012. echo ' gzip_disable "msie6";' >> /etc/nginx/nginx.conf
  5013. echo '' >> /etc/nginx/nginx.conf
  5014. echo ' # gzip_vary on;' >> /etc/nginx/nginx.conf
  5015. echo ' # gzip_proxied any;' >> /etc/nginx/nginx.conf
  5016. echo ' # gzip_comp_level 6;' >> /etc/nginx/nginx.conf
  5017. echo ' # gzip_buffers 16 8k;' >> /etc/nginx/nginx.conf
  5018. echo ' # gzip_http_version 1.1;' >> /etc/nginx/nginx.conf
  5019. echo ' # gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;' >> /etc/nginx/nginx.conf
  5020. echo '' >> /etc/nginx/nginx.conf
  5021. echo ' ##' >> /etc/nginx/nginx.conf
  5022. echo ' # Virtual Host Configs' >> /etc/nginx/nginx.conf
  5023. echo ' ##' >> /etc/nginx/nginx.conf
  5024. echo '' >> /etc/nginx/nginx.conf
  5025. echo ' include /etc/nginx/conf.d/*.conf;' >> /etc/nginx/nginx.conf
  5026. echo ' include /etc/nginx/sites-enabled/*;' >> /etc/nginx/nginx.conf
  5027. echo '}' >> /etc/nginx/nginx.conf
  5028. # install a script to easily enable and disable nginx virtual hosts
  5029. if [ ! -d $INSTALL_DIR ]; then
  5030. mkdir $INSTALL_DIR
  5031. fi
  5032. cd $INSTALL_DIR
  5033. git clone $NGINX_ENSITE_REPO $INSTALL_DIR/nginx_ensite
  5034. cd $INSTALL_DIR/nginx_ensite
  5035. git checkout $NGINX_ENSITE_COMMIT -b $NGINX_ENSITE_COMMIT
  5036. if ! grep -q "Nginx-ensite commit" $COMPLETION_FILE; then
  5037. echo "Nginx-ensite commit:$NGINX_ENSITE_COMMIT" >> $COMPLETION_FILE
  5038. else
  5039. sed -i "s/Nginx-ensite commit.*/Nginx-ensite commit:$NGINX_ENSITE_COMMIT/g" $COMPLETION_FILE
  5040. fi
  5041. make install
  5042. nginx_dissite default
  5043. echo 'install_web_server' >> $COMPLETION_FILE
  5044. }
  5045. function configure_php {
  5046. sed -i "s/memory_limit = 128M/memory_limit = ${MAX_PHP_MEMORY}M/g" /etc/php5/fpm/php.ini
  5047. sed -i 's/;cgi.fix_pathinfo=1/cgi.fix_pathinfo=0/g' /etc/php5/fpm/php.ini
  5048. sed -i "s/memory_limit = -1/memory_limit = ${MAX_PHP_MEMORY}M/g" /etc/php5/cli/php.ini
  5049. sed -i "s/upload_max_filesize = 2M/upload_max_filesize = 50M/g" /etc/php5/fpm/php.ini
  5050. sed -i "s/post_max_size = 8M/post_max_size = 50M/g" /etc/php5/fpm/php.ini
  5051. }
  5052. function install_mariadb {
  5053. if grep -Fxq "install_mariadb" $COMPLETION_FILE; then
  5054. return
  5055. fi
  5056. apt-get -y install python-software-properties debconf-utils
  5057. apt-get -y install software-properties-common
  5058. apt-get -y update
  5059. get_mariadb_password
  5060. if [ ! $MARIADB_PASSWORD ]; then
  5061. if [ -f $IMAGE_PASSWORD_FILE ]; then
  5062. MARIADB_PASSWORD="$(printf `cat $IMAGE_PASSWORD_FILE`)"
  5063. else
  5064. MARIADB_PASSWORD="$(openssl rand -base64 32)"
  5065. fi
  5066. echo "$MARIADB_PASSWORD" > $DATABASE_PASSWORD_FILE
  5067. chmod 600 $DATABASE_PASSWORD_FILE
  5068. echo '' >> /home/$MY_USERNAME/README
  5069. echo '' >> /home/$MY_USERNAME/README
  5070. echo 'MariaDB / MySql' >> /home/$MY_USERNAME/README
  5071. echo '===============' >> /home/$MY_USERNAME/README
  5072. echo $"Your MariaDB password is: $MARIADB_PASSWORD" >> /home/$MY_USERNAME/README
  5073. echo '' >> /home/$MY_USERNAME/README
  5074. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
  5075. chmod 600 /home/$MY_USERNAME/README
  5076. fi
  5077. debconf-set-selections <<< "mariadb-server mariadb-server/root_password password $MARIADB_PASSWORD"
  5078. debconf-set-selections <<< "mariadb-server mariadb-server/root_password_again password $MARIADB_PASSWORD"
  5079. apt-get -y install mariadb-server
  5080. apt-get -y remove --purge apache*
  5081. if [ -d /etc/apache2 ]; then
  5082. rm -rf /etc/apache2
  5083. echo $'Removed Apache installation after MariaDB install'
  5084. fi
  5085. if [ ! -d /etc/mysql ]; then
  5086. echo $"ERROR: mariadb-server does not appear to have installed. $CHECK_MESSAGE"
  5087. exit 54
  5088. fi
  5089. mysqladmin -u root password "$MARIADB_PASSWORD"
  5090. echo 'install_mariadb' >> $COMPLETION_FILE
  5091. }
  5092. function backup_databases_script_header {
  5093. if [ ! -f /usr/bin/backupdatabases ]; then
  5094. # daily
  5095. echo '#!/bin/sh' > /usr/bin/backupdatabases
  5096. echo '' >> /usr/bin/backupdatabases
  5097. echo "EMAIL='$MY_EMAIL_ADDRESS'" >> /usr/bin/backupdatabases
  5098. echo '' >> /usr/bin/backupdatabases
  5099. echo -n 'MYSQL_PASSWORD=$(cat ' >> /usr/bin/backupdatabases
  5100. echo "$DATABASE_PASSWORD_FILE)" >> /usr/bin/backupdatabases
  5101. echo 'umask 0077' >> /usr/bin/backupdatabases
  5102. echo '' >> /usr/bin/backupdatabases
  5103. echo '# exit if we are backing up to friends servers' >> /usr/bin/backupdatabases
  5104. echo "if [ -f $FRIENDS_SERVERS_LIST ]; then" >> /usr/bin/backupdatabases
  5105. echo ' exit 1' >> /usr/bin/backupdatabases
  5106. echo 'fi' >> /usr/bin/backupdatabases
  5107. chmod 600 /usr/bin/backupdatabases
  5108. chmod +x /usr/bin/backupdatabases
  5109. echo '#!/bin/sh' > /etc/cron.daily/backupdatabasesdaily
  5110. echo '/usr/bin/backupdatabases' >> /etc/cron.daily/backupdatabasesdaily
  5111. chmod 600 /etc/cron.daily/backupdatabasesdaily
  5112. chmod +x /etc/cron.daily/backupdatabasesdaily
  5113. # weekly
  5114. echo '#!/bin/sh' > /etc/cron.weekly/backupdatabasesweekly
  5115. echo '' >> /etc/cron.weekly/backupdatabasesweekly
  5116. echo 'umask 0077' >> /etc/cron.weekly/backupdatabasesweekly
  5117. chmod 600 /etc/cron.weekly/backupdatabasesweekly
  5118. chmod +x /etc/cron.weekly/backupdatabasesweekly
  5119. # monthly
  5120. echo '#!/bin/sh' > /etc/cron.monthly/backupdatabasesmonthly
  5121. echo '' >> /etc/cron.monthly/backupdatabasesmonthly
  5122. echo 'umask 0077' >> /etc/cron.monthly/backupdatabasesmonthly
  5123. chmod 600 /etc/cron.monthly/backupdatabasesmonthly
  5124. chmod +x /etc/cron.monthly/backupdatabasesmonthly
  5125. fi
  5126. }
  5127. function repair_databases_script {
  5128. if [ -f /etc/cron.hourly/repair ]; then
  5129. sed -i "s|/usr/bin/repairdatabase|${PROJECT_NAME}-repair-database|g" /etc/cron.hourly/repair
  5130. fi
  5131. if grep -Fxq "repair_databases_script" $COMPLETION_FILE; then
  5132. return
  5133. fi
  5134. if [ ! -f $DATABASE_PASSWORD_FILE ]; then
  5135. return
  5136. fi
  5137. echo '#!/bin/bash' > /etc/cron.hourly/repair
  5138. echo '' >> /etc/cron.hourly/repair
  5139. chmod 600 /etc/cron.hourly/repair
  5140. chmod +x /etc/cron.hourly/repair
  5141. echo 'repair_databases_script' >> $COMPLETION_FILE
  5142. }
  5143. function install_owncloud_music_app {
  5144. if [[ $SYSTEM_TYPE == "$VARIANT_WRITER" || $SYSTEM_TYPE == "$VARIANT_MAILBOX" || $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_SOCIAL" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_DEVELOPER" || $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  5145. return
  5146. fi
  5147. if ! grep -Fxq "install_owncloud" $COMPLETION_FILE; then
  5148. echo $'Tried to install the Owncloud music app, but Owncloud installation was not found'
  5149. exit 9823
  5150. fi
  5151. # update to the next commit
  5152. if [ -d /usr/share/owncloud/apps/music ]; then
  5153. if grep -q "Owncloud music app commit" $COMPLETION_FILE; then
  5154. CURRENT_OWNCLOUD_MUSIC_APP_COMMIT=$(grep "Owncloud music app commit" $COMPLETION_FILE | awk -F ':' '{print $2}')
  5155. if [[ "$OWNCLOUD_MUSIC_APP_COMMIT" != "$OWNCLOUD_MUSIC_APP_COMMIT" ]]; then
  5156. cd /usr/share/owncloud/apps/music
  5157. git stash
  5158. git checkout master
  5159. git pull
  5160. git checkout $OWNCLOUD_MUSIC_APP_COMMIT -b $OWNCLOUD_MUSIC_APP_COMMIT
  5161. sed -i "s/Owncloud music app commit.*/Owncloud music app commit:$OWNCLOUD_MUSIC_APP_COMMIT/g" $COMPLETION_FILE
  5162. fi
  5163. else
  5164. echo "Owncloud music app commit:$OWNCLOUD_MUSIC_APP_COMMIT" >> $COMPLETION_FILE
  5165. fi
  5166. fi
  5167. if grep -Fxq "install_owncloud_music_app" $COMPLETION_FILE; then
  5168. return
  5169. fi
  5170. cd /usr/share/owncloud/apps
  5171. git clone $OWNCLOUD_MUSIC_APP_REPO Music
  5172. cd music
  5173. git checkout $OWNCLOUD_MUSIC_APP_COMMIT -b $OWNCLOUD_MUSIC_APP_COMMIT
  5174. if ! grep -q "Owncloud music app commit" $COMPLETION_FILE; then
  5175. echo "Owncloud music app commit:$OWNCLOUD_MUSIC_APP_COMMIT" >> $COMPLETION_FILE
  5176. else
  5177. sed -i "s/Owncloud music app commit.*/Owncloud music app commit:$OWNCLOUD_MUSIC_APP_COMMIT/g" $COMPLETION_FILE
  5178. fi
  5179. if grep -q $"Music player in Owncloud" /home/$MY_USERNAME/README; then
  5180. echo '' >> /home/$MY_USERNAME/README
  5181. echo '' >> /home/$MY_USERNAME/README
  5182. echo $'Music player in Owncloud' >> /home/$MY_USERNAME/README
  5183. echo '========================' >> /home/$MY_USERNAME/README
  5184. echo $'To enable the music app within ouwncloud log in to the Owncloud' >> /home/$MY_USERNAME/README
  5185. echo $'administrator account then go to Apps on the left hand dropdown' >> /home/$MY_USERNAME/README
  5186. echo $'menu and enable the music app. You can then log out and log back' >> /home/$MY_USERNAME/README
  5187. echo $'in as your Owncloud user and select music from the left hand' >> /home/$MY_USERNAME/README
  5188. echo $'dropdown menu.' >> /home/$MY_USERNAME/README
  5189. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
  5190. chmod 600 /home/$MY_USERNAME/README
  5191. fi
  5192. echo 'install_owncloud_music_app' >> $COMPLETION_FILE
  5193. }
  5194. function add_ddns_domain {
  5195. if [[ $ONION_ONLY != "no" ]]; then
  5196. return
  5197. fi
  5198. if [ ! $CURRENT_DDNS_DOMAIN ]; then
  5199. echo $'ddns domain not specified'
  5200. exit 5638
  5201. fi
  5202. if [ ! -f /etc/inadyn.conf ]; then
  5203. echo $'Unable to find inadyn configuration file /etc/inadyn.conf'
  5204. exit 5745
  5205. fi
  5206. if ! grep -q "$DDNS_PROVIDER" /etc/inadyn.conf; then
  5207. echo '' >> /etc/inadyn.conf
  5208. echo "system $DDNS_PROVIDER" >> /etc/inadyn.conf
  5209. echo ' ssl' >> /etc/inadyn.conf
  5210. echo " checkip-url $GET_IP_ADDRESS_URL /" >> /etc/inadyn.conf
  5211. if [ $DDNS_USERNAME ]; then
  5212. echo " username $DDNS_USERNAME" >> /etc/inadyn.conf
  5213. fi
  5214. if [ $DDNS_PASSWORD ]; then
  5215. echo " password $DDNS_PASSWORD" >> /etc/inadyn.conf
  5216. fi
  5217. fi
  5218. if ! grep -q "$CURRENT_DDNS_DOMAIN" /etc/inadyn.conf; then
  5219. echo " alias $CURRENT_DDNS_DOMAIN" >> /etc/inadyn.conf
  5220. fi
  5221. chmod 600 /etc/inadyn.conf
  5222. service inadyn restart
  5223. systemctl daemon-reload
  5224. # clear the arguments
  5225. CURRENT_DDNS_DOMAIN=
  5226. }
  5227. function configure_owncloud_onion_site {
  5228. if [ ! $OWNCLOUD_DOMAIN_NAME ]; then
  5229. return
  5230. fi
  5231. if [ ! -f /etc/owncloud/config.php ]; then
  5232. return
  5233. fi
  5234. if [ ! -f /var/lib/tor/hidden_service_owncloud/hostname ]; then
  5235. return
  5236. fi
  5237. OWNCLOUD_ONION_HOSTNAME=$(cat /var/lib/tor/hidden_service_owncloud/hostname)
  5238. if ! grep -q "${OWNCLOUD_ONION_HOSTNAME}" /etc/owncloud/config.php; then
  5239. sed -i "s|0 => '${OWNCLOUD_DOMAIN_NAME}',|0 => '${OWNCLOUD_DOMAIN_NAME}',
  5240. 1 => '${OWNCLOUD_ONION_HOSTNAME}',|g" /etc/owncloud/config.php
  5241. sed -i "s|'writable' => false,|'writable' => false,
  5242. ),
  5243. 1 =>
  5244. array (
  5245. 'path' => '/usr/share/owncloud/apps',
  5246. 'url' => '/apps',
  5247. 'writable' => false,|g" /etc/owncloud/config.php
  5248. echo $'Owncloud configured for onion site'
  5249. fi
  5250. }
  5251. function install_owncloud {
  5252. if [[ $SYSTEM_TYPE == "$VARIANT_WRITER" || $SYSTEM_TYPE == "$VARIANT_MAILBOX" || $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_SOCIAL" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_DEVELOPER" || $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  5253. return
  5254. fi
  5255. OWNCLOUD_COMPLETION_MSG1=$" *** ${PROJECT_NAME} $SYSTEM_TYPE is now installed ***"
  5256. OWNCLOUD_COMPLETION_MSG2=$"Open $OWNCLOUD_DOMAIN_NAME in a web browser to complete the setup"
  5257. if grep -Fxq "install_owncloud" $COMPLETION_FILE; then
  5258. if [[ $SYSTEM_TYPE == "$VARIANT_CLOUD" ]]; then
  5259. install_owncloud_music_app
  5260. backup_to_friends_servers
  5261. intrusion_detection
  5262. split_gpg_key_into_fragments
  5263. # unmount any attached usb drive
  5264. if [ -d $USB_MOUNT ]; then
  5265. umount $USB_MOUNT
  5266. rm -rf $USB_MOUNT
  5267. fi
  5268. echo ''
  5269. echo "$OWNCLOUD_COMPLETION_MSG1"
  5270. echo "$OWNCLOUD_COMPLETION_MSG2"
  5271. exit 0
  5272. fi
  5273. return
  5274. fi
  5275. # if this is exclusively a cloud setup
  5276. if [[ $SYSTEM_TYPE == "$VARIANT_CLOUD" ]]; then
  5277. if [ ! $DEFAULT_DOMAIN_NAME ]; then
  5278. echo $'No default domain name when installing cloud variant'
  5279. exit 5380
  5280. fi
  5281. fi
  5282. if [ ! $OWNCLOUD_DOMAIN_NAME ]; then
  5283. echo $'No Owncloud domain name was specified'
  5284. exit 3095
  5285. fi
  5286. if [[ $SYSTEM_TYPE != "$VARIANT_CLOUD" ]]; then
  5287. if [[ $SYSTEM_TYPE != "$VARIANT_FULL" ]]; then
  5288. echo $"Owncloud install did not recognise the system type $SYSTEM_TYPE"
  5289. exit 6746
  5290. fi
  5291. fi
  5292. apt-get -y install owncloud
  5293. apt-get -y remove --purge apache*
  5294. if [ -d /etc/apache2 ]; then
  5295. rm -rf /etc/apache2
  5296. echo $'Removed Apache installation after Owncloud install'
  5297. fi
  5298. install_mariadb
  5299. get_mariadb_password
  5300. get_mariadb_owncloud_admin_password
  5301. if [ ! $OWNCLOUD_ADMIN_PASSWORD ]; then
  5302. if [ -f $IMAGE_PASSWORD_FILE ]; then
  5303. OWNCLOUD_ADMIN_PASSWORD="$(printf `cat $IMAGE_PASSWORD_FILE`)"
  5304. else
  5305. OWNCLOUD_ADMIN_PASSWORD="$(openssl rand -base64 32)"
  5306. fi
  5307. fi
  5308. if ! grep -q "Owncloud database user" /home/$MY_USERNAME/README; then
  5309. echo '' >> /home/$MY_USERNAME/README
  5310. echo '' >> /home/$MY_USERNAME/README
  5311. echo 'Owncloud' >> /home/$MY_USERNAME/README
  5312. echo '========' >> /home/$MY_USERNAME/README
  5313. echo $'Owncloud database user: owncloudadmin' >> /home/$MY_USERNAME/README
  5314. echo $"Owncloud database password: $OWNCLOUD_ADMIN_PASSWORD" >> /home/$MY_USERNAME/README
  5315. echo $'Owncloud database name: owncloud' >> /home/$MY_USERNAME/README
  5316. echo '' >> /home/$MY_USERNAME/README
  5317. echo $'After creating an administrator account then create a user account via' >> /home/$MY_USERNAME/README
  5318. echo $"the Users dropdown menu entry. The username should be '$MY_USERNAME'." >> /home/$MY_USERNAME/README
  5319. echo '' >> /home/$MY_USERNAME/README
  5320. echo $'On mobile devices you can download the Owncloud client via F-Droid.' >> /home/$MY_USERNAME/README
  5321. echo '' >> /home/$MY_USERNAME/README
  5322. echo $'To synchronise calendar entries with Android "install CalDAV Sync Adapter"' >> /home/$MY_USERNAME/README
  5323. echo $'using F-Droid then go to settings/accounts and add a CalDav account with' >> /home/$MY_USERNAME/README
  5324. echo $"the URL https://$OWNCLOUD_DOMAIN_NAME/remote.php/caldav/principals/$MY_USERNAME" >> /home/$MY_USERNAME/README
  5325. echo $'and the username and password shown above.' >> /home/$MY_USERNAME/README
  5326. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
  5327. chmod 600 /home/$MY_USERNAME/README
  5328. fi
  5329. echo "create database owncloud;
  5330. CREATE USER 'owncloudadmin'@'localhost' IDENTIFIED BY '$OWNCLOUD_ADMIN_PASSWORD';
  5331. GRANT ALL PRIVILEGES ON owncloud.* TO 'owncloudadmin'@'localhost';
  5332. quit" > $INSTALL_DIR/batch.sql
  5333. chmod 600 $INSTALL_DIR/batch.sql
  5334. mysql -u root --password="$MARIADB_PASSWORD" < $INSTALL_DIR/batch.sql
  5335. shred -zu $INSTALL_DIR/batch.sql
  5336. if [ ! -d /var/www/$OWNCLOUD_DOMAIN_NAME ]; then
  5337. mkdir /var/www/$OWNCLOUD_DOMAIN_NAME
  5338. fi
  5339. if [ -d /var/www/$OWNCLOUD_DOMAIN_NAME/htdocs ]; then
  5340. rm -rf /var/www/$OWNCLOUD_DOMAIN_NAME/htdocs
  5341. fi
  5342. ln -s /usr/share/owncloud /var/www/$OWNCLOUD_DOMAIN_NAME/htdocs
  5343. if [[ $ONION_ONLY == "no" ]]; then
  5344. echo 'server {' > /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5345. echo ' listen 80;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5346. echo " server_name $OWNCLOUD_DOMAIN_NAME;" >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5347. echo ' access_log off;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5348. echo " error_log /var/log/nginx/${OWNCLOUD_DOMAIN_NAME}_error.log $WEBSERVER_LOG_LEVEL;" >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5349. echo ' limit_conn conn_limit_per_ip 10;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5350. echo ' limit_req zone=req_limit_per_ip burst=10 nodelay;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5351. echo ' rewrite ^ https://$server_name$request_uri? permanent;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5352. echo '}' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5353. echo '' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5354. echo 'server {' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5355. echo ' listen 443 ssl;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5356. echo " root /var/www/$OWNCLOUD_DOMAIN_NAME/htdocs;" >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5357. echo " server_name $OWNCLOUD_DOMAIN_NAME;" >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5358. echo ' access_log off;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5359. echo " error_log /var/log/nginx/${OWNCLOUD_DOMAIN_NAME}_error.log $WEBSERVER_LOG_LEVEL;" >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5360. echo '' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5361. echo ' limit_conn conn_limit_per_ip 10;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5362. echo ' limit_req zone=req_limit_per_ip burst=10 nodelay;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5363. echo '' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5364. echo ' ssl on;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5365. echo " ssl_certificate /etc/ssl/certs/$OWNCLOUD_DOMAIN_NAME.crt;" >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5366. echo " ssl_certificate_key /etc/ssl/private/$OWNCLOUD_DOMAIN_NAME.key;" >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5367. echo " ssl_dhparam /etc/ssl/certs/$OWNCLOUD_DOMAIN_NAME.dhparam;" >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5368. echo '' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5369. echo ' ssl_session_timeout 60m;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5370. echo ' ssl_prefer_server_ciphers on;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5371. echo " ssl_protocols $SSL_PROTOCOLS; # not possible to do exclusive" >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5372. echo " ssl_ciphers '$SSL_CIPHERS';" >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5373. echo ' add_header X-Frame-Options DENY;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5374. echo ' add_header X-Content-Type-Options nosniff;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5375. echo ' add_header Strict-Transport-Security max-age=15768000;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5376. echo ' # if you want to be able to access the site via HTTP' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5377. echo ' # then replace the above with the following:' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5378. echo ' # add_header Strict-Transport-Security "max-age=0;";' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5379. echo " # make sure webfinger and other well known services aren't blocked" >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5380. echo ' # by denying dot files and rewrite request to the front controller' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5381. echo ' location ^~ /.well-known/ {' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5382. echo ' allow all;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5383. echo ' }' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5384. echo '' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5385. echo ' client_max_body_size 10G; # set max upload size' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5386. echo ' client_body_buffer_size 128k;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5387. echo ' fastcgi_buffers 64 4K;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5388. echo '' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5389. echo ' rewrite ^/caldav(.*)$ /remote.php/caldav$1 redirect;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5390. echo ' rewrite ^/carddav(.*)$ /remote.php/carddav$1 redirect;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5391. echo ' rewrite ^/webdav(.*)$ /remote.php/webdav$1 redirect;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5392. echo '' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5393. echo ' index index.php;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5394. echo ' error_page 403 /core/templates/403.php;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5395. echo ' error_page 404 /core/templates/404.php;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5396. echo '' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5397. echo ' location = /robots.txt {' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5398. echo ' allow all;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5399. echo ' log_not_found off;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5400. echo ' access_log off;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5401. echo ' }' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5402. echo '' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5403. echo ' location ~ ^/(data|config|\.ht|db_structure\.xml|README) {' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5404. echo ' deny all;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5405. echo ' }' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5406. echo '' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5407. echo ' location / {' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5408. echo ' # The following 2 rules are only needed with webfinger' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5409. echo ' rewrite ^/.well-known/host-meta /public.php?service=host-meta last;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5410. echo ' rewrite ^/.well-known/host-meta.json /public.php?service=host-meta-json last;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5411. echo ' rewrite ^/.well-known/carddav /remote.php/carddav/ redirect;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5412. echo ' rewrite ^/.well-known/caldav /remote.php/caldav/ redirect;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5413. echo ' rewrite ^(/core/doc/[^\/]+/)$ $1/index.html;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5414. echo ' try_files $uri $uri/ index.php;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5415. echo ' }' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5416. echo '' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5417. echo ' location ~ ^(.+?\.php)(/.*)?$ {' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5418. echo ' try_files $1 =404;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5419. echo ' fastcgi_split_path_info ^(.+\.php)(/.+)$;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5420. echo ' fastcgi_pass unix:/var/run/php5-fpm.sock;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5421. echo ' fastcgi_index index.php;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5422. echo ' include fastcgi_params;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5423. echo ' fastcgi_param SCRIPT_FILENAME $document_root$1;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5424. echo ' fastcgi_param PATH_INFO $2;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5425. echo ' fastcgi_param HTTPS on;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5426. echo ' }' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5427. echo '' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5428. echo ' # Optional: set long EXPIRES header on static assets' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5429. echo ' location ~* ^.+\.(jpg|jpeg|gif|bmp|ico|png|css|js|swf)$ {' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5430. echo ' expires 30d;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5431. echo " # Optional: Don't log access to assets" >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5432. echo ' access_log off;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5433. echo ' }' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5434. echo '}' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5435. echo '' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5436. else
  5437. echo -n '' > /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5438. fi
  5439. echo 'server {' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5440. echo " listen 127.0.0.1:${OWNCLOUD_ONION_PORT} default_server;" >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5441. echo " root /var/www/$OWNCLOUD_DOMAIN_NAME/htdocs;" >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5442. echo " server_name $OWNCLOUD_DOMAIN_NAME;" >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5443. echo ' access_log off;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5444. echo " error_log /var/log/nginx/${OWNCLOUD_DOMAIN_NAME}_error.log $WEBSERVER_LOG_LEVEL;" >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5445. echo '' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5446. echo ' limit_conn conn_limit_per_ip 10;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5447. echo ' limit_req zone=req_limit_per_ip burst=10 nodelay;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5448. echo '' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5449. echo ' add_header X-Frame-Options DENY;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5450. echo ' add_header X-Content-Type-Options nosniff;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5451. echo ' add_header Strict-Transport-Security max-age=15768000;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5452. echo ' # if you want to be able to access the site via HTTP' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5453. echo ' # then replace the above with the following:' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5454. echo ' # add_header Strict-Transport-Security "max-age=0;";' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5455. echo " # make sure webfinger and other well known services aren't blocked" >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5456. echo ' # by denying dot files and rewrite request to the front controller' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5457. echo ' location ^~ /.well-known/ {' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5458. echo ' allow all;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5459. echo ' }' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5460. echo '' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5461. echo ' client_max_body_size 10G; # set max upload size' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5462. echo ' client_body_buffer_size 128k;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5463. echo ' fastcgi_buffers 64 4K;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5464. echo '' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5465. echo ' rewrite ^/caldav(.*)$ /remote.php/caldav$1 redirect;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5466. echo ' rewrite ^/carddav(.*)$ /remote.php/carddav$1 redirect;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5467. echo ' rewrite ^/webdav(.*)$ /remote.php/webdav$1 redirect;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5468. echo '' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5469. echo ' index index.php;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5470. echo ' error_page 403 /core/templates/403.php;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5471. echo ' error_page 404 /core/templates/404.php;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5472. echo '' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5473. echo ' location = /robots.txt {' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5474. echo ' allow all;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5475. echo ' log_not_found off;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5476. echo ' access_log off;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5477. echo ' }' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5478. echo '' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5479. echo ' location ~ ^/(data|config|\.ht|db_structure\.xml|README) {' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5480. echo ' deny all;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5481. echo ' }' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5482. echo '' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5483. echo ' location / {' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5484. echo ' # The following 2 rules are only needed with webfinger' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5485. echo ' rewrite ^/.well-known/host-meta /public.php?service=host-meta last;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5486. echo ' rewrite ^/.well-known/host-meta.json /public.php?service=host-meta-json last;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5487. echo ' rewrite ^/.well-known/carddav /remote.php/carddav/ redirect;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5488. echo ' rewrite ^/.well-known/caldav /remote.php/caldav/ redirect;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5489. echo ' rewrite ^(/core/doc/[^\/]+/)$ $1/index.html;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5490. echo ' try_files $uri $uri/ index.php;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5491. echo ' }' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5492. echo '' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5493. echo ' location ~ ^(.+?\.php)(/.*)?$ {' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5494. echo ' try_files $1 =404;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5495. echo ' fastcgi_split_path_info ^(.+\.php)(/.+)$;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5496. echo ' fastcgi_pass unix:/var/run/php5-fpm.sock;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5497. echo ' fastcgi_index index.php;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5498. echo ' include fastcgi_params;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5499. echo ' fastcgi_param SCRIPT_FILENAME $document_root$1;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5500. echo ' fastcgi_param PATH_INFO $2;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5501. echo ' fastcgi_param HTTPS on;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5502. echo ' }' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5503. echo '' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5504. echo ' # Optional: set long EXPIRES header on static assets' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5505. echo ' location ~* ^.+\.(jpg|jpeg|gif|bmp|ico|png|css|js|swf)$ {' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5506. echo ' expires 30d;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5507. echo " # Optional: Don't log access to assets" >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5508. echo ' access_log off;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5509. echo ' }' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5510. echo '}' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5511. configure_php
  5512. if [[ $ONION_ONLY == "no" ]]; then
  5513. if [ ! -f /etc/ssl/certs/$OWNCLOUD_DOMAIN_NAME.dhparam ]; then
  5514. if [[ $LETSENCRYPT_ENABLED != "yes" ]]; then
  5515. ${PROJECT_NAME}-addcert -h $OWNCLOUD_DOMAIN_NAME --dhkey $DH_KEYLENGTH
  5516. else
  5517. ${PROJECT_NAME}-addcert -e $OWNCLOUD_DOMAIN_NAME -s $LETSENCRYPT_SERVER --dhkey $DH_KEYLENGTH
  5518. fi
  5519. check_certificates $OWNCLOUD_DOMAIN_NAME
  5520. fi
  5521. fi
  5522. # Ensure that the database gets backed up locally, if remote
  5523. # backups are not being used
  5524. backup_databases_script_header
  5525. echo '' >> /usr/bin/backupdatabases
  5526. echo $'# Backup Owncloud database' >> /usr/bin/backupdatabases
  5527. echo 'TEMPFILE=/root/owncloud.sql' >> /usr/bin/backupdatabases
  5528. echo 'DAILYFILE=/var/backups/owncloud_daily.sql' >> /usr/bin/backupdatabases
  5529. echo 'mysqldump --password="$MYSQL_PASSWORD" owncloud > $TEMPFILE' >> /usr/bin/backupdatabases
  5530. echo 'FILESIZE=$(stat -c%s $TEMPFILE)' >> /usr/bin/backupdatabases
  5531. echo 'if [ "$FILESIZE" -eq "0" ]; then' >> /usr/bin/backupdatabases
  5532. echo ' if [ -f $DAILYFILE ]; then' >> /usr/bin/backupdatabases
  5533. echo ' cp $DAILYFILE $TEMPFILE' >> /usr/bin/backupdatabases
  5534. echo '' >> /usr/bin/backupdatabases
  5535. echo ' # try to restore yesterdays database' >> /usr/bin/backupdatabases
  5536. echo ' mysql -u root --password="$MYSQL_PASSWORD" owncloud -o < $DAILYFILE' >> /usr/bin/backupdatabases
  5537. echo '' >> /usr/bin/backupdatabases
  5538. echo ' # Send a warning email' >> /usr/bin/backupdatabases
  5539. echo ' echo "Unable to create a backup of the Owncloud database. Attempted to restore from yesterdays backup" | mail -s "Owncloud backup" $EMAIL' >> /usr/bin/backupdatabases
  5540. echo ' else' >> /usr/bin/backupdatabases
  5541. echo ' # Send a warning email' >> /usr/bin/backupdatabases
  5542. echo ' echo "Unable to create a backup of the Owncloud database." | mail -s "Owncloud backup" $EMAIL' >> /usr/bin/backupdatabases
  5543. echo ' fi' >> /usr/bin/backupdatabases
  5544. echo 'else' >> /usr/bin/backupdatabases
  5545. echo ' chmod 600 $TEMPFILE' >> /usr/bin/backupdatabases
  5546. echo ' mv $TEMPFILE $DAILYFILE' >> /usr/bin/backupdatabases
  5547. echo '' >> /usr/bin/backupdatabases
  5548. echo ' # Make the backup readable only by root' >> /usr/bin/backupdatabases
  5549. echo ' chmod 600 $DAILYFILE' >> /usr/bin/backupdatabases
  5550. echo 'fi' >> /usr/bin/backupdatabases
  5551. nginx_ensite $OWNCLOUD_DOMAIN_NAME
  5552. if [ ! -d /var/lib/tor ]; then
  5553. echo $'No Tor installation found. Owncloud onion site cannot be configured.'
  5554. exit 877367
  5555. fi
  5556. if ! grep -q "hidden_service_owncloud" /etc/tor/torrc; then
  5557. echo 'HiddenServiceDir /var/lib/tor/hidden_service_owncloud/' >> /etc/tor/torrc
  5558. echo "HiddenServicePort 80 127.0.0.1:${OWNCLOUD_ONION_PORT}" >> /etc/tor/torrc
  5559. echo $'Added onion site for Owncloud'
  5560. fi
  5561. service php5-fpm restart
  5562. service nginx restart
  5563. systemctl restart tor
  5564. if [ ! -f /var/lib/tor/hidden_service_owncloud/hostname ]; then
  5565. echo $'Owncloud onion site hostname not found'
  5566. exit 76362
  5567. fi
  5568. OWNCLOUD_ONION_HOSTNAME=$(cat /var/lib/tor/hidden_service_owncloud/hostname)
  5569. if ! grep -q "Owncloud onion domain" /home/$MY_USERNAME/README; then
  5570. echo "Owncloud onion domain: ${OWNCLOUD_ONION_HOSTNAME}" >> /home/$MY_USERNAME/README
  5571. echo '' >> /home/$MY_USERNAME/README
  5572. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
  5573. chmod 600 /home/$MY_USERNAME/README
  5574. fi
  5575. echo "Owncloud onion domain:${OWNCLOUD_ONION_HOSTNAME}" >> $COMPLETION_FILE
  5576. # update the dynamic DNS
  5577. CURRENT_DDNS_DOMAIN=$OWNCLOUD_DOMAIN_NAME
  5578. add_ddns_domain
  5579. echo "Owncloud domain:$$OWNCLOUD_DOMAIN_NAME" >> $COMPLETION_FILE
  5580. echo 'install_owncloud' >> $COMPLETION_FILE
  5581. if [[ $SYSTEM_TYPE == "$VARIANT_CLOUD" ]]; then
  5582. install_owncloud_music_app
  5583. backup_to_friends_servers
  5584. intrusion_detection
  5585. split_gpg_key_into_fragments
  5586. # unmount any attached usb drive
  5587. if [ -d $USB_MOUNT ]; then
  5588. umount $USB_MOUNT
  5589. rm -rf $USB_MOUNT
  5590. fi
  5591. echo ''
  5592. echo "$OWNCLOUD_COMPLETION_MSG1"
  5593. echo "$OWNCLOUD_COMPLETION_MSG2"
  5594. exit 0
  5595. fi
  5596. }
  5597. function install_gogs {
  5598. if [[ $SYSTEM_TYPE == "$VARIANT_WRITER" || $SYSTEM_TYPE == "$VARIANT_MAILBOX" || $SYSTEM_TYPE == "$VARIANT_CLOUD" || $SYSTEM_TYPE == "$VARIANT_SOCIAL" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  5599. return
  5600. fi
  5601. if [ ! $GIT_DOMAIN_NAME ]; then
  5602. return
  5603. fi
  5604. export GOPATH=/home/git/go
  5605. # update to the next commit
  5606. if [ -d /var/www/$GIT_DOMAIN_NAME ]; then
  5607. if grep -q "Gogs commit" $COMPLETION_FILE; then
  5608. CURRENT_GOGS_COMMIT=$(grep "Gogs commit" $COMPLETION_FILE | awk -F ':' '{print $2}')
  5609. if [[ "$CURRENT_GOGS_COMMIT" != "$GOGS_COMMIT" ]]; then
  5610. cd $GOPATH/src/github.com/gogits/gogs
  5611. git stash
  5612. git checkout master
  5613. git pull origin master
  5614. git checkout $GOGS_COMMIT -b $GOGS_COMMIT
  5615. if [ ! "$?" = "0" ]; then
  5616. git checkout $GOGS_COMMIT
  5617. fi
  5618. sed -i "s/Gogs commit.*/Gogs commit:$GOGS_COMMIT/g" $COMPLETION_FILE
  5619. go get -u ./...
  5620. if [ ! "$?" = "0" ]; then
  5621. exit 52792
  5622. fi
  5623. go build
  5624. if [ ! "$?" = "0" ]; then
  5625. exit 36226
  5626. fi
  5627. systemctl restart gogs
  5628. fi
  5629. else
  5630. echo "Gogs commit:$GOGS_COMMIT" >> $COMPLETION_FILE
  5631. fi
  5632. fi
  5633. if grep -Fxq "install_gogs" $COMPLETION_FILE; then
  5634. return
  5635. fi
  5636. # http://gogs.io/docs/installation/install_from_source.md
  5637. # add a gogs user account
  5638. adduser --disabled-login --gecos 'Gogs' git
  5639. # install Go
  5640. apt-get -y install golang libpam0g-dev
  5641. if ! grep -q "export GOPATH=/home/git/go" ~/.bashrc; then
  5642. echo 'export GOPATH=/home/git/go' >> ~/.bashrc
  5643. echo 'systemctl set-environment GOPATH=/home/git/go' >> ~/.bashrc
  5644. fi
  5645. . ~/.bashrc
  5646. if [ ! -d $GOPATH ]; then
  5647. mkdir -p $GOPATH
  5648. fi
  5649. go get -u github.com/gpmgo/gopm
  5650. if [ ! "$?" = "0" ]; then
  5651. exit 479832
  5652. fi
  5653. # clone the repo
  5654. if [ ! -d $GOPATH/src/github.com/gogits ]; then
  5655. mkdir -p $GOPATH/src/github.com/gogits
  5656. fi
  5657. cd $GOPATH/src/github.com/gogits
  5658. git clone $GIT_DOMAIN_REPO
  5659. cd gogs
  5660. git checkout $GOGS_COMMIT -b $GOGS_COMMIT
  5661. if ! grep -q "Gogs commit" $COMPLETION_FILE; then
  5662. echo "Gogs commit:$GOGS_COMMIT" >> $COMPLETION_FILE
  5663. else
  5664. sed -i "s/Gogs commit.*/Gogs commit:$GOGS_COMMIT/g" $COMPLETION_FILE
  5665. fi
  5666. # install
  5667. go get -u ./...
  5668. go build
  5669. if [ ! "$?" = "0" ]; then
  5670. exit 546750
  5671. fi
  5672. install_mariadb
  5673. get_mariadb_password
  5674. get_mariadb_git_admin_password
  5675. if [ ! $GIT_ADMIN_PASSWORD ]; then
  5676. if [ -f $IMAGE_PASSWORD_FILE ]; then
  5677. GIT_ADMIN_PASSWORD="$(printf `cat $IMAGE_PASSWORD_FILE`)"
  5678. else
  5679. GIT_ADMIN_PASSWORD="$(openssl rand -base64 32)"
  5680. fi
  5681. fi
  5682. if ! grep -q $"Gogs admin user password" /home/$MY_USERNAME/README; then
  5683. echo '' >> /home/$MY_USERNAME/README
  5684. echo '' >> /home/$MY_USERNAME/README
  5685. echo 'Gogs' >> /home/$MY_USERNAME/README
  5686. echo '====' >> /home/$MY_USERNAME/README
  5687. echo $'Database type: MySql' >> /home/$MY_USERNAME/README
  5688. echo $'Database host: 127.0.0.1:3306' >> /home/$MY_USERNAME/README
  5689. echo $'Database user: root' >> /home/$MY_USERNAME/README
  5690. echo $"Database password: $MARIADB_PASSWORD" >> /home/$MY_USERNAME/README
  5691. echo $'Database name: gogs' >> /home/$MY_USERNAME/README
  5692. echo $'Gogs admin user: gogsadmin' >> /home/$MY_USERNAME/README
  5693. echo $"Gogs admin user password: $GIT_ADMIN_PASSWORD" >> /home/$MY_USERNAME/README
  5694. echo $"Gogs admin user email: $MY_EMAIL_ADDRESS" >> /home/$MY_USERNAME/README
  5695. echo '' >> /home/$MY_USERNAME/README
  5696. echo $'Install Steps For First-time Run:' >> /home/$MY_USERNAME/README
  5697. echo $'Leave email service settings empty' >> /home/$MY_USERNAME/README
  5698. echo $'Check "Enable Register Confirmation"' >> /home/$MY_USERNAME/README
  5699. echo $'Check "Enable Mail Notification"' >> /home/$MY_USERNAME/README
  5700. echo '' >> /home/$MY_USERNAME/README
  5701. echo $'After the initial install edit /home/git/go/src/github.com/gogits/gogs/custom/conf/app.ini' >> /home/$MY_USERNAME/README
  5702. echo $'and within the [server] section set:' >> /home/$MY_USERNAME/README
  5703. echo " DOMAIN = $GIT_DOMAIN_NAME" >> /home/$MY_USERNAME/README
  5704. echo " ROOT_URL = http://$GIT_DOMAIN_NAME/" >> /home/$MY_USERNAME/README
  5705. echo " SSH_PORT = $SSH_PORT" >> /home/$MY_USERNAME/README
  5706. echo $'If you want to disable new account registrations then append the following:' >> /home/$MY_USERNAME/README
  5707. echo ' [service]' >> /home/$MY_USERNAME/README
  5708. echo ' DISABLE_REGISTRATION = true' >> /home/$MY_USERNAME/README
  5709. echo $'Then restart with:' >> /home/$MY_USERNAME/README
  5710. echo ' systemctl restart gogs' >> /home/$MY_USERNAME/README
  5711. echo '' >> /home/$MY_USERNAME/README
  5712. echo $"Note that there's a usability/security trade-off made here." >> /home/$MY_USERNAME/README
  5713. echo $"In order to allow git clone via http we don't redirect everything" >> /home/$MY_USERNAME/README
  5714. echo $'over https. Instead only critical things such as user login,' >> /home/$MY_USERNAME/README
  5715. echo $'settings and admin are encrypted.' >> /home/$MY_USERNAME/README
  5716. echo $'There are also potential security issues with cloning/pulling/pushing' >> /home/$MY_USERNAME/README
  5717. echo $'code over http, since a determined adversary could inject malware' >> /home/$MY_USERNAME/README
  5718. echo $'into the stream as it passes, so beware.' >> /home/$MY_USERNAME/README
  5719. echo $'If you have a bought domain and a non-self signed cert then you' >> /home/$MY_USERNAME/README
  5720. echo $"should change /etc/nginx/sites-available/$GIT_DOMAIN_NAME to redirect everything over https." >> /home/$MY_USERNAME/README
  5721. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
  5722. chmod 600 /home/$MY_USERNAME/README
  5723. fi
  5724. echo "create database gogs;
  5725. CREATE USER 'gogsadmin'@'localhost' IDENTIFIED BY '$GOGS_ADMIN_PASSWORD';
  5726. GRANT ALL PRIVILEGES ON gogs.* TO 'gogsadmin'@'localhost';
  5727. quit" > $INSTALL_DIR/batch.sql
  5728. chmod 600 $INSTALL_DIR/batch.sql
  5729. mysql -u root --password="$MARIADB_PASSWORD" < $INSTALL_DIR/batch.sql
  5730. shred -zu $INSTALL_DIR/batch.sql
  5731. chmod 600 /home/git/go/src/github.com/gogits/gogs/custom/conf/app.ini
  5732. chown -R git:git /home/git
  5733. cp $GOPATH/src/github.com/gogits/gogs/scripts/systemd/gogs.service /etc/systemd/system
  5734. sed -i 's|#After=mysqld.service|After=mysqld.service|g' /etc/systemd/system/gogs.service
  5735. sed -i "s|WorkingDirectory=.*|WorkingDirectory=$GOPATH/src/github.com/gogits/gogs|g" /etc/systemd/system/gogs.service
  5736. sed -i "s|ExecStart=.*|ExecStart=$GOPATH/src/github.com/gogits/gogs/gogs web|g" /etc/systemd/system/gogs.service
  5737. sed -i "s|Environment.*|Environment=\"USER=git\" \"HOME=/home/git\" \"GOPATH=/home/git/go\"|g" /etc/systemd/system/gogs.service
  5738. systemctl enable gogs
  5739. systemctl daemon-reload
  5740. systemctl restart gogs
  5741. if [ ! -d /var/www/$GIT_DOMAIN_NAME ]; then
  5742. mkdir /var/www/$GIT_DOMAIN_NAME
  5743. fi
  5744. if [ -d /var/www/$GIT_DOMAIN_NAME/htdocs ]; then
  5745. rm -rf /var/www/$GIT_DOMAIN_NAME/htdocs
  5746. fi
  5747. if [[ $ONION_ONLY == "no" ]]; then
  5748. echo 'server {' > /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  5749. echo ' listen 80;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  5750. echo " server_name $GIT_DOMAIN_NAME;" >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  5751. echo ' access_log off;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  5752. echo " error_log /var/log/nginx/${GIT_DOMAIN_NAME}_error.log $WEBSERVER_LOG_LEVEL;" >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  5753. echo ' limit_conn conn_limit_per_ip 10;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  5754. echo ' limit_req zone=req_limit_per_ip burst=10 nodelay;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  5755. echo ' location / {' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  5756. echo ' proxy_pass http://localhost:3000;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  5757. echo ' }' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  5758. echo ' location ^~ /user/ {' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  5759. echo ' rewrite ^ https://$server_name$request_uri?;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  5760. echo ' }' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  5761. echo ' location ^~ /admin/ {' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  5762. echo ' rewrite ^ https://$server_name$request_uri?;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  5763. echo ' }' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  5764. echo '}' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  5765. echo '' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  5766. echo 'server {' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  5767. echo ' listen 443 ssl;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  5768. echo " root /var/www/$GIT_DOMAIN_NAME/htdocs;" >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  5769. echo " server_name $GIT_DOMAIN_NAME;" >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  5770. echo ' access_log off;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  5771. echo " error_log /var/log/nginx/${GIT_DOMAIN_NAME}_error.log $WEBSERVER_LOG_LEVEL;" >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  5772. echo '' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  5773. echo ' limit_conn conn_limit_per_ip 10;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  5774. echo ' limit_req zone=req_limit_per_ip burst=10 nodelay;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  5775. echo '' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  5776. echo ' ssl on;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  5777. echo " ssl_certificate /etc/ssl/certs/$GIT_DOMAIN_NAME.crt;" >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  5778. echo " ssl_certificate_key /etc/ssl/private/$GIT_DOMAIN_NAME.key;" >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  5779. echo " ssl_dhparam /etc/ssl/certs/$GIT_DOMAIN_NAME.dhparam;" >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  5780. echo '' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  5781. echo ' ssl_session_timeout 60m;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  5782. echo ' ssl_prefer_server_ciphers on;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  5783. echo " ssl_protocols $SSL_PROTOCOLS; # not possible to do exclusive" >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  5784. echo " ssl_ciphers '$SSL_CIPHERS';" >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  5785. echo ' add_header X-Frame-Options DENY;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  5786. echo ' add_header X-Content-Type-Options nosniff;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  5787. echo ' add_header Strict-Transport-Security max-age=0;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  5788. echo '' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  5789. echo ' location / {' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  5790. echo ' proxy_pass http://localhost:3000;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  5791. echo ' }' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  5792. echo '' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  5793. echo ' client_max_body_size 10G; # set max upload size' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  5794. echo ' client_body_buffer_size 128k;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  5795. echo ' fastcgi_buffers 64 4K;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  5796. echo '' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  5797. echo ' error_page 403 /core/templates/403.php;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  5798. echo ' error_page 404 /core/templates/404.php;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  5799. echo '' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  5800. echo ' location = /robots.txt {' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  5801. echo ' allow all;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  5802. echo ' log_not_found off;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  5803. echo ' access_log off;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  5804. echo ' }' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  5805. echo '}' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  5806. echo '' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  5807. else
  5808. echo -n '' > /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  5809. fi
  5810. echo 'server {' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  5811. echo " listen 127.0.0.1:${GIT_ONION_PORT} default_server;" >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  5812. echo " root /var/www/$GIT_DOMAIN_NAME/htdocs;" >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  5813. echo " server_name $GIT_DOMAIN_NAME;" >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  5814. echo ' access_log off;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  5815. echo " error_log /var/log/nginx/${GIT_DOMAIN_NAME}_error.log $WEBSERVER_LOG_LEVEL;" >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  5816. echo '' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  5817. echo ' limit_conn conn_limit_per_ip 10;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  5818. echo ' limit_req zone=req_limit_per_ip burst=10 nodelay;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  5819. echo '' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  5820. echo ' add_header X-Frame-Options DENY;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  5821. echo ' add_header X-Content-Type-Options nosniff;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  5822. echo ' add_header Strict-Transport-Security max-age=0;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  5823. echo '' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  5824. echo ' location / {' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  5825. echo ' proxy_pass http://localhost:3000;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  5826. echo ' }' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  5827. echo '' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  5828. echo ' client_max_body_size 10G; # set max upload size' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  5829. echo ' client_body_buffer_size 128k;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  5830. echo ' fastcgi_buffers 64 4K;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  5831. echo '' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  5832. echo ' error_page 403 /core/templates/403.php;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  5833. echo ' error_page 404 /core/templates/404.php;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  5834. echo '' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  5835. echo ' location = /robots.txt {' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  5836. echo ' allow all;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  5837. echo ' log_not_found off;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  5838. echo ' access_log off;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  5839. echo ' }' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  5840. echo '}' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  5841. configure_php
  5842. if [[ $ONION_ONLY == "no" ]]; then
  5843. if [ ! -f /etc/ssl/certs/$GIT_DOMAIN_NAME.dhparam ]; then
  5844. if [[ $LETSENCRYPT_ENABLED != "yes" ]]; then
  5845. ${PROJECT_NAME}-addcert -h $GIT_DOMAIN_NAME --dhkey $DH_KEYLENGTH
  5846. else
  5847. ${PROJECT_NAME}-addcert -e $GIT_DOMAIN_NAME -s $LETSENCRYPT_SERVER --dhkey $DH_KEYLENGTH
  5848. fi
  5849. check_certificates $GIT_DOMAIN_NAME
  5850. fi
  5851. fi
  5852. nginx_ensite $GIT_DOMAIN_NAME
  5853. if [ ! -d /var/lib/tor ]; then
  5854. echo $'No Tor installation found. Gogs onion site cannot be configured.'
  5855. exit 83547
  5856. fi
  5857. if ! grep -q "hidden_service_gogs" /etc/tor/torrc; then
  5858. echo 'HiddenServiceDir /var/lib/tor/hidden_service_gogs/' >> /etc/tor/torrc
  5859. echo "HiddenServicePort 80 127.0.0.1:${GIT_ONION_PORT}" >> /etc/tor/torrc
  5860. echo $'Added onion site for Gogs'
  5861. fi
  5862. service php5-fpm restart
  5863. service nginx restart
  5864. systemctl restart tor
  5865. if [ ! -f /var/lib/tor/hidden_service_gogs/hostname ]; then
  5866. echo $'Gogs onion site hostname not found'
  5867. exit 53935
  5868. fi
  5869. GIT_ONION_HOSTNAME=$(cat /var/lib/tor/hidden_service_gogs/hostname)
  5870. if ! grep -q "Gogs onion domain" /home/$MY_USERNAME/README; then
  5871. echo "Gogs onion domain: ${GIT_ONION_HOSTNAME}" >> /home/$MY_USERNAME/README
  5872. echo '' >> /home/$MY_USERNAME/README
  5873. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
  5874. chmod 600 /home/$MY_USERNAME/README
  5875. fi
  5876. echo "Gogs onion domain:${GIT_ONION_HOSTNAME}" >> $COMPLETION_FILE
  5877. # update the dynamic DNS
  5878. CURRENT_DDNS_DOMAIN=$GIT_DOMAIN_NAME
  5879. add_ddns_domain
  5880. echo "Gogs domain:$GIT_DOMAIN_NAME" >> $COMPLETION_FILE
  5881. echo 'install_gogs' >> $COMPLETION_FILE
  5882. }
  5883. function tox_avahi {
  5884. if [[ $SYSTEM_TYPE != "$VARIANT_MESH" ]]; then
  5885. return
  5886. fi
  5887. if grep -Fxq "tox_avahi" $COMPLETION_FILE; then
  5888. return
  5889. fi
  5890. if [ ! -d /etc/avahi ]; then
  5891. echo $'tox_avahi: avahi is not installed'
  5892. exit 87359
  5893. fi
  5894. # install a command to obtain the Tox ID
  5895. cd $INSTALL_DIR
  5896. git clone https://github.com/bashrc/toxid
  5897. if [ ! -d $INSTALL_DIR/toxid ]; then
  5898. exit 63921
  5899. fi
  5900. cd $INSTALL_DIR/toxid
  5901. make
  5902. if [ ! "$?" = "0" ]; then
  5903. exit 58432
  5904. fi
  5905. make install
  5906. toxavahi
  5907. # publish regularly
  5908. if ! grep -q "toxavahi" /etc/crontab; then
  5909. echo "* * * * * root toxavahi > /dev/null" >> /etc/crontab
  5910. fi
  5911. systemctl restart avahi-daemon
  5912. echo 'tox_avahi' >> $COMPLETION_FILE
  5913. }
  5914. function install_tox_node {
  5915. if [[ $SYSTEM_TYPE == "$VARIANT_WRITER" || $SYSTEM_TYPE == "$VARIANT_MAILBOX" || $SYSTEM_TYPE == "$VARIANT_CLOUD" || $SYSTEM_TYPE == "$VARIANT_SOCIAL" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_DEVELOPER" ]]; then
  5916. return
  5917. fi
  5918. # update to the next commit
  5919. if [ -d $INSTALL_DIR/toxcore ]; then
  5920. if grep -q "toxcore commit" $COMPLETION_FILE; then
  5921. CURRENT_TOX_COMMIT=$(grep "toxcore commit" $COMPLETION_FILE | awk -F ':' '{print $2}')
  5922. if [[ "$CURRENT_TOX_COMMIT" != "$TOX_COMMIT" ]]; then
  5923. cd $INSTALL_DIR/toxcore
  5924. git stash
  5925. git checkout master
  5926. git pull
  5927. git checkout $TOX_COMMIT -b $TOX_COMMIT
  5928. sed -i "s/toxcore commit.*/toxcore commit:$TOX_COMMIT/g" $COMPLETION_FILE
  5929. autoreconf -i
  5930. ./configure --enable-daemon
  5931. make
  5932. make install
  5933. systemctl restart tox-bootstrapd.service
  5934. fi
  5935. else
  5936. echo "toxcore commit:$TOX_COMMIT" >> $COMPLETION_FILE
  5937. fi
  5938. fi
  5939. if grep -Fxq "install_tox_node" $COMPLETION_FILE; then
  5940. return
  5941. fi
  5942. # toxcore
  5943. apt-get -y install build-essential libtool autotools-dev
  5944. apt-get -y install automake checkinstall check git yasm
  5945. apt-get -y install libsodium13 libsodium-dev libcap2-bin
  5946. apt-get -y install libconfig9 libconfig-dev
  5947. cd $INSTALL_DIR
  5948. git clone $TOX_REPO
  5949. cd $INSTALL_DIR/toxcore
  5950. git checkout $TOX_COMMIT -b $TOX_COMMIT
  5951. if ! grep -q "toxcore commit" $COMPLETION_FILE; then
  5952. echo "toxcore commit:$TOX_COMMIT" >> $COMPLETION_FILE
  5953. else
  5954. sed -i "s/toxcore commit.*/toxcore commit:$TOX_COMMIT/g" $COMPLETION_FILE
  5955. fi
  5956. autoreconf -i
  5957. ./configure --enable-daemon
  5958. if [ ! "$?" = "0" ]; then
  5959. exit 78467
  5960. fi
  5961. make
  5962. if [ ! "$?" = "0" ]; then
  5963. exit 84562
  5964. fi
  5965. make install
  5966. cp /usr/local/lib/libtoxcore* /usr/lib/
  5967. if [ ! -f /usr/local/bin/tox-bootstrapd ]; then
  5968. echo $"File not found /usr/local/bin/tox-bootstrapd"
  5969. exit 73862
  5970. fi
  5971. useradd --home-dir /var/lib/tox-bootstrapd --create-home --system --shell /sbin/nologin --comment $"Account to run Tox's DHT bootstrap daemon" --user-group tox-bootstrapd
  5972. chmod 700 /var/lib/tox-bootstrapd
  5973. if [ ! -f $INSTALL_DIR/toxcore/other/bootstrap_daemon/tox-bootstrapd.conf ]; then
  5974. echo $"File not found $INSTALL_DIR/toxcore/other/bootstrap_daemon/tox-bootstrapd.conf"
  5975. exit 476835
  5976. fi
  5977. # remove Maildir
  5978. if [ -d /var/lib/tox-bootstrapd/Maildir ]; then
  5979. rm -rf /var/lib/tox-bootstrapd/Maildir
  5980. fi
  5981. # create configuration file
  5982. echo "port = $TOX_PORT" > /etc/tox-bootstrapd.conf
  5983. echo 'keys_file_path = "/var/lib/tox-bootstrapd/keys"' >> /etc/tox-bootstrapd.conf
  5984. echo 'pid_file_path = "/var/run/tox-bootstrapd/tox-bootstrapd.pid"' >> /etc/tox-bootstrapd.conf
  5985. echo 'enable_ipv6 = true' >> /etc/tox-bootstrapd.conf
  5986. echo 'enable_ipv4_fallback = true' >> /etc/tox-bootstrapd.conf
  5987. echo 'enable_lan_discovery = true' >> /etc/tox-bootstrapd.conf
  5988. echo 'enable_tcp_relay = true' >> /etc/tox-bootstrapd.conf
  5989. echo "tcp_relay_ports = [443, 3389, $TOX_PORT]" >> /etc/tox-bootstrapd.conf
  5990. echo 'enable_motd = true' >> /etc/tox-bootstrapd.conf
  5991. echo 'motd = "tox-bootstrapd"' >> /etc/tox-bootstrapd.conf
  5992. if [ $TOX_NODES ]; then
  5993. echo 'bootstrap_nodes = (' >> /etc/tox-bootstrapd.conf
  5994. toxcount=0
  5995. while [ "x${TOX_NODES[toxcount]}" != "x" ]
  5996. do
  5997. toxval_ipv4=$(echo $TOX_NODES[toxcount] | awk -F ',' '{print $1}')
  5998. toxval_ipv6=$(echo $TOX_NODES[toxcount] | awk -F ',' '{print $2}')
  5999. toxval_port=$(echo $TOX_NODES[toxcount] | awk -F ',' '{print $3}')
  6000. toxval_pubkey=$(echo $TOX_NODES[toxcount] | awk -F ',' '{print $4}')
  6001. toxval_maintainer=$(echo $TOX_NODES[toxcount] | awk -F ',' '{print $5}')
  6002. echo "{ // $toxval_maintainer" >> /etc/tox-bootstrapd.conf
  6003. if [[ $toxval_ipv6 != 'NONE' ]]; then
  6004. echo " address = \"$toxval_ipv6\"" >> /etc/tox-bootstrapd.conf
  6005. else
  6006. echo " address = \"$toxval_ipv4\"" >> /etc/tox-bootstrapd.conf
  6007. fi
  6008. echo " port = $toxval_port" >> /etc/tox-bootstrapd.conf
  6009. echo " public_key = \"$toxval_pubkey\"" >> /etc/tox-bootstrapd.conf
  6010. toxcount=$(( $toxcount + 1 ))
  6011. if [ "x${TOX_NODES[toxcount]}" != "x" ]; then
  6012. echo "}," >> /etc/tox-bootstrapd.conf
  6013. else
  6014. echo "}" >> /etc/tox-bootstrapd.conf
  6015. fi
  6016. done
  6017. echo ')' >> /etc/tox-bootstrapd.conf
  6018. fi
  6019. if [ ! -f $INSTALL_DIR/toxcore/other/bootstrap_daemon/tox-bootstrapd.service ]; then
  6020. echo $"File not found $INSTALL_DIR/toxcore/other/bootstrap_daemon/tox-bootstrapd.service"
  6021. exit 7359
  6022. fi
  6023. cp $INSTALL_DIR/toxcore/other/bootstrap_daemon/tox-bootstrapd.service /etc/systemd/system/
  6024. enable_ipv6
  6025. systemctl daemon-reload
  6026. systemctl enable tox-bootstrapd.service
  6027. systemctl start tox-bootstrapd.service
  6028. if [ ! "$?" = "0" ]; then
  6029. systemctl status tox-bootstrapd.service
  6030. exit 5846
  6031. fi
  6032. systemctl restart tox-bootstrapd.service
  6033. TOX_PUBLIC_KEY=$(cat /var/log/syslog | grep tox | grep "Public Key" | awk -F ' ' '{print $8}' | tail -1)
  6034. if [ ${#TOX_PUBLIC_KEY} -lt 30 ]; then
  6035. echo $'Could not obtain the tox node public key'
  6036. exit 6529
  6037. fi
  6038. # save the public key for later reference
  6039. echo "$TOX_PUBLIC_KEY" > $TOX_BOOTSTRAP_ID_FILE
  6040. configure_firewall_for_tox
  6041. if ! grep -q $"Your Tox node public key is" /home/$MY_USERNAME/README; then
  6042. echo '' >> /home/$MY_USERNAME/README
  6043. echo '' >> /home/$MY_USERNAME/README
  6044. echo 'Tox' >> /home/$MY_USERNAME/README
  6045. echo '===' >> /home/$MY_USERNAME/README
  6046. echo $"Your Tox node public key is: $TOX_PUBLIC_KEY" >> /home/$MY_USERNAME/README
  6047. echo $'In the Toxic client you can connect to it with:' >> /home/$MY_USERNAME/README
  6048. echo " /connect $DEFAULT_DOMAIN_NAME.local $TOX_PORT $TOX_PUBLIC_KEY" >> /home/$MY_USERNAME/README
  6049. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
  6050. chmod 600 /home/$MY_USERNAME/README
  6051. fi
  6052. echo 'install_tox_node' >> $COMPLETION_FILE
  6053. }
  6054. function install_tox_client {
  6055. if [[ $SYSTEM_TYPE == "$VARIANT_WRITER" || $SYSTEM_TYPE == "$VARIANT_MAILBOX" || $SYSTEM_TYPE == "$VARIANT_CLOUD" || $SYSTEM_TYPE == "$VARIANT_SOCIAL" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_DEVELOPER" ]]; then
  6056. return
  6057. fi
  6058. # update to the next commit
  6059. if [ -d $INSTALL_DIR/toxic ]; then
  6060. if grep -q "Toxic commit" $COMPLETION_FILE; then
  6061. CURRENT_TOXIC_COMMIT=$(grep "Toxic commit" $COMPLETION_FILE | awk -F ':' '{print $2}')
  6062. if [[ "$CURRENT_TOXIC_COMMIT" != "$TOXIC_COMMIT" ]]; then
  6063. cd $INSTALL_DIR/toxic
  6064. git stash
  6065. git checkout master
  6066. git pull
  6067. git checkout $TOXIC_COMMIT -b $TOXIC_COMMIT
  6068. sed -i "s/Toxic commit.*/Toxic commit:$TOXIC_COMMIT/g" $COMPLETION_FILE
  6069. make
  6070. make install
  6071. fi
  6072. else
  6073. echo "Toxic commit:$TOXIC_COMMIT" >> $COMPLETION_FILE
  6074. fi
  6075. fi
  6076. if grep -Fxq "install_tox_client" $COMPLETION_FILE; then
  6077. return
  6078. fi
  6079. apt-get -y install libncursesw5-dev libconfig-dev libqrencode-dev libcurl4-openssl-dev
  6080. cd $INSTALL_DIR
  6081. git clone $TOXIC_REPO
  6082. cd $INSTALL_DIR/toxic
  6083. git checkout $TOXIC_COMMIT -b $TOXIC_COMMIT
  6084. if ! grep -q "Toxic commit" $COMPLETION_FILE; then
  6085. echo "Toxic commit:$TOXIC_COMMIT" >> $COMPLETION_FILE
  6086. else
  6087. sed -i "s/Toxic commit.*/Toxic commit:$TOXIC_COMMIT/g" $COMPLETION_FILE
  6088. fi
  6089. make
  6090. if [ ! -f $INSTALL_DIR/toxic/build/toxic ]; then
  6091. exit 74872
  6092. fi
  6093. make install
  6094. su -c 'echo "n
  6095. /nick $MY_USERNAME
  6096. /exit
  6097. " | /usr/bin/toxic -d' - $MY_USERNAME
  6098. echo 'install_tox_client' >> $COMPLETION_FILE
  6099. }
  6100. function install_xmpp {
  6101. if [[ $SYSTEM_TYPE == "$VARIANT_WRITER" || $SYSTEM_TYPE == "$VARIANT_MAILBOX" || $SYSTEM_TYPE == "$VARIANT_CLOUD" || $SYSTEM_TYPE == "$VARIANT_SOCIAL" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_DEVELOPER" || $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  6102. return
  6103. fi
  6104. if grep -Fxq "install_xmpp" $COMPLETION_FILE; then
  6105. return
  6106. fi
  6107. apt-get -y install lua-sec
  6108. apt-get -y install prosody
  6109. if [ ! -d /etc/prosody ]; then
  6110. echo $"ERROR: prosody does not appear to have installed. $CHECK_MESSAGE"
  6111. exit 52
  6112. fi
  6113. if [ ! -f /etc/ssl/certs/xmpp.dhparam ]; then
  6114. ${PROJECT_NAME}-addcert -h xmpp --dhkey $DH_KEYLENGTH
  6115. check_certificates xmpp
  6116. fi
  6117. chown prosody:prosody /etc/ssl/private/xmpp.key
  6118. chown prosody:prosody /etc/ssl/certs/xmpp.*
  6119. cp -a /etc/prosody/conf.avail/example.com.cfg.lua /etc/prosody/conf.avail/xmpp.cfg.lua
  6120. sed -i 's|/etc/prosody/certs/example.com.key|/etc/ssl/private/xmpp.key|g' /etc/prosody/conf.avail/xmpp.cfg.lua
  6121. sed -i 's|/etc/prosody/certs/example.com.crt|/etc/ssl/certs/xmpp.crt|g' /etc/prosody/conf.avail/xmpp.cfg.lua
  6122. if ! grep -q "xmpp.dhparam" /etc/prosody/conf.avail/xmpp.cfg.lua; then
  6123. sed -i '/certificate =/a\ dhparam = "/etc/ssl/certs/xmpp.dhparam";' /etc/prosody/conf.avail/xmpp.cfg.lua
  6124. fi
  6125. if ! grep -q 'options = {"no_sslv2", "no_sslv3" }' /etc/prosody/conf.avail/xmpp.cfg.lua; then
  6126. sed -i '/certificate =/a\ options = {"no_sslv2", "no_sslv3" };' /etc/prosody/conf.avail/xmpp.cfg.lua
  6127. fi
  6128. if ! grep -q 'ciphers =' /etc/prosody/conf.avail/xmpp.cfg.lua; then
  6129. sed -i "/certificate =/a\ ciphers = $XMPP_CIPHERS;" /etc/prosody/conf.avail/xmpp.cfg.lua
  6130. fi
  6131. if ! grep -q 'depth = "1";' /etc/prosody/conf.avail/xmpp.cfg.lua; then
  6132. sed -i '/certificate =/a\ depth = "1";' /etc/prosody/conf.avail/xmpp.cfg.lua
  6133. fi
  6134. if ! grep -q 'curve =' /etc/prosody/conf.avail/xmpp.cfg.lua; then
  6135. sed -i "/certificate =/a\ curve = $XMPP_ECC_CURVE;" /etc/prosody/conf.avail/xmpp.cfg.lua
  6136. fi
  6137. sed -i "s/example.com/$DEFAULT_DOMAIN_NAME/g" /etc/prosody/conf.avail/xmpp.cfg.lua
  6138. sed -i 's/enabled = false -- Remove this line to enable this host//g' /etc/prosody/conf.avail/xmpp.cfg.lua
  6139. if ! grep -q "modules_enabled" /etc/prosody/conf.avail/xmpp.cfg.lua; then
  6140. echo '' >> /etc/prosody/conf.avail/xmpp.cfg.lua
  6141. echo 'modules_enabled = {' >> /etc/prosody/conf.avail/xmpp.cfg.lua
  6142. echo ' "bosh"; -- Enable mod_bosh' >> /etc/prosody/conf.avail/xmpp.cfg.lua
  6143. echo ' "tls"; -- Enable mod_tls' >> /etc/prosody/conf.avail/xmpp.cfg.lua
  6144. echo ' "saslauth"; -- Enable mod_saslauth' >> /etc/prosody/conf.avail/xmpp.cfg.lua
  6145. echo '}' >> /etc/prosody/conf.avail/xmpp.cfg.lua
  6146. echo '' >> /etc/prosody/conf.avail/xmpp.cfg.lua
  6147. echo 'c2s_require_encryption = true' >> /etc/prosody/conf.avail/xmpp.cfg.lua
  6148. echo 's2s_require_encryption = true' >> /etc/prosody/conf.avail/xmpp.cfg.lua
  6149. echo 'allow_unencrypted_plain_auth = false' >> /etc/prosody/conf.avail/xmpp.cfg.lua
  6150. fi
  6151. ln -sf /etc/prosody/conf.avail/xmpp.cfg.lua /etc/prosody/conf.d/xmpp.cfg.lua
  6152. sed -i 's|/etc/prosody/certs/localhost.key|/etc/ssl/private/xmpp.key|g' /etc/prosody/prosody.cfg.lua
  6153. sed -i 's|/etc/prosody/certs/localhost.crt|/etc/ssl/certs/xmpp.crt|g' /etc/prosody/prosody.cfg.lua
  6154. if ! grep -q "xmpp.dhparam" /etc/prosody/prosody.cfg.lua; then
  6155. sed -i '/certificate =/a\ dhparam = "/etc/ssl/certs/xmpp.dhparam";' /etc/prosody/prosody.cfg.lua
  6156. fi
  6157. if ! grep -q 'options = {"no_sslv2", "no_sslv3" }' /etc/prosody/prosody.cfg.lua; then
  6158. sed -i '/certificate =/a\ options = {"no_sslv2", "no_sslv3" };' /etc/prosody/prosody.cfg.lua
  6159. fi
  6160. if ! grep -q 'ciphers =' /etc/prosody/prosody.cfg.lua; then
  6161. sed -i "/certificate =/a\ ciphers = $XMPP_CIPHERS;" /etc/prosody/prosody.cfg.lua
  6162. fi
  6163. if ! grep -q 'depth = "1";' /etc/prosody/prosody.cfg.lua; then
  6164. sed -i '/certificate =/a\ depth = "1";' /etc/prosody/prosody.cfg.lua
  6165. fi
  6166. if ! grep -q 'curve =' /etc/prosody/prosody.cfg.lua; then
  6167. sed -i "/certificate =/a\ curve = $XMPP_ECC_CURVE;" /etc/prosody/prosody.cfg.lua
  6168. fi
  6169. sed -i 's/c2s_require_encryption = false/c2s_require_encryption = true/g' /etc/prosody/prosody.cfg.lua
  6170. if ! grep -q "s2s_require_encryption" /etc/prosody/prosody.cfg.lua; then
  6171. sed -i '/c2s_require_encryption/a\s2s_require_encryption = true' /etc/prosody/prosody.cfg.lua
  6172. fi
  6173. if ! grep -q "allow_unencrypted_plain_auth" /etc/prosody/prosody.cfg.lua; then
  6174. echo 'allow_unencrypted_plain_auth = false' >> /etc/prosody/conf.avail/xmpp.cfg.lua
  6175. fi
  6176. sed -i 's/--"bosh";/"bosh";/g' /etc/prosody/prosody.cfg.lua
  6177. sed -i 's/authentication = "internal_plain"/authentication = "internal_hashed"/g' /etc/prosody/prosody.cfg.lua
  6178. sed -i 's/enabled = false -- Remove this line to enable this host//g' /etc/prosody/prosody.cfg.lua
  6179. sed -i 's|key = "/etc/prosody/certs/example.com.key"|key = "/etc/ssl/private/xmpp.key"|g' /etc/prosody/prosody.cfg.lua
  6180. sed -i 's|certificate = "/etc/prosody/certs/example.com.crt"|certificate = "/etc/ssl/certs/xmpp.crt"|g' /etc/prosody/prosody.cfg.lua
  6181. sed -i "s/example.com/$DEFAULT_DOMAIN_NAME/g" /etc/prosody/prosody.cfg.lua
  6182. service prosody restart
  6183. touch /home/$MY_USERNAME/README
  6184. if ! grep -q "Your XMPP password is" /home/$MY_USERNAME/README; then
  6185. if [ -f $IMAGE_PASSWORD_FILE ]; then
  6186. XMPP_PASSWORD="$(printf `cat $IMAGE_PASSWORD_FILE`)"
  6187. else
  6188. XMPP_PASSWORD="$(openssl rand -base64 8)"
  6189. fi
  6190. prosodyctl register $MY_USERNAME $DEFAULT_DOMAIN_NAME $XMPP_PASSWORD
  6191. echo '' >> /home/$MY_USERNAME/README
  6192. echo '' >> /home/$MY_USERNAME/README
  6193. echo $'XMPP' >> /home/$MY_USERNAME/README
  6194. echo '====' >> /home/$MY_USERNAME/README
  6195. echo $"Your XMPP password is: $XMPP_PASSWORD" >> /home/$MY_USERNAME/README
  6196. echo $'You can change it with: ' >> /home/$MY_USERNAME/README
  6197. echo '' >> /home/$MY_USERNAME/README
  6198. echo " prosodyctl passwd $MY_EMAIL_ADDRESS" >> /home/$MY_USERNAME/README
  6199. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
  6200. chmod 600 /home/$MY_USERNAME/README
  6201. fi
  6202. echo 'install_xmpp' >> $COMPLETION_FILE
  6203. }
  6204. function install_watchdog_script {
  6205. if grep -Fxq "install_watchdog_script" $COMPLETION_FILE; then
  6206. return
  6207. fi
  6208. echo '#!/bin/bash' > /usr/bin/$WATCHDOG_SCRIPT_NAME
  6209. echo 'LOGFILE=/var/log/keepon.log' >> /usr/bin/$WATCHDOG_SCRIPT_NAME
  6210. echo 'CURRENT_DATE=$(date)' >> /usr/bin/$WATCHDOG_SCRIPT_NAME
  6211. # application specific stuff is added later
  6212. chmod +x /usr/bin/$WATCHDOG_SCRIPT_NAME
  6213. if ! grep -q "/usr/bin/$WATCHDOG_SCRIPT_NAME" /etc/crontab; then
  6214. echo "* * * * * root /usr/bin/$WATCHDOG_SCRIPT_NAME" >> /etc/crontab
  6215. fi
  6216. echo 'install_watchdog_script' >> $COMPLETION_FILE
  6217. }
  6218. function install_irc_server {
  6219. if [[ $SYSTEM_TYPE == "$VARIANT_WRITER" || $SYSTEM_TYPE == "$VARIANT_MAILBOX" || $SYSTEM_TYPE == "$VARIANT_CLOUD" || $SYSTEM_TYPE == "$VARIANT_SOCIAL" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_DEVELOPER" || $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  6220. return
  6221. fi
  6222. if grep -Fxq "install_irc_server" $COMPLETION_FILE; then
  6223. return
  6224. fi
  6225. apt-get -y install ngircd
  6226. # for mesh peers also install an irc client
  6227. if [[ $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  6228. apt-get -y install irssi
  6229. fi
  6230. if [ ! -d /etc/ngircd ]; then
  6231. echo $"ERROR: ngircd does not appear to have installed. $CHECK_MESSAGE"
  6232. exit 53
  6233. fi
  6234. if [ ! -f /etc/ssl/certs/ngircd.dhparam ]; then
  6235. ${PROJECT_NAME}-addcert -h ngircd --dhkey $DH_KEYLENGTH
  6236. check_certificates ngircd
  6237. fi
  6238. DEFAULTDOMAIN=$DEFAULT_DOMAIN_NAME
  6239. if [[ $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  6240. DEFAULTDOMAIN="${DEFAULT_DOMAIN_NAME}.local"
  6241. fi
  6242. echo '**************************************************' > /etc/ngircd/motd
  6243. echo $'* F R E E D O M B O N E I R C *' >> /etc/ngircd/motd
  6244. echo '* *' >> /etc/ngircd/motd
  6245. echo $'* Freedom in the Cloud *' >> /etc/ngircd/motd
  6246. echo '**************************************************' >> /etc/ngircd/motd
  6247. sed -i 's|MotdFile = /etc/ngircd/ngircd.motd|MotdFile = /etc/ngircd/motd|g' /etc/ngircd/ngircd.conf
  6248. sed -i "s/irc@irc.example.com/$MY_EMAIL_ADDRESS/g" /etc/ngircd/ngircd.conf
  6249. sed -i "s/irc.example.net/$DEFAULTDOMAIN/g" /etc/ngircd/ngircd.conf
  6250. sed -i "s|Yet another IRC Server running on Debian GNU/Linux|IRC Server of $DEFAULTDOMAIN|g" /etc/ngircd/ngircd.conf
  6251. sed -i 's/;Password = wealllikedebian/Password =/g' /etc/ngircd/ngircd.conf
  6252. sed -i 's|;CertFile = /etc/ssl/certs/server.crt|CertFile = /etc/ssl/certs/ngircd.crt|g' /etc/ngircd/ngircd.conf
  6253. sed -i 's|;DHFile = /etc/ngircd/dhparams.pem|DHFile = /etc/ssl/certs/ngircd.dhparam|g' /etc/ngircd/ngircd.conf
  6254. sed -i 's|;KeyFile = /etc/ssl/private/server.key|KeyFile = /etc/ssl/private/ngircd.key|g' /etc/ngircd/ngircd.conf
  6255. sed -i "s/;Ports =.*/Ports = $IRC_PORT, 9999/g" /etc/ngircd/ngircd.conf
  6256. sed -i "s/;Name = #ngircd/Name = #${PROJECT_NAME}/g" /etc/ngircd/ngircd.conf
  6257. sed -i "s/;Topic = Our ngircd testing channel/Topic = ${PROJECT_NAME} chat channel/g" /etc/ngircd/ngircd.conf
  6258. sed -i 's/;MaxUsers = 23/MaxUsers = 23/g' /etc/ngircd/ngircd.conf
  6259. sed -i "s|;KeyFile = /etc/ngircd/#chan.key|KeyFile = /etc/ngircd/#${PROJECT_NAME}.key|g" /etc/ngircd/ngircd.conf
  6260. sed -i "s/;CloakHost = cloaked.host/CloakHost = ${PROJECT_NAME}/g" /etc/ngircd/ngircd.conf
  6261. IRC_SALT="$(openssl rand -base64 32)"
  6262. if [ -f $IMAGE_PASSWORD_FILE ]; then
  6263. IRC_OPERATOR_PASSWORD="$(printf `cat $IMAGE_PASSWORD_FILE`)"
  6264. else
  6265. IRC_OPERATOR_PASSWORD="$(openssl rand -base64 8)"
  6266. fi
  6267. sed -i "s|;CloakHostSalt = abcdefghijklmnopqrstuvwxyz|CloakHostSalt = $IRC_SALT|g" /etc/ngircd/ngircd.conf
  6268. sed -i 's/;ConnectIPv4 = yes/ConnectIPv4 = yes/g' /etc/ngircd/ngircd.conf
  6269. sed -i 's/;MorePrivacy = no/MorePrivacy = yes/g' /etc/ngircd/ngircd.conf
  6270. sed -i 's/;RequireAuthPing = no/RequireAuthPing = no/g' /etc/ngircd/ngircd.conf
  6271. sed -i "s/;Name = TheOper/Name = $MY_USERNAME/g" /etc/ngircd/ngircd.conf
  6272. sed -i "s/;Password = ThePwd/Password = $IRC_OPERATOR_PASSWORD/g" /etc/ngircd/ngircd.conf
  6273. if [ $IRC_PASSWORD ]; then
  6274. sed -i "0,/RE/s/Password =.*/Password = $IRC_PASSWORD/" /etc/ngircd/ngircd.conf
  6275. fi
  6276. # If we are on a mesh then DNS is not available
  6277. if [[ $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  6278. sed -i "s/;DNS =.*/DNS = no/g" /etc/ngircd/ngircd.conf
  6279. fi
  6280. mkdir /var/run/ircd
  6281. chown -R irc:irc /var/run/ircd
  6282. mkdir /var/run/ngircd
  6283. touch /var/run/ngircd/ngircd.pid
  6284. chown -R irc:irc /var/run/ngircd
  6285. systemctl restart ngircd
  6286. # keep the daemon running
  6287. echo '' >> /usr/bin/$WATCHDOG_SCRIPT_NAME
  6288. echo '# keep irc daemon running' >> /usr/bin/$WATCHDOG_SCRIPT_NAME
  6289. echo 'IRC_RUNNING=$(pgrep ngircd > /dev/null && echo Running)' >> /usr/bin/$WATCHDOG_SCRIPT_NAME
  6290. echo 'if [ ! $IRC_RUNNING ]; then' >> /usr/bin/$WATCHDOG_SCRIPT_NAME
  6291. echo ' systemctl start ngircd' >> /usr/bin/$WATCHDOG_SCRIPT_NAME
  6292. echo ' echo -n $CURRENT_DATE >> $LOGFILE' >> /usr/bin/$WATCHDOG_SCRIPT_NAME
  6293. echo ' echo " IRC daemon restarted" >> $LOGFILE' >> /usr/bin/$WATCHDOG_SCRIPT_NAME
  6294. echo 'fi' >> /usr/bin/$WATCHDOG_SCRIPT_NAME
  6295. if ! grep -q $"IRC Server" /home/$MY_USERNAME/README; then
  6296. echo '' >> /home/$MY_USERNAME/README
  6297. echo '' >> /home/$MY_USERNAME/README
  6298. echo $'IRC Server' >> /home/$MY_USERNAME/README
  6299. echo '==========' >> /home/$MY_USERNAME/README
  6300. echo $'To connect to your IRC server in irssi:' >> /home/$MY_USERNAME/README
  6301. echo '' >> /home/$MY_USERNAME/README
  6302. echo " /server add -auto -ssl $DEFAULTDOMAIN $IRC_PORT" >> /home/$MY_USERNAME/README
  6303. echo " /connect $DEFAULT_DOMAIN_NAME" >> /home/$MY_USERNAME/README
  6304. echo " /join #${PROJECT_NAME}" >> /home/$MY_USERNAME/README
  6305. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
  6306. chmod 600 /home/$MY_USERNAME/README
  6307. fi
  6308. echo 'install_irc_server' >> $COMPLETION_FILE
  6309. }
  6310. function get_wiki_admin_password {
  6311. if [ -f /home/$MY_USERNAME/README ]; then
  6312. if grep -q "Wiki password" /home/$MY_USERNAME/README; then
  6313. WIKI_ADMIN_PASSWORD=$(cat /home/$MY_USERNAME/README | grep "Wiki password:" | awk -F ':' '{print $2}' | sed 's/^ *//')
  6314. fi
  6315. fi
  6316. }
  6317. function install_wiki {
  6318. if [[ $SYSTEM_TYPE == "$VARIANT_CLOUD" || $SYSTEM_TYPE == "$VARIANT_MAILBOX" || $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_SOCIAL" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_DEVELOPER" || $SYSTEM_TYPE == "$VARIANT_MASH" ]]; then
  6319. return
  6320. fi
  6321. if grep -Fxq "install_wiki" $COMPLETION_FILE; then
  6322. return
  6323. fi
  6324. if [ ! $WIKI_DOMAIN_NAME ]; then
  6325. return
  6326. fi
  6327. apt-get -y install dokuwiki
  6328. apt-get -y remove --purge apache*
  6329. if [ -d /etc/apache2 ]; then
  6330. rm -rf /etc/apache2
  6331. echo $'Removed Apache installation after Dokuwiki install'
  6332. fi
  6333. if [ ! -d /var/www/$WIKI_DOMAIN_NAME ]; then
  6334. mkdir /var/www/$WIKI_DOMAIN_NAME
  6335. fi
  6336. if [ -d /var/www/$WIKI_DOMAIN_NAME/htdocs ]; then
  6337. rm -rf /var/www/$WIKI_DOMAIN_NAME/htdocs
  6338. fi
  6339. ln -s /usr/share/dokuwiki /var/www/$WIKI_DOMAIN_NAME/htdocs
  6340. mkdir /var/lib/dokuwiki/custom
  6341. cp /etc/dokuwiki/local.php.dist /var/lib/dokuwiki/custom/local.php
  6342. ln -s /var/lib/dokuwiki/custom/local.php /etc/dokuwiki/local.php
  6343. chown www-data /var/lib/dokuwiki/custom
  6344. chown www-data /var/lib/dokuwiki/custom/local.php
  6345. chown -R www-data /etc/dokuwiki
  6346. chown -R www-data /usr/share/dokuwiki/lib/
  6347. chmod 600 /var/lib/dokuwiki/custom/local.php
  6348. chmod -R 755 /usr/share/dokuwiki/lib
  6349. sed -i 's|//$conf|$conf|g' /var/lib/dokuwiki/custom/local.php
  6350. sed -i "s|joe|$MY_USERNAME|g" /var/lib/dokuwiki/custom/local.php
  6351. sed -i "s|Debian DokuWiki|$WIKI_TITLE|g" /etc/dokuwiki/local.php
  6352. # set the admin user
  6353. sed -i "s/@admin/$MY_USERNAME/g" /etc/dokuwiki/local.php
  6354. # disallow registration of new users
  6355. if ! grep -q "disableactions" /etc/dokuwiki/local.php; then
  6356. echo "\$conf['disableactions'] = 'register';" >> /etc/dokuwiki/local.php
  6357. fi
  6358. if ! grep -q "disableactions" /var/lib/dokuwiki/custom/local.php; then
  6359. echo "\$conf['disableactions'] = 'register';" >> /var/lib/dokuwiki/custom/local.php
  6360. fi
  6361. if ! grep -q "authtype" /var/lib/dokuwiki/custom/local.php; then
  6362. echo "\$conf['authtype'] = 'authplain';" >> /var/lib/dokuwiki/custom/local.php
  6363. fi
  6364. if ! grep -q "authtype" /etc/dokuwiki/local.php; then
  6365. echo "\$conf['authtype'] = 'authplain';" >> /etc/dokuwiki/local.php
  6366. fi
  6367. get_wiki_admin_password
  6368. if [ ! $WIKI_ADMIN_PASSWORD ]; then
  6369. if [ -f $IMAGE_PASSWORD_FILE ]; then
  6370. WIKI_ADMIN_PASSWORD="$(printf `cat $IMAGE_PASSWORD_FILE`)"
  6371. else
  6372. WIKI_ADMIN_PASSWORD="$(openssl rand -base64 16)"
  6373. fi
  6374. fi
  6375. HASHED_WIKI_PASSWORD=$(echo -n "$WIKI_ADMIN_PASSWORD" | md5sum | awk -F ' ' '{print $1}')
  6376. echo -n "$MY_USERNAME:$HASHED_WIKI_PASSWORD:$MY_NAME:$MY_EMAIL:admin,user,upload" > /var/lib/dokuwiki/acl/users.auth.php
  6377. chmod 640 /var/lib/dokuwiki/acl/users.auth.php
  6378. if ! grep -q "video/ogg" /etc/dokuwiki/mime.conf; then
  6379. echo 'ogv video/ogg' >> /etc/dokuwiki/mime.conf
  6380. fi
  6381. if ! grep -q "video/mp4" /etc/dokuwiki/mime.conf; then
  6382. echo 'mp4 video/mp4' >> /etc/dokuwiki/mime.conf
  6383. fi
  6384. if ! grep -q "video/webm" /etc/dokuwiki/mime.conf; then
  6385. echo 'webm video/webm' >> /etc/dokuwiki/mime.conf
  6386. fi
  6387. if [[ $ONION_ONLY == "no" ]]; then
  6388. echo 'server {' > /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6389. echo ' listen 80;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6390. echo " root /var/www/$WIKI_DOMAIN_NAME/htdocs;" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6391. echo " server_name $WIKI_DOMAIN_NAME;" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6392. echo ' access_log off;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6393. echo " error_log /var/log/nginx/${WIKI_DOMAIN_NAME}_error.log $WEBSERVER_LOG_LEVEL;" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6394. echo ' index index.php;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6395. echo ' charset utf-8;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6396. echo ' client_max_body_size 20m;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6397. echo ' client_body_buffer_size 128k;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6398. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6399. echo ' limit_conn conn_limit_per_ip 10;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6400. echo ' limit_req zone=req_limit_per_ip burst=10 nodelay;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6401. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6402. echo ' # rewrite to front controller as default rule' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6403. echo ' location / {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6404. echo ' rewrite ^/(.*) /index.php?q=$uri&$args last;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6405. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6406. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6407. echo " # make sure webfinger and other well known services aren't blocked" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6408. echo ' # by denying dot files and rewrite request to the front controller' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6409. echo ' location ^~ /.well-known/ {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6410. echo ' allow all;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6411. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6412. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6413. echo ' # statically serve these file types when possible' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6414. echo ' # otherwise fall back to front controller' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6415. echo ' # allow browser to cache them' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6416. echo ' # added .htm for advanced source code editor library' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6417. echo ' location ~* \.(jpg|jpeg|gif|png|ico|css|js|htm|html|ttf|woff|svg)$ {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6418. echo ' expires 30d;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6419. echo ' try_files $uri /index.php?q=$uri&$args;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6420. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6421. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6422. echo ' # block these file types' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6423. echo ' location ~* \.(tpl|md|tgz|log|out)$ {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6424. echo ' deny all;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6425. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6426. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6427. echo ' # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6428. echo ' # or a unix socket' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6429. echo ' location ~* \.php$ {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6430. echo ' # Zero-day exploit defense.' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6431. echo ' # http://forum.nginx.org/read.php?2,88845,page=3' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6432. echo " # Won't work properly (404 error) if the file is not stored on this" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6433. echo " # server, which is entirely possible with php-fpm/php-fcgi." >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6434. echo " # Comment the 'try_files' line out if you set up php-fpm/php-fcgi on" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6435. echo " # another machine. And then cross your fingers that you won't get hacked." >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6436. echo ' try_files $uri $uri/ /index.php;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6437. echo ' # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6438. echo ' fastcgi_split_path_info ^(.+\.php)(/.+)$;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6439. echo ' # With php5-cgi alone:' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6440. echo ' # fastcgi_pass 127.0.0.1:9000;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6441. echo ' # With php5-fpm:' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6442. echo ' fastcgi_pass unix:/var/run/php5-fpm.sock;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6443. echo ' include fastcgi_params;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6444. echo ' fastcgi_index index.php;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6445. echo ' fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6446. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6447. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6448. echo ' # deny access to all dot files' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6449. echo ' location ~ /\. {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6450. echo ' deny all;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6451. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6452. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6453. echo ' #deny access to store' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6454. echo ' location ~ /store {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6455. echo ' deny all;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6456. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6457. echo ' location ~ /(data|conf|bin|inc)/ {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6458. echo ' deny all;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6459. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6460. echo ' location ~ /\.ht {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6461. echo ' deny all;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6462. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6463. echo '}' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6464. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6465. echo 'server {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6466. echo ' listen 443 ssl;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6467. echo " root /var/www/$WIKI_DOMAIN_NAME/htdocs;" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6468. echo " server_name $WIKI_DOMAIN_NAME;" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6469. echo ' access_log off;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6470. echo " error_log /var/log/nginx/${WIKI_DOMAIN_NAME}_error_ssl.log $WEBSERVER_LOG_LEVEL;" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6471. echo ' index index.php;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6472. echo ' charset utf-8;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6473. echo ' client_max_body_size 20m;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6474. echo ' client_body_buffer_size 128k;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6475. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6476. echo ' limit_conn conn_limit_per_ip 10;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6477. echo ' limit_req zone=req_limit_per_ip burst=10 nodelay;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6478. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6479. echo ' ssl on;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6480. echo " ssl_certificate /etc/ssl/certs/$WIKI_DOMAIN_NAME.crt;" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6481. echo " ssl_certificate_key /etc/ssl/private/$WIKI_DOMAIN_NAME.key;" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6482. echo " ssl_dhparam /etc/ssl/certs/$WIKI_DOMAIN_NAME.dhparam;" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6483. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6484. echo ' ssl_session_timeout 60m;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6485. echo ' ssl_prefer_server_ciphers on;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6486. echo ' ssl_session_cache builtin:1000 shared:SSL:10m;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6487. echo " ssl_protocols $SSL_PROTOCOLS; # not possible to do exclusive" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6488. echo " ssl_ciphers '$SSL_CIPHERS';" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6489. echo ' add_header X-Frame-Options DENY;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6490. echo ' add_header X-Content-Type-Options nosniff;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6491. echo ' add_header Strict-Transport-Security "max-age=0;";' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6492. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6493. echo ' # rewrite to front controller as default rule' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6494. echo ' location / {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6495. echo ' rewrite ^/(.*) /index.php?q=$uri&$args last;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6496. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6497. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6498. echo " # make sure webfinger and other well known services aren't blocked" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6499. echo ' # by denying dot files and rewrite request to the front controller' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6500. echo ' location ^~ /.well-known/ {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6501. echo ' allow all;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6502. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6503. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6504. echo ' # statically serve these file types when possible' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6505. echo ' # otherwise fall back to front controller' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6506. echo ' # allow browser to cache them' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6507. echo ' # added .htm for advanced source code editor library' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6508. echo ' location ~* \.(jpg|jpeg|gif|png|ico|css|js|htm|html|ttf|woff|svg)$ {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6509. echo ' expires 30d;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6510. echo ' try_files $uri /index.php?q=$uri&$args;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6511. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6512. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6513. echo ' # block these file types' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6514. echo ' location ~* \.(tpl|md|tgz|log|out)$ {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6515. echo ' deny all;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6516. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6517. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6518. echo ' # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6519. echo ' # or a unix socket' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6520. echo ' location ~* \.php$ {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6521. echo ' # Zero-day exploit defense.' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6522. echo ' # http://forum.nginx.org/read.php?2,88845,page=3' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6523. echo " # Won't work properly (404 error) if the file is not stored on this" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6524. echo " # server, which is entirely possible with php-fpm/php-fcgi." >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6525. echo " # Comment the 'try_files' line out if you set up php-fpm/php-fcgi on" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6526. echo " # another machine. And then cross your fingers that you won't get hacked." >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6527. echo ' try_files $uri $uri/ /index.php;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6528. echo ' # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6529. echo ' fastcgi_split_path_info ^(.+\.php)(/.+)$;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6530. echo ' # With php5-cgi alone:' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6531. echo ' # fastcgi_pass 127.0.0.1:9000;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6532. echo ' # With php5-fpm:' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6533. echo ' fastcgi_pass unix:/var/run/php5-fpm.sock;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6534. echo ' include fastcgi_params;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6535. echo ' fastcgi_index index.php;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6536. echo ' fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6537. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6538. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6539. echo ' # deny access to all dot files' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6540. echo ' location ~ /\. {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6541. echo ' deny all;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6542. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6543. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6544. echo ' #deny access to store' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6545. echo ' location ~ /store {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6546. echo ' deny all;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6547. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6548. echo ' location ~ /(data|conf|bin|inc)/ {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6549. echo ' deny all;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6550. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6551. echo ' location ~ /\.ht {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6552. echo ' deny all;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6553. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6554. echo '}' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6555. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6556. else
  6557. echo -n '' > /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6558. fi
  6559. echo 'server {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6560. echo " listen 127.0.0.1:${WIKI_ONION_PORT} default_server;" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6561. echo " root /var/www/$WIKI_DOMAIN_NAME/htdocs;" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6562. echo " server_name $WIKI_DOMAIN_NAME;" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6563. echo ' access_log off;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6564. echo " error_log /var/log/nginx/${WIKI_DOMAIN_NAME}_error_ssl.log $WEBSERVER_LOG_LEVEL;" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6565. echo ' index index.php;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6566. echo ' charset utf-8;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6567. echo ' client_max_body_size 20m;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6568. echo ' client_body_buffer_size 128k;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6569. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6570. echo ' limit_conn conn_limit_per_ip 10;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6571. echo ' limit_req zone=req_limit_per_ip burst=10 nodelay;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6572. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6573. echo ' add_header X-Frame-Options DENY;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6574. echo ' add_header X-Content-Type-Options nosniff;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6575. echo ' add_header Strict-Transport-Security "max-age=0;";' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6576. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6577. echo ' # rewrite to front controller as default rule' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6578. echo ' location / {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6579. echo ' rewrite ^/(.*) /index.php?q=$uri&$args last;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6580. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6581. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6582. echo " # make sure webfinger and other well known services aren't blocked" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6583. echo ' # by denying dot files and rewrite request to the front controller' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6584. echo ' location ^~ /.well-known/ {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6585. echo ' allow all;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6586. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6587. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6588. echo ' # statically serve these file types when possible' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6589. echo ' # otherwise fall back to front controller' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6590. echo ' # allow browser to cache them' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6591. echo ' # added .htm for advanced source code editor library' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6592. echo ' location ~* \.(jpg|jpeg|gif|png|ico|css|js|htm|html|ttf|woff|svg)$ {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6593. echo ' expires 30d;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6594. echo ' try_files $uri /index.php?q=$uri&$args;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6595. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6596. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6597. echo ' # block these file types' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6598. echo ' location ~* \.(tpl|md|tgz|log|out)$ {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6599. echo ' deny all;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6600. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6601. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6602. echo ' # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6603. echo ' # or a unix socket' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6604. echo ' location ~* \.php$ {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6605. echo ' # Zero-day exploit defense.' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6606. echo ' # http://forum.nginx.org/read.php?2,88845,page=3' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6607. echo " # Won't work properly (404 error) if the file is not stored on this" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6608. echo " # server, which is entirely possible with php-fpm/php-fcgi." >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6609. echo " # Comment the 'try_files' line out if you set up php-fpm/php-fcgi on" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6610. echo " # another machine. And then cross your fingers that you won't get hacked." >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6611. echo ' try_files $uri $uri/ /index.php;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6612. echo ' # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6613. echo ' fastcgi_split_path_info ^(.+\.php)(/.+)$;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6614. echo ' # With php5-cgi alone:' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6615. echo ' # fastcgi_pass 127.0.0.1:9000;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6616. echo ' # With php5-fpm:' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6617. echo ' fastcgi_pass unix:/var/run/php5-fpm.sock;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6618. echo ' include fastcgi_params;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6619. echo ' fastcgi_index index.php;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6620. echo ' fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6621. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6622. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6623. echo ' # deny access to all dot files' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6624. echo ' location ~ /\. {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6625. echo ' deny all;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6626. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6627. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6628. echo ' #deny access to store' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6629. echo ' location ~ /store {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6630. echo ' deny all;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6631. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6632. echo ' location ~ /(data|conf|bin|inc)/ {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6633. echo ' deny all;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6634. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6635. echo ' location ~ /\.ht {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6636. echo ' deny all;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6637. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6638. echo '}' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6639. if [[ $ONION_ONLY == "no" ]]; then
  6640. if [ ! -f /etc/ssl/certs/$WIKI_DOMAIN_NAME.dhparam ]; then
  6641. if [[ $LETSENCRYPT_ENABLED != "yes" ]]; then
  6642. ${PROJECT_NAME}-addcert -h $WIKI_DOMAIN_NAME --dhkey $DH_KEYLENGTH
  6643. else
  6644. ${PROJECT_NAME}-addcert -e $WIKI_DOMAIN_NAME -s $LETSENCRYPT_SERVER --dhkey $DH_KEYLENGTH
  6645. fi
  6646. check_certificates $WIKI_DOMAIN_NAME
  6647. fi
  6648. fi
  6649. configure_php
  6650. nginx_ensite $WIKI_DOMAIN_NAME
  6651. if [ ! -d /var/lib/tor ]; then
  6652. echo $'No Tor installation found. Wiki onion site cannot be configured.'
  6653. exit 877367
  6654. fi
  6655. if ! grep -q "hidden_service_wiki" /etc/tor/torrc; then
  6656. echo 'HiddenServiceDir /var/lib/tor/hidden_service_wiki/' >> /etc/tor/torrc
  6657. echo "HiddenServicePort 80 127.0.0.1:${WIKI_ONION_PORT}" >> /etc/tor/torrc
  6658. echo $'Added onion site for Wiki'
  6659. fi
  6660. systemctl restart php5-fpm
  6661. systemctl restart nginx
  6662. systemctl restart tor
  6663. if [ ! -f /var/lib/tor/hidden_service_wiki/hostname ]; then
  6664. echo $'Wiki onion site hostname not found'
  6665. exit 52383
  6666. fi
  6667. WIKI_ONION_HOSTNAME=$(cat /var/lib/tor/hidden_service_wiki/hostname)
  6668. echo "Wiki onion domain:${WIKI_ONION_HOSTNAME}" >> $COMPLETION_FILE
  6669. # update the dynamic DNS
  6670. CURRENT_DDNS_DOMAIN=$WIKI_DOMAIN_NAME
  6671. add_ddns_domain
  6672. # add some post-install instructions
  6673. if ! grep -q $"Wiki password" /home/$MY_USERNAME/README; then
  6674. echo '' >> /home/$MY_USERNAME/README
  6675. echo '' >> /home/$MY_USERNAME/README
  6676. echo $'Wiki' >> /home/$MY_USERNAME/README
  6677. echo '====' >> /home/$MY_USERNAME/README
  6678. echo $"Wiki onion domain: ${WIKI_ONION_HOSTNAME}" >> /home/$MY_USERNAME/README
  6679. echo $"Wiki username: $MY_USERNAME" >> /home/$MY_USERNAME/README
  6680. echo $"Wiki password: $WIKI_ADMIN_PASSWORD" >> /home/$MY_USERNAME/README
  6681. echo '' >> /home/$MY_USERNAME/README
  6682. echo $'Once you have set up the wiki then remove the install file:' >> /home/$MY_USERNAME/README
  6683. echo '' >> /home/$MY_USERNAME/README
  6684. echo " rm /var/www/$WIKI_DOMAIN_NAME/htdocs/install.php" >> /home/$MY_USERNAME/README
  6685. echo '' >> /home/$MY_USERNAME/README
  6686. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
  6687. chmod 600 /home/$MY_USERNAME/README
  6688. fi
  6689. echo "Wiki domain:$WIKI_DOMAIN_NAME" >> $COMPLETION_FILE
  6690. echo 'install_wiki' >> $COMPLETION_FILE
  6691. }
  6692. function get_blog_admin_password {
  6693. if [ -f /home/$MY_USERNAME/README ]; then
  6694. if grep -q "Your blog password is" /home/$MY_USERNAME/README; then
  6695. FULLBLOG_ADMIN_PASSWORD=$(cat /home/$MY_USERNAME/README | grep "Your blog password is" | awk -F ':' '{print $2}' | sed 's/^ *//')
  6696. fi
  6697. fi
  6698. }
  6699. function install_blog {
  6700. if [[ $SYSTEM_TYPE == "$VARIANT_CLOUD" || $SYSTEM_TYPE == "$VARIANT_MAILBOX" || $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_SOCIAL" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_DEVELOPER" || $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  6701. return
  6702. fi
  6703. if [ ! $FULLBLOG_DOMAIN_NAME ]; then
  6704. echo $'The blog domain name was not specified'
  6705. exit 5062
  6706. fi
  6707. # update to the next commit
  6708. if [ -d /var/www/$FULLBLOG_DOMAIN_NAME/htdocs ]; then
  6709. if grep -q "Blog commit" $COMPLETION_FILE; then
  6710. CURRENT_FULLBLOG_COMMIT=$(grep "Blog commit" $COMPLETION_FILE | awk -F ':' '{print $2}')
  6711. if [[ "$CURRENT_FULLBLOG_COMMIT" != "$FULLBLOG_COMMIT" ]]; then
  6712. cd /var/www/$FULLBLOG_DOMAIN_NAME/htdocs
  6713. git stash
  6714. git checkout master
  6715. git pull
  6716. git checkout $FULLBLOG_COMMIT -b $FULLBLOG_COMMIT
  6717. sed -i "s/Blog commit.*/Blog commit:$FULLBLOG_COMMIT/g" $COMPLETION_FILE
  6718. chown -R www-data:www-data /var/www/$FULLBLOG_DOMAIN_NAME/htdocs
  6719. fi
  6720. else
  6721. echo "Blog commit:$FULLBLOG_COMMIT" >> $COMPLETION_FILE
  6722. fi
  6723. fi
  6724. if grep -Fxq "install_blog" $COMPLETION_FILE; then
  6725. return
  6726. fi
  6727. if [ ! -d /var/www/$FULLBLOG_DOMAIN_NAME ]; then
  6728. mkdir /var/www/$FULLBLOG_DOMAIN_NAME
  6729. fi
  6730. cd /var/www/$FULLBLOG_DOMAIN_NAME
  6731. git clone $FULLBLOG_REPO htdocs
  6732. cd htdocs
  6733. git checkout $FULLBLOG_COMMIT -b $FULLBLOG_COMMIT
  6734. if ! grep -q "Blog commit" $COMPLETION_FILE; then
  6735. echo "Blog commit:$FULLBLOG_COMMIT" >> $COMPLETION_FILE
  6736. else
  6737. sed -i "s/Blog commit.*/Blog commit:$FULLBLOG_COMMIT/g" $COMPLETION_FILE
  6738. fi
  6739. cd /var/www/$FULLBLOG_DOMAIN_NAME
  6740. chown -R www-data:www-data /var/www/$FULLBLOG_DOMAIN_NAME/htdocs
  6741. if [[ $ONION_ONLY == "no" ]]; then
  6742. echo 'server {' > /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6743. echo ' listen 80;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6744. echo " root /var/www/$FULLBLOG_DOMAIN_NAME/htdocs;" >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6745. echo " server_name $FULLBLOG_DOMAIN_NAME;" >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6746. echo ' access_log off;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6747. echo " error_log /var/log/nginx/${FULLBLOG_DOMAIN_NAME}_error.log $WEBSERVER_LOG_LEVEL;" >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6748. echo ' index index.php;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6749. echo ' charset utf-8;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6750. echo ' client_max_body_size 20m;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6751. echo ' client_body_buffer_size 128k;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6752. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6753. echo ' limit_conn conn_limit_per_ip 10;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6754. echo ' limit_req zone=req_limit_per_ip burst=10 nodelay;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6755. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6756. echo ' # Always redirect the login page to https' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6757. echo ' location /login {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6758. echo ' rewrite ^ https://$server_name$request_uri?;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6759. echo ' }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6760. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6761. echo ' # rewrite to front controller as default rule' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6762. echo ' location / {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6763. echo ' rewrite ^/(.*) /index.php?q=$uri&$args last;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6764. echo ' }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6765. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6766. echo " # make sure webfinger and other well known services aren't blocked" >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6767. echo ' # by denying dot files and rewrite request to the front controller' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6768. echo ' location ^~ /.well-known/ {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6769. echo ' allow all;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6770. echo ' }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6771. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6772. echo ' # statically serve these file types when possible' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6773. echo ' # otherwise fall back to front controller' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6774. echo ' # allow browser to cache them' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6775. echo ' # added .htm for advanced source code editor library' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6776. echo ' location ~* \.(jpg|jpeg|gif|png|ico|css|js|htm|html|ttf|woff|svg)$ {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6777. echo ' expires 30d;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6778. echo ' try_files $uri /index.php?q=$uri&$args;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6779. echo ' }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6780. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6781. echo ' # block these file types' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6782. echo ' location ~* \.(tpl|md|tgz|log|out)$ {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6783. echo ' deny all;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6784. echo ' }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6785. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6786. echo ' # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6787. echo ' # or a unix socket' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6788. echo ' location ~* \.php$ {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6789. echo ' # Zero-day exploit defense.' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6790. echo ' # http://forum.nginx.org/read.php?2,88845,page=3' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6791. echo " # Won't work properly (404 error) if the file is not stored on this" >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6792. echo " # server, which is entirely possible with php-fpm/php-fcgi." >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6793. echo " # Comment the 'try_files' line out if you set up php-fpm/php-fcgi on" >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6794. echo " # another machine. And then cross your fingers that you won't get hacked." >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6795. echo ' try_files $uri $uri/ /index.php;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6796. echo ' # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6797. echo ' fastcgi_split_path_info ^(.+\.php)(/.+)$;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6798. echo ' # With php5-cgi alone:' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6799. echo ' # fastcgi_pass 127.0.0.1:9000;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6800. echo ' # With php5-fpm:' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6801. echo ' fastcgi_pass unix:/var/run/php5-fpm.sock;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6802. echo ' include fastcgi_params;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6803. echo ' fastcgi_index index.php;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6804. echo ' fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6805. echo ' }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6806. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6807. echo ' # deny access to all dot files' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6808. echo ' location ~ /\. {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6809. echo ' deny all;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6810. echo ' }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6811. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6812. echo ' #deny access to store' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6813. echo ' location ~ /store {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6814. echo ' deny all;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6815. echo ' }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6816. echo ' location ~ /(data|conf|bin|inc)/ {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6817. echo ' deny all;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6818. echo ' }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6819. echo ' location ~ /\.ht {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6820. echo ' deny all;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6821. echo ' }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6822. echo '}' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6823. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6824. echo 'server {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6825. echo ' listen 443 ssl;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6826. echo " root /var/www/$FULLBLOG_DOMAIN_NAME/htdocs;" >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6827. echo " server_name $FULLBLOG_DOMAIN_NAME;" >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6828. echo ' access_log off;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6829. echo " error_log /var/log/nginx/${FULLBLOG_DOMAIN_NAME}_error_ssl.log $WEBSERVER_LOG_LEVEL;" >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6830. echo ' index index.php;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6831. echo ' charset utf-8;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6832. echo ' client_max_body_size 20m;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6833. echo ' client_body_buffer_size 128k;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6834. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6835. echo ' limit_conn conn_limit_per_ip 10;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6836. echo ' limit_req zone=req_limit_per_ip burst=10 nodelay;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6837. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6838. echo ' ssl on;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6839. echo " ssl_certificate /etc/ssl/certs/$FULLBLOG_DOMAIN_NAME.crt;" >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6840. echo " ssl_certificate_key /etc/ssl/private/$FULLBLOG_DOMAIN_NAME.key;" >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6841. echo " ssl_dhparam /etc/ssl/certs/$FULLBLOG_DOMAIN_NAME.dhparam;" >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6842. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6843. echo ' ssl_session_timeout 60m;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6844. echo ' ssl_prefer_server_ciphers on;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6845. echo ' ssl_session_cache builtin:1000 shared:SSL:10m;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6846. echo " ssl_protocols $SSL_PROTOCOLS; # not possible to do exclusive" >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6847. echo " ssl_ciphers '$SSL_CIPHERS';" >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6848. echo ' add_header X-Frame-Options DENY;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6849. echo ' add_header X-Content-Type-Options nosniff;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6850. echo ' add_header Strict-Transport-Security "max-age=0;";' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6851. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6852. echo ' # rewrite to front controller as default rule' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6853. echo ' location / {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6854. echo ' rewrite ^/(.*) /index.php?q=$uri&$args last;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6855. echo ' }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6856. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6857. echo " # make sure webfinger and other well known services aren't blocked" >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6858. echo ' # by denying dot files and rewrite request to the front controller' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6859. echo ' location ^~ /.well-known/ {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6860. echo ' allow all;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6861. echo ' }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6862. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6863. echo ' # statically serve these file types when possible' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6864. echo ' # otherwise fall back to front controller' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6865. echo ' # allow browser to cache them' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6866. echo ' # added .htm for advanced source code editor library' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6867. echo ' location ~* \.(jpg|jpeg|gif|png|ico|css|js|htm|html|ttf|woff|svg)$ {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6868. echo ' expires 30d;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6869. echo ' try_files $uri /index.php?q=$uri&$args;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6870. echo ' }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6871. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6872. echo ' # block these file types' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6873. echo ' location ~* \.(tpl|md|tgz|log|out)$ {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6874. echo ' deny all;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6875. echo ' }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6876. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6877. echo ' # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6878. echo ' # or a unix socket' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6879. echo ' location ~* \.php$ {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6880. echo ' # Zero-day exploit defense.' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6881. echo ' # http://forum.nginx.org/read.php?2,88845,page=3' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6882. echo " # Won't work properly (404 error) if the file is not stored on this" >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6883. echo " # server, which is entirely possible with php-fpm/php-fcgi." >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6884. echo " # Comment the 'try_files' line out if you set up php-fpm/php-fcgi on" >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6885. echo " # another machine. And then cross your fingers that you won't get hacked." >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6886. echo ' try_files $uri $uri/ /index.php;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6887. echo ' # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6888. echo ' fastcgi_split_path_info ^(.+\.php)(/.+)$;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6889. echo ' # With php5-cgi alone:' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6890. echo ' # fastcgi_pass 127.0.0.1:9000;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6891. echo ' # With php5-fpm:' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6892. echo ' fastcgi_pass unix:/var/run/php5-fpm.sock;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6893. echo ' include fastcgi_params;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6894. echo ' fastcgi_index index.php;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6895. echo ' fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6896. echo ' }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6897. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6898. echo ' # deny access to all dot files' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6899. echo ' location ~ /\. {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6900. echo ' deny all;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6901. echo ' }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6902. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6903. echo ' #deny access to store' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6904. echo ' location ~ /store {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6905. echo ' deny all;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6906. echo ' }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6907. echo ' location ~ /(data|conf|bin|inc)/ {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6908. echo ' deny all;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6909. echo ' }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6910. echo ' location ~ /\.ht {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6911. echo ' deny all;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6912. echo ' }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6913. echo '}' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6914. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6915. else
  6916. echo -n '' > /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6917. fi
  6918. echo 'server {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6919. echo " listen 127.0.0.1:${FULLBLOG_ONION_PORT} default_server;" >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6920. echo " root /var/www/$FULLBLOG_DOMAIN_NAME/htdocs;" >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6921. echo " server_name $FULLBLOG_DOMAIN_NAME;" >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6922. echo ' access_log off;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6923. echo " error_log /var/log/nginx/${FULLBLOG_DOMAIN_NAME}_error_ssl.log $WEBSERVER_LOG_LEVEL;" >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6924. echo ' index index.php;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6925. echo ' charset utf-8;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6926. echo ' client_max_body_size 20m;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6927. echo ' client_body_buffer_size 128k;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6928. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6929. echo ' limit_conn conn_limit_per_ip 10;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6930. echo ' limit_req zone=req_limit_per_ip burst=10 nodelay;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6931. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6932. echo ' add_header X-Frame-Options DENY;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6933. echo ' add_header X-Content-Type-Options nosniff;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6934. echo ' add_header Strict-Transport-Security "max-age=0;";' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6935. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6936. echo ' # rewrite to front controller as default rule' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6937. echo ' location / {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6938. echo ' rewrite ^/(.*) /index.php?q=$uri&$args last;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6939. echo ' }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6940. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6941. echo " # make sure webfinger and other well known services aren't blocked" >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6942. echo ' # by denying dot files and rewrite request to the front controller' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6943. echo ' location ^~ /.well-known/ {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6944. echo ' allow all;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6945. echo ' }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6946. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6947. echo ' # statically serve these file types when possible' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6948. echo ' # otherwise fall back to front controller' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6949. echo ' # allow browser to cache them' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6950. echo ' # added .htm for advanced source code editor library' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6951. echo ' location ~* \.(jpg|jpeg|gif|png|ico|css|js|htm|html|ttf|woff|svg)$ {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6952. echo ' expires 30d;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6953. echo ' try_files $uri /index.php?q=$uri&$args;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6954. echo ' }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6955. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6956. echo ' # block these file types' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6957. echo ' location ~* \.(tpl|md|tgz|log|out)$ {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6958. echo ' deny all;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6959. echo ' }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6960. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6961. echo ' # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6962. echo ' # or a unix socket' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6963. echo ' location ~* \.php$ {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6964. echo ' # Zero-day exploit defense.' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6965. echo ' # http://forum.nginx.org/read.php?2,88845,page=3' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6966. echo " # Won't work properly (404 error) if the file is not stored on this" >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6967. echo " # server, which is entirely possible with php-fpm/php-fcgi." >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6968. echo " # Comment the 'try_files' line out if you set up php-fpm/php-fcgi on" >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6969. echo " # another machine. And then cross your fingers that you won't get hacked." >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6970. echo ' try_files $uri $uri/ /index.php;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6971. echo ' # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6972. echo ' fastcgi_split_path_info ^(.+\.php)(/.+)$;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6973. echo ' # With php5-cgi alone:' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6974. echo ' # fastcgi_pass 127.0.0.1:9000;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6975. echo ' # With php5-fpm:' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6976. echo ' fastcgi_pass unix:/var/run/php5-fpm.sock;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6977. echo ' include fastcgi_params;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6978. echo ' fastcgi_index index.php;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6979. echo ' fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6980. echo ' }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6981. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6982. echo ' # deny access to all dot files' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6983. echo ' location ~ /\. {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6984. echo ' deny all;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6985. echo ' }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6986. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6987. echo ' #deny access to store' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6988. echo ' location ~ /store {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6989. echo ' deny all;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6990. echo ' }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6991. echo ' location ~ /(data|conf|bin|inc)/ {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6992. echo ' deny all;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6993. echo ' }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6994. echo ' location ~ /\.ht {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6995. echo ' deny all;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6996. echo ' }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6997. echo '}' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  6998. if [[ $ONION_ONLY == "no" ]]; then
  6999. if [ ! -f /etc/ssl/certs/$FULLBLOG_DOMAIN_NAME.dhparam ]; then
  7000. if [[ $LETSENCRYPT_ENABLED != "yes" ]]; then
  7001. ${PROJECT_NAME}-addcert -h $FULLBLOG_DOMAIN_NAME --dhkey $DH_KEYLENGTH
  7002. else
  7003. ${PROJECT_NAME}-addcert -e $FULLBLOG_DOMAIN_NAME -s $LETSENCRYPT_SERVER --dhkey $DH_KEYLENGTH
  7004. fi
  7005. check_certificates $FULLBLOG_DOMAIN_NAME
  7006. fi
  7007. fi
  7008. configure_php
  7009. # blog settings
  7010. cp /var/www/$FULLBLOG_DOMAIN_NAME/htdocs/config/config.ini.example /var/www/$FULLBLOG_DOMAIN_NAME/htdocs/config/config.ini
  7011. sed -i "s|site.url.*|site.url = '/'|g" /var/www/$FULLBLOG_DOMAIN_NAME/htdocs/config/config.ini
  7012. sed -i "s|blog.title.*|blog.title = '$MY_BLOG_TITLE'|g" /var/www/$FULLBLOG_DOMAIN_NAME/htdocs/config/config.ini
  7013. sed -i "s|blog.tagline.*|blog.tagline = '$MY_BLOG_SUBTITLE'|g" /var/www/$FULLBLOG_DOMAIN_NAME/htdocs/config/config.ini
  7014. sed -i 's|timezone.*|timezone = "Europe/London"|g' /var/www/$FULLBLOG_DOMAIN_NAME/htdocs/config/config.ini
  7015. sed -i "s|Your name|$MY_NAME|g" /var/www/$FULLBLOG_DOMAIN_NAME/htdocs/config/config.ini
  7016. # create a user password
  7017. get_blog_admin_password
  7018. if [ ! $FULLBLOG_ADMIN_PASSWORD ]; then
  7019. if [ -f $IMAGE_PASSWORD_FILE ]; then
  7020. FULLBLOG_ADMIN_PASSWORD="$(printf `cat $IMAGE_PASSWORD_FILE`)"
  7021. else
  7022. FULLBLOG_ADMIN_PASSWORD="$(openssl rand -base64 16)"
  7023. fi
  7024. echo '' >> /home/$MY_USERNAME/README
  7025. echo '' >> /home/$MY_USERNAME/README
  7026. echo $'HTMLy Blog' >> /home/$MY_USERNAME/README
  7027. echo '==========' >> /home/$MY_USERNAME/README
  7028. echo $"Your blog username: $MY_USERNAME" >> /home/$MY_USERNAME/README
  7029. echo $"Your blog password is: $FULLBLOG_ADMIN_PASSWORD" >> /home/$MY_USERNAME/README
  7030. echo $"Log into your blog at https://$FULLBLOG_DOMAIN_NAME/login" >> /home/$MY_USERNAME/README
  7031. echo $'Edit your blog title and time zone at:' >> /home/$MY_USERNAME/README
  7032. echo " /var/www/$FULLBLOG_DOMAIN_NAME/htdocs/config/config.ini" >> /home/$MY_USERNAME/README
  7033. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
  7034. chmod 600 /home/$MY_USERNAME/README
  7035. fi
  7036. # create a user
  7037. echo ';Password' > /var/www/$FULLBLOG_DOMAIN_NAME/htdocs/config/users/$MY_USERNAME.ini
  7038. echo "password = '$FULLBLOG_ADMIN_PASSWORD'" >> /var/www/$FULLBLOG_DOMAIN_NAME/htdocs/config/users/$MY_USERNAME.ini
  7039. echo 'encryption = clear' >> /var/www/$FULLBLOG_DOMAIN_NAME/htdocs/config/users/$MY_USERNAME.ini
  7040. echo ';Role' >> /var/www/$FULLBLOG_DOMAIN_NAME/htdocs/config/users/$MY_USERNAME.ini
  7041. echo 'role = admin' >> /var/www/$FULLBLOG_DOMAIN_NAME/htdocs/config/users/$MY_USERNAME.ini
  7042. nginx_ensite $FULLBLOG_DOMAIN_NAME
  7043. if [ ! -d /var/lib/tor ]; then
  7044. echo $'No Tor installation found. Blog onion site cannot be configured.'
  7045. exit 45926
  7046. fi
  7047. if ! grep -q "hidden_service_blog" /etc/tor/torrc; then
  7048. echo 'HiddenServiceDir /var/lib/tor/hidden_service_blog/' >> /etc/tor/torrc
  7049. echo "HiddenServicePort 80 127.0.0.1:${FULLBLOG_ONION_PORT}" >> /etc/tor/torrc
  7050. echo $'Added onion site for blog'
  7051. fi
  7052. systemctl restart php5-fpm
  7053. systemctl restart nginx
  7054. systemctl restart tor
  7055. if [ ! -f /var/lib/tor/hidden_service_blog/hostname ]; then
  7056. echo $'Blog onion site hostname not found'
  7057. exit 12053
  7058. fi
  7059. FULLBLOG_ONION_HOSTNAME=$(cat /var/lib/tor/hidden_service_blog/hostname)
  7060. if ! grep -q "Blog onion domain" /home/$MY_USERNAME/README; then
  7061. echo "Blog onion domain: ${FULLBLOG_ONION_HOSTNAME}" >> /home/$MY_USERNAME/README
  7062. echo '' >> /home/$MY_USERNAME/README
  7063. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
  7064. chmod 600 /home/$MY_USERNAME/README
  7065. fi
  7066. echo "Blog onion domain:${FULLBLOG_ONION_HOSTNAME}" >> $COMPLETION_FILE
  7067. # update the dynamic DNS
  7068. CURRENT_DDNS_DOMAIN=$FULLBLOG_DOMAIN_NAME
  7069. add_ddns_domain
  7070. echo 'install_blog' >> $COMPLETION_FILE
  7071. }
  7072. function install_gnu_social {
  7073. if [[ $SYSTEM_TYPE == "$VARIANT_CLOUD" || $SYSTEM_TYPE == "$VARIANT_MAILBOX" || $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_WRITER" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_DEVELOPER" || $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  7074. return
  7075. fi
  7076. if [ ! $MICROBLOG_DOMAIN_NAME ]; then
  7077. echo $'No domain name was given for the microblog'
  7078. exit 7359
  7079. fi
  7080. # update to the next commit
  7081. if [ -d /var/www/$MICROBLOG_DOMAIN_NAME/htdocs ]; then
  7082. if grep -q "GNU Social commit" $COMPLETION_FILE; then
  7083. CURRENT_GNUSOCIAL_COMMIT=$(grep "GNU Social commit" $COMPLETION_FILE | awk -F ':' '{print $2}')
  7084. if [[ "$CURRENT_GNUSOCIAL_COMMIT" != "$GNUSOCIAL_COMMIT" ]]; then
  7085. cd /var/www/$MICROBLOG_DOMAIN_NAME/htdocs
  7086. git stash
  7087. git checkout master
  7088. git pull
  7089. git checkout $GNUSOCIAL_COMMIT -b $GNUSOCIAL_COMMIT
  7090. sed -i "s/GNU Social commit.*/GNU Social commit:$GNUSOCIAL_COMMIT/g" $COMPLETION_FILE
  7091. chown -R www-data:www-data /var/www/$MICROBLOG_DOMAIN_NAME/htdocs
  7092. fi
  7093. else
  7094. echo "GNU Social commit:$GNUSOCIAL_COMMIT" >> $COMPLETION_FILE
  7095. fi
  7096. fi
  7097. if grep -Fxq "install_gnu_social" $COMPLETION_FILE; then
  7098. return
  7099. fi
  7100. install_mariadb
  7101. get_mariadb_password
  7102. repair_databases_script
  7103. apt-get -y install php-gettext php5-curl php5-gd php5-mysql git curl php-xml-parser
  7104. if [ ! -d /var/www/$MICROBLOG_DOMAIN_NAME ]; then
  7105. mkdir /var/www/$MICROBLOG_DOMAIN_NAME
  7106. fi
  7107. if [ ! -d /var/www/$MICROBLOG_DOMAIN_NAME/htdocs ]; then
  7108. mkdir /var/www/$MICROBLOG_DOMAIN_NAME/htdocs
  7109. fi
  7110. cd $INSTALL_DIR
  7111. git clone $MICROBLOG_REPO gnusocial
  7112. cd gnusocial
  7113. git checkout $GNUSOCIAL_COMMIT -b $GNUSOCIAL_COMMIT
  7114. if ! grep -q "GNU Social commit" $COMPLETION_FILE; then
  7115. echo "GNU Social commit:$GNUSOCIAL_COMMIT" >> $COMPLETION_FILE
  7116. else
  7117. sed -i "s/GNU Social commit.*/GNU Social commit:$GNUSOCIAL_COMMIT/g" $COMPLETION_FILE
  7118. fi
  7119. cd $INSTALL_DIR
  7120. rm -rf /var/www/$MICROBLOG_DOMAIN_NAME/htdocs
  7121. mv gnusocial /var/www/$MICROBLOG_DOMAIN_NAME/htdocs
  7122. chmod a+w /var/www/$MICROBLOG_DOMAIN_NAME/htdocs
  7123. chown www-data:www-data /var/www/$MICROBLOG_DOMAIN_NAME/htdocs
  7124. chmod a+w /var/www/$MICROBLOG_DOMAIN_NAME/htdocs/avatar
  7125. chmod a+w /var/www/$MICROBLOG_DOMAIN_NAME/htdocs/background
  7126. chmod a+w /var/www/$MICROBLOG_DOMAIN_NAME/htdocs/file
  7127. chmod +x /var/www/$MICROBLOG_DOMAIN_NAME/htdocs/scripts/maildaemon.php
  7128. get_mariadb_gnusocial_admin_password
  7129. if [ ! $MICROBLOG_ADMIN_PASSWORD ]; then
  7130. if [ -f $IMAGE_PASSWORD_FILE ]; then
  7131. MICROBLOG_ADMIN_PASSWORD="$(printf `cat $IMAGE_PASSWORD_FILE`)"
  7132. else
  7133. MICROBLOG_ADMIN_PASSWORD="$(openssl rand -base64 32)"
  7134. fi
  7135. echo '' >> /home/$MY_USERNAME/README
  7136. echo '' >> /home/$MY_USERNAME/README
  7137. echo $'GNU Social' >> /home/$MY_USERNAME/README
  7138. echo '==========' >> /home/$MY_USERNAME/README
  7139. echo $"Your MariaDB gnusocial admin password is: $MICROBLOG_ADMIN_PASSWORD" >> /home/$MY_USERNAME/README
  7140. echo '' >> /home/$MY_USERNAME/README
  7141. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
  7142. chmod 600 /home/$MY_USERNAME/README
  7143. fi
  7144. echo "create database gnusocial;
  7145. CREATE USER 'gnusocialadmin'@'localhost' IDENTIFIED BY '$MICROBLOG_ADMIN_PASSWORD';
  7146. GRANT ALL PRIVILEGES ON gnusocial.* TO 'gnusocialadmin'@'localhost';
  7147. quit" > $INSTALL_DIR/batch.sql
  7148. chmod 600 $INSTALL_DIR/batch.sql
  7149. mysql -u root --password="$MARIADB_PASSWORD" < $INSTALL_DIR/batch.sql
  7150. shred -zu $INSTALL_DIR/batch.sql
  7151. if [ ! -f "/etc/aliases" ]; then
  7152. touch /etc/aliases
  7153. fi
  7154. if grep -q "www-data: root" /etc/aliases; then
  7155. echo 'www-data: root' >> /etc/aliases
  7156. fi
  7157. if grep -q "/var/www/$MICROBLOG_DOMAIN_NAME/htdocs/scripts/maildaemon.php" /etc/aliases; then
  7158. echo "*: /var/www/$MICROBLOG_DOMAIN_NAME/htdocs/scripts/maildaemon.php" >> /etc/aliases
  7159. fi
  7160. newaliases
  7161. # update the dynamic DNS
  7162. CURRENT_DDNS_DOMAIN=$MICROBLOG_DOMAIN_NAME
  7163. add_ddns_domain
  7164. if [[ $ONION_ONLY == "no" ]]; then
  7165. echo 'server {' > /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7166. echo ' listen 80;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7167. echo " server_name $MICROBLOG_DOMAIN_NAME;" >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7168. echo " root /var/www/$MICROBLOG_DOMAIN_NAME/htdocs;" >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7169. echo ' access_log off;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7170. echo " error_log /var/log/nginx/${MICROBLOG_DOMAIN_NAME}_error.log $WEBSERVER_LOG_LEVEL;" >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7171. echo ' index index.php;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7172. echo ' limit_conn conn_limit_per_ip 10;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7173. echo ' limit_req zone=req_limit_per_ip burst=10 nodelay;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7174. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7175. echo '' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7176. echo ' rewrite ^ https://$server_name$request_uri? permanent;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7177. echo '}' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7178. echo '' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7179. echo 'server {' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7180. echo ' listen 443 ssl;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7181. echo " server_name $MICROBLOG_DOMAIN_NAME;" >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7182. echo " root /var/www/$MICROBLOG_DOMAIN_NAME/htdocs;" >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7183. echo ' index index.php index.html index.htm;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7184. echo ' access_log off;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7185. echo '' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7186. echo ' limit_conn conn_limit_per_ip 10;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7187. echo ' limit_req zone=req_limit_per_ip burst=10 nodelay;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7188. echo '' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7189. echo ' location ~* \.php$ {' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7190. echo ' # Zero-day exploit defense.' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7191. echo ' # http://forum.nginx.org/read.php?2,88845,page=3' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7192. echo ' try_files $uri $uri/ /index.php;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7193. echo ' fastcgi_split_path_info ^(.+\.php)(/.+)$;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7194. echo ' fastcgi_pass unix:/var/run/php5-fpm.sock;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7195. echo ' include fastcgi_params;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7196. echo ' fastcgi_index index.php;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7197. echo ' fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7198. echo ' fastcgi_read_timeout 300;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7199. echo ' }' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7200. echo '' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7201. echo ' ssl on;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7202. echo " ssl_certificate /etc/ssl/certs/$MICROBLOG_DOMAIN_NAME.crt;" >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7203. echo " ssl_certificate_key /etc/ssl/private/$MICROBLOG_DOMAIN_NAME.key;" >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7204. echo " ssl_dhparam /etc/ssl/certs/$MICROBLOG_DOMAIN_NAME.dhparam;" >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7205. echo '' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7206. echo ' ssl_session_timeout 60m;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7207. echo ' ssl_prefer_server_ciphers on;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7208. echo ' ssl_session_cache builtin:1000 shared:SSL:10m;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7209. echo " ssl_protocols $SSL_PROTOCOLS; # not possible to do exclusive" >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7210. echo " ssl_ciphers '$SSL_CIPHERS';" >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7211. echo ' add_header X-Frame-Options DENY;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7212. echo ' add_header X-Content-Type-Options nosniff;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7213. echo ' add_header Strict-Transport-Security max-age=15768000;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7214. echo '' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7215. echo ' location / {' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7216. echo ' rewrite ^(.*)$ /index.php?p=$1 last;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7217. echo ' break;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7218. echo ' }' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7219. echo '' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7220. echo ' location ~* ^/(.*)\.(ico|css|js|gif|png|jpg|bmp|JPG|jpeg)$ {' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7221. echo " root /var/www/$MICROBLOG_DOMAIN_NAME/htdocs;" >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7222. echo ' rewrite ^/(.*)$ /$1 break;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7223. echo ' access_log off;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7224. echo ' expires max;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7225. echo ' }' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7226. echo '' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7227. echo ' client_max_body_size 15m;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7228. echo '' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7229. echo " error_log /var/log/nginx/${MICROBLOG_DOMAIN_NAME}_error_ssl.log $WEBSERVER_LOG_LEVEL;" >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7230. echo '}' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7231. echo '' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7232. else
  7233. echo -n '' > /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7234. fi
  7235. echo 'server {' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7236. echo " listen 127.0.0.1:${MICROBLOG_ONION_PORT} default_server;" >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7237. echo " server_name $MICROBLOG_DOMAIN_NAME;" >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7238. echo " root /var/www/$MICROBLOG_DOMAIN_NAME/htdocs;" >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7239. echo ' index index.php index.html index.htm;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7240. echo ' access_log off;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7241. echo '' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7242. echo ' limit_conn conn_limit_per_ip 10;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7243. echo ' limit_req zone=req_limit_per_ip burst=10 nodelay;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7244. echo '' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7245. echo ' location ~* \.php$ {' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7246. echo ' # Zero-day exploit defense.' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7247. echo ' # http://forum.nginx.org/read.php?2,88845,page=3' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7248. echo ' try_files $uri $uri/ /index.php;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7249. echo ' fastcgi_split_path_info ^(.+\.php)(/.+)$;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7250. echo ' fastcgi_pass unix:/var/run/php5-fpm.sock;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7251. echo ' include fastcgi_params;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7252. echo ' fastcgi_index index.php;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7253. echo ' fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7254. echo ' fastcgi_read_timeout 300;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7255. echo ' }' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7256. echo '' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7257. echo ' add_header X-Frame-Options DENY;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7258. echo ' add_header X-Content-Type-Options nosniff;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7259. echo ' add_header Strict-Transport-Security max-age=15768000;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7260. echo '' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7261. echo ' location / {' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7262. echo ' rewrite ^(.*)$ /index.php?p=$1 last;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7263. echo ' break;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7264. echo ' }' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7265. echo '' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7266. echo ' location ~* ^/(.*)\.(ico|css|js|gif|png|jpg|bmp|JPG|jpeg)$ {' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7267. echo " root /var/www/$MICROBLOG_DOMAIN_NAME/htdocs;" >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7268. echo ' rewrite ^/(.*)$ /$1 break;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7269. echo ' access_log off;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7270. echo ' expires max;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7271. echo ' }' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7272. echo '' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7273. echo ' client_max_body_size 15m;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7274. echo '' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7275. echo " error_log /var/log/nginx/${MICROBLOG_DOMAIN_NAME}_error_ssl.log $WEBSERVER_LOG_LEVEL;" >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7276. echo '}' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7277. configure_php
  7278. if [[ $ONION_ONLY == "no" ]]; then
  7279. if [ ! -f /etc/ssl/certs/$MICROBLOG_DOMAIN_NAME.dhparam ]; then
  7280. ${PROJECT_NAME}-addcert -e $MICROBLOG_DOMAIN_NAME -s $LETSENCRYPT_SERVER --dhkey $DH_KEYLENGTH
  7281. check_certificates $MICROBLOG_DOMAIN_NAME
  7282. fi
  7283. fi
  7284. # Ensure that the database gets backed up locally, if remote
  7285. # backups are not being used
  7286. backup_databases_script_header
  7287. echo '' >> /usr/bin/backupdatabases
  7288. echo $'# Backup the GNU Social database' >> /usr/bin/backupdatabases
  7289. echo 'TEMPFILE=/root/gnusocial.sql' >> /usr/bin/backupdatabases
  7290. echo 'DAILYFILE=/var/backups/gnusocial_daily.sql' >> /usr/bin/backupdatabases
  7291. echo 'mysqldump --password="$MYSQL_PASSWORD" gnusocial > $TEMPFILE' >> /usr/bin/backupdatabases
  7292. echo 'FILESIZE=$(stat -c%s $TEMPFILE)' >> /usr/bin/backupdatabases
  7293. echo 'if [ "$FILESIZE" -eq "0" ]; then' >> /usr/bin/backupdatabases
  7294. echo ' if [ -f $DAILYFILE ]; then' >> /usr/bin/backupdatabases
  7295. echo ' cp $DAILYFILE $TEMPFILE' >> /usr/bin/backupdatabases
  7296. echo '' >> /usr/bin/backupdatabases
  7297. echo ' # try to restore yesterdays database' >> /usr/bin/backupdatabases
  7298. echo ' mysql -u root --password="$MYSQL_PASSWORD" gnusocial -o < $DAILYFILE' >> /usr/bin/backupdatabases
  7299. echo '' >> /usr/bin/backupdatabases
  7300. echo ' # Send a warning email' >> /usr/bin/backupdatabases
  7301. echo ' echo "Unable to create a backup of the GNU Social database. Attempted to restore from yesterdays backup" | mail -s "GNU Social backup" $EMAIL' >> /usr/bin/backupdatabases
  7302. echo ' else' >> /usr/bin/backupdatabases
  7303. echo ' # Send a warning email' >> /usr/bin/backupdatabases
  7304. echo ' echo "Unable to create a backup of the GNU Social database." | mail -s "GNU Social backup" $EMAIL' >> /usr/bin/backupdatabases
  7305. echo ' fi' >> /usr/bin/backupdatabases
  7306. echo 'else' >> /usr/bin/backupdatabases
  7307. echo ' chmod 600 $TEMPFILE' >> /usr/bin/backupdatabases
  7308. echo ' mv $TEMPFILE $DAILYFILE' >> /usr/bin/backupdatabases
  7309. echo '' >> /usr/bin/backupdatabases
  7310. echo ' # Make the backup readable only by root' >> /usr/bin/backupdatabases
  7311. echo ' chmod 600 $DAILYFILE' >> /usr/bin/backupdatabases
  7312. echo 'fi' >> /usr/bin/backupdatabases
  7313. echo '' >> /etc/cron.weekly/backupdatabasesweekly
  7314. echo $'# GNU Social' >> /etc/cron.weekly/backupdatabasesweekly
  7315. echo 'if [ -f /var/backups/gnusocial_weekly.sql ]; then' >> /etc/cron.weekly/backupdatabasesweekly
  7316. echo ' cp -f /var/backups/gnusocial_weekly.sql /var/backups/gnusocial_2weekly.sql' >> /etc/cron.weekly/backupdatabasesweekly
  7317. echo 'fi' >> /etc/cron.weekly/backupdatabasesweekly
  7318. echo 'if [ -f /var/backups/gnusocial_daily.sql ]; then' >> /etc/cron.weekly/backupdatabasesweekly
  7319. echo ' cp -f /var/backups/gnusocial_daily.sql /var/backups/gnusocial_weekly.sql' >> /etc/cron.weekly/backupdatabasesweekly
  7320. echo 'fi' >> /etc/cron.weekly/backupdatabasesweekly
  7321. echo '' >> /etc/cron.monthly/backupdatabasesmonthly
  7322. echo $'# GNU Social' >> /etc/cron.monthly/backupdatabasesmonthly
  7323. echo 'if [ -f /var/backups/gnusocial_monthly.sql ]; then' >> /etc/cron.monthly/backupdatabasesmonthly
  7324. echo ' cp -f /var/backups/gnusocial_monthly.sql /var/backups/gnusocial_2monthly.sql' >> /etc/cron.monthly/backupdatabasesmonthly
  7325. echo 'fi' >> /etc/cron.monthly/backupdatabasesmonthly
  7326. echo 'if [ -f /var/backups/gnusocial_weekly.sql ]; then' >> /etc/cron.monthly/backupdatabasesmonthly
  7327. echo ' cp -f /var/backups/gnusocial_weekly.sql /var/backups/gnusocial_monthly.sql' >> /etc/cron.monthly/backupdatabasesmonthly
  7328. echo 'fi' >> /etc/cron.monthly/backupdatabasesmonthly
  7329. if ! grep -q "gnusocial" /etc/cron.hourly/repair; then
  7330. echo "${PROJECT_NAME}-repair-database gnusocial" >> /etc/cron.hourly/repair
  7331. fi
  7332. nginx_ensite $MICROBLOG_DOMAIN_NAME
  7333. if [ ! -d /var/lib/tor ]; then
  7334. echo $'No Tor installation found. GNU Social onion site cannot be configured.'
  7335. exit 45927
  7336. fi
  7337. if ! grep -q "hidden_service_microblog" /etc/tor/torrc; then
  7338. echo 'HiddenServiceDir /var/lib/tor/hidden_service_microblog/' >> /etc/tor/torrc
  7339. echo "HiddenServicePort 80 127.0.0.1:${MICROBLOG_ONION_PORT}" >> /etc/tor/torrc
  7340. echo $'Added onion site for GNU Social'
  7341. fi
  7342. systemctl restart php5-fpm
  7343. systemctl restart nginx
  7344. systemctl restart tor
  7345. if [ ! -f /var/lib/tor/hidden_service_microblog/hostname ]; then
  7346. echo $'GNU Social onion site hostname not found'
  7347. exit 12054
  7348. fi
  7349. MICROBLOG_ONION_HOSTNAME=$(cat /var/lib/tor/hidden_service_microblog/hostname)
  7350. if ! grep -q "GNU Social onion domain" /home/$MY_USERNAME/README; then
  7351. echo "GNU Social onion domain: ${MICROBLOG_ONION_HOSTNAME}" >> /home/$MY_USERNAME/README
  7352. echo '' >> /home/$MY_USERNAME/README
  7353. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
  7354. chmod 600 /home/$MY_USERNAME/README
  7355. fi
  7356. echo "GNU Social onion domain:${MICROBLOG_ONION_HOSTNAME}" >> $COMPLETION_FILE
  7357. # some post-install instructions for the user
  7358. if ! grep -q $"To set up your microblog go to" /home/$MY_USERNAME/README; then
  7359. echo '' >> /home/$MY_USERNAME/README
  7360. echo '' >> /home/$MY_USERNAME/README
  7361. echo $'Microblog' >> /home/$MY_USERNAME/README
  7362. echo '=========' >> /home/$MY_USERNAME/README
  7363. echo $"To set up your microblog go to" >> /home/$MY_USERNAME/README
  7364. echo $"https://$MICROBLOG_DOMAIN_NAME/install.php" >> /home/$MY_USERNAME/README
  7365. echo $'and enter the following settings:' >> /home/$MY_USERNAME/README
  7366. echo $' - Set a name for the site' >> /home/$MY_USERNAME/README
  7367. echo $' - Server SSL: enable' >> /home/$MY_USERNAME/README
  7368. echo $' - Hostname: localhost' >> /home/$MY_USERNAME/README
  7369. echo $' - Type: MySql/MariaDB' >> /home/$MY_USERNAME/README
  7370. echo $' - Name: gnusocial' >> /home/$MY_USERNAME/README
  7371. echo $' - DB username: root' >> /home/$MY_USERNAME/README
  7372. echo $" - DB Password; $MARIADB_PASSWORD" >> /home/$MY_USERNAME/README
  7373. echo $" - Administrator nickname: $MY_USERNAME" >> /home/$MY_USERNAME/README
  7374. echo $" - Administrator password: $MICROBLOG_ADMIN_PASSWORD" >> /home/$MY_USERNAME/README
  7375. echo $' - Subscribe to announcements: ticked' >> /home/$MY_USERNAME/README
  7376. echo $' - Site profile: Community' >> /home/$MY_USERNAME/README
  7377. echo '' >> /home/$MY_USERNAME/README
  7378. echo $'When the install is complete you will see a lot of warnings' >> /home/$MY_USERNAME/README
  7379. echo $'but just ignore those and navigate to ' >> /home/$MY_USERNAME/README
  7380. echo $"https://$MICROBLOG_DOMAIN_NAME and you can then " >> /home/$MY_USERNAME/README
  7381. echo $'complete the configuration via the *Admin* section on the header' >> /home/$MY_USERNAME/README
  7382. echo $'bar. Some recommended admin settings are:' >> /home/$MY_USERNAME/README
  7383. echo '' >> /home/$MY_USERNAME/README
  7384. echo $'Under the *Site* settings:' >> /home/$MY_USERNAME/README
  7385. echo ' Text limit: 140' >> /home/$MY_USERNAME/README
  7386. echo ' Dupe Limit: 60000' >> /home/$MY_USERNAME/README
  7387. echo '' >> /home/$MY_USERNAME/README
  7388. echo $'Under the *User* settings:' >> /home/$MY_USERNAME/README
  7389. echo ' Bio limit: 1000' >> /home/$MY_USERNAME/README
  7390. echo '' >> /home/$MY_USERNAME/README
  7391. echo $'Under the *Access* settings:' >> /home/$MY_USERNAME/README
  7392. echo ' /Invite only/ ticked' >> /home/$MY_USERNAME/README
  7393. echo '' >> /home/$MY_USERNAME/README
  7394. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
  7395. chmod 600 /home/$MY_USERNAME/README
  7396. fi
  7397. echo "GNU Social domain:$MICROBLOG_DOMAIN_NAME" >> $COMPLETION_FILE
  7398. echo 'install_gnu_social' >> $COMPLETION_FILE
  7399. }
  7400. function install_hubzilla {
  7401. if [[ $SYSTEM_TYPE == "$VARIANT_CLOUD" || $SYSTEM_TYPE == "$VARIANT_MAILBOX" || $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_WRITER" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_DEVELOPER" || $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  7402. return
  7403. fi
  7404. if [ ! $HUBZILLA_DOMAIN_NAME ]; then
  7405. return
  7406. fi
  7407. # For now it probably won't install as onion-only. This might change in future
  7408. if [[ $ONION_ONLY != "no" ]]; then
  7409. return
  7410. fi
  7411. # update to the next commit
  7412. if [ -d /var/www/$HUBZILLA_DOMAIN_NAME/htdocs ]; then
  7413. if grep -q "Hubzilla commit" $COMPLETION_FILE; then
  7414. CURRENT_HUBZILLA_COMMIT=$(grep "Hubzilla commit" $COMPLETION_FILE | awk -F ':' '{print $2}')
  7415. if [[ "$CURRENT_HUBZILLA_COMMIT" != "$HUBZILLA_COMMIT" ]]; then
  7416. cd /var/www/$HUBZILLA_DOMAIN_NAME/htdocs
  7417. git stash
  7418. git checkout master
  7419. git pull
  7420. git checkout $HUBZILLA_COMMIT -b $HUBZILLA_COMMIT
  7421. sed -i "s/Hubzilla commit.*/Hubzilla commit:$HUBZILLA_COMMIT/g" $COMPLETION_FILE
  7422. chown -R www-data:www-data /var/www/$HUBZILLA_DOMAIN_NAME/htdocs
  7423. fi
  7424. else
  7425. echo "Hubzilla commit:$HUBZILLA_COMMIT" >> $COMPLETION_FILE
  7426. fi
  7427. fi
  7428. if grep -Fxq "install_hubzilla" $COMPLETION_FILE; then
  7429. return
  7430. fi
  7431. install_mariadb
  7432. get_mariadb_password
  7433. repair_databases_script
  7434. apt-get -y install php5-common php5-cli php5-curl php5-gd php5-mysql php5-mcrypt git
  7435. apt-get -y install php5-dev imagemagick php5-imagick
  7436. if [ ! -d /var/www/$HUBZILLA_DOMAIN_NAME ]; then
  7437. mkdir /var/www/$HUBZILLA_DOMAIN_NAME
  7438. fi
  7439. if [ ! -d /var/www/$HUBZILLA_DOMAIN_NAME/htdocs ]; then
  7440. mkdir /var/www/$HUBZILLA_DOMAIN_NAME/htdocs
  7441. fi
  7442. if [ ! -f /var/www/$HUBZILLA_DOMAIN_NAME/htdocs/index.php ]; then
  7443. cd $INSTALL_DIR
  7444. git clone $HUBZILLA_REPO hubzilla
  7445. git checkout $HUBZILLA_COMMIT -b $HUBZILLA_COMMIT
  7446. if ! grep -q "Hubzilla commit" $COMPLETION_FILE; then
  7447. echo "Hubzilla commit:$HUBZILLA_COMMIT" >> $COMPLETION_FILE
  7448. else
  7449. sed -i "s/Hubzilla commit.*/Hubzilla commit:$HUBZILLA_COMMIT/g" $COMPLETION_FILE
  7450. fi
  7451. rm -rf /var/www/$HUBZILLA_DOMAIN_NAME/htdocs
  7452. mv hubzilla /var/www/$HUBZILLA_DOMAIN_NAME/htdocs
  7453. chown -R www-data:www-data /var/www/$HUBZILLA_DOMAIN_NAME/htdocs
  7454. git clone $HUBZILLA_ADDONS_REPO /var/www/$HUBZILLA_DOMAIN_NAME/htdocs/addon
  7455. # some extra themes
  7456. git clone https://github.com/DeadSuperHero/redmatrix-themes /var/www/$HUBZILLA_DOMAIN_NAME/htdocs/redmatrix-themes1
  7457. cp -r /var/www/$HUBZILLA_DOMAIN_NAME/htdocs/redmatrix-themes1/* view/theme/
  7458. fi
  7459. get_mariadb_hubzilla_admin_password
  7460. if [ ! $HUBZILLA_ADMIN_PASSWORD ]; then
  7461. if [ -f $IMAGE_PASSWORD_FILE ]; then
  7462. HUBZILLA_ADMIN_PASSWORD="$(printf `cat $IMAGE_PASSWORD_FILE`)"
  7463. else
  7464. HUBZILLA_ADMIN_PASSWORD="$(openssl rand -base64 32)"
  7465. fi
  7466. echo '' >> /home/$MY_USERNAME/README
  7467. echo '' >> /home/$MY_USERNAME/README
  7468. echo 'Hubzilla' >> /home/$MY_USERNAME/README
  7469. echo '==========' >> /home/$MY_USERNAME/README
  7470. echo $"Your MariaDB Hubzilla admin password is: $HUBZILLA_ADMIN_PASSWORD" >> /home/$MY_USERNAME/README
  7471. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
  7472. chmod 600 /home/$MY_USERNAME/README
  7473. fi
  7474. echo "create database hubzilla;
  7475. CREATE USER 'hubzillaadmin'@'localhost' IDENTIFIED BY '$HUBZILLA_ADMIN_PASSWORD';
  7476. GRANT ALL PRIVILEGES ON hubzilla.* TO 'hubzillaadmin'@'localhost';
  7477. quit" > $INSTALL_DIR/batch.sql
  7478. chmod 600 $INSTALL_DIR/batch.sql
  7479. mysql -u root --password="$MARIADB_PASSWORD" < $INSTALL_DIR/batch.sql
  7480. shred -zu $INSTALL_DIR/batch.sql
  7481. if ! grep -q "/var/www/$HUBZILLA_DOMAIN_NAME/htdocs" /etc/crontab; then
  7482. echo "12,22,32,42,52 * * * * root cd /var/www/$HUBZILLA_DOMAIN_NAME/htdocs; /usr/bin/timeout 500 /usr/bin/php include/poller.php" >> /etc/crontab
  7483. fi
  7484. # update the dynamic DNS
  7485. CURRENT_DDNS_DOMAIN=$HUBZILLA_DOMAIN_NAME
  7486. add_ddns_domain
  7487. if [[ $ONION_ONLY == "no" ]]; then
  7488. echo 'server {' > /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7489. echo ' listen 80;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7490. echo " server_name $HUBZILLA_DOMAIN_NAME;" >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7491. echo " root /var/www/$HUBZILLA_DOMAIN_NAME/htdocs;" >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7492. echo ' access_log off;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7493. echo " error_log /var/log/nginx/${HUBZILLA_DOMAIN_NAME}_error.log $WEBSERVER_LOG_LEVEL;" >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7494. echo ' limit_conn conn_limit_per_ip 10;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7495. echo ' limit_req zone=req_limit_per_ip burst=10 nodelay;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7496. echo ' index index.php;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7497. echo '' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7498. echo ' rewrite ^ https://$server_name$request_uri? permanent;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7499. echo '}' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7500. echo '' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7501. echo 'server {' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7502. echo ' listen 443 ssl;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7503. echo " root /var/www/$HUBZILLA_DOMAIN_NAME/htdocs;" >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7504. echo " server_name $HUBZILLA_DOMAIN_NAME;" >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7505. echo " error_log /var/log/nginx/${HUBZILLA_DOMAIN_NAME}_error_ssl.log $WEBSERVER_LOG_LEVEL;" >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7506. echo ' index index.php;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7507. echo ' charset utf-8;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7508. echo ' client_max_body_size 20m;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7509. echo ' client_body_buffer_size 128k;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7510. echo ' access_log off;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7511. echo '' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7512. echo ' limit_conn conn_limit_per_ip 10;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7513. echo ' limit_req zone=req_limit_per_ip burst=10 nodelay;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7514. echo '' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7515. echo ' ssl on;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7516. echo " ssl_certificate /etc/ssl/certs/$HUBZILLA_DOMAIN_NAME.bundle.crt;" >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7517. echo " ssl_certificate_key /etc/ssl/private/$HUBZILLA_DOMAIN_NAME.key;" >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7518. echo " ssl_dhparam /etc/ssl/certs/$HUBZILLA_DOMAIN_NAME.dhparam;" >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7519. echo '' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7520. echo ' ssl_session_timeout 60m;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7521. echo ' ssl_prefer_server_ciphers on;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7522. echo ' ssl_session_cache builtin:1000 shared:SSL:10m;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7523. echo " ssl_protocols $SSL_PROTOCOLS; # not possible to do exclusive" >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7524. echo " ssl_ciphers '$SSL_CIPHERS';" >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7525. echo ' add_header X-Frame-Options DENY;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7526. echo ' add_header X-Content-Type-Options nosniff;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7527. echo ' add_header Strict-Transport-Security max-age=15768000;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7528. echo '' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7529. echo ' # rewrite to front controller as default rule' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7530. echo ' location / {' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7531. echo ' rewrite ^/(.*) /index.php?q=$uri&$args last;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7532. echo ' }' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7533. echo '' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7534. echo " # make sure webfinger and other well known services aren't blocked" >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7535. echo ' # by denying dot files and rewrite request to the front controller' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7536. echo ' location ^~ /.well-known/ {' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7537. echo ' allow all;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7538. echo ' rewrite ^/(.*) /index.php?q=$uri&$args last;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7539. echo ' }' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7540. echo '' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7541. echo ' # statically serve these file types when possible' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7542. echo ' # otherwise fall back to front controller' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7543. echo ' # allow browser to cache them' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7544. echo ' # added .htm for advanced source code editor library' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7545. echo ' location ~* \.(jpg|jpeg|gif|png|ico|css|js|htm|html|ttf|woff|svg)$ {' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7546. echo ' expires 30d;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7547. echo ' try_files $uri /index.php?q=$uri&$args;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7548. echo ' }' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7549. echo '' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7550. echo ' # block these file types' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7551. echo ' location ~* \.(tpl|md|tgz|log|out)$ {' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7552. echo ' deny all;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7553. echo ' }' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7554. echo '' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7555. echo ' # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7556. echo ' # or a unix socket' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7557. echo ' location ~* \.php$ {' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7558. echo ' # Zero-day exploit defense.' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7559. echo ' # http://forum.nginx.org/read.php?2,88845,page=3' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7560. echo " # Won't work properly (404 error) if the file is not stored on this" >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7561. echo " # server, which is entirely possible with php-fpm/php-fcgi." >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7562. echo " # Comment the 'try_files' line out if you set up php-fpm/php-fcgi on" >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7563. echo " # another machine. And then cross your fingers that you won't get hacked." >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7564. echo ' try_files $uri $uri/ /index.php;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7565. echo ' # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7566. echo ' fastcgi_split_path_info ^(.+\.php)(/.+)$;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7567. echo ' # With php5-cgi alone:' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7568. echo ' # fastcgi_pass 127.0.0.1:9000;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7569. echo ' # With php5-fpm:' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7570. echo ' fastcgi_pass unix:/var/run/php5-fpm.sock;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7571. echo ' include fastcgi_params;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7572. echo ' fastcgi_index index.php;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7573. echo ' fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7574. echo ' fastcgi_read_timeout 300;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7575. echo ' }' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7576. echo '' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7577. echo ' # deny access to all dot files' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7578. echo ' location ~ /\. {' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7579. echo ' deny all;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7580. echo ' }' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7581. echo '' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7582. echo ' location ~ /\.ht {' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7583. echo ' deny all;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7584. echo ' }' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7585. echo '}' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7586. echo '' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7587. else
  7588. echo -n '' > /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7589. fi
  7590. echo 'server {' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7591. echo " listen 127.0.0.1:${HUBZILLA_ONION_PORT} default_server;" >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7592. echo " root /var/www/$HUBZILLA_DOMAIN_NAME/htdocs;" >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7593. echo " server_name $HUBZILLA_DOMAIN_NAME;" >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7594. echo " error_log /var/log/nginx/${HUBZILLA_DOMAIN_NAME}_error_ssl.log $WEBSERVER_LOG_LEVEL;" >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7595. echo ' index index.php;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7596. echo ' charset utf-8;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7597. echo ' client_max_body_size 20m;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7598. echo ' client_body_buffer_size 128k;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7599. echo ' access_log off;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7600. echo '' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7601. echo ' limit_conn conn_limit_per_ip 10;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7602. echo ' limit_req zone=req_limit_per_ip burst=10 nodelay;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7603. echo '' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7604. echo ' add_header X-Frame-Options DENY;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7605. echo ' add_header X-Content-Type-Options nosniff;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7606. echo ' add_header Strict-Transport-Security max-age=15768000;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7607. echo '' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7608. echo ' # rewrite to front controller as default rule' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7609. echo ' location / {' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7610. echo ' rewrite ^/(.*) /index.php?q=$uri&$args last;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7611. echo ' }' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7612. echo '' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7613. echo " # make sure webfinger and other well known services aren't blocked" >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7614. echo ' # by denying dot files and rewrite request to the front controller' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7615. echo ' location ^~ /.well-known/ {' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7616. echo ' allow all;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7617. echo ' rewrite ^/(.*) /index.php?q=$uri&$args last;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7618. echo ' }' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7619. echo '' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7620. echo ' # statically serve these file types when possible' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7621. echo ' # otherwise fall back to front controller' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7622. echo ' # allow browser to cache them' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7623. echo ' # added .htm for advanced source code editor library' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7624. echo ' location ~* \.(jpg|jpeg|gif|png|ico|css|js|htm|html|ttf|woff|svg)$ {' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7625. echo ' expires 30d;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7626. echo ' try_files $uri /index.php?q=$uri&$args;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7627. echo ' }' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7628. echo '' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7629. echo ' # block these file types' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7630. echo ' location ~* \.(tpl|md|tgz|log|out)$ {' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7631. echo ' deny all;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7632. echo ' }' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7633. echo '' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7634. echo ' # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7635. echo ' # or a unix socket' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7636. echo ' location ~* \.php$ {' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7637. echo ' # Zero-day exploit defense.' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7638. echo ' # http://forum.nginx.org/read.php?2,88845,page=3' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7639. echo " # Won't work properly (404 error) if the file is not stored on this" >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7640. echo " # server, which is entirely possible with php-fpm/php-fcgi." >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7641. echo " # Comment the 'try_files' line out if you set up php-fpm/php-fcgi on" >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7642. echo " # another machine. And then cross your fingers that you won't get hacked." >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7643. echo ' try_files $uri $uri/ /index.php;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7644. echo ' # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7645. echo ' fastcgi_split_path_info ^(.+\.php)(/.+)$;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7646. echo ' # With php5-cgi alone:' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7647. echo ' # fastcgi_pass 127.0.0.1:9000;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7648. echo ' # With php5-fpm:' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7649. echo ' fastcgi_pass unix:/var/run/php5-fpm.sock;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7650. echo ' include fastcgi_params;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7651. echo ' fastcgi_index index.php;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7652. echo ' fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7653. echo ' fastcgi_read_timeout 300;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7654. echo ' }' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7655. echo '' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7656. echo ' # deny access to all dot files' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7657. echo ' location ~ /\. {' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7658. echo ' deny all;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7659. echo ' }' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7660. echo '' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7661. echo ' location ~ /\.ht {' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7662. echo ' deny all;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7663. echo ' }' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7664. echo '}' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7665. configure_php
  7666. if [[ $ONION_ONLY == "no" ]]; then
  7667. if [ ! -f /etc/ssl/certs/$HUBZILLA_DOMAIN_NAME.dhparam ]; then
  7668. ${PROJECT_NAME}-addcert -e $HUBZILLA_DOMAIN_NAME -s $LETSENCRYPT_SERVER --dhkey $DH_KEYLENGTH
  7669. check_certificates $HUBZILLA_DOMAIN_NAME
  7670. fi
  7671. fi
  7672. if [ ! -d /var/www/$HUBZILLA_DOMAIN_NAME/htdocs/view/tpl/smarty3 ]; then
  7673. mkdir /var/www/$HUBZILLA_DOMAIN_NAME/htdocs/view/tpl/smarty3
  7674. fi
  7675. if [ ! -d "/var/www/$HUBZILLA_DOMAIN_NAME/htdocs/store" ]; then
  7676. mkdir "/var/www/$HUBZILLA_DOMAIN_NAME/htdocs/store"
  7677. fi
  7678. if [ ! -d "/var/www/$HUBZILLA_DOMAIN_NAME/htdocs/store/[data]" ]; then
  7679. mkdir "/var/www/$HUBZILLA_DOMAIN_NAME/htdocs/store/[data]"
  7680. fi
  7681. if [ ! -d "/var/www/$HUBZILLA_DOMAIN_NAME/htdocs/store/[data]/smarty3" ]; then
  7682. mkdir "/var/www/$HUBZILLA_DOMAIN_NAME/htdocs/store/[data]/smarty3"
  7683. chmod 777 "/var/www/$HUBZILLA_DOMAIN_NAME/htdocs/store/[data]/smarty3"
  7684. fi
  7685. chmod 777 /var/www/$HUBZILLA_DOMAIN_NAME/htdocs/view/tpl
  7686. chown -R www-data:www-data "/var/www/$HUBZILLA_DOMAIN_NAME/htdocs/store"
  7687. chmod 777 /var/www/$HUBZILLA_DOMAIN_NAME/htdocs/view/tpl/smarty3
  7688. # Ensure that the database gets backed up locally, if remote
  7689. # backups are not being used
  7690. backup_databases_script_header
  7691. echo '' >> /usr/bin/backupdatabases
  7692. echo $'# Backup the Hubzilla database' >> /usr/bin/backupdatabases
  7693. echo 'TEMPFILE=/root/hubzilla.sql' >> /usr/bin/backupdatabases
  7694. echo 'DAILYFILE=/var/backups/hubzilla_daily.sql' >> /usr/bin/backupdatabases
  7695. echo 'mysqldump --password="$MYSQL_PASSWORD" hubzilla > $TEMPFILE' >> /usr/bin/backupdatabases
  7696. echo 'FILESIZE=$(stat -c%s $TEMPFILE)' >> /usr/bin/backupdatabases
  7697. echo 'if [ "$FILESIZE" -lt "1024" ]; then' >> /usr/bin/backupdatabases
  7698. echo ' if [ -f $DAILYFILE ]; then' >> /usr/bin/backupdatabases
  7699. echo ' cp $DAILYFILE $TEMPFILE' >> /usr/bin/backupdatabases
  7700. echo '' >> /usr/bin/backupdatabases
  7701. echo ' # try to restore yesterdays database' >> /usr/bin/backupdatabases
  7702. echo ' mysql -u root --password="$MYSQL_PASSWORD" hubzilla -o < $DAILYFILE' >> /usr/bin/backupdatabases
  7703. echo '' >> /usr/bin/backupdatabases
  7704. echo ' # Send a warning email' >> /usr/bin/backupdatabases
  7705. echo ' echo "Unable to create a backup of the Hubzilla database. Attempted to restore from yesterdays backup" | mail -s "Hubzilla backup" $EMAIL' >> /usr/bin/backupdatabases
  7706. echo ' else' >> /usr/bin/backupdatabases
  7707. echo ' # Send a warning email' >> /usr/bin/backupdatabases
  7708. echo ' echo "Unable to create a backup of the Hubzilla database." | mail -s "Hubzilla backup" $EMAIL' >> /usr/bin/backupdatabases
  7709. echo ' fi' >> /usr/bin/backupdatabases
  7710. echo 'else' >> /usr/bin/backupdatabases
  7711. echo ' chmod 600 $TEMPFILE' >> /usr/bin/backupdatabases
  7712. echo ' mv $TEMPFILE $DAILYFILE' >> /usr/bin/backupdatabases
  7713. echo '' >> /usr/bin/backupdatabases
  7714. echo ' # Make the backup readable only by root' >> /usr/bin/backupdatabases
  7715. echo ' chmod 600 $DAILYFILE' >> /usr/bin/backupdatabases
  7716. echo 'fi' >> /usr/bin/backupdatabases
  7717. echo '' >> /etc/cron.weekly/backupdatabasesweekly
  7718. echo '# Hubzilla' >> /etc/cron.weekly/backupdatabasesweekly
  7719. echo 'if [ -f /var/backups/hubzilla_weekly.sql ]; then' >> /etc/cron.weekly/backupdatabasesweekly
  7720. echo ' cp -f /var/backups/hubzilla_weekly.sql /var/backups/hubzilla_2weekly.sql' >> /etc/cron.weekly/backupdatabasesweekly
  7721. echo 'fi' >> /etc/cron.weekly/backupdatabasesweekly
  7722. echo 'if [ -f /var/backups/hubzilla_daily.sql ]; then' >> /etc/cron.weekly/backupdatabasesweekly
  7723. echo ' cp -f /var/backups/hubzilla_daily.sql /var/backups/hubzilla_weekly.sql' >> /etc/cron.weekly/backupdatabasesweekly
  7724. echo 'fi' >> /etc/cron.weekly/backupdatabasesweekly
  7725. echo '' >> /etc/cron.monthly/backupdatabasesmonthly
  7726. echo '# Hubzilla' >> /etc/cron.monthly/backupdatabasesmonthly
  7727. echo 'if [ -f /var/backups/hubzilla_monthly.sql ]; then' >> /etc/cron.monthly/backupdatabasesmonthly
  7728. echo ' cp -f /var/backups/hubzilla_monthly.sql /var/backups/hubzilla_2monthly.sql' >> /etc/cron.monthly/backupdatabasesmonthly
  7729. echo 'fi' >> /etc/cron.monthly/backupdatabasesmonthly
  7730. echo 'if [ -f /var/backups/hubzilla_weekly.sql ]; then' >> /etc/cron.monthly/backupdatabasesmonthly
  7731. echo ' cp -f /var/backups/hubzilla_weekly.sql /var/backups/hubzilla_monthly.sql' >> /etc/cron.monthly/backupdatabasesmonthly
  7732. echo 'fi' >> /etc/cron.monthly/backupdatabasesmonthly
  7733. if ! grep -q "hubzilla" /etc/cron.hourly/repair; then
  7734. echo "${PROJECT_NAME}-repair-database hubzilla" >> /etc/cron.hourly/repair
  7735. # remove legacy stuff
  7736. sed -i 's|/usr/bin/repairdatabase redmatrix||g' /etc/cron.hourly/repair
  7737. fi
  7738. chown -R www-data:www-data /var/www/$HUBZILLA_DOMAIN_NAME/htdocs
  7739. nginx_ensite $HUBZILLA_DOMAIN_NAME
  7740. if [ ! -d /var/lib/tor ]; then
  7741. echo $'No Tor installation found. Hubzilla onion site cannot be configured.'
  7742. exit 45925
  7743. fi
  7744. if ! grep -q "hidden_service_hubzilla" /etc/tor/torrc; then
  7745. echo 'HiddenServiceDir /var/lib/tor/hidden_service_hubzilla/' >> /etc/tor/torrc
  7746. echo "HiddenServicePort 80 127.0.0.1:${HUBZILLA_ONION_PORT}" >> /etc/tor/torrc
  7747. echo $'Added onion site for Hubzilla'
  7748. fi
  7749. service php5-fpm restart
  7750. service nginx restart
  7751. service cron restart
  7752. systemctl restart tor
  7753. if [ ! -f /var/lib/tor/hidden_service_hubzilla/hostname ]; then
  7754. echo $'Hubzilla onion site hostname not found'
  7755. exit 12052
  7756. fi
  7757. HUBZILLA_ONION_HOSTNAME=$(cat /var/lib/tor/hidden_service_hubzilla/hostname)
  7758. if ! grep -q "Hubzilla onion domain" /home/$MY_USERNAME/README; then
  7759. echo "Hubzilla onion domain: ${HUBZILLA_ONION_HOSTNAME}" >> /home/$MY_USERNAME/README
  7760. echo '' >> /home/$MY_USERNAME/README
  7761. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
  7762. chmod 600 /home/$MY_USERNAME/README
  7763. fi
  7764. echo "Hubzilla domain:${HUBZILLA_DOMAIN_NAME}" >> $COMPLETION_FILE
  7765. echo "Hubzilla onion domain:${HUBZILLA_ONION_HOSTNAME}" >> $COMPLETION_FILE
  7766. echo 'install_hubzilla' >> $COMPLETION_FILE
  7767. }
  7768. function script_for_attaching_usb_drive {
  7769. if grep -Fxq "script_for_attaching_usb_drive" $COMPLETION_FILE; then
  7770. return
  7771. fi
  7772. echo '#!/bin/bash' > /usr/bin/attach-music
  7773. echo 'remove-music' >> /usr/bin/attach-music
  7774. echo "if [ ! -d $USB_MOUNT ]; then" >> /usr/bin/attach-music
  7775. echo " mkdir $USB_MOUNT" >> /usr/bin/attach-music
  7776. echo 'fi' >> /usr/bin/attach-music
  7777. echo "mount /dev/sda1 $USB_MOUNT" >> /usr/bin/attach-music
  7778. echo "chown root:root $USB_MOUNT" >> /usr/bin/attach-music
  7779. echo "chown -R minidlna:minidlna $USB_MOUNT/*" >> /usr/bin/attach-music
  7780. echo 'service minidlna restart' >> /usr/bin/attach-music
  7781. echo 'minidlnad -R' >> /usr/bin/attach-music
  7782. chmod +x /usr/bin/attach-music
  7783. ln -s /usr/bin/attach-music /usr/bin/attach-usb
  7784. ln -s /usr/bin/attach-music /usr/bin/attach-videos
  7785. ln -s /usr/bin/attach-music /usr/bin/attach-pictures
  7786. ln -s /usr/bin/attach-music /usr/bin/attach-media
  7787. echo '#!/bin/bash' > /usr/bin/remove-music
  7788. echo "if [ -d $USB_MOUNT ]; then" >> /usr/bin/remove-music
  7789. echo " umount $USB_MOUNT" >> /usr/bin/remove-music
  7790. echo " rm -rf $USB_MOUNT" >> /usr/bin/remove-music
  7791. echo 'fi' >> /usr/bin/remove-music
  7792. chmod +x /usr/bin/remove-music
  7793. ln -s /usr/bin/remove-music /usr/bin/detach-music
  7794. ln -s /usr/bin/remove-music /usr/bin/detach-usb
  7795. ln -s /usr/bin/remove-music /usr/bin/remove-usb
  7796. ln -s /usr/bin/remove-music /usr/bin/detach-media
  7797. ln -s /usr/bin/remove-music /usr/bin/remove-media
  7798. ln -s /usr/bin/remove-music /usr/bin/detach-videos
  7799. ln -s /usr/bin/remove-music /usr/bin/remove-videos
  7800. ln -s /usr/bin/remove-music /usr/bin/detach-pictures
  7801. ln -s /usr/bin/remove-music /usr/bin/remove-pictures
  7802. echo 'script_for_attaching_usb_drive' >> $COMPLETION_FILE
  7803. }
  7804. function install_dlna_server {
  7805. if grep -Fxq "install_dlna_server" $COMPLETION_FILE; then
  7806. return
  7807. fi
  7808. if [[ $SYSTEM_TYPE == "$VARIANT_CLOUD" || $SYSTEM_TYPE == "$VARIANT_MAILBOX" || $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_WRITER" || $SYSTEM_TYPE == "$VARIANT_SOCIAL" || $SYSTEM_TYPE == "$VARIANT_DEVELOPER" || $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  7809. return
  7810. fi
  7811. apt-get -y install minidlna
  7812. if [ ! -f /etc/minidlna.conf ]; then
  7813. echo $"ERROR: minidlna does not appear to have installed. $CHECK_MESSAGE"
  7814. exit 55
  7815. fi
  7816. sed -i "s|media_dir=/var/lib/minidlna|media_dir=A,/home/$MY_USERNAME/Music|g" /etc/minidlna.conf
  7817. if ! grep -q "/home/$MY_USERNAME/Pictures" /etc/minidlna.conf; then
  7818. echo "media_dir=P,/home/$MY_USERNAME/Pictures" >> /etc/minidlna.conf
  7819. fi
  7820. if ! grep -q "/home/$MY_USERNAME/Videos" /etc/minidlna.conf; then
  7821. echo "media_dir=V,/home/$MY_USERNAME/Videos" >> /etc/minidlna.conf
  7822. fi
  7823. if ! grep -q "$USB_MOUNT/Music" /etc/minidlna.conf; then
  7824. echo "media_dir=A,$USB_MOUNT/Music" >> /etc/minidlna.conf
  7825. fi
  7826. if ! grep -q "$USB_MOUNT/Pictures" /etc/minidlna.conf; then
  7827. echo "media_dir=P,$USB_MOUNT/Pictures" >> /etc/minidlna.conf
  7828. fi
  7829. if ! grep -q "$USB_MOUNT/Videos" /etc/minidlna.conf; then
  7830. echo "media_dir=V,$USB_MOUNT/Videos" >> /etc/minidlna.conf
  7831. fi
  7832. sed -i 's/#root_container=./root_container=B/g' /etc/minidlna.conf
  7833. if [[ $SYSTEM_TYPE != "$VARIANT_MESH" ]]; then
  7834. sed -i 's/#network_interface=/network_interface=eth0/g' /etc/minidlna.conf
  7835. else
  7836. sed -i 's/#network_interface=/network_interface=$WIFI_INTERFACE/g' /etc/minidlna.conf
  7837. fi
  7838. sed -i "s/#friendly_name=/friendly_name=\"${PROJECT_NAME} Media\"/g" /etc/minidlna.conf
  7839. sed -i 's|#db_dir=/var/cache/minidlna|db_dir=/var/cache/minidlna|g' /etc/minidlna.conf
  7840. sed -i 's/#inotify=yes/inotify=yes/g' /etc/minidlna.conf
  7841. sed -i 's/#notify_interval=895/notify_interval=300/g' /etc/minidlna.conf
  7842. sed -i "s|#presentation_url=/|presentation_url=http://localhost:8200|g" /etc/minidlna.conf
  7843. service minidlna force-reload
  7844. service minidlna reload
  7845. sed -i 's/fs.inotify.max_user_watches*/fs.inotify.max_user_watches=65536/g' /etc/sysctl.conf
  7846. if ! grep -q "max_user_watches" $COMPLETION_FILE; then
  7847. echo 'fs.inotify.max_user_watches=65536' >> /etc/sysctl.conf
  7848. fi
  7849. /sbin/sysctl -p
  7850. echo 'install_dlna_server' >> $COMPLETION_FILE
  7851. }
  7852. function install_mediagoblin {
  7853. return
  7854. if grep -Fxq "install_mediagoblin" $COMPLETION_FILE; then
  7855. return
  7856. fi
  7857. if [[ $SYSTEM_TYPE == "$VARIANT_CLOUD" || $SYSTEM_TYPE == "$VARIANT_MAILBOX" || $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_WRITER" || $SYSTEM_TYPE == "$VARIANT_SOCIAL" || $SYSTEM_TYPE == "$VARIANT_DEVELOPER" || $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  7858. return
  7859. fi
  7860. if [ ! $MEDIAGOBLIN_DOMAIN_NAME ]; then
  7861. return
  7862. fi
  7863. apt-get -y install git-core python python-dev python-lxml python-imaging python-virtualenv
  7864. apt-get -y install postgresql postgresql-client python-psycopg2
  7865. apt-get -y install python-gst-1.0 libjpeg62-turbo-dev gstreamer1.0-plugins-base python-gobject
  7866. apt-get -y install gstreamer1.0-plugins-good gstreamer1.0-libav libav-tools gstreamer0.10-tools
  7867. apt-get -y install python-numpy python-scipy libsndfile1-dev python-gst0.10-dev
  7868. apt-get -y install gstreamer0.10-plugins-base gstreamer0.10-plugins-good gstreamer1.0-tools
  7869. su -c "createuser -A -D mediagoblin" - postgres
  7870. su -c "createdb -E UNICODE -O mediagoblin mediagoblin" - postgres
  7871. adduser --disabled-login --gecos 'Mediagoblin' mediagoblin
  7872. MEDIAGOBLIN_DOMAIN_ROOT="/home/mediagoblin"
  7873. MEDIAGOBLIN_PATH="$MEDIAGOBLIN_DOMAIN_ROOT/mediagoblin"
  7874. MEDIAGOBLIN_PATH_BIN="$MEDIAGOBLIN_PATH/mediagoblin/bin"
  7875. mkdir -p $MEDIAGOBLIN_DOMAIN_ROOT
  7876. chown -hR mediagoblin: $MEDIAGOBLIN_DOMAIN_ROOT
  7877. su -c "cd $MEDIAGOBLIN_DOMAIN_ROOT; git clone $MEDIAGOBLIN_REPO" - mediagoblin
  7878. cd $MEDIAGOBLIN_DOMAIN_ROOT
  7879. git checkout -q v0.7.1
  7880. su -c "cd $MEDIAGOBLIN_PATH; git submodule init" - mediagoblin
  7881. su -c "cd $MEDIAGOBLIN_PATH; git submodule update" - mediagoblin
  7882. su -c "cd $MEDIAGOBLIN_PATH; (virtualenv --python=python2 --system-site-packages . || cd $MEDIAGOBLIN_PATH; virtualenv --python=python2 .) && ./bin/python setup.py develop" - mediagoblin
  7883. su -c "cd $MEDIAGOBLIN_PATH; ./bin/easy_install flup" - mediagoblin
  7884. if [ -f $MEDIAGOBLIN_PATH/lib/python2.7/no-global-site-packages.txt ]; then
  7885. virtualenv deactivate
  7886. rm -f $MEDIAGOBLIN_PATH/lib/python2.7/no-global-site-packages.txt
  7887. su -c "cd $MEDIAGOBLIN_PATH; source bin/activate" - mediagoblin
  7888. fi
  7889. if [ -f $MEDIAGOBLIN_PATH/mediagoblin.example.ini ]; then
  7890. # this is for versions > 0.7.1
  7891. su -c "cp $MEDIAGOBLIN_PATH/mediagoblin.example.ini $MEDIAGOBLIN_PATH/mediagoblin_local.ini" - mediagoblin
  7892. sed -i 's|# data_basedir.*|data_basedir = "/var/lib/mediagoblin"|g' $MEDIAGOBLIN_PATH/mediagoblin_local.ini
  7893. else
  7894. su -c "cp $MEDIAGOBLIN_PATH/mediagoblin.ini $MEDIAGOBLIN_PATH/mediagoblin_local.ini" - mediagoblin
  7895. fi
  7896. sed -i 's|# sql_engine.*|sql_engine = postgresql:///mediagoblin|g' $MEDIAGOBLIN_PATH/mediagoblin_local.ini
  7897. sed -i "s/email_sender_address.*/email_sender_address = \"$MY_EMAIL_ADDRESS\"/g" $MEDIAGOBLIN_PATH/mediagoblin_local.ini
  7898. sed -i 's|email_debug_mode.*|email_debug_mode = false|g' $MEDIAGOBLIN_PATH/mediagoblin_local.ini
  7899. # add extra media types
  7900. if ! grep -q "media_types.stl" $MEDIAGOBLIN_PATH/mediagoblin_local.ini; then
  7901. echo '[[mediagoblin.media_types.stl]]' >> $MEDIAGOBLIN_PATH/mediagoblin_local.ini
  7902. fi
  7903. if ! grep -q "media_types.audio" $MEDIAGOBLIN_PATH/mediagoblin_local.ini; then
  7904. echo '[[mediagoblin.media_types.audio]]' >> $MEDIAGOBLIN_PATH/mediagoblin_local.ini
  7905. fi
  7906. if ! grep -q "media_types.video" $MEDIAGOBLIN_PATH/mediagoblin_local.ini; then
  7907. echo '[[mediagoblin.media_types.video]]' >> $MEDIAGOBLIN_PATH/mediagoblin_local.ini
  7908. fi
  7909. #su -c 'cd $MEDIAGOBLIN_PATH; ./bin/pip install scikits.audiolab' - mediagoblin
  7910. #su -c "cd $MEDIAGOBLIN_PATH; git submodule update && ./bin/python setup.py develop --upgrade && ./bin/gmg dbupdate" - mediagoblin
  7911. su -c "cd $MEDIAGOBLIN_PATH; ./bin/gmg dbupdate" - mediagoblin
  7912. echo 'server {' > /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  7913. echo ' listen 80;' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  7914. echo " server_name $MEDIAGOBLIN_DOMAIN_NAME;" >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  7915. echo ' access_log off;' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  7916. echo " error_log /var/log/nginx/${MEDIAGOBLIN_DOMAIN_NAME}_error.log $WEBSERVER_LOG_LEVEL;" >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  7917. echo ' limit_conn conn_limit_per_ip 10;' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  7918. echo ' limit_req zone=req_limit_per_ip burst=10 nodelay;' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  7919. echo ' location / {' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  7920. echo ' proxy_pass http://localhost:6543;' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  7921. echo ' }' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  7922. echo ' location ^~ /auth/ {' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  7923. echo ' rewrite ^ https://$server_name$request_uri?;' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  7924. echo ' }' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  7925. echo ' location ^~ /u/ {' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  7926. echo ' rewrite ^ https://$server_name$request_uri?;' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  7927. echo ' }' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  7928. echo ' location ^~ /submit/ {' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  7929. echo ' rewrite ^ https://$server_name$request_uri?;' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  7930. echo ' }' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  7931. echo '}' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  7932. echo '' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  7933. echo 'server {' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  7934. echo ' listen 443 ssl;' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  7935. echo " root /var/www/$MEDIAGOBLIN_DOMAIN_NAME/htdocs;" >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  7936. echo " server_name $MEDIAGOBLIN_DOMAIN_NAME;" >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  7937. echo ' access_log off;' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  7938. echo " error_log /var/log/nginx/${MEDIAGOBLIN_DOMAIN_NAME}_error.log $WEBSERVER_LOG_LEVEL;" >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  7939. echo '' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  7940. echo ' limit_conn conn_limit_per_ip 10;' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  7941. echo ' limit_req zone=req_limit_per_ip burst=10 nodelay;' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  7942. echo '' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  7943. echo ' ssl on;' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  7944. echo " ssl_certificate /etc/ssl/certs/$MEDIAGOBLIN_DOMAIN_NAME.crt;" >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  7945. echo " ssl_certificate_key /etc/ssl/private/$MEDIAGOBLIN_DOMAIN_NAME.key;" >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  7946. echo " ssl_dhparam /etc/ssl/certs/$MEDIAGOBLIN_DOMAIN_NAME.dhparam;" >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  7947. echo '' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  7948. echo ' ssl_session_timeout 60m;' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  7949. echo ' ssl_prefer_server_ciphers on;' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  7950. echo " ssl_protocols $SSL_PROTOCOLS; # not possible to do exclusive" >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  7951. echo " ssl_ciphers '$SSL_CIPHERS';" >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  7952. echo ' add_header X-Frame-Options DENY;' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  7953. echo ' add_header X-Content-Type-Options nosniff;' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  7954. echo ' add_header Strict-Transport-Security max-age=0;' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  7955. echo '' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  7956. echo ' location / {' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  7957. echo ' proxy_pass http://localhost:6543;' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  7958. echo ' }' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  7959. echo '' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  7960. echo ' client_max_body_size 10G; # set max upload size' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  7961. echo ' client_body_buffer_size 128k;' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  7962. echo ' fastcgi_buffers 64 4K;' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  7963. echo '' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  7964. echo ' error_page 403 /core/templates/403.php;' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  7965. echo ' error_page 404 /core/templates/404.php;' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  7966. echo '' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  7967. echo ' location = /robots.txt {' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  7968. echo ' allow all;' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  7969. echo ' log_not_found off;' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  7970. echo ' access_log off;' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  7971. echo ' }' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  7972. echo '}' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  7973. if [ ! -f /etc/ssl/certs/$MEDIAGOBLIN_DOMAIN_NAME.dhparam ]; then
  7974. if [[ $LETSENCRYPT_ENABLED != "yes" ]]; then
  7975. ${PROJECT_NAME}-addcert -h $MEDIAGOBLIN_DOMAIN_NAME --dhkey $DH_KEYLENGTH
  7976. else
  7977. ${PROJECT_NAME}-addcert -e $MEDIAGOBLIN_DOMAIN_NAME -s $LETSENCRYPT_SERVER --dhkey $DH_KEYLENGTH
  7978. fi
  7979. check_certificates $MEDIAGOBLIN_DOMAIN_NAME
  7980. fi
  7981. nginx_ensite $MEDIAGOBLIN_DOMAIN_NAME
  7982. service php5-fpm restart
  7983. service nginx restart
  7984. /usr/sbin/nginx -s reload
  7985. # update the dynamic DNS
  7986. CURRENT_DDNS_DOMAIN=$MEDIAGOBLIN_DOMAIN_NAME
  7987. add_ddns_domain
  7988. # init with systemd
  7989. echo '[Unit]' > /etc/systemd/system/mediagoblin.service
  7990. echo 'Description=Mediagoblin (Media Server)' >> /etc/systemd/system/mediagoblin.service
  7991. echo 'After=syslog.target' >> /etc/systemd/system/mediagoblin.service
  7992. echo 'After=network.target' >> /etc/systemd/system/mediagoblin.service
  7993. echo 'After=postgresql.service' >> /etc/systemd/system/mediagoblin.service
  7994. echo '' >> /etc/systemd/system/mediagoblin.service
  7995. echo '[Service]' >> /etc/systemd/system/mediagoblin.service
  7996. echo 'Type=simple' >> /etc/systemd/system/mediagoblin.service
  7997. echo 'User=mediagoblin' >> /etc/systemd/system/mediagoblin.service
  7998. echo 'Group=mediagoblin' >> /etc/systemd/system/mediagoblin.service
  7999. echo 'WorkingDirectory=/home/mediagoblin/mediagoblin' >> /etc/systemd/system/mediagoblin.service
  8000. echo 'ExecStart=/home/mediagoblin/mediagoblin/lazyserver.sh --server-name=broadcast' >> /etc/systemd/system/mediagoblin.service
  8001. echo 'Restart=always' >> /etc/systemd/system/mediagoblin.service
  8002. echo 'Environment="USER=mediagoblin","HOME=/home/mediagoblin"' >> /etc/systemd/system/mediagoblin.service
  8003. echo '' >> /etc/systemd/system/mediagoblin.service
  8004. echo '[Install]' >> /etc/systemd/system/mediagoblin.service
  8005. echo 'WantedBy=multi-user.target' >> /etc/systemd/system/mediagoblin.service
  8006. systemctl enable mediagoblin
  8007. systemctl restart mediagoblin
  8008. echo 'install_mediagoblin' >> $COMPLETION_FILE
  8009. }
  8010. function create_upgrade_script {
  8011. if [ -f /usr/local/bin/${PROJECT_NAME}-upgrade ]; then
  8012. cp /usr/local/bin/${PROJECT_NAME}-upgrade /etc/cron.weekly/$UPGRADE_SCRIPT_NAME
  8013. else
  8014. cp /usr/bin/${PROJECT_NAME}-upgrade /etc/cron.weekly/$UPGRADE_SCRIPT_NAME
  8015. fi
  8016. if grep -Fxq "create_upgrade_script" $COMPLETION_FILE; then
  8017. return
  8018. fi
  8019. apt-get -y install unattended-upgrades
  8020. echo 'create_upgrade_script' >> $COMPLETION_FILE
  8021. }
  8022. function intrusion_detection {
  8023. if grep -Fxq "intrusion_detection" $COMPLETION_FILE; then
  8024. return
  8025. fi
  8026. if [[ $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  8027. return
  8028. fi
  8029. apt-get -y install tripwire
  8030. apt-get -y autoremove
  8031. cd /etc/tripwire
  8032. cp site.key $DEFAULT_DOMAIN_NAME-site.key
  8033. echo '*** Installing intrusion detection ***'
  8034. echo '
  8035. ' | tripwire --init
  8036. # make a script for easy resetting of the tripwire
  8037. echo '#!/bin/sh' > /usr/bin/reset-tripwire
  8038. echo 'tripwire --update-policy --secure-mode low /etc/tripwire/twpol.txt' >> /usr/bin/reset-tripwire
  8039. chmod +x /usr/bin/reset-tripwire
  8040. sed -i 's/SYSLOGREPORTING.*/SYSLOGREPORTING =false/g' /etc/tripwire/twcfg.txt
  8041. # only send emails if something has changed
  8042. sed -i 's|MAILNOVIOLATIONS.*|MAILNOVIOLATIONS = false|g' /etc/tripwire/twcfg.txt
  8043. sed -i '/# These files change the behavior of the root account/,/}/ s/.*//g' /etc/tripwire/twpol.txt
  8044. sed -i 's|/etc/rc.boot.*||g' /etc/tripwire/twpol.txt
  8045. # Don't show any changes to /proc
  8046. sed -i 's|/proc.*||g' /etc/tripwire/twpol.txt
  8047. # Don't report log changes
  8048. sed -i 's|/var/log.*||g' /etc/tripwire/twpol.txt
  8049. # Ignore /etc/tripwire
  8050. if ! grep -q "!/etc/tripwire" /etc/tripwire/twpol.txt; then
  8051. sed -i '\|/etc\t\t->.*|a\ !/etc/tripwire;' /etc/tripwire/twpol.txt
  8052. fi
  8053. # Avoid logging the changed database
  8054. sed -i 's|$(TWETC)/tw.pol.*||g' /etc/tripwire/twpol.txt
  8055. # recreate the configuration
  8056. echo '
  8057. ' | twadmin --create-cfgfile -S /etc/tripwire/site.key /etc/tripwire/twcfg.txt
  8058. # reset
  8059. echo '
  8060. ' | reset-tripwire
  8061. echo 'intrusion_detection' >> $COMPLETION_FILE
  8062. }
  8063. # see https://trac.torproject.org/projects/tor/wiki/doc/TransparentProxy
  8064. # Local Redirection and Anonymizing Middlebox
  8065. function route_outgoing_traffic_through_tor {
  8066. if grep -Fxq "route_outgoing_traffic_through_tor" $COMPLETION_FILE; then
  8067. return
  8068. fi
  8069. if [[ $ROUTE_THROUGH_TOR != "yes" ]]; then
  8070. return
  8071. fi
  8072. apt-get -y install tor tor-arm
  8073. ### set variables
  8074. # Destinations you don't want routed through Tor
  8075. _non_tor="192.168.1.0/24 192.168.0.0/24"
  8076. # The user that Tor runs as
  8077. _tor_uid="debian-tor"
  8078. # Tor's TransPort
  8079. _trans_port="9040"
  8080. # Your internal interface
  8081. _int_if="eth0"
  8082. ### Set iptables *nat
  8083. iptables -t nat -A OUTPUT -o lo -j RETURN
  8084. iptables -t nat -A OUTPUT -m owner --uid-owner $_tor_uid -j RETURN
  8085. iptables -t nat -A OUTPUT -p udp --dport 53 -j REDIRECT --to-ports 53
  8086. # Allow clearnet access for hosts in $_non_tor
  8087. for _clearnet in $_non_tor; do
  8088. iptables -t nat -A OUTPUT -d $_clearnet -j RETURN
  8089. iptables -t nat -A PREROUTING -i $_int_if -d $_clearnet -j RETURN
  8090. done
  8091. # Redirect all other pre-routing and output to Tor
  8092. iptables -t nat -A OUTPUT -p tcp --syn -j REDIRECT --to-ports $_trans_port
  8093. iptables -t nat -A PREROUTING -i $_int_if -p udp --dport 53 -j REDIRECT --to-ports 53
  8094. iptables -t nat -A PREROUTING -i $_int_if -p tcp --syn -j REDIRECT --to-ports $_trans_port
  8095. ### set iptables *filter
  8096. iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
  8097. # Allow clearnet access for hosts in $_non_tor
  8098. for _clearnet in $_non_tor 127.0.0.0/8; do
  8099. iptables -A OUTPUT -d $_clearnet -j ACCEPT
  8100. done
  8101. # Allow only Tor output
  8102. iptables -A OUTPUT -m owner --uid-owner $_tor_uid -j ACCEPT
  8103. iptables -A OUTPUT -j REJECT
  8104. save_firewall_settings
  8105. if ! grep -q "fs.file-max" /etc/sysctl.conf; then
  8106. echo "fs.file-max=100000" >> /etc/sysctl.conf
  8107. /sbin/sysctl -p
  8108. fi
  8109. echo 'domain localdomain' > /etc/resolv.conf
  8110. echo 'search localdomain' >> /etc/resolv.conf
  8111. echo 'nameserver 127.0.0.1' >> /etc/resolv.conf
  8112. if ! grep -q "VirtualAddrNetworkIPv4" /etc/tor/torrc; then
  8113. echo 'VirtualAddrNetworkIPv4 10.192.0.0/10' >> /etc/tor/torrc
  8114. fi
  8115. if ! grep -q "AutomapHostsOnResolve" /etc/tor/torrc; then
  8116. echo 'AutomapHostsOnResolve 1' >> /etc/tor/torrc
  8117. fi
  8118. if ! grep -q "TransPort" /etc/tor/torrc; then
  8119. echo 'TransPort 9040' >> /etc/tor/torrc
  8120. fi
  8121. if ! grep -q "TransListenAddress 127.0.0.1" /etc/tor/torrc; then
  8122. echo 'TransListenAddress 127.0.0.1' >> /etc/tor/torrc
  8123. fi
  8124. if ! grep -q "TransListenAddress $LOCAL_NETWORK_STATIC_IP_ADDRESS" /etc/tor/torrc; then
  8125. echo "TransListenAddress $LOCAL_NETWORK_STATIC_IP_ADDRESS" >> /etc/tor/torrc
  8126. fi
  8127. if ! grep -q "DNSPort" /etc/tor/torrc; then
  8128. echo 'DNSPort 53' >> /etc/tor/torrc
  8129. fi
  8130. if ! grep -q "DNSListenAddress 127.0.0.1" /etc/tor/torrc; then
  8131. echo 'DNSListenAddress 127.0.0.1' >> /etc/tor/torrc
  8132. fi
  8133. if ! grep -q "DNSListenAddress $LOCAL_NETWORK_STATIC_IP_ADDRESS" /etc/tor/torrc; then
  8134. echo "DNSListenAddress $LOCAL_NETWORK_STATIC_IP_ADDRESS" >> /etc/tor/torrc
  8135. fi
  8136. echo 'route_outgoing_traffic_through_tor' >> $COMPLETION_FILE
  8137. }
  8138. # A command to create a git repository for a project
  8139. function create_git_project {
  8140. if grep -Fxq "create_git_project" $COMPLETION_FILE; then
  8141. return
  8142. fi
  8143. apt-get -y install git
  8144. echo '#!/bin/bash' > /usr/bin/$CREATE_GIT_PROJECT_COMMAND
  8145. echo '' >> /usr/bin/$CREATE_GIT_PROJECT_COMMAND
  8146. echo 'GIT_PROJECT_NAME=$1' >> /usr/bin/$CREATE_GIT_PROJECT_COMMAND
  8147. echo 'if [ ! $GIT_PROJECT_NAME ]; then' >> /usr/bin/$CREATE_GIT_PROJECT_COMMAND
  8148. echo ' echo "Please specify a project name, without any spaces"' >> /usr/bin/$CREATE_GIT_PROJECT_COMMAND
  8149. echo ' exit 1' >> /usr/bin/$CREATE_GIT_PROJECT_COMMAND
  8150. echo 'fi' >> /usr/bin/$CREATE_GIT_PROJECT_COMMAND
  8151. echo '' >> /usr/bin/$CREATE_GIT_PROJECT_COMMAND
  8152. echo 'if [ ! -d /home/$USER/projects/$GIT_PROJECT_NAME ]; then' >> /usr/bin/$CREATE_GIT_PROJECT_COMMAND
  8153. echo ' mkdir -p /home/$USER/projects/$GIT_PROJECT_NAME' >> /usr/bin/$CREATE_GIT_PROJECT_COMMAND
  8154. echo 'fi' >> /usr/bin/$CREATE_GIT_PROJECT_COMMAND
  8155. echo '' >> /usr/bin/$CREATE_GIT_PROJECT_COMMAND
  8156. echo 'cd /home/$USER/projects/$GIT_PROJECT_NAME' >> /usr/bin/$CREATE_GIT_PROJECT_COMMAND
  8157. echo 'git init --bare' >> /usr/bin/$CREATE_GIT_PROJECT_COMMAND
  8158. echo '' >> /usr/bin/$CREATE_GIT_PROJECT_COMMAND
  8159. echo -n 'echo "Your project has been created, ' >> /usr/bin/$CREATE_GIT_PROJECT_COMMAND
  8160. echo 'use the following command to clone the repository"' >> /usr/bin/$CREATE_GIT_PROJECT_COMMAND
  8161. echo -n " git clone ssh://$MY_USERNAME@$DEFAULT_DOMAIN_NAME:$SSH_PORT" >> /usr/bin/$CREATE_GIT_PROJECT_COMMAND
  8162. echo '/home/$USER/projects/$GIT_PROJECT_NAME' >> /usr/bin/$CREATE_GIT_PROJECT_COMMAND
  8163. echo '' >> /usr/bin/$CREATE_GIT_PROJECT_COMMAND
  8164. echo 'exit 0' >> /usr/bin/$CREATE_GIT_PROJECT_COMMAND
  8165. chmod +x /usr/bin/$CREATE_GIT_PROJECT_COMMAND
  8166. echo 'create_git_project' >> $COMPLETION_FILE
  8167. }
  8168. function check_date {
  8169. curr_date=$(date)
  8170. if [[ $curr_date == *"1970"* ]]; then
  8171. apt-get -y install ntp
  8172. fi
  8173. }
  8174. function install_dynamicdns {
  8175. if [[ $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  8176. return
  8177. fi
  8178. if [[ $ONION_ONLY != "no" ]]; then
  8179. return
  8180. fi
  8181. # update to the next commit
  8182. if [ -d $INSTALL_DIR/inadyn ]; then
  8183. if grep -q "inadyn commit" $COMPLETION_FILE; then
  8184. CURRENT_INADYN_COMMIT=$(grep "inadyn commit" $COMPLETION_FILE | awk -F ':' '{print $2}')
  8185. if [[ "$CURRENT_INADYN_COMMIT" != "$INADYN_COMMIT" ]]; then
  8186. cd $INSTALL_DIR/inadyn
  8187. git stash
  8188. git checkout master
  8189. git pull
  8190. git checkout $INADYN_COMMIT -b $INADYN_COMMIT
  8191. sed -i "s/inadyn commit.*/inadyn commit:$INADYN_COMMIT/g" $COMPLETION_FILE
  8192. ./configure
  8193. USE_OPENSSL=1 make
  8194. make install
  8195. systemctl restart inadyn
  8196. fi
  8197. else
  8198. echo "inadyn commit:$INADYN_COMMIT" >> $COMPLETION_FILE
  8199. fi
  8200. fi
  8201. if grep -Fxq "install_dynamicdns" $COMPLETION_FILE; then
  8202. return
  8203. fi
  8204. # Here we compile from source because the current package
  8205. # doesn't support https, which could result in passwords
  8206. # being leaked
  8207. # Debian version 1.99.4-1
  8208. # https version 1.99.8
  8209. apt-get -y install build-essential curl libgnutls28-dev automake1.11
  8210. git clone $INADYN_REPO $INSTALL_DIR/inadyn
  8211. if [ ! -d $INSTALL_DIR/inadyn ]; then
  8212. echo 'inadyn repo not cloned'
  8213. echo -n | openssl s_client -showcerts -connect github.com:443 -CApath /etc/ssl/certs
  8214. exit 6785
  8215. fi
  8216. cd $INSTALL_DIR/inadyn
  8217. git checkout $INADYN_COMMIT -b $INADYN_COMMIT
  8218. if ! grep -q "inadyn commit" $COMPLETION_FILE; then
  8219. echo "inadyn commit:$INADYN_COMMIT" >> $COMPLETION_FILE
  8220. else
  8221. sed -i "s/inadyn commit.*/inadyn commit:$INADYN_COMMIT/g" $COMPLETION_FILE
  8222. fi
  8223. ./configure
  8224. if [ ! "$?" = "0" ]; then
  8225. exit 74890
  8226. fi
  8227. USE_OPENSSL=1 make
  8228. if [ ! "$?" = "0" ]; then
  8229. exit 74858
  8230. fi
  8231. make install
  8232. if [ ! "$?" = "0" ]; then
  8233. exit 3785
  8234. fi
  8235. # create an unprivileged user
  8236. #useradd -r -s /bin/false debian-inadyn
  8237. # create a configuration file
  8238. echo 'background' > /etc/inadyn.conf
  8239. echo 'verbose 1' >> /etc/inadyn.conf
  8240. echo 'period 300' >> /etc/inadyn.conf
  8241. echo 'startup-delay 60' >> /etc/inadyn.conf
  8242. echo 'cache-dir /run/inadyn' >> /etc/inadyn.conf
  8243. echo 'logfile /dev/null' >> /etc/inadyn.conf
  8244. chmod 600 /etc/inadyn.conf
  8245. echo '[Unit]' > /etc/systemd/system/inadyn.service
  8246. echo 'Description=inadyn (DynDNS updater)' >> /etc/systemd/system/inadyn.service
  8247. echo 'After=network.target' >> /etc/systemd/system/inadyn.service
  8248. echo '' >> /etc/systemd/system/inadyn.service
  8249. echo '[Service]' >> /etc/systemd/system/inadyn.service
  8250. echo 'ExecStart=/usr/local/sbin/inadyn --config /etc/inadyn.conf' >> /etc/systemd/system/inadyn.service
  8251. echo 'Restart=always' >> /etc/systemd/system/inadyn.service
  8252. echo 'Type=forking' >> /etc/systemd/system/inadyn.service
  8253. echo '' >> /etc/systemd/system/inadyn.service
  8254. echo '[Install]' >> /etc/systemd/system/inadyn.service
  8255. echo 'WantedBy=multi-user.target' >> /etc/systemd/system/inadyn.service
  8256. systemctl enable inadyn
  8257. systemctl start inadyn
  8258. systemctl daemon-reload
  8259. echo 'install_dynamicdns' >> $COMPLETION_FILE
  8260. }
  8261. function get_voip_server_password {
  8262. if [ -f /home/$MY_USERNAME/README ]; then
  8263. if grep -q "VoIP server password" /home/$MY_USERNAME/README; then
  8264. if [ ! $VOIP_SERVER_PASSWORD ]; then
  8265. VOIP_SERVER_PASSWORD=$(cat /home/$MY_USERNAME/README | grep "VoIP server password" | awk -F ':' '{print $2}' | sed 's/^ *//')
  8266. fi
  8267. fi
  8268. fi
  8269. }
  8270. function get_sip_server_password {
  8271. if [ -f /home/$MY_USERNAME/README ]; then
  8272. if grep -q "SIP server password" /home/$MY_USERNAME/README; then
  8273. if [ ! $SIP_SERVER_PASSWORD ]; then
  8274. SIP_SERVER_PASSWORD=$(cat /home/$MY_USERNAME/README | grep "SIP server password" | awk -F ':' '{print $2}' | sed 's/^ *//')
  8275. fi
  8276. fi
  8277. fi
  8278. }
  8279. function install_ipfs {
  8280. if [[ $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_MAILBOX" ]]; then
  8281. return
  8282. fi
  8283. # update to the next commit
  8284. if [ -d /home/git/go/src/github.com/ipfs/go-ipfs ]; then
  8285. if grep -q "ipfs commit" $COMPLETION_FILE; then
  8286. CURRENT_IPFS_COMMIT=$(grep "ipfs commit" $COMPLETION_FILE | awk -F ':' '{print $2}')
  8287. if [[ "$CURRENT_IPFS_COMMIT" != "$IPFS_COMMIT" ]]; then
  8288. cd /home/git/go/src/github.com/ipfs/go-ipfs
  8289. git stash
  8290. git checkout master
  8291. git pull
  8292. git checkout $IPFS_COMMIT -b $IPFS_COMMIT
  8293. sed -i "s/ipfs commit.*/ipfs commit:$IPFS_COMMIT/g" $COMPLETION_FILE
  8294. chown -R git:git /home/git
  8295. systemctl restart ipfs
  8296. systemctl daemon-reload
  8297. fi
  8298. else
  8299. echo "ipfs commit:$IPFS_COMMIT" >> $COMPLETION_FILE
  8300. fi
  8301. fi
  8302. if grep -Fxq "install_ipfs" $COMPLETION_FILE; then
  8303. return
  8304. fi
  8305. apt-get -y install golang libpam0g-dev fuse
  8306. if [ ! -d /home/git ]; then
  8307. # add a gogs user account
  8308. adduser --disabled-login --gecos 'Gogs' git
  8309. # install Go
  8310. if ! grep -q "export GOPATH=/home/git/go" ~/.bashrc; then
  8311. echo 'export GOPATH=/home/git/go' >> ~/.bashrc
  8312. echo 'systemctl set-environment GOPATH=/home/git/go' >> ~/.bashrc
  8313. fi
  8314. . ~/.bashrc
  8315. export GOPATH=/home/git/go
  8316. if [ ! -d $GOPATH ]; then
  8317. mkdir -p $GOPATH
  8318. fi
  8319. fi
  8320. IPFS_PATH=/home/git/go/bin
  8321. if ! grep -q 'GOPATH/bin' ~/.bashrc; then
  8322. echo 'export PATH="$GOPATH/bin:$PATH:";' >> ~/.bashrc
  8323. fi
  8324. . ~/.bashrc
  8325. # set gopath for the user
  8326. if ! grep -q "GOPATH=" /home/$MY_USERNAME/.bashrc; then
  8327. echo 'export GOPATH=/home/git/go' >> /home/$MY_USERNAME/.bashrc
  8328. echo 'export PATH="$GOPATH/bin:$PATH:";' >> /home/$MY_USERNAME/.bashrc
  8329. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.bashrc
  8330. fi
  8331. go get -u $IPFS_GO_REPO
  8332. if [ ! "$?" = "0" ]; then
  8333. exit 8242
  8334. fi
  8335. cd /home/git/go/src/github.com/ipfs/go-ipfs
  8336. git checkout $IPFS_COMMIT -b $IPFS_COMMIT
  8337. if ! grep -q "ipfs commit" $COMPLETION_FILE; then
  8338. echo "ipfs commit:$IPFS_COMMIT" >> $COMPLETION_FILE
  8339. else
  8340. sed -i "s/ipfs commit.*/ipfs commit:$IPFS_COMMIT/g" $COMPLETION_FILE
  8341. fi
  8342. # initialise
  8343. su -c "$IPFS_PATH/ipfs init -b 4096" - $MY_USERNAME
  8344. if [ ! -d /home/$MY_USERNAME/.ipfs ]; then
  8345. echo "IPFS could not be initialised for user $MY_USERNAME"
  8346. exit 7358
  8347. fi
  8348. # directories to mount to
  8349. if [ ! -d /ipfs ]; then
  8350. mkdir /ipfs
  8351. mkdir /ipns
  8352. chown $MY_USERNAME:$MY_USERNAME /ipfs
  8353. chown $MY_USERNAME:$MY_USERNAME /ipns
  8354. fi
  8355. if [ -f /etc/fuse.conf ]; then
  8356. chown $MY_USERNAME:$MY_USERNAME /etc/fuse.conf
  8357. fi
  8358. if [ -f /dev/fuse ]; then
  8359. chown $MY_USERNAME:$MY_USERNAME /dev/fuse
  8360. fi
  8361. echo '[Unit]' > /etc/systemd/system/ipfs.service
  8362. echo 'Description=IPFS daemon' >> /etc/systemd/system/ipfs.service
  8363. echo 'After=syslog.target' >> /etc/systemd/system/ipfs.service
  8364. echo 'After=network.target' >> /etc/systemd/system/ipfs.service
  8365. echo '' >> /etc/systemd/system/ipfs.service
  8366. echo '[Service]' >> /etc/systemd/system/ipfs.service
  8367. echo 'Type=simple' >> /etc/systemd/system/ipfs.service
  8368. echo "User=$MY_USERNAME" >> /etc/systemd/system/ipfs.service
  8369. echo "Group=$MY_USERNAME" >> /etc/systemd/system/ipfs.service
  8370. echo "WorkingDirectory=/home/$MY_USERNAME" >> /etc/systemd/system/ipfs.service
  8371. echo "ExecStart=$IPFS_PATH/ipfs daemon --mount" >> /etc/systemd/system/ipfs.service
  8372. echo 'Restart=on-failure' >> /etc/systemd/system/ipfs.service
  8373. echo "Environment=\"USER=$MY_USERNAME\" \"HOME=/home/$MY_USERNAME\" \"GOPATH=/home/git/go\"" >> /etc/systemd/system/ipfs.service
  8374. echo '' >> /etc/systemd/system/ipfs.service
  8375. echo '[Install]' >> /etc/systemd/system/ipfs.service
  8376. echo 'WantedBy=multi-user.target' >> /etc/systemd/system/ipfs.service
  8377. systemctl enable ipfs
  8378. systemctl daemon-reload
  8379. systemctl restart ipfs
  8380. if [ -d /etc/avahi ]; then
  8381. su -c "echo $($IPFS_PATH/ipfs id | grep '\"ID\":' | awk -F '\"' '{print $4}') > /tmp/ipfsid" - $MY_USERNAME
  8382. if [ ! -f /tmp/ipfsid ]; then
  8383. echo 'No IPFS identity was created'
  8384. exit 37895
  8385. fi
  8386. IPFS_PEER_ID=$(cat /tmp/ipfsid)
  8387. if [ ${#IPFS_PEER_ID} -lt 10 ]; then
  8388. echo 'Invalid IPFS peer ID'
  8389. echo "$IPFS_PEER_ID"
  8390. exit 74782
  8391. fi
  8392. # Add an avahi service
  8393. echo '<?xml version="1.0" standalone="no"?><!--*-nxml-*-->' > /etc/avahi/services/ipfs.service
  8394. echo '<!DOCTYPE service-group SYSTEM "avahi-service.dtd">' >> /etc/avahi/services/ipfs.service
  8395. echo '<service-group>' >> /etc/avahi/services/ipfs.service
  8396. echo ' <name replace-wildcards="yes">%h IPFS</name>' >> /etc/avahi/services/ipfs.service
  8397. echo ' <service>' >> /etc/avahi/services/ipfs.service
  8398. echo ' <type>_ipfs._tcp</type>' >> /etc/avahi/services/ipfs.service
  8399. echo " <port>$IPFS_PORT</port>" >> /etc/avahi/services/ipfs.service
  8400. echo " <txt-record>$IPFS_PEER_ID</txt-record>" >> /etc/avahi/services/ipfs.service
  8401. echo ' </service>' >> /etc/avahi/services/ipfs.service
  8402. echo '</service-group>' >> /etc/avahi/services/ipfs.service
  8403. rm /tmp/ipfsid
  8404. fi
  8405. echo 'install_ipfs' >> $COMPLETION_FILE
  8406. }
  8407. function install_voip {
  8408. if [[ $SYSTEM_TYPE == "$VARIANT_WRITER" || $SYSTEM_TYPE == "$VARIANT_MAILBOX" || $SYSTEM_TYPE == "$VARIANT_CLOUD" || $SYSTEM_TYPE == "$VARIANT_SOCIAL" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_DEVELOPER" ]]; then
  8409. return
  8410. fi
  8411. if grep -Fxq "install_voip" $COMPLETION_FILE; then
  8412. return
  8413. fi
  8414. apt-get -y install mumble-server
  8415. get_voip_server_password
  8416. if [ ! $VOIP_SERVER_PASSWORD ]; then
  8417. if [ -f $IMAGE_PASSWORD_FILE ]; then
  8418. VOIP_SERVER_PASSWORD="$(printf `cat $IMAGE_PASSWORD_FILE`)"
  8419. else
  8420. VOIP_SERVER_PASSWORD="$(openssl rand -base64 16)"
  8421. if [ ${#VOIP_SERVER_PASSWORD} -lt $MINIMUM_PASSWORD_LENGTH ]; then
  8422. VOIP_SERVER_PASSWORD="$(openssl rand -base64 16)"
  8423. fi
  8424. fi
  8425. fi
  8426. # Make an ssl cert for the server
  8427. if [ ! -f /etc/ssl/certs/mumble.dhparam ]; then
  8428. ${PROJECT_NAME}-addcert -h mumble --dhkey $DH_KEYLENGTH
  8429. check_certificates mumble
  8430. fi
  8431. # Check that the cert was created
  8432. if [ ! -f /etc/ssl/certs/mumble.crt ]; then
  8433. echo $'VoIP server certificate not created'
  8434. exit 57892
  8435. fi
  8436. if [ ! -f /etc/ssl/private/mumble.key ]; then
  8437. echo $'VoIP server key not created'
  8438. exit 57893
  8439. fi
  8440. if [ ! -d /var/lib/mumble-server ]; then
  8441. mkdir /var/lib/mumble-server
  8442. fi
  8443. cp /etc/ssl/certs/mumble.* /var/lib/mumble-server
  8444. cp /etc/ssl/private/mumble.key /var/lib/mumble-server
  8445. chown -R mumble-server:mumble-server /var/lib/mumble-server
  8446. sed -i "s|welcometext=.*|welcometext=\"<br />Welcome to $DEFAULT_DOMAIN_NAME <b>VoIP</b>.<br />Chat freely!<br />\"|g" /etc/mumble-server.ini
  8447. if [[ $VOIP_SERVER_PASSWORD && $SYSTEM_TYPE != "$VARIANT_MESH" ]]; then
  8448. sed -i "s|serverpassword=.*|serverpassword=$VOIP_SERVER_PASSWORD|g" /etc/mumble-server.ini
  8449. fi
  8450. sed -i 's|#autobanAttempts.*|autobanAttempts = 10|g' /etc/mumble-server.ini
  8451. sed -i 's|#autobanTimeframe.*|autobanTimeframe = 120|g' /etc/mumble-server.ini
  8452. sed -i 's|#autobanTime.*|autobanTime = 300|g' /etc/mumble-server.ini
  8453. sed -i 's|#sendversion=.*|sendversion=False|g' /etc/mumble-server.ini
  8454. sed -i 's|sendversion=.*|sendversion=False|g' /etc/mumble-server.ini
  8455. if ! grep -q "allowping" /etc/mumble-server.ini; then
  8456. echo 'allowping=False' >> /etc/mumble-server.ini
  8457. fi
  8458. sed -i 's|allowping=.*|allowping=False|g' /etc/mumble-server.ini
  8459. sed -i 's|#sslCert=.*|sslCert=/var/lib/mumble-server/mumble.crt|g' /etc/mumble-server.ini
  8460. sed -i 's|#sslKey=.*|sslKey=/var/lib/mumble-server/mumble.key|g' /etc/mumble-server.ini
  8461. sed -i 's|#certrequired=.*|certrequired=True|g' /etc/mumble-server.ini
  8462. sed -i 's|users=100|users=10|g' /etc/mumble-server.ini
  8463. sed -i 's|#channelnestinglimit=10|channelnestinglimit=10|g' /etc/mumble-server.ini
  8464. sed -i 's|#textmessagelength=.*|textmessagelength=1000|g' /etc/mumble-server.ini
  8465. sed -i 's|textmessagelength=.*|textmessagelength=1000|g' /etc/mumble-server.ini
  8466. sed -i 's|#imagemessagelength=.*|imagemessagelength=131072|g' /etc/mumble-server.ini
  8467. sed -i 's|#allowhtml=.*|allowhtml=False|g' /etc/mumble-server.ini
  8468. sed -i 's|allowhtml=.*|allowhtml=False|g' /etc/mumble-server.ini
  8469. sed -i "s|port=.*|port=$VOIP_PORT|g" /etc/mumble-server.ini
  8470. systemctl restart mumble-server
  8471. if ! grep -q $"VoIP Server" /home/$MY_USERNAME/README; then
  8472. echo '' >> /home/$MY_USERNAME/README
  8473. echo '' >> /home/$MY_USERNAME/README
  8474. echo $'VoIP Server' >> /home/$MY_USERNAME/README
  8475. echo '===========' >> /home/$MY_USERNAME/README
  8476. echo $'VoIP server username: mumble-server' >> /home/$MY_USERNAME/README
  8477. if [[ $SYSTEM_TYPE != "VARIANT_MESH" ]]; then
  8478. echo $"VoIP server password: $VOIP_SERVER_PASSWORD" >> /home/$MY_USERNAME/README
  8479. fi
  8480. echo '' >> /home/$MY_USERNAME/README
  8481. echo $'To connect to the VoIP server use your username and the server password shown above.' >> /home/$MY_USERNAME/README
  8482. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
  8483. chmod 600 /home/$MY_USERNAME/README
  8484. fi
  8485. echo 'install_voip' >> $COMPLETION_FILE
  8486. }
  8487. function install_sip {
  8488. if [[ $SYSTEM_TYPE == "$VARIANT_WRITER" || $SYSTEM_TYPE == "$VARIANT_MAILBOX" || $SYSTEM_TYPE == "$VARIANT_CLOUD" || $SYSTEM_TYPE == "$VARIANT_SOCIAL" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_DEVELOPER" ]]; then
  8489. return
  8490. fi
  8491. if grep -Fxq "install_sip" $COMPLETION_FILE; then
  8492. return
  8493. fi
  8494. apt-get -y install sipwitch
  8495. get_sip_server_password
  8496. if [ ! $SIP_SERVER_PASSWORD ]; then
  8497. if [ -f $IMAGE_PASSWORD_FILE ]; then
  8498. SIP_SERVER_PASSWORD="$(printf `cat $IMAGE_PASSWORD_FILE`)"
  8499. else
  8500. SIP_SERVER_PASSWORD="$(openssl rand -base64 10)"
  8501. fi
  8502. fi
  8503. echo '<?xml version="1.0"?>' > /etc/sipwitch.conf
  8504. echo '<sipwitch>' >> /etc/sipwitch.conf
  8505. echo '<provision>' >> /etc/sipwitch.conf
  8506. echo "<user id=\"$MY_USERNAME\">" >> /etc/sipwitch.conf
  8507. echo '<extension>201</extension>' >> /etc/sipwitch.conf
  8508. echo "<secret>$SIP_SERVER_PASSWORD</secret>" >> /etc/sipwitch.conf
  8509. echo "<display>$MY_USERNAME 201</display>" >> /etc/sipwitch.conf
  8510. echo '</user>' >> /etc/sipwitch.conf
  8511. echo '</provision>' >> /etc/sipwitch.conf
  8512. echo '<access>' >> /etc/sipwitch.conf
  8513. echo '</access>' >> /etc/sipwitch.conf
  8514. echo '<stack>' >> /etc/sipwitch.conf
  8515. echo " <localnames>$DEFAULT_DOMAIN_NAME</localnames>" >> /etc/sipwitch.conf
  8516. echo ' <mapped>200</mapped>' >> /etc/sipwitch.conf
  8517. echo ' <threading>2</threading>' >> /etc/sipwitch.conf
  8518. echo ' <interface>*</interface>' >> /etc/sipwitch.conf
  8519. echo ' <dumping>false</dumping>' >> /etc/sipwitch.conf
  8520. echo ' <system>system</system>' >> /etc/sipwitch.conf
  8521. echo ' <anon>anonymous</anon>' >> /etc/sipwitch.conf
  8522. echo '</stack>' >> /etc/sipwitch.conf
  8523. echo '<timers>' >> /etc/sipwitch.conf
  8524. echo ' <!-- ring every 4 seconds -->' >> /etc/sipwitch.conf
  8525. echo ' <ring>4</ring>' >> /etc/sipwitch.conf
  8526. echo ' <!-- call forward no answer after x rings -->' >> /etc/sipwitch.conf
  8527. echo ' <cfna>4</cfna>' >> /etc/sipwitch.conf
  8528. echo ' <!-- call reset to clear cid in stack, 6 seconds -->' >> /etc/sipwitch.conf
  8529. echo ' <reset>6</reset>' >> /etc/sipwitch.conf
  8530. echo '</timers>' >> /etc/sipwitch.conf
  8531. echo '<!-- we have 2xx numbers plus space for external users -->' >> /etc/sipwitch.conf
  8532. echo '<registry>' >> /etc/sipwitch.conf
  8533. echo ' <prefix>200</prefix>' >> /etc/sipwitch.conf
  8534. echo ' <range>100</range>' >> /etc/sipwitch.conf
  8535. echo ' <keysize>77</keysize>' >> /etc/sipwitch.conf
  8536. echo ' <mapped>200</mapped>' >> /etc/sipwitch.conf
  8537. echo ' <!-- <realm>GNU Telephony</realm> -->' >> /etc/sipwitch.conf
  8538. echo '</registry>' >> /etc/sipwitch.conf
  8539. echo '<routing>' >> /etc/sipwitch.conf
  8540. echo '</routing>' >> /etc/sipwitch.conf
  8541. echo '</sipwitch>' >> /etc/sipwitch.conf
  8542. sed -i 's|#PLUGINS=|PLUGINS=|g' /etc/default/sipwitch
  8543. groupadd sipwitch
  8544. usermod -aG sipwitch $MY_USERNAME
  8545. service sipwitch start
  8546. if ! grep -q $"SIP Server" /home/$MY_USERNAME/README; then
  8547. echo '' >> /home/$MY_USERNAME/README
  8548. echo '' >> /home/$MY_USERNAME/README
  8549. echo $'SIP Server' >> /home/$MY_USERNAME/README
  8550. echo '==========' >> /home/$MY_USERNAME/README
  8551. echo $"SIP server username: $MY_USERNAME" >> /home/$MY_USERNAME/README
  8552. echo $"SIP server extension: 201" >> /home/$MY_USERNAME/README
  8553. echo $"SIP server password: $SIP_SERVER_PASSWORD" >> /home/$MY_USERNAME/README
  8554. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
  8555. chmod 600 /home/$MY_USERNAME/README
  8556. fi
  8557. echo 'install_sip' >> $COMPLETION_FILE
  8558. }
  8559. function install_final {
  8560. if grep -Fxq "install_final" $COMPLETION_FILE; then
  8561. return
  8562. fi
  8563. # unmount any attached usb drive
  8564. if [ -d $USB_MOUNT ]; then
  8565. umount $USB_MOUNT
  8566. rm -rf $USB_MOUNT
  8567. fi
  8568. split_gpg_key_into_fragments
  8569. echo 'install_final' >> $COMPLETION_FILE
  8570. clear
  8571. echo ''
  8572. echo $"
  8573. *** ${PROJECT_NAME} installation is complete. Rebooting... ***
  8574. Now forward these ports from your internet router
  8575. HTTP 80
  8576. HTTPS 443
  8577. SSH 2222
  8578. DLNA 1900
  8579. DLNA 8200
  8580. XMPP 5222-5223
  8581. XMPP 5269
  8582. XMPP 5280-5281
  8583. IRC 6697
  8584. IRC 9999
  8585. Git 9418
  8586. Email 25
  8587. Email 587
  8588. Email 465
  8589. Email 993
  8590. VoIP 64738
  8591. VoIP 5060
  8592. Tox 33445
  8593. IPFS 4001
  8594. "
  8595. if [ -f "/home/$MY_USERNAME/README" ]; then
  8596. echo $"See /home/$MY_USERNAME/README for post-installation instructions."
  8597. echo ''
  8598. fi
  8599. if [ ! -f $IMAGE_PASSWORD_FILE ]; then
  8600. reboot
  8601. fi
  8602. }
  8603. read_configuration
  8604. set_default_onion_domains
  8605. locale_setup
  8606. parse_args
  8607. check_domains
  8608. install_not_on_BBB
  8609. remove_default_user
  8610. configure_firewall
  8611. configure_firewall_ping
  8612. configure_firewall_for_ssh
  8613. configure_firewall_for_dns
  8614. configure_firewall_for_ftp
  8615. configure_firewall_for_web_access
  8616. configure_firewall_for_voip
  8617. configure_firewall_for_sip
  8618. configure_firewall_for_avahi
  8619. configure_firewall_for_zeronet
  8620. configure_firewall_for_ipfs
  8621. remove_proprietary_repos
  8622. change_debian_repos
  8623. enable_backports
  8624. configure_dns
  8625. initial_setup
  8626. install_tor
  8627. check_date
  8628. install_dynamicdns
  8629. randomize_cron
  8630. create_freedns_updater
  8631. mark_admin_user_account
  8632. enforce_good_passwords
  8633. install_editor
  8634. change_login_message
  8635. enable_zram
  8636. random_number_generator
  8637. set_your_domain_name
  8638. time_synchronisation
  8639. configure_internet_protocol
  8640. create_git_project
  8641. configure_ssh
  8642. remove_instructions_from_motd
  8643. check_hwrng
  8644. search_for_attached_usb_drive
  8645. regenerate_ssh_keys
  8646. create_upgrade_script
  8647. letsencrypt_renewals
  8648. install_zeronet
  8649. install_watchdog_script
  8650. configure_avahi
  8651. create_avahi_onion_domains
  8652. install_zeronet_blog
  8653. install_zeronet_mail
  8654. install_zeronet_forum
  8655. #install_atheros_wifi
  8656. configure_firewall_for_cjdns
  8657. mesh_cjdns
  8658. mesh_cjdns_tools
  8659. configure_firewall_for_batman
  8660. mesh_batman_bridge
  8661. configure_firewall_for_babel
  8662. mesh_babel
  8663. route_outgoing_traffic_through_tor
  8664. configure_email
  8665. create_procmail
  8666. spam_filtering
  8667. configure_imap
  8668. #configure_imap_client_certs
  8669. configure_gpg
  8670. configure_backup_key
  8671. encrypt_incoming_email
  8672. encrypt_outgoing_email
  8673. email_client
  8674. email_archiving
  8675. email_from_address
  8676. configure_firewall_for_email
  8677. create_public_mailing_list
  8678. #create_private_mailing_list
  8679. encrypt_all_email
  8680. import_email
  8681. script_for_attaching_usb_drive
  8682. install_web_server
  8683. configure_firewall_for_web_server
  8684. install_owncloud
  8685. install_owncloud_music_app
  8686. configure_owncloud_onion_site
  8687. install_gogs
  8688. install_xmpp
  8689. install_tox_node
  8690. install_tox_client
  8691. tox_avahi
  8692. configure_firewall_for_xmpp
  8693. install_irc_server
  8694. configure_firewall_for_irc
  8695. install_voip
  8696. install_sip
  8697. install_wiki
  8698. install_blog
  8699. mark_blog_domain
  8700. install_gnu_social
  8701. install_hubzilla
  8702. install_dlna_server
  8703. configure_firewall_for_dlna
  8704. install_mediagoblin
  8705. #install_ipfs
  8706. repair_databases_script
  8707. backup_to_friends_servers
  8708. intrusion_detection
  8709. install_final
  8710. echo "${PROJECT_NAME} installation is complete"
  8711. exit 0