freedombone 489KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625562656275628562956305631563256335634563556365637563856395640564156425643564456455646564756485649565056515652565356545655565656575658565956605661566256635664566556665667566856695670567156725673567456755676567756785679568056815682568356845685568656875688568956905691569256935694569556965697569856995700570157025703570457055706570757085709571057115712571357145715571657175718571957205721572257235724572557265727572857295730573157325733573457355736573757385739574057415742574357445745574657475748574957505751575257535754575557565757575857595760576157625763576457655766576757685769577057715772577357745775577657775778577957805781578257835784578557865787578857895790579157925793579457955796579757985799580058015802580358045805580658075808580958105811581258135814581558165817581858195820582158225823582458255826582758285829583058315832583358345835583658375838583958405841584258435844584558465847584858495850585158525853585458555856585758585859586058615862586358645865586658675868586958705871587258735874587558765877587858795880588158825883588458855886588758885889589058915892589358945895589658975898589959005901590259035904590559065907590859095910591159125913591459155916591759185919592059215922592359245925592659275928592959305931593259335934593559365937593859395940594159425943594459455946594759485949595059515952595359545955595659575958595959605961596259635964596559665967596859695970597159725973597459755976597759785979598059815982598359845985598659875988598959905991599259935994599559965997599859996000600160026003600460056006600760086009601060116012601360146015601660176018601960206021602260236024602560266027602860296030603160326033603460356036603760386039604060416042604360446045604660476048604960506051605260536054605560566057605860596060606160626063606460656066606760686069607060716072607360746075607660776078607960806081608260836084608560866087608860896090609160926093609460956096609760986099610061016102610361046105610661076108610961106111611261136114611561166117611861196120612161226123612461256126612761286129613061316132613361346135613661376138613961406141614261436144614561466147614861496150615161526153615461556156615761586159616061616162616361646165616661676168616961706171617261736174617561766177617861796180618161826183618461856186618761886189619061916192619361946195619661976198619962006201620262036204620562066207620862096210621162126213621462156216621762186219622062216222622362246225622662276228622962306231623262336234623562366237623862396240624162426243624462456246624762486249625062516252625362546255625662576258625962606261626262636264626562666267626862696270627162726273627462756276627762786279628062816282628362846285628662876288628962906291629262936294629562966297629862996300630163026303630463056306630763086309631063116312631363146315631663176318631963206321632263236324632563266327632863296330633163326333633463356336633763386339634063416342634363446345634663476348634963506351635263536354635563566357635863596360636163626363636463656366636763686369637063716372637363746375637663776378637963806381638263836384638563866387638863896390639163926393639463956396639763986399640064016402640364046405640664076408640964106411641264136414641564166417641864196420642164226423642464256426642764286429643064316432643364346435643664376438643964406441644264436444644564466447644864496450645164526453645464556456645764586459646064616462646364646465646664676468646964706471647264736474647564766477647864796480648164826483648464856486648764886489649064916492649364946495649664976498649965006501650265036504650565066507650865096510651165126513651465156516651765186519652065216522652365246525652665276528652965306531653265336534653565366537653865396540654165426543654465456546654765486549655065516552655365546555655665576558655965606561656265636564656565666567656865696570657165726573657465756576657765786579658065816582658365846585658665876588658965906591659265936594659565966597659865996600660166026603660466056606660766086609661066116612661366146615661666176618661966206621662266236624662566266627662866296630663166326633663466356636663766386639664066416642664366446645664666476648664966506651665266536654665566566657665866596660666166626663666466656666666766686669667066716672667366746675667666776678667966806681668266836684668566866687668866896690669166926693669466956696669766986699670067016702670367046705670667076708670967106711671267136714671567166717671867196720672167226723672467256726672767286729673067316732673367346735673667376738673967406741674267436744674567466747674867496750675167526753675467556756675767586759676067616762676367646765676667676768676967706771677267736774677567766777677867796780678167826783678467856786678767886789679067916792679367946795679667976798679968006801680268036804680568066807680868096810681168126813681468156816681768186819682068216822682368246825682668276828682968306831683268336834683568366837683868396840684168426843684468456846684768486849685068516852685368546855685668576858685968606861686268636864686568666867686868696870687168726873687468756876687768786879688068816882688368846885688668876888688968906891689268936894689568966897689868996900690169026903690469056906690769086909691069116912691369146915691669176918691969206921692269236924692569266927692869296930693169326933693469356936693769386939694069416942694369446945694669476948694969506951695269536954695569566957695869596960696169626963696469656966696769686969697069716972697369746975697669776978697969806981698269836984698569866987698869896990699169926993699469956996699769986999700070017002700370047005700670077008700970107011701270137014701570167017701870197020702170227023702470257026702770287029703070317032703370347035703670377038703970407041704270437044704570467047704870497050705170527053705470557056705770587059706070617062706370647065706670677068706970707071707270737074707570767077707870797080708170827083708470857086708770887089709070917092709370947095709670977098709971007101710271037104710571067107710871097110711171127113711471157116711771187119712071217122712371247125712671277128712971307131713271337134713571367137713871397140714171427143714471457146714771487149715071517152715371547155715671577158715971607161716271637164716571667167716871697170717171727173717471757176717771787179718071817182718371847185718671877188718971907191719271937194719571967197719871997200720172027203720472057206720772087209721072117212721372147215721672177218721972207221722272237224722572267227722872297230723172327233723472357236723772387239724072417242724372447245724672477248724972507251725272537254725572567257725872597260726172627263726472657266726772687269727072717272727372747275727672777278727972807281728272837284728572867287728872897290729172927293729472957296729772987299730073017302730373047305730673077308730973107311731273137314731573167317731873197320732173227323732473257326732773287329733073317332733373347335733673377338733973407341734273437344734573467347734873497350735173527353735473557356735773587359736073617362736373647365736673677368736973707371737273737374737573767377737873797380738173827383738473857386738773887389739073917392739373947395739673977398739974007401740274037404740574067407740874097410741174127413741474157416741774187419742074217422742374247425742674277428742974307431743274337434743574367437743874397440744174427443744474457446744774487449745074517452745374547455745674577458745974607461746274637464746574667467746874697470747174727473747474757476747774787479748074817482748374847485748674877488748974907491749274937494749574967497749874997500750175027503750475057506750775087509751075117512751375147515751675177518751975207521752275237524752575267527752875297530753175327533753475357536753775387539754075417542754375447545754675477548754975507551755275537554755575567557755875597560756175627563756475657566756775687569757075717572757375747575757675777578757975807581758275837584758575867587758875897590759175927593759475957596759775987599760076017602760376047605760676077608760976107611761276137614761576167617761876197620762176227623762476257626762776287629763076317632763376347635763676377638763976407641764276437644764576467647764876497650765176527653765476557656765776587659766076617662766376647665766676677668766976707671767276737674767576767677767876797680768176827683768476857686768776887689769076917692769376947695769676977698769977007701770277037704770577067707770877097710771177127713771477157716771777187719772077217722772377247725772677277728772977307731773277337734773577367737773877397740774177427743774477457746774777487749775077517752775377547755775677577758775977607761776277637764776577667767776877697770777177727773777477757776777777787779778077817782778377847785778677877788778977907791779277937794779577967797779877997800780178027803780478057806780778087809781078117812781378147815781678177818781978207821782278237824782578267827782878297830783178327833783478357836783778387839784078417842784378447845784678477848784978507851785278537854785578567857785878597860786178627863786478657866786778687869787078717872787378747875787678777878787978807881788278837884788578867887788878897890789178927893789478957896789778987899790079017902790379047905790679077908790979107911791279137914791579167917791879197920792179227923792479257926792779287929793079317932793379347935793679377938793979407941794279437944794579467947794879497950795179527953795479557956795779587959796079617962796379647965796679677968796979707971797279737974797579767977797879797980798179827983798479857986798779887989799079917992799379947995799679977998799980008001800280038004800580068007800880098010801180128013801480158016801780188019802080218022802380248025802680278028802980308031803280338034803580368037803880398040804180428043804480458046804780488049805080518052805380548055805680578058805980608061806280638064806580668067806880698070807180728073807480758076807780788079808080818082808380848085808680878088808980908091809280938094809580968097809880998100810181028103810481058106810781088109811081118112811381148115811681178118811981208121812281238124812581268127812881298130813181328133813481358136813781388139814081418142814381448145814681478148814981508151815281538154815581568157815881598160816181628163816481658166816781688169817081718172817381748175817681778178817981808181818281838184818581868187818881898190819181928193819481958196819781988199820082018202820382048205820682078208820982108211821282138214821582168217821882198220822182228223822482258226822782288229823082318232823382348235823682378238823982408241824282438244824582468247824882498250825182528253825482558256825782588259826082618262826382648265826682678268826982708271827282738274827582768277827882798280828182828283828482858286828782888289829082918292829382948295829682978298829983008301830283038304830583068307830883098310831183128313831483158316831783188319832083218322832383248325832683278328832983308331833283338334833583368337833883398340834183428343834483458346834783488349835083518352835383548355835683578358835983608361836283638364836583668367836883698370837183728373837483758376837783788379838083818382838383848385838683878388838983908391839283938394839583968397839883998400840184028403840484058406840784088409841084118412841384148415841684178418841984208421842284238424842584268427842884298430843184328433843484358436843784388439844084418442844384448445844684478448844984508451845284538454845584568457845884598460846184628463846484658466846784688469847084718472847384748475847684778478847984808481848284838484848584868487848884898490849184928493849484958496849784988499850085018502850385048505850685078508850985108511851285138514851585168517851885198520852185228523852485258526852785288529853085318532853385348535853685378538853985408541854285438544854585468547854885498550855185528553855485558556855785588559856085618562856385648565856685678568856985708571857285738574857585768577857885798580858185828583858485858586858785888589859085918592859385948595859685978598859986008601860286038604860586068607860886098610861186128613861486158616861786188619862086218622862386248625862686278628862986308631863286338634863586368637863886398640864186428643864486458646864786488649865086518652865386548655865686578658865986608661866286638664866586668667866886698670867186728673867486758676867786788679868086818682868386848685868686878688868986908691869286938694869586968697869886998700870187028703870487058706870787088709871087118712871387148715871687178718871987208721872287238724872587268727872887298730873187328733873487358736873787388739874087418742874387448745874687478748874987508751875287538754875587568757875887598760876187628763876487658766876787688769877087718772877387748775877687778778877987808781878287838784878587868787878887898790879187928793879487958796879787988799880088018802880388048805880688078808880988108811881288138814881588168817881888198820882188228823882488258826882788288829883088318832883388348835883688378838883988408841884288438844884588468847884888498850885188528853885488558856885788588859886088618862886388648865886688678868886988708871887288738874887588768877887888798880888188828883888488858886888788888889889088918892889388948895889688978898889989008901890289038904890589068907890889098910891189128913891489158916891789188919892089218922892389248925892689278928892989308931893289338934893589368937893889398940894189428943894489458946894789488949895089518952895389548955895689578958895989608961896289638964896589668967896889698970897189728973897489758976897789788979898089818982898389848985898689878988898989908991899289938994899589968997899889999000900190029003900490059006900790089009901090119012901390149015901690179018901990209021902290239024902590269027902890299030903190329033903490359036903790389039904090419042904390449045904690479048904990509051905290539054905590569057905890599060906190629063906490659066906790689069907090719072907390749075907690779078907990809081908290839084908590869087908890899090909190929093909490959096909790989099910091019102910391049105910691079108910991109111911291139114911591169117911891199120912191229123912491259126912791289129913091319132913391349135913691379138913991409141914291439144914591469147914891499150915191529153915491559156915791589159916091619162916391649165916691679168916991709171917291739174917591769177917891799180918191829183918491859186918791889189919091919192919391949195919691979198919992009201920292039204920592069207920892099210921192129213921492159216921792189219922092219222922392249225922692279228922992309231923292339234923592369237923892399240924192429243924492459246924792489249925092519252925392549255925692579258925992609261926292639264926592669267926892699270927192729273927492759276927792789279928092819282928392849285928692879288928992909291929292939294929592969297929892999300930193029303930493059306930793089309931093119312931393149315931693179318931993209321932293239324932593269327932893299330933193329333933493359336933793389339934093419342934393449345934693479348934993509351935293539354935593569357935893599360936193629363936493659366936793689369937093719372937393749375937693779378937993809381938293839384938593869387938893899390939193929393939493959396939793989399940094019402940394049405940694079408940994109411941294139414941594169417941894199420942194229423942494259426942794289429943094319432943394349435943694379438943994409441944294439444944594469447944894499450945194529453945494559456945794589459946094619462946394649465946694679468946994709471947294739474947594769477947894799480948194829483948494859486948794889489949094919492949394949495949694979498949995009501950295039504950595069507950895099510951195129513951495159516951795189519952095219522952395249525952695279528952995309531953295339534953595369537953895399540954195429543954495459546954795489549955095519552955395549555955695579558955995609561956295639564956595669567956895699570957195729573957495759576957795789579958095819582958395849585958695879588958995909591959295939594959595969597959895999600960196029603960496059606960796089609961096119612961396149615961696179618961996209621962296239624962596269627962896299630963196329633963496359636963796389639964096419642964396449645964696479648964996509651965296539654965596569657965896599660966196629663966496659666966796689669967096719672967396749675967696779678967996809681968296839684968596869687968896899690969196929693969496959696969796989699970097019702970397049705970697079708970997109711971297139714971597169717971897199720972197229723972497259726972797289729973097319732973397349735973697379738973997409741974297439744974597469747974897499750975197529753975497559756975797589759976097619762976397649765976697679768976997709771977297739774977597769777977897799780978197829783978497859786978797889789979097919792979397949795979697979798979998009801980298039804980598069807980898099810981198129813981498159816981798189819982098219822982398249825982698279828982998309831983298339834983598369837983898399840984198429843984498459846984798489849985098519852985398549855985698579858985998609861986298639864986598669867986898699870987198729873987498759876987798789879988098819882988398849885988698879888988998909891989298939894989598969897989898999900990199029903990499059906990799089909991099119912991399149915991699179918991999209921992299239924992599269927992899299930993199329933993499359936993799389939994099419942994399449945994699479948994999509951995299539954995599569957995899599960996199629963996499659966996799689969997099719972997399749975997699779978997999809981998299839984998599869987998899899990999199929993999499959996999799989999100001000110002100031000410005100061000710008100091001010011100121001310014100151001610017100181001910020100211002210023100241002510026100271002810029100301003110032100331003410035100361003710038100391004010041100421004310044
  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-2016 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. PROJECT_WEBSITE="http://${PROJECT_NAME}.uk.to"
  39. # Repo
  40. PROJECT_REPO="https://github.com/bashrc/${PROJECT_NAME}"
  41. # Contact details
  42. PROJECT_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. # password used for accessing your repo trove
  74. MY_TROVE_PASSWORD=
  75. # friend's repo trove
  76. FRIENDS_TROVE_PASSWORD=
  77. FRIENDS_TROVE_SERVER=
  78. FRIENDS_TROVE_SSH_PORT=2222
  79. # This isn't used here, but is included for trove creation purposes
  80. LETSENCRYPT_REPO="https://github.com/letsencrypt/letsencrypt"
  81. # An optional password to log into IRC. This applies to all users
  82. IRC_PASSWORD=
  83. # If this file exists it contains a global password used with
  84. # disk image installs. This simplifies password management for
  85. # deployment at scale
  86. IMAGE_PASSWORD_FILE=/root/login.txt
  87. # parameters used when adding a new domain
  88. DDNS_PROVIDER="default@freedns.afraid.org"
  89. DDNS_USERNAME=
  90. DDNS_PASSWORD=
  91. CURRENT_DDNS_DOMAIN=
  92. EXIM_ONION_REPO="https://github.com/petterreinholdtsen/exim4-smtorp"
  93. NGINX_ENSITE_REPO="https://github.com/perusio/nginx_ensite"
  94. NGINX_ENSITE_COMMIT='fa4d72ce1c0a490442c8474e9c8dc21ed52c93d0'
  95. CLEANUP_MAILDIR_REPO="https://github.com/bashrc/cleanup-maildir"
  96. CLEANUP_MAILDIR_COMMIT='33241d2e3861f901ba17f5c77ada007e1ec06a86'
  97. INADYN_REPO="https://github.com/bashrc/inadyn"
  98. INADYN_COMMIT='fadbe17f520d337dfb8d69ee4bf1fcaa23fce0d6'
  99. # Minimum number of characters in a password
  100. MINIMUM_PASSWORD_LENGTH=10
  101. # number of CPU cores
  102. CPU_CORES=1
  103. # If the system is on an IPv6 network
  104. IPV6_NETWORK='2001:470:26:307'
  105. # The static IP address of the system within the local network
  106. # By default the IP address is dynamic within your LAN
  107. LOCAL_NETWORK_STATIC_IP_ADDRESS=
  108. # IP address of the router (gateway)
  109. ROUTER_IP_ADDRESS="192.168.1.254"
  110. # DNS
  111. NAMESERVER1='213.73.91.35'
  112. NAMESERVER2='85.214.20.141'
  113. # whether to route outgoing traffic through Tor
  114. ROUTE_THROUGH_TOR="no"
  115. # Why use Google as a time source?
  116. # The thinking here is that it's likely to be reliable and fast.
  117. # The ping doesn't reveal any information other than that the server
  118. # is running, and if anyone maliciously alters the time on Google's
  119. # servers then that would certainly be newsworthy and they'd be
  120. # likely to do something about it quickly.
  121. # If you have better time sources then change them here.
  122. TLS_TIME_SOURCE1="google.com"
  123. TLS_TIME_SOURCE2="www.ptb.de"
  124. # The type of hardware random number generator being used
  125. # This can be empty, "beaglebone" or "onerng"
  126. HWRNG_TYPE=
  127. # Download location for OneRNG driver
  128. ONERNG_PACKAGE="onerng_3.4-1_all.deb"
  129. ONERNG_PACKAGE_DOWNLOAD="https://github.com/OneRNG/onerng.github.io/blob/master/sw/$ONERNG_PACKAGE?raw=true"
  130. # Hash for OneRNG driver
  131. ONERNG_PACKAGE_HASH='78f1c2f52ae573e3b398a695ece7ab9f41868252657ea269f0d5cf0bd4f2eb59'
  132. # device name for OneRNG
  133. ONERNG_DEVICE='ttyACM0'
  134. # Whether this system is being installed within a docker container
  135. INSTALLED_WITHIN_DOCKER="no"
  136. # If you want to run a public mailing list specify its name here.
  137. # There should be no spaces in the name
  138. PUBLIC_MAILING_LIST=
  139. # Optional different domain name for the public mailing list
  140. PUBLIC_MAILING_LIST_DOMAIN_NAME=
  141. # Directory where the public mailing list data is stored
  142. PUBLIC_MAILING_LIST_DIRECTORY="/var/spool/mlmmj"
  143. # If you want to run an encrypted mailing list specify its name here.
  144. # There should be no spaces in the name
  145. PRIVATE_MAILING_LIST=
  146. # Domain name for mediagoblin installation
  147. MEDIAGOBLIN_DOMAIN_NAME=
  148. MEDIAGOBLIN_CODE=
  149. MEDIAGOBLIN_REPO="https://gitorious.org/mediagoblin/mediagoblin.git"
  150. MEDIAGOBLIN_ADMIN_PASSWORD=
  151. # Domain name for microblog installation
  152. MICROBLOG_DOMAIN_NAME=
  153. MICROBLOG_CODE=
  154. MICROBLOG_ONION_PORT=8087
  155. MICROBLOG_REPO="https://git.gnu.io/gnu/gnu-social.git"
  156. MICROBLOG_ADMIN_PASSWORD=
  157. GNUSOCIAL_COMMIT='94392ab00ceefec6105ac7d6e6846fb644bbd0f1'
  158. # Domain name for hubzilla installation
  159. HUBZILLA_DOMAIN_NAME=
  160. HUBZILLA_CODE=
  161. HUBZILLA_ONION_PORT=8085
  162. HUBZILLA_REPO="https://github.com/redmatrix/hubzilla.git"
  163. HUBZILLA_THEMES_REPO="https://github.com/DeadSuperHero/redmatrix-themes"
  164. HUBZILLA_ADDONS_REPO="https://github.com/redmatrix/hubzilla-addons.git"
  165. HUBZILLA_ADMIN_PASSWORD=
  166. HUBZILLA_COMMIT='761afd029d97703f2f7609d546b7b5f3d257c601'
  167. HUBZILLA_ADDONS_COMMIT='e32f98d65850a8681e8242f3db8b6484abb35c67'
  168. # Domain name for git hosting installation
  169. GIT_DOMAIN_NAME=
  170. GIT_CODE=
  171. GIT_ONION_PORT=8090
  172. GIT_DOMAIN_REPO="https://github.com/gogits/gogs.git"
  173. GIT_ADMIN_PASSWORD=
  174. GOGS_COMMIT='efea642d6cf419c9587d44b95ff2bc04e89f7bfe'
  175. GO_PACKAGE_MANAGER_REPO="https://github.com/gpmgo/gopm"
  176. # Domain name for Owncloud installation
  177. OWNCLOUD_DOMAIN_NAME=
  178. OWNCLOUD_CODE=
  179. OWNCLOUD_ONION_PORT=8088
  180. OWNCLOUD_ADMIN_PASSWORD=
  181. OWNCLOUD_MUSIC_APP_REPO="https://github.com/owncloud/music"
  182. OWNCLOUD_MUSIC_APP_COMMIT='7f79afb4ae9a6ecd8f530d87106f960306c0a15a'
  183. # Domain name for your wiki
  184. WIKI_DOMAIN_NAME=
  185. WIKI_ADMIN_PASSWORD=
  186. WIKI_TITLE="${PROJECT_NAME} Wiki"
  187. WIKI_CODE=
  188. WIKI_ONION_PORT=8089
  189. # Domain name for your blog
  190. FULLBLOG_DOMAIN_NAME=
  191. FULLBLOG_CODE=
  192. FULLBLOG_ONION_PORT=8086
  193. FULLBLOG_REPO="https://github.com/danpros/htmly"
  194. FULLBLOG_COMMIT='5f271a2370cc1bfde15f2a0d5ed6928cc74b0efa'
  195. MY_BLOG_TITLE="My Blog"
  196. MY_BLOG_SUBTITLE="Another ${PROJECT_NAME} Blog"
  197. GPG_KEYSERVER="hkp://keys.gnupg.net"
  198. # whether to encrypt all incoming email with your public key
  199. GPG_ENCRYPT_STORED_EMAIL="yes"
  200. # gets set to yes if gpg keys are imported from usb
  201. GPG_KEYS_IMPORTED="no"
  202. # optionally you can provide your exported GPG key pair here
  203. # Note that the private key file will be deleted after use
  204. # If these are unspecified then a new GPG key will be created
  205. MY_GPG_PUBLIC_KEY=
  206. MY_GPG_PRIVATE_KEY=
  207. # optionally specify your public key ID
  208. MY_GPG_PUBLIC_KEY_ID=
  209. # If you have existing mail within a Maildir
  210. # you can specify the directory here and the files
  211. # will be imported
  212. IMPORT_MAILDIR=
  213. # The Debian package repository to use.
  214. DEBIAN_REPO="ftp.us.debian.org"
  215. DEBIAN_VERSION="jessie"
  216. # Directory where source code is downloaded and compiled
  217. INSTALL_DIR=$HOME/build
  218. # device name for an attached usb drive
  219. USB_DRIVE=/dev/sda1
  220. # Location where the USB drive is mounted to
  221. USB_MOUNT=/mnt/usb
  222. # name of a script used to upgrade the system
  223. UPGRADE_SCRIPT_NAME="${PROJECT_NAME}-upgrade"
  224. # name of a script which keeps running processes going even if they crash
  225. WATCHDOG_SCRIPT_NAME="keepon"
  226. # Number of days to keep backups for
  227. BACKUP_MAX_DAYS=30
  228. # memory limit for php in MB
  229. MAX_PHP_MEMORY=64
  230. # default MariaDB password
  231. MARIADB_PASSWORD=
  232. # Directory where XMPP settings are stored
  233. XMPP_DIRECTORY="/var/lib/prosody"
  234. # file containing a list of remote locations to backup to
  235. # Format: [username@friendsdomain//home/username] [ssh_password]
  236. # With the only space character being between the server and the password
  237. FRIENDS_SERVERS_LIST=/home/$MY_USERNAME/backup.list
  238. # list of encryption protocols
  239. SSL_PROTOCOLS="TLSv1 TLSv1.1 TLSv1.2"
  240. # list of ciphers to use. See bettercrypto.org recommendations
  241. SSL_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"
  242. # ssh (from https://stribika.github.io/2015/01/04/secure-secure-shell.html)
  243. SSH_CIPHERS="chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com,aes256-ctr,aes192-ctr,aes128-ctr"
  244. 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"
  245. SSH_KEX="curve25519-sha256@libssh.org,diffie-hellman-group-exchange-sha256"
  246. 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"
  247. # xmpp ciphers and curve
  248. 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"'
  249. XMPP_ECC_CURVE='"secp384r1"'
  250. # the default email address
  251. MY_EMAIL_ADDRESS=$MY_USERNAME@$DEFAULT_DOMAIN_NAME
  252. # optionally specify your name to appear on the blog
  253. MY_NAME=$DEFAULT_DOMAIN_NAME
  254. export DEBIAN_FRONTEND=noninteractive
  255. # logging level for Nginx
  256. WEBSERVER_LOG_LEVEL='warn'
  257. # used to limit CPU usage
  258. CPULIMIT='/usr/bin/cpulimit -l 20 -e'
  259. # command to create a git repository
  260. CREATE_GIT_PROJECT_COMMAND='create-project'
  261. # File which keeps track of what has already been installed
  262. COMPLETION_FILE=$HOME/${PROJECT_NAME}-completed.txt
  263. # Used to indicate whether the backup contains MariaDB databases or not
  264. BACKUP_INCLUDES_DATABASES="no"
  265. # contains the mysql root password which
  266. # is used for backups and repair
  267. DATABASE_PASSWORD_FILE=/root/dbpass
  268. # log file where details of remote backups are stored
  269. REMOTE_BACKUPS_LOG=/var/log/remotebackups.log
  270. # message if something fails to install
  271. 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."
  272. # web site used to obtain the external IP address of the system
  273. GET_IP_ADDRESS_URL="checkip.two-dns.de"
  274. # Password used for VoIP server
  275. VOIP_SERVER_PASSWORD=
  276. # Port on which VoIP server listens
  277. VOIP_PORT=64738
  278. SIP_SERVER_PASSWORD=
  279. SIP_PORT=5060
  280. # Location of VoIP database and configuration
  281. VOIP_DATABASE="mumble-server.sqlite"
  282. VOIP_CONFIG_FILE="mumble-server.ini"
  283. # other possible services to obtain the external IP address
  284. EXTERNAL_IP_SERVICES=( \
  285. 'https://check.torproject.org/' \
  286. 'https://www.whatsmydns.net/whats-my-ip-address.html' \
  287. 'https://www.privateinternetaccess.com/pages/whats-my-ip/' \
  288. 'http://checkip.two-dns.de' \
  289. 'http://ip.dnsexit.com' \
  290. 'http://ifconfig.me/ip' \
  291. 'http://ipecho.net/plain' \
  292. 'http://checkip.dyndns.org/plain' \
  293. 'http://ipogre.com/linux.php' \
  294. 'http://whatismyipaddress.com/' \
  295. 'http://ip.my-proxy.com/' \
  296. 'http://websiteipaddress.com/WhatIsMyIp' \
  297. 'http://getmyipaddress.org/' \
  298. 'http://www.my-ip-address.net/' \
  299. 'http://myexternalip.com/raw' \
  300. 'http://www.canyouseeme.org/' \
  301. 'http://www.trackip.net/' \
  302. 'http://icanhazip.com/' \
  303. 'http://www.iplocation.net/' \
  304. 'http://www.howtofindmyipaddress.com/' \
  305. 'http://www.ipchicken.com/' \
  306. 'http://whatsmyip.net/' \
  307. 'http://www.ip-adress.com/' \
  308. 'http://checkmyip.com/' \
  309. 'http://www.tracemyip.org/' \
  310. 'http://checkmyip.net/' \
  311. 'http://www.lawrencegoetz.com/programs/ipinfo/' \
  312. 'http://www.findmyip.co/' \
  313. 'http://ip-lookup.net/' \
  314. 'http://www.dslreports.com/whois' \
  315. 'http://www.mon-ip.com/en/my-ip/' \
  316. 'http://www.myip.ru' \
  317. 'http://ipgoat.com/' \
  318. 'http://www.myipnumber.com/my-ip-address.asp' \
  319. 'http://www.whatsmyipaddress.net/' \
  320. 'http://formyip.com/' \
  321. 'http://www.displaymyip.com/' \
  322. 'http://www.bobborst.com/tools/whatsmyip/' \
  323. 'http://www.geoiptool.com/' \
  324. 'http://checkip.dyndns.com/' \
  325. 'http://myexternalip.com/' \
  326. 'http://www.ip-adress.eu/' \
  327. 'http://www.infosniper.net/' \
  328. 'http://wtfismyip.com/' \
  329. 'http://ipinfo.io/' \
  330. 'http://httpbin.org/ip')
  331. WIFI_CHANNEL=2
  332. WIFI_INTERFACE=wlan0
  333. # cjdns settings
  334. ENABLE_CJDNS="no"
  335. CJDNS_PRIVATE_KEY=
  336. CJDNS_PUBLIC_KEY=
  337. CJDNS_IPV6=
  338. CJDNS_PASSWORD=
  339. CJDNS_PORT=
  340. CJDNS_REPO="https://github.com/cjdelisle/cjdns.git"
  341. CJDNS_COMMIT='13189fde111d0500427a7a0ce06a970753527bca'
  342. CJDCMD_REPO="https://github.com/inhies/cjdcmd"
  343. CJDCMD_COMMIT='973cca6ed0eecf9041c3403a40193c0b1291b808'
  344. # B.A.T.M.A.N settings
  345. ENABLE_BATMAN="no"
  346. BATMAN_CELLID='any'
  347. ESSID='mesh'
  348. # Babel mesh
  349. ENABLE_BABEL="no"
  350. BABEL_PORT=6696
  351. # social key management
  352. ENABLE_SOCIAL_KEY_MANAGEMENT="no"
  353. TOX_PORT=33445
  354. TOX_REPO="git://github.com/irungentoo/toxcore.git"
  355. TOXID_REPO="https://github.com/bashrc/toxid"
  356. TOX_COMMIT='73b2144edcfd1ca617e9054479b66ab0c0361a14'
  357. TOX_BOOTSTRAP_ID_FILE=/var/lib/tox-bootstrapd/pubkey.txt
  358. # These are some default nodes, but you can replace them with trusted nodes
  359. # as you prefer. See https://wiki.tox.im/Nodes
  360. TOX_NODES=
  361. #TOX_NODES=(
  362. # '192.254.75.102,2607:5600:284::2,33445,951C88B7E75C867418ACDB5D273821372BB5BD652740BCDF623A4FA293E75D2F,Tox RELENG,US'
  363. # '144.76.60.215,2a01:4f8:191:64d6::1,33445,04119E835DF3E78BACF0F84235B300546AF8B936F035185E2A8E9E0A67C8924F,sonOfRa,DE'
  364. #)
  365. TOXIC_REPO="https://github.com/Tox/toxic"
  366. TOXIC_COMMIT='88270827a96b2082e254677f35585ed24581a42c'
  367. #ZERONET_REPO='https://github.com/HelloZeroNet/ZeroNet.git'
  368. ZERONET_REPO="https://github.com/HelloZeroNet/ZeroNet.git"
  369. ZERONET_COMMIT='675bd462556c541d65e2d95f91f899146a373aad'
  370. ZERONET_BLOG_REPO="https://github.com/HelloZeroNet/ZeroBlog"
  371. ZERONET_BLOG_COMMIT='bbb0d6c36465fed2e6df71f1aab45fcc9c6ad609'
  372. ZERONET_MAIL_REPO="https://github.com/HelloZeroNet/ZeroMail"
  373. ZERONET_MAIL_COMMIT='955af09d643c72b02e4983d71eca5c0c93a6c131'
  374. ZERONET_FORUM_REPO="https://github.com/HelloZeroNet/ZeroTalk"
  375. ZERONET_FORUM_COMMIT='e2d2c9cb1cfbfef91b244935efb5c14c2ad95faa'
  376. ZERONET_URL=http://127.0.0.1:43110
  377. ZERONET_PORT=15441
  378. TRACKER_PORT=6969
  379. ZERONET_DEFAULT_BLOG_TAGLINE="Blogging on the Mesh"
  380. ZERONET_DEFAULT_FORUM_TAGLINE="A decentralized discussion group"
  381. ZERONET_DEFAULT_MAIL_TAGLINE="Mail for the Mesh"
  382. # https://github.com/ipfs/go-ipfs
  383. IPFS_GO_REPO="https://github.com/ipfs/go-ipfs"
  384. IPFS_COMMIT='20b06a4cbce8884f5b194da6e98cb11f2c77f166'
  385. IPFS_PORT=4001
  386. GPGIT_REPO="https://github.com/mikecardwell/gpgit"
  387. GPGIT_COMMIT='583dc76119f19420f8a33f606744faa7c8922738'
  388. # Default diffie-hellman key length in bits
  389. DH_KEYLENGTH=2048
  390. # repo for atheros AR9271 wifi driver
  391. ATHEROS_WIFI_REPO="https://github.com/qca/open-ath9k-htc-firmware.git"
  392. # Whether Let's Encrypt is enabled for all sites
  393. LETSENCRYPT_ENABLED="no"
  394. LETSENCRYPT_SERVER='https://acme-v01.api.letsencrypt.org/directory'
  395. function show_help {
  396. echo ''
  397. echo $"${PROJECT_NAME} -c [configuration file]"
  398. echo ''
  399. echo $' -h --help Show help'
  400. echo $' menuconfig Easy interactive installation'
  401. echo $' menuconfig-full Full interactive installation'
  402. echo $' menuconfig-onion Interactive installation for onion-only sites'
  403. echo $' -c --config Installing from a configuration file'
  404. echo $' --bbb Installing on Beaglebone Black'
  405. echo $' -u --user User to install the system as'
  406. echo $' -d --domain Default domain name'
  407. echo $' -s --system System type'
  408. echo $' --ip Static LAN IP address of the system'
  409. echo $' --iprouter LAN IP address of the internet router'
  410. echo $' --ddns Dynamic DNS provider domain'
  411. echo $' --ddnsuser Dynamic DNS provider username'
  412. echo $' --ddnspass Dynamic DNS provider password'
  413. echo ''
  414. echo $' --microblogdomain Microblog domain name'
  415. echo $' --wikidomain Wiki domain name'
  416. echo $' --blogdomain Blog domain name'
  417. echo $' --ownclouddomain Owncloud domain name'
  418. echo $' --hubzilladomain Hubzilla domain name'
  419. echo $' --gitdomain Git hosting domain name'
  420. echo $' -t --time Domain used as a TLS time source'
  421. echo $' --ssh ssh port number'
  422. echo $' --list Public mailing list name'
  423. echo $' --cores Number of CPU cores'
  424. echo $' --name Your name'
  425. echo $' --email Your email address'
  426. echo $' --usb Path for the USB drive (eg. /dev/sdb1)'
  427. echo $' --cjdns Enable CJDNS'
  428. echo $' --vpass VoIP server password'
  429. echo $' --vport VoIP server port'
  430. echo $' --ns1 First DNS nameserver'
  431. echo $' --ns2 Second DNS nameserver'
  432. echo $' --repo Debian repository'
  433. echo ''
  434. echo $'system types'
  435. echo '------------'
  436. echo $'This can either be blank if you wish to install the full system,'
  437. echo $"or for more specialised variants you can specify '$VARIANT_MAILBOX', '$VARIANT_CLOUD',"
  438. echo $"'$VARIANT_CHAT', '$VARIANT_SOCIAL', '$VARIANT_MEDIA', '$VARIANT_WRITER', '$VARIANT_DEVELOPER'"
  439. echo $"or '$VARIANT_MESH'."
  440. echo ''
  441. echo $"If you wish to install everything except email then use the '$VARIANT_NONMAILBOX' variaint."
  442. echo ''
  443. exit 0
  444. }
  445. function git_clone {
  446. repo_url="$1"
  447. destination_dir="$2"
  448. if [[ "$repo_url" == "ssh:"* ]]; then
  449. if [ "${FRIENDS_TROVE_SERVER}" ]; then
  450. if [ ${#FRIENDS_TROVE_SERVER} -gt 2 ]; then
  451. if [ "$FRIENDS_TROVE_PASSWORD" ]; then
  452. if [ ${#FRIENDS_TROVE_PASSWORD} -gt 2 ]; then
  453. sshpass -p "$FRIENDS_TROVE_PASSWORD" git clone "$repo_url" "$destination_dir"
  454. return
  455. fi
  456. fi
  457. fi
  458. fi
  459. fi
  460. git clone "$repo_url" "$destination_dir"
  461. }
  462. function git_pull {
  463. if [ ! $1 ]; then
  464. echo $'git_pull no repo specified'
  465. fi
  466. git stash
  467. git remote set-url origin $1
  468. git checkout master
  469. if [ "${FRIENDS_TROVE_SERVER}" ]; then
  470. if [ ${#FRIENDS_TROVE_SERVER} -gt 2 ]; then
  471. if [ "$FRIENDS_TROVE_PASSWORD" ]; then
  472. if [ ${#FRIENDS_TROVE_PASSWORD} -gt 2 ]; then
  473. sshpass -p "$FRIENDS_TROVE_PASSWORD" git pull
  474. if [ $2 ]; then
  475. git checkout $2 -b $2
  476. fi
  477. return
  478. fi
  479. fi
  480. fi
  481. fi
  482. git pull
  483. if [ $2 ]; then
  484. git checkout $2 -b $2
  485. fi
  486. }
  487. function create_database {
  488. app_name="$1"
  489. app_admin_password="$2"
  490. if [ ! -d $INSTALL_DIR ]; then
  491. mkdir $INSTALL_DIR
  492. fi
  493. echo "create database ${app_name};
  494. CREATE USER '${app_name}admin'@'localhost' IDENTIFIED BY '${app_admin_password}';
  495. GRANT ALL PRIVILEGES ON ${app_name}.* TO '${app_name}admin'@'localhost';
  496. quit" > $INSTALL_DIR/batch.sql
  497. chmod 600 $INSTALL_DIR/batch.sql
  498. mysql -u root --password="$MARIADB_PASSWORD" < $INSTALL_DIR/batch.sql
  499. shred -zu $INSTALL_DIR/batch.sql
  500. }
  501. function locale_setup {
  502. if grep -Fxq "locale_setup" $COMPLETION_FILE; then
  503. return
  504. fi
  505. apt-get -y install locales locales-all debconf
  506. if [ ! "$DEFAULT_LANGUAGE" ]; then
  507. DEFAULT_LANGUAGE='en_GB.UTF-8'
  508. fi
  509. if [ ${#DEFAULT_LANGUAGE} -lt 2 ]; then
  510. DEFAULT_LANGUAGE='en_GB.UTF-8'
  511. fi
  512. update-locale LANG=${DEFAULT_LANGUAGE}
  513. update-locale LANGUAGE=${DEFAULT_LANGUAGE}
  514. update-locale LC_MESSAGES=${DEFAULT_LANGUAGE}
  515. update-locale LC_ALL=${DEFAULT_LANGUAGE}
  516. update-locale LC_CTYPE=${DEFAULT_LANGUAGE}
  517. echo 'locale_setup' >> $COMPLETION_FILE
  518. }
  519. function interactive_configuration_remote_backups {
  520. if [[ $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  521. return
  522. fi
  523. if [ ! -f /usr/local/bin/${PROJECT_NAME}-remote ]; then
  524. if [ ! -f /usr/bin/${PROJECT_NAME}-remote ]; then
  525. echo $"The command ${PROJECT_NAME}-remote was not found"
  526. exit 87354
  527. fi
  528. fi
  529. ${PROJECT_NAME}-remote -u $MY_USERNAME -l $FRIENDS_SERVERS_LIST -m $MINIMUM_PASSWORD_LENGTH -r yes
  530. if [ ! "$?" = "0" ]; then
  531. echo $'Command failed:'
  532. echo ''
  533. echo $" ${PROJECT_NAME}-remote -u $MY_USERNAME -l $FRIENDS_SERVERS_LIST -m $MINIMUM_PASSWORD_LENGTH -r yes"
  534. echo ''
  535. exit 65892
  536. fi
  537. }
  538. # test a domain name to see if it's valid
  539. function validate_domain_name {
  540. # count the number of dots in the domain name
  541. dots=${TEST_DOMAIN_NAME//[^.]}
  542. no_of_dots=${#dots}
  543. if (( $no_of_dots > 3 )); then
  544. 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"
  545. fi
  546. if (( $no_of_dots == 0 )); then
  547. 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"
  548. fi
  549. }
  550. function interactive_configuration {
  551. if [ ! -f /usr/local/bin/${PROJECT_NAME}-config ]; then
  552. if [ ! -f /usr/bin/${PROJECT_NAME}-config ]; then
  553. echo $"The command ${PROJECT_NAME}-config was not found"
  554. exit 63935
  555. fi
  556. fi
  557. if [ -f /tmp/meshuserdevice ]; then
  558. rm -f /tmp/meshuserdevice
  559. fi
  560. if [[ $ONION_ONLY == "no" ]]; then
  561. if [[ $MINIMAL_INSTALL == "no" ]]; then
  562. ${PROJECT_NAME}-config \
  563. -f $CONFIGURATION_FILE \
  564. -w $PROJECT_WEBSITE \
  565. -b $PROJECT_BITMESSAGE \
  566. -m $MINIMUM_PASSWORD_LENGTH
  567. else
  568. ${PROJECT_NAME}-config \
  569. -f $CONFIGURATION_FILE \
  570. -w $PROJECT_WEBSITE \
  571. -b $PROJECT_BITMESSAGE \
  572. -m $MINIMUM_PASSWORD_LENGTH \
  573. --minimal "yes"
  574. fi
  575. else
  576. ${PROJECT_NAME}-config \
  577. -f $CONFIGURATION_FILE \
  578. -w $PROJECT_WEBSITE \
  579. -b $PROJECT_BITMESSAGE \
  580. -m $MINIMUM_PASSWORD_LENGTH \
  581. --onion "yes"
  582. fi
  583. if [ -f /tmp/meshuserdevice ]; then
  584. # mesh network user device installation
  585. rm -f /tmp/meshuserdevice
  586. exit 0
  587. fi
  588. if [ ! "$?" = "0" ]; then
  589. echo $'Command failed:'
  590. echo ''
  591. echo $" ${PROJECT_NAME}-config -u $MY_USERNAME -f $CONFIGURATION_FILE -w $PROJECT_WEBSITE -b $PROJECT_BITMESSAGE -m $MINIMUM_PASSWORD_LENGTH --minimal [yes|no]"
  592. echo ''
  593. exit 73594
  594. fi
  595. if [[ $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  596. FRIENDS_SERVERS_LIST=/home/$MY_USERNAME/backup.list
  597. dialog --title $"Encrypted backup to other servers" \
  598. --backtitle $"${PROJECT_NAME} Configuration" \
  599. --defaultno \
  600. --yesno $"\nDo you wish to configure some remote backup locations?" 7 60
  601. sel=$?
  602. case $sel in
  603. 0) interactive_configuration_remote_backups;;
  604. esac
  605. fi
  606. }
  607. command_options=$1
  608. if [[ $command_options == "menuconfig-full" ]]; then
  609. MINIMAL_INSTALL="no"
  610. command_options="menuconfig"
  611. fi
  612. if [[ $command_options == "menuconfig-onion" ]]; then
  613. MINIMAL_INSTALL="yes"
  614. ONION_ONLY="yes"
  615. command_options="menuconfig"
  616. fi
  617. if [[ $command_options == "menuconfig" ]]; then
  618. interactive_configuration
  619. else
  620. while [[ $# > 1 ]]
  621. do
  622. key="$1"
  623. case $key in
  624. -h|--help)
  625. show_help
  626. ;;
  627. # load a configuration file
  628. -c|--config)
  629. shift
  630. CONFIGURATION_FILE="$1"
  631. INSTALLING_FROM_CONFIGURATION_FILE="yes"
  632. break
  633. ;;
  634. # username within /home
  635. -u|--user)
  636. shift
  637. MY_USERNAME="$1"
  638. ;;
  639. # microblog domain name
  640. --microblogdomain)
  641. shift
  642. MICROBLOG_DOMAIN_NAME="$1"
  643. ;;
  644. # wiki domain name
  645. --wikidomain)
  646. shift
  647. WIKI_DOMAIN_NAME="$1"
  648. ;;
  649. # blog domain name
  650. --blogdomain)
  651. shift
  652. FULLBLOG_DOMAIN_NAME="$1"
  653. ;;
  654. # owncloud domain name
  655. --ownclouddomain)
  656. shift
  657. OWNCLOUD_DOMAIN_NAME="$1"
  658. ;;
  659. # hubzilla domain name
  660. --hubzilladomain)
  661. shift
  662. HUBZILLA_DOMAIN_NAME="$1"
  663. ;;
  664. # git hosting domain name
  665. --gitdomain)
  666. shift
  667. GIT_DOMAIN_NAME="$1"
  668. ;;
  669. # default domain name
  670. -d|--domain)
  671. shift
  672. DEFAULT_DOMAIN_NAME="$1"
  673. ;;
  674. # The type of system
  675. -s|--system)
  676. shift
  677. SYSTEM_TYPE="$1"
  678. ;;
  679. # The dynamic DNS provider
  680. --ddns)
  681. shift
  682. DDNS_PROVIDER="$1"
  683. ;;
  684. # Username for the synamic DNS provider
  685. --ddnsuser)
  686. shift
  687. DDNS_USERNAME="$1"
  688. ;;
  689. # Password for the synamic DNS provider
  690. --ddnspass)
  691. shift
  692. DDNS_PASSWORD="$1"
  693. ;;
  694. # Whether this installation is on a Beaglebone Black
  695. --bbb)
  696. INSTALLING_ON_BBB="yes"
  697. ;;
  698. # Domain name to use as a TLS time source
  699. -t|--time)
  700. shift
  701. TLS_TIME_SOURCE1="$1"
  702. ;;
  703. # Static IP address for the system
  704. --ip)
  705. shift
  706. LOCAL_NETWORK_STATIC_IP_ADDRESS=$1
  707. ;;
  708. # IP address for the internet router
  709. --iprouter)
  710. shift
  711. ROUTER_IP_ADDRESS=$1
  712. ;;
  713. # ssh port
  714. --ssh)
  715. shift
  716. SSH_PORT=$1
  717. ;;
  718. # public mailing list name
  719. --list)
  720. shift
  721. PUBLIC_MAILING_LIST="$1"
  722. ;;
  723. # Number of CPU cores
  724. --cores)
  725. shift
  726. CPU_CORES=$1
  727. ;;
  728. # my name
  729. --name)
  730. shift
  731. MY_NAME="$1"
  732. ;;
  733. # my email address
  734. --email)
  735. shift
  736. MY_EMAIL_ADDRESS="$1"
  737. ;;
  738. # USB drive
  739. --usb)
  740. shift
  741. USB_DRIVE=$1
  742. ;;
  743. # Enable CJDNS
  744. --cjdns)
  745. shift
  746. ENABLE_CJDNS="yes"
  747. ;;
  748. # Enable B.A.T.M.A.N
  749. --batman)
  750. shift
  751. ENABLE_BATMAN="yes"
  752. ;;
  753. # Enable Babel
  754. --babel)
  755. shift
  756. ENABLE_BABEL="yes"
  757. ;;
  758. # VoIP server password
  759. --vpass)
  760. shift
  761. VOIP_SERVER_PASSWORD=$1
  762. ;;
  763. # VoIP server port
  764. --vport)
  765. shift
  766. VOIP_PORT=$1
  767. ;;
  768. # DNS Nameserver 1
  769. --ns1)
  770. shift
  771. NAMESERVER1=$1
  772. ;;
  773. # DNS Nameserver 2
  774. --ns2)
  775. shift
  776. NAMESERVER2=$1
  777. ;;
  778. # Debian repository
  779. --repo)
  780. shift
  781. DEBIAN_REPO=$1
  782. ;;
  783. # minimal install
  784. --minimal)
  785. shift
  786. MINIMAL_INSTALL=$1
  787. ;;
  788. *)
  789. # unknown option
  790. ;;
  791. esac
  792. shift
  793. done
  794. fi
  795. function parse_args {
  796. if [[ $NO_OF_ARGS == 0 ]]; then
  797. echo 'no_of_args = 0'
  798. show_help
  799. exit 0
  800. fi
  801. if [ ! -d /home/$MY_USERNAME ]; then
  802. echo $"There is no user '$MY_USERNAME' on the system. Use 'adduser $MY_USERNAME' to create the user."
  803. exit 1
  804. fi
  805. if [ ! "$DEFAULT_DOMAIN_NAME" ]; then
  806. if [[ $SYSTEM_TYPE != "$VARIANT_MESH" ]]; then
  807. echo 'No default domain specified'
  808. show_help
  809. exit 2
  810. fi
  811. fi
  812. if [ ! $MY_USERNAME ]; then
  813. echo 'No username specified'
  814. show_help
  815. exit 3
  816. fi
  817. if [[ $SYSTEM_TYPE != "$VARIANT_MESH" ]]; then
  818. if [[ $ONION_ONLY == "no" ]]; then
  819. if [ ! $DDNS_USERNAME ]; then
  820. echo $'Please provide the username for your dynamic DNS provider with the --ddnsuser option'
  821. exit 7823
  822. fi
  823. if [ ! $DDNS_PASSWORD ]; then
  824. echo $'Please provide the password for your dynamic DNS provider with the --ddnspass option'
  825. exit 6382
  826. fi
  827. fi
  828. fi
  829. if [ ! $SYSTEM_TYPE ]; then
  830. SYSTEM_TYPE=$VARIANT_FULL
  831. fi
  832. 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
  833. echo $"'$SYSTEM_TYPE' is an unrecognised ${PROJECT_NAME} variant."
  834. exit 30
  835. fi
  836. }
  837. function read_repo_servers {
  838. if [ -f $CONFIGURATION_FILE ]; then
  839. if grep -q "FRIENDS_TROVE_SERVER" $CONFIGURATION_FILE; then
  840. FRIENDS_TROVE_SERVER=$(grep "FRIENDS_TROVE_SERVER" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  841. fi
  842. if grep -q "FRIENDS_TROVE_SSH_PORT" $CONFIGURATION_FILE; then
  843. FRIENDS_TROVE_SSH_PORT=$(grep "FRIENDS_TROVE_SSH_PORT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  844. fi
  845. if grep -q "MY_TROVE_PASSWORD" $CONFIGURATION_FILE; then
  846. MY_TROVE_PASSWORD=$(grep "MY_TROVE_PASSWORD" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  847. fi
  848. if grep -q "FRIENDS_TROVE_PASSWORD" $CONFIGURATION_FILE; then
  849. FRIENDS_TROVE_PASSWORD=$(grep "FRIENDS_TROVE_PASSWORD" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  850. fi
  851. fi
  852. if [ ! $FRIENDS_TROVE_SERVER ]; then
  853. return
  854. fi
  855. if [ ${#FRIENDS_TROVE_SERVER} -lt 2 ]; then
  856. return
  857. fi
  858. MAIN_COMMAND=/usr/local/bin/${PROJECT_NAME}
  859. if [ ! -f $MAIN_COMMAND ]; then
  860. MAIN_COMMAND=/usr/bin/${PROJECT_NAME}
  861. fi
  862. REPOS=($(cat ${MAIN_COMMAND} | grep "_REPO=\"" | uniq -u | sed 's|${PROJECT_NAME}|'"${PROJECT_NAME}"'|g'))
  863. for line in "${REPOS[@]}"
  864. do
  865. repo_name=$(echo "$line" | awk -F '=' '{print $1}')
  866. trove_name=$(echo "$repo_name" | sed "s|_REPO||g" | awk '{print tolower($0)}')
  867. friends_repo_url="ssh://trove@${FRIENDS_TROVE_SERVER}:${FRIENDS_TROVE_SSH_PORT}/home/trove/${trove_name}"
  868. ${repo_name}="${friends_repo_url}"
  869. done
  870. }
  871. function read_configuration {
  872. # if not installing on a Beaglebone then use sdb as the USB drive by default
  873. if [ ! $INSTALLING_ON_BBB ]; then
  874. if [[ $USB_DRIVE == /dev/sda1 ]]; then
  875. USB_DRIVE=/dev/sdb1
  876. fi
  877. fi
  878. if [[ $INSTALLING_FROM_CONFIGURATION_FILE == "yes" ]]; then
  879. if [ ! -f $CONFIGURATION_FILE ]; then
  880. echo $"The configuration file $CONFIGURATION_FILE was not found"
  881. exit 8935
  882. fi
  883. fi
  884. if [ -f $CONFIGURATION_FILE ]; then
  885. read_repo_servers
  886. # Ensure that a copy of the config exists for upgrade purposes
  887. if [[ $CONFIGURATION_FILE != "/root/${PROJECT_NAME}.cfg" ]]; then
  888. cp $CONFIGURATION_FILE /root/${PROJECT_NAME}.cfg
  889. fi
  890. if grep -q "PROJECT_WEBSITE" $CONFIGURATION_FILE; then
  891. PROJECT_WEBSITE=$(grep "PROJECT_WEBSITE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  892. fi
  893. if grep -q "PROJECT_REPO" $CONFIGURATION_FILE; then
  894. PROJECT_REPO=$(grep "PROJECT_REPO" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  895. fi
  896. if grep -q "ONION_ONLY" $CONFIGURATION_FILE; then
  897. ONION_ONLY=$(grep "ONION_ONLY" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  898. fi
  899. if grep -q "IRC_PASSWORD" $CONFIGURATION_FILE; then
  900. IRC_PASSWORD=$(grep "IRC_PASSWORD" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  901. fi
  902. if grep -q "DEFAULT_LANGUAGE" $CONFIGURATION_FILE; then
  903. DEFAULT_LANGUAGE=$(grep "DEFAULT_LANGUAGE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  904. fi
  905. if grep -q "MINIMAL_INSTALL" $CONFIGURATION_FILE; then
  906. MINIMAL_INSTALL=$(grep "MINIMAL_INSTALL" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  907. fi
  908. if grep -q "LETSENCRYPT_SERVER" $CONFIGURATION_FILE; then
  909. LETSENCRYPT_SERVER=$(grep "LETSENCRYPT_SERVER" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  910. fi
  911. if grep -q "FULLBLOG_REPO" $CONFIGURATION_FILE; then
  912. FULLBLOG_REPO=$(grep "FULLBLOG_REPO" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  913. fi
  914. if grep -q "FULLBLOG_COMMIT" $CONFIGURATION_FILE; then
  915. FULLBLOG_COMMIT=$(grep "FULLBLOG_COMMIT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  916. fi
  917. if grep -q "GOGS_COMMIT" $CONFIGURATION_FILE; then
  918. GOGS_COMMIT=$(grep "GOGS_COMMIT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  919. fi
  920. if grep -q "TOX_COMMIT" $CONFIGURATION_FILE; then
  921. TOX_COMMIT=$(grep "TOX_COMMIT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  922. fi
  923. if grep -q "TOXIC_COMMIT" $CONFIGURATION_FILE; then
  924. TOXIC_COMMIT=$(grep "TOXIC_COMMIT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  925. fi
  926. if grep -q "GPGIT_REPO" $CONFIGURATION_FILE; then
  927. GPGIT_REPO=$(grep "GPGIT_REPO" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  928. fi
  929. if grep -q "GPGIT_COMMIT" $CONFIGURATION_FILE; then
  930. GPGIT_COMMIT=$(grep "GPGIT_COMMIT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  931. fi
  932. if grep -q "OWNCLOUD_MUSIC_APP_COMMIT" $CONFIGURATION_FILE; then
  933. OWNCLOUD_MUSIC_APP_COMMIT=$(grep "OWNCLOUD_MUSIC_APP_COMMIT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  934. fi
  935. if grep -q "HUBZILLA_REPO" $CONFIGURATION_FILE; then
  936. HUBZILLA_REPO=$(grep "HUBZILLA_REPO" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  937. fi
  938. if grep -q "HUBZILLA_COMMIT" $CONFIGURATION_FILE; then
  939. HUBZILLA_COMMIT=$(grep "HUBZILLA_COMMIT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  940. fi
  941. if grep -q "IPFS_COMMIT" $CONFIGURATION_FILE; then
  942. IPFS_COMMIT=$(grep "IPFS_COMMIT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  943. fi
  944. if grep -q "ZERONET_BLOG_COMMIT" $CONFIGURATION_FILE; then
  945. ZERONET_BLOG_COMMIT=$(grep "ZERONET_BLOG_COMMIT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  946. fi
  947. if grep -q "ZERONET_MAIL_COMMIT" $CONFIGURATION_FILE; then
  948. ZERONET_MAIL_COMMIT=$(grep "ZERONET_MAIL_COMMIT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  949. fi
  950. if grep -q "ZERONET_FORUM_COMMIT" $CONFIGURATION_FILE; then
  951. ZERONET_FORUM_COMMIT=$(grep "ZERONET_FORUM_COMMIT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  952. fi
  953. if grep -q "GNUSOCIAL_COMMIT" $CONFIGURATION_FILE; then
  954. GNUSOCIAL_COMMIT=$(grep "GNUSOCIAL_COMMIT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  955. fi
  956. if grep -q "NGINX_ENSITE_REPO" $CONFIGURATION_FILE; then
  957. NGINX_ENSITE_REPO=$(grep "NGINX_ENSITE_REPO" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  958. fi
  959. if grep -q "NGINX_ENSITE_COMMIT" $CONFIGURATION_FILE; then
  960. NGINX_ENSITE_COMMIT=$(grep "NGINX_ENSITE_COMMIT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  961. fi
  962. if grep -q "CLEANUP_MAILDIR_COMMIT" $CONFIGURATION_FILE; then
  963. CLEANUP_MAILDIR_COMMIT=$(grep "CLEANUP_MAILDIR_COMMIT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  964. fi
  965. if grep -q "CLEANUP_MAILDIR_REPO" $CONFIGURATION_FILE; then
  966. CLEANUP_MAILDIR_REPO=$(grep "CLEANUP_MAILDIR_REPO" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  967. fi
  968. if grep -q "ZERONET_COMMIT" $CONFIGURATION_FILE; then
  969. ZERONET_COMMIT=$(grep "ZERONET_COMMIT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  970. fi
  971. if grep -q "INADYN_REPO" $CONFIGURATION_FILE; then
  972. INADYN_REPO=$(grep "INADYN_REPO" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  973. fi
  974. if grep -q "INADYN_COMMIT" $CONFIGURATION_FILE; then
  975. INADYN_COMMIT=$(grep "INADYN_COMMIT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  976. fi
  977. if grep -q "GPG_KEYSERVER" $CONFIGURATION_FILE; then
  978. GPG_KEYSERVER=$(grep "GPG_KEYSERVER" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  979. fi
  980. if grep -q "IPFS_PORT" $CONFIGURATION_FILE; then
  981. IPFS_PORT=$(grep "IPFS_PORT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  982. fi
  983. if grep -q "TRACKER_PORT" $CONFIGURATION_FILE; then
  984. TRACKER_PORT=$(grep "TRACKER_PORT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  985. fi
  986. if grep -q "ZERONET_PORT" $CONFIGURATION_FILE; then
  987. ZERONET_PORT=$(grep "ZERONET_PORT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  988. fi
  989. if grep -q "DH_KEYLENGTH" $CONFIGURATION_FILE; then
  990. DH_KEYLENGTH=$(grep "DH_KEYLENGTH" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  991. fi
  992. if grep -q "WIFI_INTERFACE" $CONFIGURATION_FILE; then
  993. WIFI_INTERFACE=$(grep "WIFI_INTERFACE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  994. fi
  995. if grep -q "IRC_PORT" $CONFIGURATION_FILE; then
  996. IRC_PORT=$(grep "IRC_PORT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  997. fi
  998. if grep -q "WIFI_CHANNEL" $CONFIGURATION_FILE; then
  999. WIFI_CHANNEL=$(grep "WIFI_CHANNEL" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1000. fi
  1001. if grep -q "BATMAN_CELLID" $CONFIGURATION_FILE; then
  1002. BATMAN_CELLID=$(grep "BATMAN_CELLID" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1003. fi
  1004. if grep -q "ESSID" $CONFIGURATION_FILE; then
  1005. ESSID=$(grep "ESSID" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1006. fi
  1007. if grep -q "TOX_PORT" $CONFIGURATION_FILE; then
  1008. TOX_PORT=$(grep "TOX_PORT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1009. fi
  1010. if grep -q "TOX_NODES" $CONFIGURATION_FILE; then
  1011. TOX_NODES=$(grep "TOX_NODES" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1012. fi
  1013. if grep -q "TOX_REPO" $CONFIGURATION_FILE; then
  1014. TOX_REPO=$(grep "TOX_REPO" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1015. fi
  1016. if grep -q "ENABLE_SOCIAL_KEY_MANAGEMENT" $CONFIGURATION_FILE; then
  1017. ENABLE_SOCIAL_KEY_MANAGEMENT=$(grep "ENABLE_SOCIAL_KEY_MANAGEMENT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1018. fi
  1019. if grep -q "IPV6_NETWORK" $CONFIGURATION_FILE; then
  1020. IPV6_NETWORK=$(grep "IPV6_NETWORK" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1021. fi
  1022. if grep -q "HWRNG_TYPE" $CONFIGURATION_FILE; then
  1023. HWRNG_TYPE=$(grep "HWRNG_TYPE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1024. fi
  1025. if grep -q "MEDIAGOBLIN_DOMAIN_NAME" $CONFIGURATION_FILE; then
  1026. MEDIAGOBLIN_DOMAIN_NAME=$(grep "MEDIAGOBLIN_DOMAIN_NAME" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1027. fi
  1028. if grep -q "MEDIAGOBLIN_CODE" $CONFIGURATION_FILE; then
  1029. MEDIAGOBLIN_CODE=$(grep "MEDIAGOBLIN_CODE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1030. fi
  1031. if grep -q "GIT_ADMIN_PASSWORD" $CONFIGURATION_FILE; then
  1032. GIT_ADMIN_PASSWORD=$(grep "GIT_ADMIN_PASSWORD" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1033. fi
  1034. if grep -q "GIT_DOMAIN_NAME" $CONFIGURATION_FILE; then
  1035. GIT_DOMAIN_NAME=$(grep "GIT_DOMAIN_NAME" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1036. fi
  1037. if grep -q "GIT_CODE" $CONFIGURATION_FILE; then
  1038. GIT_CODE=$(grep "GIT_CODE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1039. fi
  1040. if grep -q "SYSTEM_TYPE" $CONFIGURATION_FILE; then
  1041. SYSTEM_TYPE=$(grep "SYSTEM_TYPE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1042. fi
  1043. if grep -q "SSL_PROTOCOLS" $CONFIGURATION_FILE; then
  1044. SSL_PROTOCOLS=$(grep "SSL_PROTOCOLS" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1045. fi
  1046. if grep -q "SSL_CIPHERS" $CONFIGURATION_FILE; then
  1047. SSL_CIPHERS=$(grep "SSL_CIPHERS" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1048. fi
  1049. if grep -q "SSH_CIPHERS" $CONFIGURATION_FILE; then
  1050. SSH_CIPHERS=$(grep "SSH_CIPHERS" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1051. fi
  1052. if grep -q "SSH_MACS" $CONFIGURATION_FILE; then
  1053. SSH_MACS=$(grep "SSH_MACS" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1054. fi
  1055. if grep -q "SSH_KEX" $CONFIGURATION_FILE; then
  1056. SSH_KEX=$(grep "SSH_KEX" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1057. fi
  1058. if grep -q "SSH_HOST_KEY_ALGORITHMS" $CONFIGURATION_FILE; then
  1059. SSH_HOST_KEY_ALGORITHMS=$(grep "SSH_HOST_KEY_ALGORITHMS" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1060. fi
  1061. if grep -q "SSH_PASSWORDS" $CONFIGURATION_FILE; then
  1062. SSH_PASSWORDS=$(grep "SSH_PASSWORDS" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1063. fi
  1064. if grep -q "XMPP_CIPHERS" $CONFIGURATION_FILE; then
  1065. XMPP_CIPHERS=$(grep "XMPP_CIPHERS" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1066. fi
  1067. if grep -q "XMPP_ECC_CURVE" $CONFIGURATION_FILE; then
  1068. XMPP_ECC_CURVE=$(grep "XMPP_ECC_CURVE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1069. fi
  1070. if grep -q "MY_USERNAME" $CONFIGURATION_FILE; then
  1071. MY_USERNAME=$(grep "MY_USERNAME" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1072. fi
  1073. if grep -q "DOMAIN_NAME" $CONFIGURATION_FILE; then
  1074. # for backwards compatability
  1075. DEFAULT_DOMAIN_NAME=$(grep "DOMAIN_NAME" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1076. fi
  1077. if grep -q "DEFAULT_DOMAIN_NAME" $CONFIGURATION_FILE; then
  1078. DEFAULT_DOMAIN_NAME=$(grep "DEFAULT_DOMAIN_NAME" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1079. fi
  1080. if grep -q "DEFAULT_DOMAIN_CODE" $CONFIGURATION_FILE; then
  1081. DEFAULT_DOMAIN_CODE=$(grep "DEFAULT_DOMAIN_CODE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1082. fi
  1083. if grep -q "NAMESERVER1" $CONFIGURATION_FILE; then
  1084. NAMESERVER1=$(grep "NAMESERVER1" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1085. fi
  1086. if grep -q "NAMESERVER2" $CONFIGURATION_FILE; then
  1087. NAMESERVER2=$(grep "NAMESERVER2" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1088. fi
  1089. if grep -q "DEBIAN_REPO" $CONFIGURATION_FILE; then
  1090. DEBIAN_REPO=$(grep "DEBIAN_REPO" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1091. 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."
  1092. fi
  1093. if grep -q "VOIP_PORT" $CONFIGURATION_FILE; then
  1094. VOIP_PORT=$(grep "VOIP_PORT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1095. fi
  1096. if grep -q "VOIP_SERVER_PASSWORD" $CONFIGURATION_FILE; then
  1097. VOIP_SERVER_PASSWORD=$(grep "VOIP_SERVER_PASSWORD" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1098. fi
  1099. if grep -q "SIP_PORT" $CONFIGURATION_FILE; then
  1100. SIP_PORT=$(grep "SIP_PORT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1101. fi
  1102. if grep -q "SIP_SERVER_PASSWORD" $CONFIGURATION_FILE; then
  1103. SIP_SERVER_PASSWORD=$(grep "SIP_SERVER_PASSWORD" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1104. fi
  1105. if grep -q "GET_IP_ADDRESS_URL" $CONFIGURATION_FILE; then
  1106. GET_IP_ADDRESS_URL=$(grep "GET_IP_ADDRESS_URL" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1107. fi
  1108. if grep -q "DDNS_PROVIDER" $CONFIGURATION_FILE; then
  1109. DDNS_PROVIDER=$(grep "DDNS_PROVIDER" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1110. fi
  1111. if grep -q "DDNS_USERNAME" $CONFIGURATION_FILE; then
  1112. DDNS_USERNAME=$(grep "DDNS_USERNAME" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1113. fi
  1114. if grep -q "DDNS_PASSWORD" $CONFIGURATION_FILE; then
  1115. DDNS_PASSWORD=$(grep "DDNS_PASSWORD" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1116. fi
  1117. if grep -q "LOCAL_NETWORK_STATIC_IP_ADDRESS" $CONFIGURATION_FILE; then
  1118. LOCAL_NETWORK_STATIC_IP_ADDRESS=$(grep "LOCAL_NETWORK_STATIC_IP_ADDRESS" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1119. fi
  1120. if grep -q "ENABLE_BABEL" $CONFIGURATION_FILE; then
  1121. ENABLE_BABEL=$(grep "ENABLE_BABEL" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1122. fi
  1123. if grep -q "ENABLE_BATMAN" $CONFIGURATION_FILE; then
  1124. ENABLE_BATMAN=$(grep "ENABLE_BATMAN" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1125. fi
  1126. if grep -q "ENABLE_CJDNS" $CONFIGURATION_FILE; then
  1127. ENABLE_CJDNS=$(grep "ENABLE_CJDNS" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1128. fi
  1129. if grep -q "CJDNS_COMMIT" $CONFIGURATION_FILE; then
  1130. CJDNS_COMMIT=$(grep "CJDNS_COMMIT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1131. fi
  1132. if grep -q "CJDNS_IPV6" $CONFIGURATION_FILE; then
  1133. CJDNS_IPV6=$(grep "CJDNS_IPV6" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1134. fi
  1135. if grep -q "CJDNS_PUBLIC_KEY" $CONFIGURATION_FILE; then
  1136. CJDNS_PUBLIC_KEY=$(grep "CJDNS_PUBLIC_KEY" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1137. fi
  1138. if grep -q "CJDNS_PRIVATE_KEY" $CONFIGURATION_FILE; then
  1139. CJDNS_PRIVATE_KEY=$(grep "CJDNS_PRIVATE_KEY" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1140. fi
  1141. if grep -q "ROUTER_IP_ADDRESS" $CONFIGURATION_FILE; then
  1142. ROUTER_IP_ADDRESS=$(grep "ROUTER_IP_ADDRESS" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1143. fi
  1144. if grep -q "CPU_CORES" $CONFIGURATION_FILE; then
  1145. CPU_CORES=$(grep "CPU_CORES" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1146. fi
  1147. if grep -q "WEBSERVER_LOG_LEVEL" $CONFIGURATION_FILE; then
  1148. WEBSERVER_LOG_LEVEL=$(grep "WEBSERVER_LOG_LEVEL" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1149. fi
  1150. if grep -q "ROUTE_THROUGH_TOR" $CONFIGURATION_FILE; then
  1151. ROUTE_THROUGH_TOR=$(grep "ROUTE_THROUGH_TOR" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1152. fi
  1153. if grep -q "WIKI_TITLE" $CONFIGURATION_FILE; then
  1154. WIKI_TITLE=$(grep "WIKI_TITLE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1155. fi
  1156. if grep -q "MY_NAME" $CONFIGURATION_FILE; then
  1157. MY_NAME=$(grep "MY_NAME" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1158. fi
  1159. if grep -q "MY_EMAIL_ADDRESS" $CONFIGURATION_FILE; then
  1160. MY_EMAIL_ADDRESS=$(grep "MY_EMAIL_ADDRESS" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1161. fi
  1162. if grep -q "INSTALLING_ON_BBB" $CONFIGURATION_FILE; then
  1163. INSTALLING_ON_BBB=$(grep "INSTALLING_ON_BBB" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1164. fi
  1165. if grep -q "SSH_PORT" $CONFIGURATION_FILE; then
  1166. SSH_PORT=$(grep "SSH_PORT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1167. fi
  1168. if grep -q "INSTALLED_WITHIN_DOCKER" $CONFIGURATION_FILE; then
  1169. INSTALLED_WITHIN_DOCKER=$(grep "INSTALLED_WITHIN_DOCKER" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1170. fi
  1171. if grep -q "PUBLIC_MAILING_LIST" $CONFIGURATION_FILE; then
  1172. PUBLIC_MAILING_LIST=$(grep "PUBLIC_MAILING_LIST" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1173. fi
  1174. if grep -q "MICROBLOG_DOMAIN_NAME" $CONFIGURATION_FILE; then
  1175. MICROBLOG_DOMAIN_NAME=$(grep "MICROBLOG_DOMAIN_NAME" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1176. fi
  1177. if grep -q "MICROBLOG_CODE" $CONFIGURATION_FILE; then
  1178. MICROBLOG_CODE=$(grep "MICROBLOG_CODE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1179. fi
  1180. if grep -q "HUBZILLA_DOMAIN_NAME" $CONFIGURATION_FILE; then
  1181. HUBZILLA_DOMAIN_NAME=$(grep "HUBZILLA_DOMAIN_NAME" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1182. fi
  1183. if grep -q "HUBZILLA_CODE" $CONFIGURATION_FILE; then
  1184. HUBZILLA_CODE=$(grep "HUBZILLA_CODE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1185. fi
  1186. if grep -q "OWNCLOUD_DOMAIN_NAME" $CONFIGURATION_FILE; then
  1187. OWNCLOUD_DOMAIN_NAME=$(grep "OWNCLOUD_DOMAIN_NAME" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1188. fi
  1189. if grep -q "OWNCLOUD_CODE" $CONFIGURATION_FILE; then
  1190. OWNCLOUD_CODE=$(grep "OWNCLOUD_CODE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1191. fi
  1192. if grep -q "WIKI_DOMAIN_NAME" $CONFIGURATION_FILE; then
  1193. WIKI_DOMAIN_NAME=$(grep "WIKI_DOMAIN_NAME" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1194. fi
  1195. if grep -q "WIKI_CODE" $CONFIGURATION_FILE; then
  1196. WIKI_CODE=$(grep "WIKI_CODE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1197. fi
  1198. if grep -q "FULLBLOG_DOMAIN_NAME" $CONFIGURATION_FILE; then
  1199. FULLBLOG_DOMAIN_NAME=$(grep "FULLBLOG_DOMAIN_NAME" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1200. fi
  1201. if grep -q "FULLBLOG_CODE" $CONFIGURATION_FILE; then
  1202. FULLBLOG_CODE=$(grep "FULLBLOG_CODE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1203. fi
  1204. if grep -q "MY_BLOG_TITLE" $CONFIGURATION_FILE; then
  1205. MY_BLOG_TITLE=$(grep "MY_BLOG_TITLE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1206. fi
  1207. if grep -q "MY_BLOG_SUBTITLE" $CONFIGURATION_FILE; then
  1208. MY_BLOG_SUBTITLE=$(grep "MY_BLOG_SUBTITLE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1209. fi
  1210. if grep -q "GPG_ENCRYPT_STORED_EMAIL" $CONFIGURATION_FILE; then
  1211. GPG_ENCRYPT_STORED_EMAIL=$(grep "GPG_ENCRYPT_STORED_EMAIL" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1212. fi
  1213. if grep -q "MY_GPG_PUBLIC_KEY" $CONFIGURATION_FILE; then
  1214. MY_GPG_PUBLIC_KEY=$(grep "MY_GPG_PUBLIC_KEY" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1215. fi
  1216. if grep -q "MY_GPG_PRIVATE_KEY" $CONFIGURATION_FILE; then
  1217. MY_GPG_PRIVATE_KEY=$(grep "MY_GPG_PRIVATE_KEY" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1218. fi
  1219. if grep -q "MY_GPG_PUBLIC_KEY_ID" $CONFIGURATION_FILE; then
  1220. MY_GPG_PUBLIC_KEY_ID=$(grep "MY_GPG_PUBLIC_KEY_ID" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1221. fi
  1222. if grep -q "USB_DRIVE" $CONFIGURATION_FILE; then
  1223. USB_DRIVE=$(grep "USB_DRIVE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1224. fi
  1225. if grep -q "MAX_PHP_MEMORY" $CONFIGURATION_FILE; then
  1226. MAX_PHP_MEMORY=$(grep "MAX_PHP_MEMORY" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1227. fi
  1228. if grep -q "TLS_TIME_SOURCE1" $CONFIGURATION_FILE; then
  1229. TLS_TIME_SOURCE1=$(grep "TLS_TIME_SOURCE1" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1230. fi
  1231. if grep -q "TLS_TIME_SOURCE2" $CONFIGURATION_FILE; then
  1232. TLS_TIME_SOURCE2=$(grep "TLS_TIME_SOURCE2" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1233. fi
  1234. fi
  1235. echo "System type: $SYSTEM_TYPE"
  1236. }
  1237. function set_default_onion_domains {
  1238. # If sites are only visible via Tor then for installation
  1239. # purposes assign them some default domain names
  1240. if [[ $ONION_ONLY == "no" ]]; then
  1241. return
  1242. fi
  1243. if [ $OWNCLOUD_DOMAIN_NAME ]; then
  1244. OWNCLOUD_DOMAIN_NAME='owncloud.local'
  1245. fi
  1246. if [ $MICROBLOG_DOMAIN_NAME ]; then
  1247. MICROBLOG_DOMAIN_NAME='microblog.local'
  1248. fi
  1249. if [ $FULLBLOG_DOMAIN_NAME ]; then
  1250. FULLBLOG_DOMAIN_NAME='blog.local'
  1251. fi
  1252. if [ $GIT_DOMAIN_NAME ]; then
  1253. GIT_DOMAIN_NAME='git.local'
  1254. fi
  1255. if [ $WIKI_DOMAIN_NAME ]; then
  1256. WIKI_DOMAIN_NAME='wiki.local'
  1257. fi
  1258. if [ $DEFAULT_DOMAIN_NAME ]; then
  1259. DEFAULT_DOMAIN_NAME="${PROJECT_NAME}.local"
  1260. fi
  1261. }
  1262. function wait_for_onion_service {
  1263. onion_service_name="$1"
  1264. sleep_ctr=0
  1265. while [ ! -f /var/lib/tor/hidden_service_${onion_service_name}/hostname ]; do
  1266. sleep 1
  1267. sleep_ctr=$((sleep_ctr + 1))
  1268. if [ $sleep_ctr -gt 10 ]; then
  1269. break
  1270. fi
  1271. done
  1272. if [ ! -f /var/lib/tor/hidden_service_${onion_service_name}/hostname ]; then
  1273. # restart and try a second time
  1274. systemctl restart tor
  1275. sleep_ctr=0
  1276. while [ ! -f /var/lib/tor/hidden_service_${onion_service_name}/hostname ]; do
  1277. sleep 1
  1278. sleep_ctr=$((sleep_ctr + 1))
  1279. if [ $sleep_ctr -gt 10 ]; then
  1280. break
  1281. fi
  1282. done
  1283. fi
  1284. }
  1285. function add_onion_service {
  1286. onion_service_name="$1"
  1287. onion_service_port_from=$2
  1288. onion_service_port_to=$3
  1289. if [ -f /var/lib/tor/hidden_service_${onion_service_name}/hostname ]; then
  1290. echo $(cat /var/lib/tor/hidden_service_${onion_service_name}/hostname)
  1291. return
  1292. fi
  1293. if [ ! -d /var/lib/tor ]; then
  1294. echo $"No Tor installation found. ${onion_service_name} onion site cannot be configured."
  1295. exit 877367
  1296. fi
  1297. if ! grep -q "hidden_service_${onion_service_name}" /etc/tor/torrc; then
  1298. echo "HiddenServiceDir /var/lib/tor/hidden_service_${onion_service_name}/" >> /etc/tor/torrc
  1299. echo "HiddenServicePort ${onion_service_port_from} 127.0.0.1:${onion_service_port_to}" >> /etc/tor/torrc
  1300. fi
  1301. systemctl restart tor
  1302. wait_for_onion_service ${onion_service_name}
  1303. if [ ! -f /var/lib/tor/hidden_service_${onion_service_name}/hostname ]; then
  1304. echo $"${onion_service_name} onion site hostname not found"
  1305. exit 76362
  1306. fi
  1307. echo $(cat /var/lib/tor/hidden_service_${onion_service_name}/hostname)
  1308. }
  1309. function create_avahi_onion_domains {
  1310. if [[ $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  1311. return
  1312. fi
  1313. if [ ! -d /etc/avahi/services ]; then
  1314. return
  1315. fi
  1316. if [ $OWNCLOUD_DOMAIN_NAME ]; then
  1317. echo '<?xml version="1.0" standalone="no"?><!--*-nxml-*-->' > /etc/avahi/services/owncloud.service
  1318. echo '<!DOCTYPE service-group SYSTEM "avahi-service.dtd">' >> /etc/avahi/services/owncloud.service
  1319. echo '<service-group>' >> /etc/avahi/services/owncloud.service
  1320. echo ' <name replace-wildcards="yes">%h HTTP</name>' >> /etc/avahi/services/owncloud.service
  1321. echo ' <service>' >> /etc/avahi/services/owncloud.service
  1322. echo ' <type>_http._tcp</type>' >> /etc/avahi/services/owncloud.service
  1323. echo " <port>$OWNCLOUD_ONION_PORT</port>" >> /etc/avahi/services/owncloud.service
  1324. echo ' </service>' >> /etc/avahi/services/owncloud.service
  1325. echo '</service-group>' >> /etc/avahi/services/owncloud.service
  1326. fi
  1327. if [ $MICROBLOG_DOMAIN_NAME ]; then
  1328. echo '<?xml version="1.0" standalone="no"?><!--*-nxml-*-->' > /etc/avahi/services/microblog.service
  1329. echo '<!DOCTYPE service-group SYSTEM "avahi-service.dtd">' >> /etc/avahi/services/microblog.service
  1330. echo '<service-group>' >> /etc/avahi/services/microblog.service
  1331. echo ' <name replace-wildcards="yes">%h HTTP</name>' >> /etc/avahi/services/microblog.service
  1332. echo ' <service>' >> /etc/avahi/services/microblog.service
  1333. echo ' <type>_http._tcp</type>' >> /etc/avahi/services/microblog.service
  1334. echo " <port>$MICROBLOG_ONION_PORT</port>" >> /etc/avahi/services/microblog.service
  1335. echo ' </service>' >> /etc/avahi/services/microblog.service
  1336. echo '</service-group>' >> /etc/avahi/services/microblog.service
  1337. fi
  1338. if [ $FULLBLOG_DOMAIN_NAME ]; then
  1339. echo '<?xml version="1.0" standalone="no"?><!--*-nxml-*-->' > /etc/avahi/services/blog.service
  1340. echo '<!DOCTYPE service-group SYSTEM "avahi-service.dtd">' >> /etc/avahi/services/blog.service
  1341. echo '<service-group>' >> /etc/avahi/services/blog.service
  1342. echo ' <name replace-wildcards="yes">%h HTTP</name>' >> /etc/avahi/services/blog.service
  1343. echo ' <service>' >> /etc/avahi/services/blog.service
  1344. echo ' <type>_http._tcp</type>' >> /etc/avahi/services/blog.service
  1345. echo " <port>$BLOG_ONION_PORT</port>" >> /etc/avahi/services/blog.service
  1346. echo ' </service>' >> /etc/avahi/services/blog.service
  1347. echo '</service-group>' >> /etc/avahi/services/blog.service
  1348. fi
  1349. if [ $GIT_DOMAIN_NAME ]; then
  1350. echo '<?xml version="1.0" standalone="no"?><!--*-nxml-*-->' > /etc/avahi/services/git.service
  1351. echo '<!DOCTYPE service-group SYSTEM "avahi-service.dtd">' >> /etc/avahi/services/git.service
  1352. echo '<service-group>' >> /etc/avahi/services/git.service
  1353. echo ' <name replace-wildcards="yes">%h HTTP</name>' >> /etc/avahi/services/git.service
  1354. echo ' <service>' >> /etc/avahi/services/git.service
  1355. echo ' <type>_http._tcp</type>' >> /etc/avahi/services/git.service
  1356. echo " <port>$GIT_ONION_PORT</port>" >> /etc/avahi/services/git.service
  1357. echo ' </service>' >> /etc/avahi/services/git.service
  1358. echo '</service-group>' >> /etc/avahi/services/git.service
  1359. fi
  1360. if [ $WIKI_DOMAIN_NAME ]; then
  1361. echo '<?xml version="1.0" standalone="no"?><!--*-nxml-*-->' > /etc/avahi/services/wiki.service
  1362. echo '<!DOCTYPE service-group SYSTEM "avahi-service.dtd">' >> /etc/avahi/services/wiki.service
  1363. echo '<service-group>' >> /etc/avahi/services/wiki.service
  1364. echo ' <name replace-wildcards="yes">%h HTTP</name>' >> /etc/avahi/services/wiki.service
  1365. echo ' <service>' >> /etc/avahi/services/wiki.service
  1366. echo ' <type>_http._tcp</type>' >> /etc/avahi/services/wiki.service
  1367. echo " <port>$WIKI_ONION_PORT</port>" >> /etc/avahi/services/wiki.service
  1368. echo ' </service>' >> /etc/avahi/services/wiki.service
  1369. echo '</service-group>' >> /etc/avahi/services/wiki.service
  1370. fi
  1371. }
  1372. # check an individual domain name
  1373. function test_domain_name {
  1374. if [ $1 ]; then
  1375. TEST_DOMAIN_NAME=$1
  1376. validate_domain_name
  1377. if [[ $TEST_DOMAIN_NAME != $1 ]]; then
  1378. echo $TEST_DOMAIN_NAME
  1379. exit 8528
  1380. fi
  1381. fi
  1382. }
  1383. # check that domain names are sensible
  1384. function check_domains {
  1385. if [ $WIKI_DOMAIN_NAME ]; then
  1386. test_domain_name "$WIKI_DOMAIN_NAME"
  1387. if [[ "$test_domain_name" == "$OWNCLOUD_DOMAIN_NAME" ]]; then
  1388. echo $'Wiki domain name is the same as Owncloud domain name. They must be different'
  1389. exit 73863
  1390. fi
  1391. if [[ "$test_domain_name" == "$FULLBLOG_DOMAIN_NAME" ]]; then
  1392. echo $'Wiki domain name is the same as blog domain name. They must be different'
  1393. exit 97326
  1394. fi
  1395. if [[ "$test_domain_name" == "$MICROBLOG_DOMAIN_NAME" ]]; then
  1396. echo $'Wiki domain name is the same as microblog domain name. They must be different'
  1397. exit 36827
  1398. fi
  1399. if [[ "$test_domain_name" == "$HUBZILLA_DOMAIN_NAME" ]]; then
  1400. echo $'Wiki domain name is the same as hubzilla domain name. They must be different'
  1401. exit 65848
  1402. fi
  1403. if [ $GIT_DOMAIN_NAME ]; then
  1404. if [[ "$test_domain_name" == "$GIT_DOMAIN_NAME" ]]; then
  1405. echo $'Wiki domain name is the same as Gogs domain name. They must be different'
  1406. exit 73529
  1407. fi
  1408. fi
  1409. fi
  1410. if [ $OWNCLOUD_DOMAIN_NAME ]; then
  1411. test_domain_name "$OWNCLOUD_DOMAIN_NAME"
  1412. if [[ "$test_domain_name" == "$WIKI_DOMAIN_NAME" ]]; then
  1413. echo $'Owncloud domain name is the same as wiki domain name. They must be different'
  1414. exit 37994
  1415. fi
  1416. if [[ "$test_domain_name" == "$FULLBLOG_DOMAIN_NAME" ]]; then
  1417. echo $'Owncloud domain name is the same as blog domain name. They must be different'
  1418. exit 37936
  1419. fi
  1420. if [[ "$test_domain_name" == "$MICROBLOG_DOMAIN_NAME" ]]; then
  1421. echo $'Owncloud domain name is the same as microblog domain name. They must be different'
  1422. exit 36896
  1423. fi
  1424. if [[ "$test_domain_name" == "$HUBZILLA_DOMAIN_NAME" ]]; then
  1425. echo $'Owncloud domain name is the same as hubzilla domain name. They must be different'
  1426. exit 68365
  1427. fi
  1428. if [ $GIT_DOMAIN_NAME ]; then
  1429. if [[ "$test_domain_name" == "$GIT_DOMAIN_NAME" ]]; then
  1430. echo $'Owncloud domain name is the same as Gogs domain name. They must be different'
  1431. exit 27692
  1432. fi
  1433. fi
  1434. fi
  1435. if [ $FULLBLOG_DOMAIN_NAME ]; then
  1436. test_domain_name "$FULLBLOG_DOMAIN_NAME"
  1437. if [[ "$test_domain_name" == "$WIKI_DOMAIN_NAME" ]]; then
  1438. echo $'Blog domain name is the same as wiki domain name. They must be different'
  1439. exit 62348
  1440. fi
  1441. if [[ "$test_domain_name" == "$OWNCLOUD_DOMAIN_NAME" ]]; then
  1442. echo $'Blog domain name is the same as Owncloud domain name. They must be different'
  1443. exit 84682
  1444. fi
  1445. if [[ "$test_domain_name" == "$MICROBLOG_DOMAIN_NAME" ]]; then
  1446. echo $'Blog domain name is the same as microblog domain name. They must be different'
  1447. exit 38236
  1448. fi
  1449. if [[ "$test_domain_name" == "$HUBZILLA_DOMAIN_NAME" ]]; then
  1450. echo $'Blog domain name is the same as hubzilla domain name. They must be different'
  1451. exit 35483
  1452. fi
  1453. if [ $GIT_DOMAIN_NAME ]; then
  1454. if [[ "$test_domain_name" == "$GIT_DOMAIN_NAME" ]]; then
  1455. echo $'Blog domain name is the same as Gogs domain name. They must be different'
  1456. exit 84695
  1457. fi
  1458. fi
  1459. fi
  1460. if [ $MICROBLOG_DOMAIN_NAME ]; then
  1461. test_domain_name "$MICROBLOG_DOMAIN_NAME"
  1462. if [[ "$test_domain_name" == "$WIKI_DOMAIN_NAME" ]]; then
  1463. echo $'Microblog domain name is the same as wiki domain name. They must be different'
  1464. exit 73924
  1465. fi
  1466. if [[ "$test_domain_name" == "$OWNCLOUD_DOMAIN_NAME" ]]; then
  1467. echo $'Microblog domain name is the same as Owncloud domain name. They must be different'
  1468. exit 73683
  1469. fi
  1470. if [[ "$test_domain_name" == "$FULLBLOG_DOMAIN_NAME" ]]; then
  1471. echo $'Microblog domain name is the same as blog domain name. They must be different'
  1472. exit 26832
  1473. fi
  1474. if [[ "$test_domain_name" == "$HUBZILLA_DOMAIN_NAME" ]]; then
  1475. echo $'Microblog domain name is the same as hubzilla domain name. They must be different'
  1476. exit 678382
  1477. fi
  1478. if [ $GIT_DOMAIN_NAME ]; then
  1479. if [[ "$test_domain_name" == "$GIT_DOMAIN_NAME" ]]; then
  1480. echo $'Microblog domain name is the same as Gogs domain name. They must be different'
  1481. exit 684325
  1482. fi
  1483. fi
  1484. fi
  1485. if [ $HUBZILLA_DOMAIN_NAME ]; then
  1486. test_domain_name "$HUBZILLA_DOMAIN_NAME"
  1487. if [[ "$test_domain_name" == "$WIKI_DOMAIN_NAME" ]]; then
  1488. echo $'Hubzilla domain name is the same as wiki domain name. They must be different'
  1489. exit 83682
  1490. fi
  1491. if [[ "$test_domain_name" == "$OWNCLOUD_DOMAIN_NAME" ]]; then
  1492. echo $'Hubzilla domain name is the same as Owncloud domain name. They must be different'
  1493. exit 65192
  1494. fi
  1495. if [[ "$test_domain_name" == "$FULLBLOG_DOMAIN_NAME" ]]; then
  1496. echo $'Hubzilla domain name is the same as blog domain name. They must be different'
  1497. exit 74817
  1498. fi
  1499. if [[ "$test_domain_name" == "$MICROBLOG_DOMAIN_NAME" ]]; then
  1500. echo $'Hubzilla domain name is the same as microblog domain name. They must be different'
  1501. exit 83683
  1502. fi
  1503. if [ $GIT_DOMAIN_NAME ]; then
  1504. if [[ "$test_domain_name" == "$GIT_DOMAIN_NAME" ]]; then
  1505. echo $'Hubzilla domain name is the same as Gogs domain name. They must be different'
  1506. exit 135523
  1507. fi
  1508. fi
  1509. fi
  1510. if [ $GIT_DOMAIN_NAME ]; then
  1511. test_domain_name "$GIT_DOMAIN_NAME"
  1512. if [[ "$test_domain_name" == "$WIKI_DOMAIN_NAME" ]]; then
  1513. echo $'Hubzilla domain name is the same as wiki domain name. They must be different'
  1514. exit 83682
  1515. fi
  1516. if [[ "$test_domain_name" == "$OWNCLOUD_DOMAIN_NAME" ]]; then
  1517. echo $'Hubzilla domain name is the same as Owncloud domain name. They must be different'
  1518. exit 65192
  1519. fi
  1520. if [[ "$test_domain_name" == "$FULLBLOG_DOMAIN_NAME" ]]; then
  1521. echo $'Hubzilla domain name is the same as blog domain name. They must be different'
  1522. exit 74817
  1523. fi
  1524. if [[ "$test_domain_name" == "$MICROBLOG_DOMAIN_NAME" ]]; then
  1525. echo $'Hubzilla domain name is the same as microblog domain name. They must be different'
  1526. exit 83683
  1527. fi
  1528. if [[ "$test_domain_name" == "$HUBZILLA_DOMAIN_NAME" ]]; then
  1529. echo $'Microblog domain name is the same as hubzilla domain name. They must be different'
  1530. exit 678382
  1531. fi
  1532. fi
  1533. }
  1534. # Checks whether certificates were generated for the given hostname
  1535. function check_certificates {
  1536. if [ ! $1 ]; then
  1537. return
  1538. fi
  1539. if [[ $LETSENCRYPT_ENABLED != "yes" ]]; then
  1540. if [ ! -f /etc/ssl/private/$1.key ]; then
  1541. echo $"Private certificate for $CHECK_HOSTNAME was not created"
  1542. exit 63959
  1543. fi
  1544. if [ ! -f /etc/ssl/certs/$1.crt ]; then
  1545. echo $"Public certificate for $CHECK_HOSTNAME was not created"
  1546. exit 7679
  1547. fi
  1548. else
  1549. if [ ! -f /etc/letsencrypt/live/${1}/privkey.pem ]; then
  1550. echo $"Private certificate for $CHECK_HOSTNAME was not created"
  1551. exit 6282
  1552. fi
  1553. if [ ! -f /etc/letsencrypt/live/${1}/fullchain.pem ]; then
  1554. echo $"Public certificate for $CHECK_HOSTNAME was not created"
  1555. exit 5328
  1556. fi
  1557. fi
  1558. if [ ! -f /etc/ssl/certs/$1.dhparam ]; then
  1559. echo $"Diffie–Hellman parameters for $CHECK_HOSTNAME were not created"
  1560. exit 5989
  1561. fi
  1562. }
  1563. function install_not_on_BBB {
  1564. if grep -Fxq "install_not_on_BBB" $COMPLETION_FILE; then
  1565. return
  1566. fi
  1567. if [[ INSTALLING_ON_BBB == "yes" ]]; then
  1568. return
  1569. fi
  1570. if [ ! $LOCAL_NETWORK_STATIC_IP_ADDRESS ]; then
  1571. return
  1572. fi
  1573. echo '# The loopback network interface' > /etc/network/interfaces
  1574. echo 'auto lo' >> /etc/network/interfaces
  1575. echo 'iface lo inet loopback' >> /etc/network/interfaces
  1576. echo '' >> /etc/network/interfaces
  1577. echo '# The primary network interface' >> /etc/network/interfaces
  1578. echo 'auto eth0' >> /etc/network/interfaces
  1579. echo 'iface eth0 inet static' >> /etc/network/interfaces
  1580. echo " address $LOCAL_NETWORK_STATIC_IP_ADDRESS" >> /etc/network/interfaces
  1581. echo ' netmask 255.255.255.0' >> /etc/network/interfaces
  1582. echo " gateway $ROUTER_IP_ADDRESS" >> /etc/network/interfaces
  1583. echo " dns-nameservers $NAMESERVER1 $NAMESERVER2" >> /etc/network/interfaces
  1584. echo '# Example to keep MAC address between reboots' >> /etc/network/interfaces
  1585. echo '#hwaddress ether DE:AD:BE:EF:CA:FE' >> /etc/network/interfaces
  1586. echo '' >> /etc/network/interfaces
  1587. echo '# The secondary network interface' >> /etc/network/interfaces
  1588. echo '#auto eth1' >> /etc/network/interfaces
  1589. echo '#iface eth1 inet dhcp' >> /etc/network/interfaces
  1590. echo '' >> /etc/network/interfaces
  1591. echo '# WiFi Example' >> /etc/network/interfaces
  1592. echo "#auto $WIFI_INTERFACE" >> /etc/network/interfaces
  1593. echo "#iface $WIFI_INTERFACE inet dhcp" >> /etc/network/interfaces
  1594. echo '# wpa-ssid "essid"' >> /etc/network/interfaces
  1595. echo '# wpa-psk "password"' >> /etc/network/interfaces
  1596. echo '' >> /etc/network/interfaces
  1597. echo '# Ethernet/RNDIS gadget (g_ether)' >> /etc/network/interfaces
  1598. echo '# ... or on host side, usbnet and random hwaddr' >> /etc/network/interfaces
  1599. echo '# Note on some boards, usb0 is automaticly setup with an init script' >> /etc/network/interfaces
  1600. echo '#iface usb0 inet static' >> /etc/network/interfaces
  1601. echo '# address 192.168.7.2' >> /etc/network/interfaces
  1602. echo '# netmask 255.255.255.0' >> /etc/network/interfaces
  1603. echo '# network 192.168.7.0' >> /etc/network/interfaces
  1604. echo '# gateway 192.168.7.1' >> /etc/network/interfaces
  1605. echo 'install_not_on_BBB' >> $COMPLETION_FILE
  1606. }
  1607. function mark_admin_user_account {
  1608. if ! grep -q "Admin user:" $COMPLETION_FILE; then
  1609. echo "Admin user:$MY_USERNAME" >> $COMPLETION_FILE
  1610. fi
  1611. }
  1612. function mark_blog_domain {
  1613. 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
  1614. return
  1615. fi
  1616. if ! grep -q "Blog domain:" $COMPLETION_FILE; then
  1617. echo "Blog domain:$FULLBLOG_DOMAIN_NAME" >> $COMPLETION_FILE
  1618. fi
  1619. }
  1620. function randomize_cron {
  1621. # The predictable default timing of Debian cron jobs might
  1622. # be exploitable knowledge. Avoid too much predictability
  1623. # by randomizing the times when cron jobs run
  1624. if grep -Fxq "randomize_cron" $COMPLETION_FILE; then
  1625. return
  1626. fi
  1627. # randomize the day on which the weekly cron job runs
  1628. randdow=$(($RANDOM%6+1))
  1629. sed -i "s|\* \* 7|* * $randdow|g" /etc/crontab
  1630. # randomize the time when the weekly cron job runs
  1631. randmin=$(($RANDOM%60))
  1632. randhr=$(($RANDOM%3+1))
  1633. sed -i "s|47 6|$randmin $randhr|g" /etc/crontab
  1634. # randomize the time when the daily cron job runs
  1635. randmin=$(($RANDOM%60))
  1636. randhr=$(($RANDOM%3+4))
  1637. sed -i "s|25 6\t\* \* \*|$randmin $randhr\t* * *|g" /etc/crontab
  1638. # randomize the time when the hourly cron job runs
  1639. randmin=$(($RANDOM%60))
  1640. sed -i "s|17 \*\t|$randmin *\t|g" /etc/crontab
  1641. # randomize monthly cron job time and day
  1642. randmin=$(($RANDOM%60))
  1643. randhr=$(($RANDOM%22+1))
  1644. randdom=$(($RANDOM%27+1))
  1645. sed -i "s|52 6\t|$randmin $randhr\t|g" /etc/crontab
  1646. sed -i "s|\t1 \* \*|\t$randdom * *|g" /etc/crontab
  1647. systemctl restart cron
  1648. echo 'randomize_cron' >> $COMPLETION_FILE
  1649. }
  1650. function get_cjdns_public_key {
  1651. if [ -f /home/$MY_USERNAME/README ]; then
  1652. if grep -q "cjdns public key" /home/$MY_USERNAME/README; then
  1653. if [ ! $CJDNS_PUBLIC_KEY ]; then
  1654. CJDNS_PUBLIC_KEY=$(cat /home/$MY_USERNAME/README | grep "cjdns public key" | awk -F ':' '{print $2}' | sed 's/^ *//')
  1655. fi
  1656. fi
  1657. fi
  1658. }
  1659. function get_cjdns_private_key {
  1660. if [ -f /home/$MY_USERNAME/README ]; then
  1661. if grep -q "cjdns private key" /home/$MY_USERNAME/README; then
  1662. if [ ! $CJDNS_PRIVATE_KEY ]; then
  1663. CJDNS_PRIVATE_KEY=$(cat /home/$MY_USERNAME/README | grep "cjdns private key" | awk -F ':' '{print $2}' | sed 's/^ *//')
  1664. fi
  1665. fi
  1666. fi
  1667. }
  1668. function get_cjdns_ipv6_address {
  1669. if [ -f /home/$MY_USERNAME/README ]; then
  1670. if grep -q "cjdns IPv6 address" /home/$MY_USERNAME/README; then
  1671. if [ ! $CJDNS_IPV6 ]; then
  1672. CJDNS_IPV6=$(cat /home/$MY_USERNAME/README | grep "cjdns IPv6 address" | awk -F ':' '{print $2}' | sed 's/^ *//')
  1673. fi
  1674. fi
  1675. fi
  1676. }
  1677. function get_cjdns_port {
  1678. if [ -f /home/$MY_USERNAME/README ]; then
  1679. if grep -q "cjdns port" /home/$MY_USERNAME/README; then
  1680. if [ ! $CJDNS_PORT ]; then
  1681. CJDNS_PORT=$(cat /home/$MY_USERNAME/README | grep "cjdns port" | awk -F ':' '{print $2}' | sed 's/^ *//')
  1682. fi
  1683. fi
  1684. fi
  1685. }
  1686. function get_cjdns_password {
  1687. if [ -f /home/$MY_USERNAME/README ]; then
  1688. if grep -q "cjdns password" /home/$MY_USERNAME/README; then
  1689. if [ ! $CJDNS_PASSWORD ]; then
  1690. CJDNS_PASSWORD=$(cat /home/$MY_USERNAME/README | grep "cjdns password" | awk -F ':' '{print $2}' | sed 's/^ *//')
  1691. fi
  1692. fi
  1693. fi
  1694. }
  1695. # script to automatically renew any Let's Encrypt certificates
  1696. function letsencrypt_renewals {
  1697. if [[ $ONION_ONLY != "no" ]]; then
  1698. return
  1699. fi
  1700. renewals_script=/etc/cron.monthly/letsencrypt
  1701. renewals_retry_script=/etc/cron.daily/letsencrypt
  1702. renewal_failure_msg=$'The certificate for $LETSENCRYPT_DOMAIN could not be renewed'
  1703. renewal_email_title=$'${PROJECT_NAME} Lets Encrypt certificate renewal'
  1704. # the main script tries to renew once per month
  1705. echo '#!/bin/bash' > $renewals_script
  1706. echo '' >> $renewals_script
  1707. echo "PROJECT_NAME='${PROJECT_NAME}'" >> $renewals_script
  1708. echo 'COMPLETION_FILE=$HOME/${PROJECT_NAME}-completed.txt' >> $renewals_script
  1709. echo '' >> $renewals_script
  1710. echo 'if [ -d /etc/letsencrypt ]; then' >> $renewals_script
  1711. echo ' if [ -f ~/letsencrypt_failed ]; then' >> $renewals_script
  1712. echo ' rm ~/letsencrypt_failed' >> $renewals_script
  1713. echo ' fi' >> $renewals_script
  1714. echo -n ' ADMIN_USERNAME=$(cat $COMPLETION_FILE | grep "Admin user" | ' >> $renewals_script
  1715. echo -n "awk -F ':' '{print " >> $renewals_script
  1716. echo -n '$2' >> $renewals_script
  1717. echo "}')" >> $renewals_script
  1718. echo ' ADMIN_EMAIL_ADDRESS=$ADMIN_USERNAME@$HOSTNAME' >> $renewals_script
  1719. echo ' for d in /etc/letsencrypt/live/*/ ; do' >> $renewals_script
  1720. echo -n ' LETSENCRYPT_DOMAIN=$(echo "$d" | ' >> $renewals_script
  1721. echo -n "awk -F '/' '{print " >> $renewals_script
  1722. echo -n '$5' >> $renewals_script
  1723. echo "}')" >> $renewals_script
  1724. echo ' if [ -f /etc/nginx/sites-available/$LETSENCRYPT_DOMAIN ]; then' >> $renewals_script
  1725. echo ' ${PROJECT_NAME}-renew-cert -h $LETSENCRYPT_DOMAIN -p letsencrypt' >> $renewals_script
  1726. echo ' if [ ! "$?" = "0" ]; then' >> $renewals_script
  1727. echo " echo \"${renewal_failure_msg}\" > ~/temp_renewletsencrypt.txt" >> $renewals_script
  1728. echo ' echo "" >> ~/temp_renewletsencrypt.txt' >> $renewals_script
  1729. echo ' ${PROJECT_NAME}-renew-cert -h $LETSENCRYPT_DOMAIN -p letsencrypt 2>> ~/temp_renewletsencrypt.txt' >> $renewals_script
  1730. echo -n " cat ~/temp_renewletsencrypt.txt | mail -s \"${renewal_email_title}\" " >> $renewals_script
  1731. echo '$ADMIN_EMAIL_ADDRESS' >> $renewals_script
  1732. echo ' rm ~/temp_renewletsencrypt.txt' >> $renewals_script
  1733. echo ' if [ ! -f ~/letsencrypt_failed ]; then' >> $renewals_script
  1734. echo ' touch ~/letsencrypt_failed' >> $renewals_script
  1735. echo ' fi' >> $renewals_script
  1736. echo ' fi' >> $renewals_script
  1737. echo ' fi' >> $renewals_script
  1738. echo ' done' >> $renewals_script
  1739. echo 'fi' >> $renewals_script
  1740. chmod +x $renewals_script
  1741. # a secondary script keeps trying to renew after a failure
  1742. echo '#!/bin/bash' > $renewals_retry_script
  1743. echo '' >> $renewals_retry_script
  1744. echo "PROJECT_NAME='${PROJECT_NAME}'" >> $renewals_retry_script
  1745. echo 'COMPLETION_FILE=$HOME/${PROJECT_NAME}-completed.txt' >> $renewals_retry_script
  1746. echo '' >> $renewals_retry_script
  1747. echo 'if [ -d /etc/letsencrypt ]; then' >> $renewals_retry_script
  1748. echo ' if [ -f ~/letsencrypt_failed ]; then' >> $renewals_retry_script
  1749. echo ' rm ~/letsencrypt_failed' >> $renewals_retry_script
  1750. echo -n ' ADMIN_USERNAME=$(cat $COMPLETION_FILE | grep "Admin user" | ' >> $renewals_retry_script
  1751. echo -n "awk -F ':' '{print " >> $renewals_retry_script
  1752. echo -n '$2' >> $renewals_retry_script
  1753. echo "}')" >> $renewals_retry_script
  1754. echo ' ADMIN_EMAIL_ADDRESS=$ADMIN_USERNAME@$HOSTNAME' >> $renewals_retry_script
  1755. echo ' for d in /etc/letsencrypt/live/*/ ; do' >> $renewals_retry_script
  1756. echo -n ' LETSENCRYPT_DOMAIN=$(echo "$d" | ' >> $renewals_retry_script
  1757. echo -n "awk -F '/' '{print " >> $renewals_retry_script
  1758. echo -n '$5' >> $renewals_retry_script
  1759. echo "}')" >> $renewals_retry_script
  1760. echo ' if [ -f /etc/nginx/sites-available/$LETSENCRYPT_DOMAIN ]; then' >> $renewals_retry_script
  1761. echo ' ${PROJECT_NAME}-renew-cert -h $LETSENCRYPT_DOMAIN -p letsencrypt' >> $renewals_retry_script
  1762. echo ' if [ ! "$?" = "0" ]; then' >> $renewals_retry_script
  1763. echo " echo \"${renewal_failure_msg}\" > ~/temp_renewletsencrypt.txt" >> $renewals_retry_script
  1764. echo ' echo "" >> ~/temp_renewletsencrypt.txt' >> $renewals_retry_script
  1765. echo ' ${PROJECT_NAME}-renew-cert -h $LETSENCRYPT_DOMAIN -p letsencrypt 2>> ~/temp_renewletsencrypt.txt' >> $renewals_retry_script
  1766. echo -n " cat ~/temp_renewletsencrypt.txt | mail -s \"${renewal_email_title}\" " >> $renewals_retry_script
  1767. echo '$ADMIN_EMAIL_ADDRESS' >> $renewals_retry_script
  1768. echo ' rm ~/temp_renewletsencrypt.txt' >> $renewals_retry_script
  1769. echo ' if [ ! -f ~/letsencrypt_failed ]; then' >> $renewals_retry_script
  1770. echo ' touch ~/letsencrypt_failed' >> $renewals_retry_script
  1771. echo ' fi' >> $renewals_retry_script
  1772. echo ' fi' >> $renewals_retry_script
  1773. echo ' fi' >> $renewals_retry_script
  1774. echo ' done' >> $renewals_retry_script
  1775. echo ' fi' >> $renewals_retry_script
  1776. echo 'fi' >> $renewals_retry_script
  1777. chmod +x $renewals_retry_script
  1778. }
  1779. function save_firewall_settings {
  1780. iptables-save > /etc/firewall.conf
  1781. ip6tables-save > /etc/firewall6.conf
  1782. printf '#!/bin/sh\n' > /etc/network/if-up.d/iptables
  1783. printf 'iptables-restore < /etc/firewall.conf\n' >> /etc/network/if-up.d/iptables
  1784. printf 'ip6tables-restore < /etc/firewall6.conf\n' >> /etc/network/if-up.d/iptables
  1785. chmod +x /etc/network/if-up.d/iptables
  1786. }
  1787. function enable_ipv6 {
  1788. # endure that ipv6 is enabled and can route
  1789. sed -i 's/net.ipv6.conf.all.disable_ipv6.*/net.ipv6.conf.all.disable_ipv6 = 0/g' /etc/sysctl.conf
  1790. #sed -i "s/net.ipv6.conf.all.accept_redirects.*/net.ipv6.conf.all.accept_redirects = 1/g" /etc/sysctl.conf
  1791. #sed -i "s/net.ipv6.conf.all.accept_source_route.*/net.ipv6.conf.all.accept_source_route = 1/g" /etc/sysctl.conf
  1792. sed -i "s/net.ipv6.conf.all.forwarding.*/net.ipv6.conf.all.forwarding=1/g" /etc/sysctl.conf
  1793. echo 1 > /proc/sys/net/ipv6/conf/all/forwarding
  1794. }
  1795. function mesh_cjdns {
  1796. if [[ $ENABLE_CJDNS != "yes" ]]; then
  1797. return
  1798. fi
  1799. # update to the next commit
  1800. if [ -d /etc/cjdns ]; then
  1801. if grep -q "cjdns commit" $COMPLETION_FILE; then
  1802. CURRENT_CJDNS_COMMIT=$(grep "cjdns commit" $COMPLETION_FILE | awk -F ':' '{print $2}')
  1803. if [[ "$CURRENT_CJDNS_COMMIT" != "$CJDNS_COMMIT" ]]; then
  1804. cd /etc/cjdns
  1805. git_pull $CJDNS_REPO $CJDNS_COMMIT
  1806. sed -i "s/cjdns commit.*/cjdns commit:$CJDNS_COMMIT/g" $COMPLETION_FILE
  1807. ./do
  1808. fi
  1809. fi
  1810. fi
  1811. if grep -Fxq "mesh_cjdns" $COMPLETION_FILE; then
  1812. return
  1813. fi
  1814. apt-get -y install nodejs git build-essential nmap
  1815. # if a README exists then obtain the cjdns parameters
  1816. get_cjdns_ipv6_address
  1817. get_cjdns_public_key
  1818. get_cjdns_private_key
  1819. get_cjdns_port
  1820. get_cjdns_password
  1821. # special compile settings for running ./do on the Beaglebone Black
  1822. if [[ $INSTALLING_ON_BBB == "yes" ]]; then
  1823. CFLAGS="-O2 -march=armv7-a -mtune=cortex-a8 -mfpu=neon -ftree-vectorize -ffast-math -mfloat-abi=hard -marm -Wno-error=maybe-uninitialized"
  1824. export LDFLAGS="$CFLAGS"
  1825. fi
  1826. if [ ! -d /etc/cjdns ]; then
  1827. git_clone $CJDNS_REPO /etc/cjdns
  1828. cd /etc/cjdns
  1829. git checkout $CJDNS_COMMIT -b $CJDNS_COMMIT
  1830. if ! grep -q "cjdns commit" $COMPLETION_FILE; then
  1831. echo "cjdns commit:$CJDNS_COMMIT" >> $COMPLETION_FILE
  1832. else
  1833. sed -i "s/cjdns commit.*/cjdns commit:$CJDNS_COMMIT/g" $COMPLETION_FILE
  1834. fi
  1835. ./do
  1836. if [ ! "$?" = "0" ]; then
  1837. exit 7439
  1838. fi
  1839. # create a configuration
  1840. if [ ! -f /etc/cjdns/cjdroute.conf ]; then
  1841. ./cjdroute --genconf > /etc/cjdns/cjdroute.conf
  1842. if [ ! "$?" = "0" ]; then
  1843. exit 5922
  1844. fi
  1845. fi
  1846. # create a user to run as
  1847. useradd cjdns
  1848. else
  1849. cd /etc/cjdns
  1850. git_pull $CJDNS_REPO
  1851. ./do
  1852. if [ ! "$?" = "0" ]; then
  1853. exit 9926
  1854. fi
  1855. fi
  1856. # set permissions
  1857. chown -R cjdns:cjdns /etc/cjdns
  1858. chmod 600 /etc/cjdns/cjdroute.conf
  1859. /sbin/ip tuntap add mode tun user cjdns dev cjdroute0
  1860. # insert values into the configuration file
  1861. if [ $CJDNS_PRIVATE_KEY ]; then
  1862. sed -i "s/\"privateKey\":.*/\"privateKey\": \"$CJDNS_PRIVATE_KEY\",/g" /etc/cjdns/cjdroute.conf
  1863. else
  1864. CJDNS_PRIVATE_KEY=$(cat /etc/cjdns/cjdroute.conf | grep '"privateKey"' | awk -F '"' '{print $4}' | sed -n 1p)
  1865. fi
  1866. if [ $CJDNS_PUBLIC_KEY ]; then
  1867. sed -i "s/\"publicKey\":.*/\"publicKey\": \"$CJDNS_PUBLIC_KEY\",/g" /etc/cjdns/cjdroute.conf
  1868. else
  1869. CJDNS_PUBLIC_KEY=$(cat /etc/cjdns/cjdroute.conf | grep '"publicKey"' | awk -F '"' '{print $4}' | sed -n 1p)
  1870. fi
  1871. if [ $CJDNS_IPV6 ]; then
  1872. sed -i "s/\"ipv6\":.*/\"ipv6\": \"$CJDNS_IPV6\",/g" /etc/cjdns/cjdroute.conf
  1873. else
  1874. CJDNS_IPV6=$(cat /etc/cjdns/cjdroute.conf | grep '"ipv6"' | awk -F '"' '{print $4}' | sed -n 1p)
  1875. fi
  1876. if [ $CJDNS_PASSWORD ]; then
  1877. sed -i "0,/{\"password\":.*/s//{\"password\": \"$CJDNS_PASSWORD\"}/g" /etc/cjdns/cjdroute.conf
  1878. else
  1879. CJDNS_PASSWORD=$(cat /etc/cjdns/cjdroute.conf | grep '"password"' | awk -F '"' '{print $4}' | sed -n 1p)
  1880. fi
  1881. if [ $CJDNS_PORT ]; then
  1882. sed -i "s/\"bind\": \"0.0.0.0:.*/\"bind\": \"0.0.0.0:$CJDNS_PORT\",/g" /etc/cjdns/cjdroute.conf
  1883. else
  1884. CJDNS_PORT=$(cat /etc/cjdns/cjdroute.conf | grep '"bind": "0.0.0.0:' | awk -F '"' '{print $4}' | awk -F ':' '{print $2}' | sed -n 1p)
  1885. fi
  1886. enable_ipv6
  1887. echo '#!/bin/sh -e' > /etc/init.d/cjdns
  1888. echo '### BEGIN INIT INFO' >> /etc/init.d/cjdns
  1889. echo '# hyperboria.sh - An init script (/etc/init.d/) for cjdns' >> /etc/init.d/cjdns
  1890. echo '# Provides: cjdroute' >> /etc/init.d/cjdns
  1891. echo '# Required-Start: $remote_fs $network' >> /etc/init.d/cjdns
  1892. echo '# Required-Stop: $remote_fs $network' >> /etc/init.d/cjdns
  1893. echo '# Default-Start: 2 3 4 5' >> /etc/init.d/cjdns
  1894. echo '# Default-Stop: 0 1 6' >> /etc/init.d/cjdns
  1895. echo '# Short-Description: Cjdns router' >> /etc/init.d/cjdns
  1896. echo '# Description: A routing engine designed for security, scalability, speed and ease of use.' >> /etc/init.d/cjdns
  1897. echo '# cjdns git repo: https://github.com/cjdelisle/cjdns/' >> /etc/init.d/cjdns
  1898. echo '### END INIT INFO' >> /etc/init.d/cjdns
  1899. echo '' >> /etc/init.d/cjdns
  1900. echo 'PROG="cjdroute"' >> /etc/init.d/cjdns
  1901. echo 'GIT_PATH="/etc/cjdns"' >> /etc/init.d/cjdns
  1902. echo 'PROG_PATH="/etc/cjdns"' >> /etc/init.d/cjdns
  1903. echo 'CJDNS_CONFIG="cjdroute.conf"' >> /etc/init.d/cjdns
  1904. echo 'CJDNS_USER="cjdns"' >> /etc/init.d/cjdns
  1905. echo "CJDNS_IP='$CJDNS_IPV6'" >> /etc/init.d/cjdns
  1906. echo '' >> /etc/init.d/cjdns
  1907. echo 'start() {' >> /etc/init.d/cjdns
  1908. echo ' # Start it up with the user cjdns' >> /etc/init.d/cjdns
  1909. echo ' if [ $(pgrep cjdroute | wc -l) != 0 ];' >> /etc/init.d/cjdns
  1910. echo ' then' >> /etc/init.d/cjdns
  1911. echo ' echo "cjdroute is already running. Doing nothing..."' >> /etc/init.d/cjdns
  1912. echo ' else' >> /etc/init.d/cjdns
  1913. echo ' echo " * Starting cjdroute"' >> /etc/init.d/cjdns
  1914. echo ' su -c "$PROG_PATH/$PROG < $PROG_PATH/$CJDNS_CONFIG" - $CJDNS_USER' >> /etc/init.d/cjdns
  1915. echo ' /sbin/ip addr add $CJDNS_IP/8 dev tun0' >> /etc/init.d/cjdns
  1916. echo ' /sbin/ip link set mtu 1312 dev tun0' >> /etc/init.d/cjdns
  1917. echo ' /sbin/ip link set tun0 up' >> /etc/init.d/cjdns
  1918. echo ' /sbin/ip tuntap add mode tun user cjdns dev tun0' >> /etc/init.d/cjdns
  1919. echo ' fi' >> /etc/init.d/cjdns
  1920. echo '}' >> /etc/init.d/cjdns
  1921. echo '' >> /etc/init.d/cjdns
  1922. echo 'stop() {' >> /etc/init.d/cjdns
  1923. echo '' >> /etc/init.d/cjdns
  1924. echo ' if [ $(pgrep cjdroute | wc -l) != 2 ];' >> /etc/init.d/cjdns
  1925. echo ' then' >> /etc/init.d/cjdns
  1926. echo ' echo "cjdns isnt running."' >> /etc/init.d/cjdns
  1927. echo ' else' >> /etc/init.d/cjdns
  1928. echo ' echo "Killing cjdroute"' >> /etc/init.d/cjdns
  1929. echo ' killall cjdroute' >> /etc/init.d/cjdns
  1930. echo ' fi' >> /etc/init.d/cjdns
  1931. echo '}' >> /etc/init.d/cjdns
  1932. echo '' >> /etc/init.d/cjdns
  1933. echo 'status() {' >> /etc/init.d/cjdns
  1934. echo ' if [ $(pgrep cjdroute | wc -l) != 0 ];' >> /etc/init.d/cjdns
  1935. echo ' then' >> /etc/init.d/cjdns
  1936. echo ' echo "Cjdns is running"' >> /etc/init.d/cjdns
  1937. echo ' else' >> /etc/init.d/cjdns
  1938. echo ' echo "Cjdns is not running"' >> /etc/init.d/cjdns
  1939. echo ' fi' >> /etc/init.d/cjdns
  1940. echo '}' >> /etc/init.d/cjdns
  1941. echo '' >> /etc/init.d/cjdns
  1942. echo ' update() {' >> /etc/init.d/cjdns
  1943. echo ' cd $GIT_PATH' >> /etc/init.d/cjdns
  1944. echo ' echo "Updating..."' >> /etc/init.d/cjdns
  1945. echo ' git pull' >> /etc/init.d/cjdns
  1946. echo ' ./do' >> /etc/init.d/cjdns
  1947. echo '}' >> /etc/init.d/cjdns
  1948. echo '' >> /etc/init.d/cjdns
  1949. echo '## Check to see if we are running as root first.' >> /etc/init.d/cjdns
  1950. echo 'if [ "$(id -u)" != "0" ]; then' >> /etc/init.d/cjdns
  1951. echo ' echo "This script must be run as root" 1>&2' >> /etc/init.d/cjdns
  1952. echo ' exit 1' >> /etc/init.d/cjdns
  1953. echo 'fi' >> /etc/init.d/cjdns
  1954. echo '' >> /etc/init.d/cjdns
  1955. echo 'case $1 in' >> /etc/init.d/cjdns
  1956. echo ' start)' >> /etc/init.d/cjdns
  1957. echo ' start' >> /etc/init.d/cjdns
  1958. echo ' exit 0' >> /etc/init.d/cjdns
  1959. echo ' ;;' >> /etc/init.d/cjdns
  1960. echo ' stop)' >> /etc/init.d/cjdns
  1961. echo ' stop' >> /etc/init.d/cjdns
  1962. echo ' exit 0' >> /etc/init.d/cjdns
  1963. echo ' ;;' >> /etc/init.d/cjdns
  1964. echo ' reload|restart|force-reload)' >> /etc/init.d/cjdns
  1965. echo ' stop' >> /etc/init.d/cjdns
  1966. echo ' sleep 1' >> /etc/init.d/cjdns
  1967. echo ' start' >> /etc/init.d/cjdns
  1968. echo ' exit 0' >> /etc/init.d/cjdns
  1969. echo ' ;;' >> /etc/init.d/cjdns
  1970. echo ' status)' >> /etc/init.d/cjdns
  1971. echo ' status' >> /etc/init.d/cjdns
  1972. echo ' exit 0' >> /etc/init.d/cjdns
  1973. echo ' ;;' >> /etc/init.d/cjdns
  1974. echo ' update|upgrade)' >> /etc/init.d/cjdns
  1975. echo ' update' >> /etc/init.d/cjdns
  1976. echo ' stop' >> /etc/init.d/cjdns
  1977. echo ' sleep 2' >> /etc/init.d/cjdns
  1978. echo ' start' >> /etc/init.d/cjdns
  1979. echo ' exit 0' >> /etc/init.d/cjdns
  1980. echo ' ;;' >> /etc/init.d/cjdns
  1981. echo ' **)' >> /etc/init.d/cjdns
  1982. echo ' echo "Usage: $0 (start|stop|restart|status|update)" 1>&2' >> /etc/init.d/cjdns
  1983. echo ' exit 1' >> /etc/init.d/cjdns
  1984. echo ' ;;' >> /etc/init.d/cjdns
  1985. echo 'esac' >> /etc/init.d/cjdns
  1986. chmod +x /etc/init.d/cjdns
  1987. update-rc.d cjdns defaults
  1988. service cjdns start
  1989. if [ ! "$?" = "0" ]; then
  1990. systemctl status cjdns.service
  1991. exit 8260
  1992. fi
  1993. apt-get -y install radvd
  1994. echo 'interface eth0' > /etc/radvd.conf
  1995. echo '{' >> /etc/radvd.conf
  1996. echo ' AdvSendAdvert on;' >> /etc/radvd.conf
  1997. echo ' prefix fdfc::1/64' >> /etc/radvd.conf
  1998. echo ' {' >> /etc/radvd.conf
  1999. echo ' AdvRouterAddr on;' >> /etc/radvd.conf
  2000. echo ' };' >> /etc/radvd.conf
  2001. echo '};' >> /etc/radvd.conf
  2002. systemctl restart radvd
  2003. if [ ! "$?" = "0" ]; then
  2004. systemctl status radvd.service
  2005. exit 4395
  2006. fi
  2007. if ! grep -q "# Mesh Networking (cjdns)" /etc/network/interfaces; then
  2008. echo '' >> /etc/network/interfaces
  2009. echo '# Mesh Networking (cjdns)' >> /etc/network/interfaces
  2010. echo 'iface eth0 inet6 static' >> /etc/network/interfaces
  2011. echo ' pre-up modprobe ipv6' >> /etc/network/interfaces
  2012. echo ' address fdfc:0000:0000:0000:0000:0000:0000:0001' >> /etc/network/interfaces
  2013. echo ' netmask 64' >> /etc/network/interfaces
  2014. service network-manager restart
  2015. if [ ! "$?" = "0" ]; then
  2016. systemctl status networking.service
  2017. exit 6949
  2018. fi
  2019. fi
  2020. ip6tables -A INPUT -p udp --dport $CJDNS_PORT -j ACCEPT
  2021. ip6tables -A INPUT -p tcp --dport $CJDNS_PORT -j ACCEPT
  2022. save_firewall_settings
  2023. if ! grep -q $"Mesh Networking (cjdns)" /home/$MY_USERNAME/README; then
  2024. CURRENT_IP_ADDRESS=$(ip addr show | grep "inet " | sed -n 2p | awk -F ' ' '{print $2}' | awk -F '/' '{print $1}')
  2025. echo '' >> /home/$MY_USERNAME/README
  2026. echo '' >> /home/$MY_USERNAME/README
  2027. echo $'Mesh Networking (cjdns)' >> /home/$MY_USERNAME/README
  2028. echo '=======================' >> /home/$MY_USERNAME/README
  2029. echo $"cjdns IPv6 address: $CJDNS_IPV6" >> /home/$MY_USERNAME/README
  2030. echo $"cjdns public key: $CJDNS_PUBLIC_KEY" >> /home/$MY_USERNAME/README
  2031. echo $"cjdns private key: $CJDNS_PRIVATE_KEY" >> /home/$MY_USERNAME/README
  2032. echo $"cjdns password: $CJDNS_PASSWORD" >> /home/$MY_USERNAME/README
  2033. echo $"cjdns port: $CJDNS_PORT" >> /home/$MY_USERNAME/README
  2034. echo '' >> /home/$MY_USERNAME/README
  2035. echo $"Forward port $CJDNS_PORT from your internet router to the ${PROJECT_NAME}" >> /home/$MY_USERNAME/README
  2036. echo '' >> /home/$MY_USERNAME/README
  2037. echo $'Below is an example of your connection credentials' >> /home/$MY_USERNAME/README
  2038. echo $'that you can give to other people so they can connect' >> /home/$MY_USERNAME/README
  2039. echo $'to you using your default password' >> /home/$MY_USERNAME/README
  2040. echo $'Adding a unique password for each user is advisable' >> /home/$MY_USERNAME/README
  2041. echo $'so that leaks can be isolated.' >> /home/$MY_USERNAME/README
  2042. echo '' >> /home/$MY_USERNAME/README
  2043. echo "\"$CURRENT_IP_ADDRESS:$CJDNS_PORT\":{\"password\":\"$CJDNS_PASSWORD\",\"publicKey\":\"$CJDNS_PUBLIC_KEY\"}" >> /home/$MY_USERNAME/README
  2044. echo '' >> /home/$MY_USERNAME/README
  2045. echo $'More is not better. 3-5 cjdns peers is good. 30 peers is bad.' >> /home/$MY_USERNAME/README
  2046. echo '' >> /home/$MY_USERNAME/README
  2047. echo $'NEVER USE A PUBLIC PEER. These degrade the network and make it centralized.' >> /home/$MY_USERNAME/README
  2048. echo $'Each node can handle many peers, but no node can handle the entire internet.' >> /home/$MY_USERNAME/README
  2049. echo $'As this network grows any public peer will simply become saturated and' >> /home/$MY_USERNAME/README
  2050. echo $'useless causing issues for the entire network.' >> /home/$MY_USERNAME/README
  2051. echo $'Please report anyone offering you a public peer as they are promoting shared' >> /home/$MY_USERNAME/README
  2052. echo $'passwords which could lead to people pretending to be you. A peering pass' >> /home/$MY_USERNAME/README
  2053. echo $'should not contain someone elses nickname or info but should contain yours' >> /home/$MY_USERNAME/README
  2054. echo $'to ensure it is not shared. It also helps when editing the conf to know who' >> /home/$MY_USERNAME/README
  2055. echo $'each password is for.' >> /home/$MY_USERNAME/README
  2056. echo '' >> /home/$MY_USERNAME/README
  2057. echo $'Possible cjdns destinations of interest:' >> /home/$MY_USERNAME/README
  2058. echo ' http://transitiontech.ca/faq' >> /home/$MY_USERNAME/README
  2059. echo ' http://cjdns.ca/hypeirc.txt' >> /home/$MY_USERNAME/README
  2060. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
  2061. chmod 600 /home/$MY_USERNAME/README
  2062. fi
  2063. echo 'mesh_cjdns' >> $COMPLETION_FILE
  2064. }
  2065. function create_trove {
  2066. if grep -Fxq "create_trove" $COMPLETION_FILE; then
  2067. return
  2068. fi
  2069. ${PROJECT_NAME}-trove
  2070. echo 'create_trove' >> $COMPLETION_FILE
  2071. }
  2072. function mesh_cjdns_tools {
  2073. if grep -Fxq "mesh_cjdns_tools" $COMPLETION_FILE; then
  2074. return
  2075. fi
  2076. if [[ $ENABLE_CJDNS != "yes" ]]; then
  2077. return
  2078. fi
  2079. if [ ! -d /etc/cjdns ]; then
  2080. mesh_cjdns
  2081. fi
  2082. apt-get -y install golang mercurial
  2083. if [ ! -f ~/.bashrc ]; then
  2084. touch ~/.bashrc
  2085. fi
  2086. export GOPATH=$HOME/projects/go
  2087. if ! grep -q "export GOPATH=" ~/.bashrc; then
  2088. echo 'export GOPATH=$HOME/projects/go' >> ~/.bashrc
  2089. fi
  2090. if ! grep -q "export PATH=$PATH:$HOME/projects/go/bin" ~/.bashrc; then
  2091. export PATH=$PATH:$HOME/projects/go/bin
  2092. echo 'export PATH=$PATH:$HOME/projects/go/bin' >> ~/.bashrc
  2093. fi
  2094. export GOPATH=$HOME/projects/go
  2095. export PATH=$PATH:$HOME/projects/go/bin
  2096. go get $CJDCMD_REPO
  2097. if [ ! -f $HOME/projects/go/bin/cjdcmd ]; then
  2098. echo $'cjdcmd was not compiled. Check your golang installation'
  2099. exit 7439
  2100. fi
  2101. cp $HOME/projects/go/bin/cjdcmd /usr/bin
  2102. # initialise from the cjdns config
  2103. /usr/bin/cjdcmd cjdnsadmin -file /etc/cjdns/cjdroute.conf
  2104. echo 'mesh_cjdns_tools' >> $COMPLETION_FILE
  2105. }
  2106. function install_zeronet_blog {
  2107. if [[ $SYSTEM_TYPE != "$VARIANT_MESH" ]]; then
  2108. return
  2109. fi
  2110. if [ -d /opt/zeronet/ZeroBlog ]; then
  2111. if grep -q "ZeroNet Blog commit" $COMPLETION_FILE; then
  2112. CURRENT_ZERONET_BLOG_COMMIT=$(grep "ZeroNet Blog commit" $COMPLETION_FILE | awk -F ':' '{print $2}')
  2113. if [[ "$CURRENT_ZERONET_BLOG_COMMIT" != "$ZERONET_BLOG_COMMIT" ]]; then
  2114. cd /opt/zeronet/ZeroBlog
  2115. git_pull $ZERONET_BLOG_REPO $ZERONET_BLOG_COMMIT
  2116. sed -i "s/ZeroNet Blog commit.*/ZeroNet Blog commit:$ZERONET_BLOG_COMMIT/g" $COMPLETION_FILE
  2117. fi
  2118. else
  2119. echo "ZeroNet Blog commit:$ZERONET_BLOG_COMMIT" >> $COMPLETION_FILE
  2120. fi
  2121. fi
  2122. if grep -Fxq "install_zeronet_blog" $COMPLETION_FILE; then
  2123. return
  2124. fi
  2125. if [ ! -f /home/$MY_USERNAME/README ]; then
  2126. touch /home/$MY_USERNAME/README
  2127. fi
  2128. if grep -q "ZeroNet Blog address" /home/$MY_USERNAME/README; then
  2129. return
  2130. fi
  2131. if [ ! -d /etc/avahi ]; then
  2132. echo $'Avahi is not installed'
  2133. exit 736
  2134. fi
  2135. ZERONET_DEFAULT_BLOG_TITLE="${MY_USERNAME}'s Blog"
  2136. cd /opt/zeronet
  2137. python zeronet.py --batch siteCreate 2> /opt/zeronet/blog.txt
  2138. if [ ! -f /opt/zeronet/blog.txt ]; then
  2139. echo $'Unable to create blog'
  2140. exit 479
  2141. fi
  2142. blog_address=$(cat blog.txt | grep "Site address" | awk -F ':' '{print $2}')
  2143. blog_private_key=$(cat blog.txt | grep "Site private key" | awk -F ':' '{print $2}')
  2144. ZERONET_BLOG_ADDRESS=${blog_address//[[:blank:]]/}
  2145. ZERONET_BLOG_PRIVATE_KEY=${blog_private_key//[[:blank:]]/}
  2146. if [ ${#ZERONET_BLOG_ADDRESS} -lt 20 ]; then
  2147. echo $"Address: $ZERONET_BLOG_ADDRESS"
  2148. echo $"Public key: $ZERONET_BLOG_PRIVATE_KEY"
  2149. echo $'Unable to create zeronet blog address'
  2150. exit 7358
  2151. fi
  2152. if [ ${#ZERONET_BLOG_PRIVATE_KEY} -lt 20 ]; then
  2153. echo $"Address: $ZERONET_BLOG_ADDRESS"
  2154. echo $"Public key: $ZERONET_BLOG_PRIVATE_KEY"
  2155. echo $'Unable to create zeronet blog private key'
  2156. exit 1639
  2157. fi
  2158. if [ ! -d "/opt/zeronet/data/$ZERONET_BLOG_ADDRESS" ]; then
  2159. echo $"Unable to find site directory: /opt/zeronet/data/$ZERONET_BLOG_ADDRESS"
  2160. exit 7638
  2161. fi
  2162. git_clone $ZERONET_BLOG_REPO ZeroBlog
  2163. if [ ! -d /opt/zeronet/ZeroBlog ]; then
  2164. echo $'ZeroBlog repo could not be cloned'
  2165. exit 6739
  2166. fi
  2167. cd /opt/zeronet/ZeroBlog
  2168. git checkout $ZERONET_BLOG_COMMIT -b $ZERONET_BLOG_COMMIT
  2169. if ! grep -q "ZeroNet Blog commit" $COMPLETION_FILE; then
  2170. echo "ZeroNet Blog commit:$ZERONET_BLOG_COMMIT" >> $COMPLETION_FILE
  2171. else
  2172. sed -i "s/ZeroNet Blog commit.*/ZeroNet Blog commit:$ZERONET_BLOG_COMMIT/g" $COMPLETION_FILE
  2173. fi
  2174. echo $"ZeroNet Blog address: $ZERONET_BLOG_ADDRESS"
  2175. echo $"ZeroNet Blog private key: $ZERONET_BLOG_PRIVATE_KEY"
  2176. cp -r /opt/zeronet/ZeroBlog/* /opt/zeronet/data/$ZERONET_BLOG_ADDRESS
  2177. if [ ! -d /opt/zeronet/data/$ZERONET_BLOG_ADDRESS/data ]; then
  2178. mkdir /opt/zeronet/data/$ZERONET_BLOG_ADDRESS/data
  2179. fi
  2180. cp /opt/zeronet/data/$ZERONET_BLOG_ADDRESS/data-default/data.json /opt/zeronet/data/$ZERONET_BLOG_ADDRESS/data
  2181. sed -i "s/MyZeroBlog/$ZERONET_DEFAULT_BLOG_TITLE/g" /opt/zeronet/data/$ZERONET_BLOG_ADDRESS/data/data.json
  2182. sed -i "s/My ZeroBlog./$ZERONET_DEFAULT_BLOG_TAGLINE/g" /opt/zeronet/data/$ZERONET_BLOG_ADDRESS/data/data.json
  2183. sed -i "s/ZeroBlog Demo/$ZERONET_DEFAULT_BLOG_TITLE/g" /opt/zeronet/data/$ZERONET_BLOG_ADDRESS/index.html
  2184. sed -i "s|<h3 class=\"description\">.*|<h3 class=\"description\">$ZERONET_DEFAULT_BLOG_TAGLINE</h3>|g" /opt/zeronet/data/$ZERONET_BLOG_ADDRESS/index.html
  2185. sed -i "s/Blogging platform Demo/Blogging platform/g" /opt/zeronet/data/$ZERONET_BLOG_ADDRESS/content.json
  2186. python zeronet.py siteSign $ZERONET_BLOG_ADDRESS $ZERONET_BLOG_PRIVATE_KEY
  2187. # Add an avahi service
  2188. echo '<?xml version="1.0" standalone="no"?><!--*-nxml-*-->' > /tmp/zeronet-blog.service
  2189. echo '<!DOCTYPE service-group SYSTEM "avahi-service.dtd">' >> /tmp/zeronet-blog.service
  2190. echo '<service-group>' >> /tmp/zeronet-blog.service
  2191. echo ' <name replace-wildcards="yes">%h ZeroNet Blog</name>' >> /tmp/zeronet-blog.service
  2192. echo ' <service>' >> /tmp/zeronet-blog.service
  2193. echo ' <type>_zeronet._udp</type>' >> /tmp/zeronet-blog.service
  2194. echo " <port>$ZERONET_PORT</port>" >> /tmp/zeronet-blog.service
  2195. echo " <txt-record>$ZERONET_URL/$ZERONET_BLOG_ADDRESS</txt-record>" >> /tmp/zeronet-blog.service
  2196. echo ' </service>' >> /tmp/zeronet-blog.service
  2197. echo '</service-group>' >> /tmp/zeronet-blog.service
  2198. cp /tmp/zeronet-blog.service /etc/avahi/services/zeronet-blog.service
  2199. if [ ! -d /home/$MY_USERNAME/.config/zeronet ]; then
  2200. mkdir -p /home/$MY_USERNAME/.config/zeronet
  2201. chown -R $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.config
  2202. fi
  2203. echo "$ZERONET_URL/$ZERONET_BLOG_ADDRESS" > /home/$MY_USERNAME/.config/zeronet/myblog
  2204. if ! grep -q "ZeroNet Blog address" /home/$MY_USERNAME/README; then
  2205. echo '' >> /home/$MY_USERNAME/README
  2206. echo "ZeroNet Blog address: $ZERONET_BLOG_ADDRESS" >> /home/$MY_USERNAME/README
  2207. echo "ZeroNet Blog private key: $ZERONET_BLOG_PRIVATE_KEY" >> /home/$MY_USERNAME/README
  2208. fi
  2209. echo 'install_zeronet_blog' >> $COMPLETION_FILE
  2210. }
  2211. function install_zeronet_mail {
  2212. if [[ $SYSTEM_TYPE != "$VARIANT_MESH" ]]; then
  2213. return
  2214. fi
  2215. if [ -d /opt/zeronet/ZeroMail ]; then
  2216. if grep -q "ZeroNet Mail commit" $COMPLETION_FILE; then
  2217. CURRENT_ZERONET_MAIL_COMMIT=$(grep "ZeroNet Mail commit" $COMPLETION_FILE | awk -F ':' '{print $2}')
  2218. if [[ "$CURRENT_ZERONET_MAIL_COMMIT" != "$ZERONET_MAIL_COMMIT" ]]; then
  2219. cd /opt/zeronet/ZeroMail
  2220. git_pull $ZERONET_MAIL_REPO $ZERONET_MAIL_COMMIT
  2221. sed -i "s/ZeroNet Mail commit.*/ZeroNet Mail commit:$ZERONET_MAIL_COMMIT/g" $COMPLETION_FILE
  2222. fi
  2223. else
  2224. echo "ZeroNet Mail commit:$ZERONET_MAIL_COMMIT" >> $COMPLETION_FILE
  2225. fi
  2226. fi
  2227. if grep -Fxq "install_zeronet_mail" $COMPLETION_FILE; then
  2228. return
  2229. fi
  2230. if [ ! -f /home/$MY_USERNAME/README ]; then
  2231. touch /home/$MY_USERNAME/README
  2232. fi
  2233. if grep -q "ZeroNet Mail address" /home/$MY_USERNAME/README; then
  2234. return
  2235. fi
  2236. if [ ! -d /etc/avahi ]; then
  2237. echo 'Avahi is not installed'
  2238. exit 736
  2239. fi
  2240. ZERONET_DEFAULT_MAIL_TITLE="${MY_USERNAME}'s Mail"
  2241. cd /opt/zeronet
  2242. python zeronet.py --batch siteCreate 2> /opt/zeronet/mail.txt
  2243. if [ ! -f /opt/zeronet/mail.txt ]; then
  2244. echo $'Unable to create mail'
  2245. exit 479
  2246. fi
  2247. mail_address=$(cat mail.txt | grep "Site address" | awk -F ':' '{print $2}')
  2248. mail_private_key=$(cat mail.txt | grep "Site private key" | awk -F ':' '{print $2}')
  2249. ZERONET_MAIL_ADDRESS=${mail_address//[[:blank:]]/}
  2250. ZERONET_MAIL_PRIVATE_KEY=${mail_private_key//[[:blank:]]/}
  2251. if [ ${#ZERONET_MAIL_ADDRESS} -lt 20 ]; then
  2252. echo $"Address: $ZERONET_MAIL_ADDRESS"
  2253. echo $"Public key: $ZERONET_MAIL_PRIVATE_KEY"
  2254. echo $'Unable to create zeronet mail address'
  2255. exit 7358
  2256. fi
  2257. if [ ${#ZERONET_MAIL_PRIVATE_KEY} -lt 20 ]; then
  2258. echo $"Address: $ZERONET_MAIL_ADDRESS"
  2259. echo $"Public key: $ZERONET_MAIL_PRIVATE_KEY"
  2260. echo $'Unable to create zeronet mail private key'
  2261. exit 1639
  2262. fi
  2263. if [ ! -d "/opt/zeronet/data/$ZERONET_MAIL_ADDRESS" ]; then
  2264. echo $"Unable to find site directory: /opt/zeronet/data/$ZERONET_MAIL_ADDRESS"
  2265. exit 7638
  2266. fi
  2267. git_clone $ZERONET_MAIL_REPO ZeroMail
  2268. if [ ! -d /opt/zeronet/ZeroMail ]; then
  2269. echo $'ZeroMail repo could not be cloned'
  2270. exit 6739
  2271. fi
  2272. cd /opt/zeronet/ZeroMail
  2273. git checkout $ZERONET_MAIL_COMMIT -b $ZERONET_MAIL_COMMIT
  2274. if ! grep -q "ZeroNet Mail commit" $COMPLETION_FILE; then
  2275. echo "ZeroNet Mail commit:$ZERONET_MAIL_COMMIT" >> $COMPLETION_FILE
  2276. else
  2277. sed -i "s/ZeroNet Mail commit.*/ZeroNet Mail commit:$ZERONET_MAIL_COMMIT/g" $COMPLETION_FILE
  2278. fi
  2279. echo $"ZeroNet Mail address: $ZERONET_MAIL_ADDRESS"
  2280. echo $"ZeroNet Mail private key: $ZERONET_MAIL_PRIVATE_KEY"
  2281. cp -r /opt/zeronet/ZeroMail/* /opt/zeronet/data/$ZERONET_MAIL_ADDRESS
  2282. if [ ! -d /opt/zeronet/data/$ZERONET_MAIL_ADDRESS/data ]; then
  2283. mkdir /opt/zeronet/data/$ZERONET_MAIL_ADDRESS/data
  2284. fi
  2285. cp /opt/zeronet/data/$ZERONET_MAIL_ADDRESS/data-default/data.json /opt/zeronet/data/$ZERONET_MAIL_ADDRESS/data
  2286. sed -i "s/MyZeroMail/$ZERONET_DEFAULT_MAIL_TITLE/g" /opt/zeronet/data/$ZERONET_MAIL_ADDRESS/data/data.json
  2287. sed -i "s/My ZeroMail./$ZERONET_DEFAULT_MAIL_TAGLINE/g" /opt/zeronet/data/$ZERONET_MAIL_ADDRESS/data/data.json
  2288. sed -i "s/ZeroMail Demo/$ZERONET_DEFAULT_MAIL_TITLE/g" /opt/zeronet/data/$ZERONET_MAIL_ADDRESS/index.html
  2289. sed -i "s|<h3 class=\"description\">.*|<h3 class=\"description\">$ZERONET_DEFAULT_MAIL_TAGLINE</h3>|g" /opt/zeronet/data/$ZERONET_MAIL_ADDRESS/index.html
  2290. sed -i "s/Mailging platform Demo/Mailging platform/g" /opt/zeronet/data/$ZERONET_MAIL_ADDRESS/content.json
  2291. python zeronet.py siteSign $ZERONET_MAIL_ADDRESS $ZERONET_MAIL_PRIVATE_KEY
  2292. # Add an avahi service
  2293. echo '<?xml version="1.0" standalone="no"?><!--*-nxml-*-->' > /tmp/zeronet-mail.service
  2294. echo '<!DOCTYPE service-group SYSTEM "avahi-service.dtd">' >> /tmp/zeronet-mail.service
  2295. echo '<service-group>' >> /tmp/zeronet-mail.service
  2296. echo ' <name replace-wildcards="yes">%h ZeroNet Mail</name>' >> /tmp/zeronet-mail.service
  2297. echo ' <service>' >> /tmp/zeronet-mail.service
  2298. echo ' <type>_zeronet._udp</type>' >> /tmp/zeronet-mail.service
  2299. echo " <port>$ZERONET_PORT</port>" >> /tmp/zeronet-mail.service
  2300. echo " <txt-record>$ZERONET_URL/$ZERONET_MAIL_ADDRESS</txt-record>" >> /tmp/zeronet-mail.service
  2301. echo ' </service>' >> /tmp/zeronet-mail.service
  2302. echo '</service-group>' >> /tmp/zeronet-mail.service
  2303. cp /tmp/zeronet-mail.service /etc/avahi/services/zeronet-mail.service
  2304. if [ ! -d /home/$MY_USERNAME/.config/zeronet ]; then
  2305. mkdir -p /home/$MY_USERNAME/.config/zeronet
  2306. chown -R $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.config
  2307. fi
  2308. echo "$ZERONET_URL/$ZERONET_MAIL_ADDRESS" > /home/$MY_USERNAME/.config/zeronet/mymail
  2309. if ! grep -q $"ZeroNet Mail address" /home/$MY_USERNAME/README; then
  2310. echo '' >> /home/$MY_USERNAME/README
  2311. echo $"ZeroNet Mail address: $ZERONET_MAIL_ADDRESS" >> /home/$MY_USERNAME/README
  2312. echo $"ZeroNet Mail private key: $ZERONET_MAIL_PRIVATE_KEY" >> /home/$MY_USERNAME/README
  2313. fi
  2314. echo 'install_zeronet_mail' >> $COMPLETION_FILE
  2315. }
  2316. function install_zeronet_forum {
  2317. if [[ $SYSTEM_TYPE != "$VARIANT_MESH" ]]; then
  2318. return
  2319. fi
  2320. # update to the next commit
  2321. if [ -d /opt/zeronet/ZeroTalk ]; then
  2322. if grep -q "ZeroNet Forum commit" $COMPLETION_FILE; then
  2323. CURRENT_ZERONET_FORUM_COMMIT=$(grep "ZeroNet Forum commit" $COMPLETION_FILE | awk -F ':' '{print $2}')
  2324. if [[ "$CURRENT_ZERONET_FORUM_COMMIT" != "$ZERONET_FORUM_COMMIT" ]]; then
  2325. cd /opt/zeronet/ZeroTalk
  2326. git_pull $ZERONET_FORUM_REPO $ZERONET_FORUM_COMMIT
  2327. sed -i "s/ZeroNet Forum commit.*/ZeroNet Forum commit:$ZERONET_FORUM_COMMIT/g" $COMPLETION_FILE
  2328. fi
  2329. else
  2330. echo "ZeroNet Forum commit:$ZERONET_FORUM_COMMIT" >> $COMPLETION_FILE
  2331. fi
  2332. fi
  2333. if grep -Fxq "install_zeronet_forum" $COMPLETION_FILE; then
  2334. return
  2335. fi
  2336. if [ ! -f /home/$MY_USERNAME/README ]; then
  2337. touch /home/$MY_USERNAME/README
  2338. fi
  2339. if grep -q "ZeroNet Forum address" /home/$MY_USERNAME/README; then
  2340. return
  2341. fi
  2342. if [ ! -d /etc/avahi ]; then
  2343. echo $'Avahi is not installed'
  2344. exit 736
  2345. fi
  2346. ZERONET_DEFAULT_FORUM_TITLE=$"${MY_USERNAME}'s Forum"
  2347. cd /opt/zeronet
  2348. python zeronet.py --batch siteCreate 2> /opt/zeronet/forum.txt
  2349. if [ ! -f /opt/zeronet/forum.txt ]; then
  2350. echo $'Unable to create forum'
  2351. exit 479
  2352. fi
  2353. forum_address=$(cat forum.txt | grep "Site address" | awk -F ':' '{print $2}')
  2354. forum_private_key=$(cat forum.txt | grep "Site private key" | awk -F ':' '{print $2}')
  2355. ZERONET_FORUM_ADDRESS=${forum_address//[[:blank:]]/}
  2356. ZERONET_FORUM_PRIVATE_KEY=${forum_private_key//[[:blank:]]/}
  2357. if [ ${#ZERONET_FORUM_ADDRESS} -lt 20 ]; then
  2358. echo $"Address: $ZERONET_FORUM_ADDRESS"
  2359. echo $"Public key: $ZERONET_FORUM_PRIVATE_KEY"
  2360. echo $'Unable to create zeronet forum address'
  2361. exit 76352
  2362. fi
  2363. if [ ${#ZERONET_FORUM_PRIVATE_KEY} -lt 20 ]; then
  2364. echo $"Address: $ZERONET_FORUM_ADDRESS"
  2365. echo $"Public key: $ZERONET_FORUM_PRIVATE_KEY"
  2366. echo $'Unable to create zeronet forum private key'
  2367. exit 87356
  2368. fi
  2369. if [ ! -d "/opt/zeronet/data/$ZERONET_FORUM_ADDRESS" ]; then
  2370. echo $"Unable to find site directory: /opt/zeronet/data/$ZERONET_FORUM_ADDRESS"
  2371. exit 7638
  2372. fi
  2373. git_clone $ZERONET_FORUM_REPO ZeroTalk
  2374. if [ ! -d /opt/zeronet/ZeroTalk ]; then
  2375. echo $'ZeroTalk repo could not be cloned'
  2376. exit 6739
  2377. fi
  2378. git checkout $ZERONET_FORUM_COMMIT -b $ZERONET_FORUM_COMMIT
  2379. if ! grep -q "ZeroNet Forum commit" $COMPLETION_FILE; then
  2380. echo "ZeroNet Forum commit:$ZERONET_FORUM_COMMIT" >> $COMPLETION_FILE
  2381. else
  2382. sed -i "s/ZeroNet Forum commit.*/ZeroNet Forum commit:$ZERONET_FORUM_COMMIT/g" $COMPLETION_FILE
  2383. fi
  2384. echo $"Forum address: $ZERONET_FORUM_ADDRESS"
  2385. echo $"Forum private key: $ZERONET_FORUM_PRIVATE_KEY"
  2386. cp -r /opt/zeronet/ZeroTalk/* /opt/zeronet/data/$ZERONET_FORUM_ADDRESS
  2387. sed -i "s/ZeroBoard/$ZERONET_DEFAULT_FORUM_TITLE/g" /opt/zeronet/data/$ZERONET_FORUM_ADDRESS/index.html
  2388. sed -i "s/ZeroTalk/$ZERONET_DEFAULT_FORUM_TITLE/g" /opt/zeronet/data/$ZERONET_FORUM_ADDRESS/index.html
  2389. sed -i "s|Demo for dynamic, decentralized content publishing.|$ZERONET_DEFAULT_FORUM_TAGLINE|g" /opt/zeronet/data/$ZERONET_FORUM_ADDRESS/index.html
  2390. sed -i 's/Messaging Board Demo/Messaging Board/g' /opt/zeronet/data/$ZERONET_FORUM_ADDRESS/content.json
  2391. sed -i "s/ZeroBoard/$ZERONET_DEFAULT_FORUM_TITLE/g" /opt/zeronet/data/$ZERONET_FORUM_ADDRESS/content.json
  2392. python zeronet.py siteSign $ZERONET_FORUM_ADDRESS $ZERONET_FORUM_PRIVATE_KEY --inner_path data/users/content.json
  2393. # Add an avahi service
  2394. echo '<?xml version="1.0" standalone="no"?><!--*-nxml-*-->' > /tmp/zeronet-forum.service
  2395. echo '<!DOCTYPE service-group SYSTEM "avahi-service.dtd">' >> /tmp/zeronet-forum.service
  2396. echo '<service-group>' >> /tmp/zeronet-forum.service
  2397. echo ' <name replace-wildcards="yes">%h ZeroNet Forum</name>' >> /tmp/zeronet-forum.service
  2398. echo ' <service>' >> /tmp/zeronet-forum.service
  2399. echo ' <type>_zeronet._udp</type>' >> /tmp/zeronet-forum.service
  2400. echo " <port>$ZERONET_PORT</port>" >> /tmp/zeronet-forum.service
  2401. echo " <txt-record>$ZERONET_URL/$ZERONET_FORUM_ADDRESS</txt-record>" >> /tmp/zeronet-forum.service
  2402. echo ' </service>' >> /tmp/zeronet-forum.service
  2403. echo '</service-group>' >> /tmp/zeronet-forum.service
  2404. sudo cp /tmp/zeronet-forum.service /etc/avahi/services/zeronet-forum.service
  2405. if [ ! -d /home/$MY_USERNAME/.config/zeronet ]; then
  2406. mkdir -p /home/$MY_USERNAME/.config/zeronet
  2407. chown -R $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.config
  2408. fi
  2409. echo "$ZERONET_URL/$ZERONET_FORUM_ADDRESS" > /home/$MY_USERNAME/.config/zeronet/myforum
  2410. if ! grep -q $"ZeroNet Forum address" /home/$MY_USERNAME/README; then
  2411. echo '' >> /home/$MY_USERNAME/README
  2412. echo $"ZeroNet Forum address: $ZERONET_FORUM_ADDRESS" >> /home/$MY_USERNAME/README
  2413. echo $"ZeroNet Forum private key: $ZERONET_FORUM_PRIVATE_KEY" >> /home/$MY_USERNAME/README
  2414. fi
  2415. echo 'install_zeronet_forum' >> $COMPLETION_FILE
  2416. }
  2417. function install_zeronet {
  2418. if [[ $SYSTEM_TYPE != "$VARIANT_MESH" ]]; then
  2419. return
  2420. fi
  2421. # update to the next commit
  2422. if [ -d /opt/zeronet ]; then
  2423. if grep -q "ZeroNet commit" $COMPLETION_FILE; then
  2424. CURRENT_ZERONET_COMMIT=$(grep "ZeroNet commit" $COMPLETION_FILE | awk -F ':' '{print $2}')
  2425. if [[ "$CURRENT_ZERONET_COMMIT" != "$ZERONET_COMMIT" ]]; then
  2426. cd /opt/zeronet
  2427. git_pull $ZERONET_REPO $ZERONET_COMMIT
  2428. sed -i "s/ZeroNet commit.*/ZeroNet commit:$ZERONET_COMMIT/g" $COMPLETION_FILE
  2429. systemctl restart zeronet.service
  2430. fi
  2431. else
  2432. echo "ZeroNet commit:$ZERONET_COMMIT" >> $COMPLETION_FILE
  2433. fi
  2434. fi
  2435. if grep -Fxq "install_zeronet" $COMPLETION_FILE; then
  2436. return
  2437. fi
  2438. apt-get -y install python python-msgpack python-gevent
  2439. apt-get -y install python-pip bittornado
  2440. pip install msgpack-python --upgrade
  2441. useradd -d /opt/zeronet/ -s /bin/false zeronet
  2442. git_clone $ZERONET_REPO /opt/zeronet
  2443. if [ ! -d /opt/zeronet ]; then
  2444. exit 56823
  2445. fi
  2446. cd /opt/zeronet
  2447. git checkout $ZERONET_COMMIT -b $ZERONET_COMMIT
  2448. if ! grep -q "ZeroNet commit" $COMPLETION_FILE; then
  2449. echo "ZeroNet commit:$ZERONET_COMMIT" >> $COMPLETION_FILE
  2450. else
  2451. sed -i "s/ZeroNet commit.*/ZeroNet commit:$ZERONET_COMMIT/g" $COMPLETION_FILE
  2452. fi
  2453. sudo chown -R zeronet:zeronet /opt/zeronet
  2454. #git checkout bashrc/bootstrap-file
  2455. # Hack to ensure that the file access port is opened
  2456. # This is because zeronet normally relies on an internet site
  2457. # to do this, but on a purely local mesh the internet isn't available
  2458. 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
  2459. echo '[Unit]' > /etc/systemd/system/zeronet.service
  2460. echo 'Description=Zeronet Server' >> /etc/systemd/system/zeronet.service
  2461. echo 'After=syslog.target' >> /etc/systemd/system/zeronet.service
  2462. echo 'After=network.target' >> /etc/systemd/system/zeronet.service
  2463. echo '[Service]' >> /etc/systemd/system/zeronet.service
  2464. echo 'Type=simple' >> /etc/systemd/system/zeronet.service
  2465. echo 'User=zeronet' >> /etc/systemd/system/zeronet.service
  2466. echo 'Group=zeronet' >> /etc/systemd/system/zeronet.service
  2467. echo 'WorkingDirectory=/opt/zeronet' >> /etc/systemd/system/zeronet.service
  2468. echo "ExecStart=/usr/bin/python zeronet.py --ip_external ${DEFAULT_DOMAIN_NAME}.local --trackers_file /opt/zeronet/bootstrap" >> /etc/systemd/system/zeronet.service
  2469. echo '' >> /etc/systemd/system/zeronet.service
  2470. echo 'TimeoutSec=300' >> /etc/systemd/system/zeronet.service
  2471. echo '' >> /etc/systemd/system/zeronet.service
  2472. echo '[Install]' >> /etc/systemd/system/zeronet.service
  2473. echo 'WantedBy=multi-user.target' >> /etc/systemd/system/zeronet.service
  2474. echo '[Unit]' > /etc/systemd/system/tracker.service
  2475. echo 'Description=Torrent Tracker' >> /etc/systemd/system/tracker.service
  2476. echo 'After=syslog.target' >> /etc/systemd/system/tracker.service
  2477. echo 'After=network.target' >> /etc/systemd/system/tracker.service
  2478. echo '[Service]' >> /etc/systemd/system/tracker.service
  2479. echo 'Type=simple' >> /etc/systemd/system/tracker.service
  2480. echo 'User=tracker' >> /etc/systemd/system/tracker.service
  2481. echo 'Group=tracker' >> /etc/systemd/system/tracker.service
  2482. echo 'WorkingDirectory=/opt/tracker' >> /etc/systemd/system/tracker.service
  2483. 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
  2484. echo '' >> /etc/systemd/system/tracker.service
  2485. echo 'TimeoutSec=300' >> /etc/systemd/system/tracker.service
  2486. echo '' >> /etc/systemd/system/tracker.service
  2487. echo '[Install]' >> /etc/systemd/system/tracker.service
  2488. echo 'WantedBy=multi-user.target' >> /etc/systemd/system/tracker.service
  2489. useradd -d /opt/tracker/ -s /bin/false tracker
  2490. if [ ! -d /opt/tracker ]; then
  2491. mkdir /opt/tracker
  2492. fi
  2493. chown -R tracker:tracker /opt/tracker
  2494. # publish regularly
  2495. if ! grep -q "zeronetavahi" /etc/crontab; then
  2496. echo "* * * * * root zeronetavahi > /dev/null" >> /etc/crontab
  2497. fi
  2498. systemctl enable tracker.service
  2499. systemctl enable zeronet.service
  2500. systemctl daemon-reload
  2501. systemctl start tracker.service
  2502. systemctl start zeronet.service
  2503. echo 'mesh_zeronet' >> $COMPLETION_FILE
  2504. }
  2505. function install_vpn_tunnel {
  2506. if ! grep -q "repo.universe-factory.net" /etc/apt/sources.list; then
  2507. echo 'deb http://repo.universe-factory.net/debian/ sid main' >> /etc/apt/sources.list
  2508. gpg --keyserver pgpkeys.mit.edu --recv-key 16EF3F64CB201D9C
  2509. if [ ! "$?" = "0" ]; then
  2510. exit 76272
  2511. fi
  2512. gpg -a --export 16EF3F64CB201D9C | sudo apt-key add -
  2513. apt-get update
  2514. apt-get -y install fastd
  2515. if [ ! "$?" = "0" ]; then
  2516. exit 52026
  2517. fi
  2518. fi
  2519. }
  2520. # ath9k_htc driver
  2521. function install_atheros_wifi {
  2522. if grep -Fxq "install_atheros_wifi" $COMPLETION_FILE; then
  2523. return
  2524. fi
  2525. if [ $INSTALLING_ON_BBB != "yes" ]; then
  2526. return
  2527. fi
  2528. if [[ $ENABLE_BABEL != "yes" && $ENABLE_BATMAN != "yes" && $ENABLE_CJDNS != "yes" ]]; then
  2529. return
  2530. fi
  2531. if [ -d $INSTALL_DIR/open-ath9k-htc-firmware ]; then
  2532. return
  2533. fi
  2534. # have drivers already been installed ?
  2535. if [ -f /lib/firmware/htc_9271.fw ]; then
  2536. return
  2537. fi
  2538. apt-get -y install build-essential cmake git m4 texinfo
  2539. if [ ! -d $INSTALL_DIR ]; then
  2540. mkdir -p $INSTALL_DIR
  2541. fi
  2542. cd $INSTALL_DIR
  2543. if [ ! -d $INSTALL_DIR/open-ath9k-htc-firmware ]; then
  2544. git_clone $ATHEROS_WIFI_REPO $INSTALL_DIR/open-ath9k-htc-firmware
  2545. if [ ! "$?" = "0" ]; then
  2546. rm -rf $INSTALL_DIR/open-ath9k-htc-firmware
  2547. exit 74283
  2548. fi
  2549. fi
  2550. cd $INSTALL_DIR/open-ath9k-htc-firmware
  2551. git checkout 1.4.0
  2552. make toolchain
  2553. if [ ! "$?" = "0" ]; then
  2554. rm -rf $INSTALL_DIR/open-ath9k-htc-firmware
  2555. exit 24820
  2556. fi
  2557. make firmware
  2558. if [ ! "$?" = "0" ]; then
  2559. rm -rf $INSTALL_DIR/open-ath9k-htc-firmware
  2560. exit 63412
  2561. fi
  2562. cp target_firmware/*.fw /lib/firmware/
  2563. if [ ! "$?" = "0" ]; then
  2564. exit 74681
  2565. fi
  2566. echo 'install_atheros_wifi' >> $COMPLETION_FILE
  2567. }
  2568. function configure_avahi {
  2569. if grep -Fxq "configure_avahi" $COMPLETION_FILE; then
  2570. return
  2571. fi
  2572. # only enable avahi if we're doing mesh networking
  2573. if [[ $ENABLE_BABEL != "yes" && $ENABLE_BATMAN != "yes" && $ENABLE_CJDNS != "yes" ]]; then
  2574. return
  2575. fi
  2576. apt-get -y install avahi-utils avahi-autoipd avahi-dnsconfd
  2577. if [ $DEFAULT_DOMAIN_NAME ]; then
  2578. sed -i "s|#host-name=.*|host-name=$DEFAULT_DOMAIN_NAME|g" /etc/avahi/avahi-daemon.conf
  2579. else
  2580. decarray=( 1 2 3 4 5 6 7 8 9 0 )
  2581. 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]}
  2582. sed -i "s|#host-name=.*|host-name=P$PEER_ID|g" /etc/avahi/avahi-daemon.conf
  2583. fi
  2584. if [ ! -d /etc/avahi/services ]; then
  2585. mkdir -p /etc/avahi/services
  2586. fi
  2587. # remove an avahi service which isn't used
  2588. if [ -f /etc/avahi/services/udisks.service ]; then
  2589. rm /etc/avahi/services/udisks.service
  2590. fi
  2591. # Add an ssh service
  2592. echo '<?xml version="1.0" standalone="no"?><!--*-nxml-*-->' > /etc/avahi/services/ssh.service
  2593. echo '<!DOCTYPE service-group SYSTEM "avahi-service.dtd">' >> /etc/avahi/services/ssh.service
  2594. echo '<service-group>' >> /etc/avahi/services/ssh.service
  2595. echo ' <name replace-wildcards="yes">%h SSH</name>' >> /etc/avahi/services/ssh.service
  2596. echo ' <service>' >> /etc/avahi/services/ssh.service
  2597. echo ' <type>_ssh._tcp</type>' >> /etc/avahi/services/ssh.service
  2598. echo " <port>$SSH_PORT</port>" >> /etc/avahi/services/ssh.service
  2599. echo ' </service>' >> /etc/avahi/services/ssh.service
  2600. echo '</service-group>' >> /etc/avahi/services/ssh.service
  2601. # keep the daemon running
  2602. echo '' >> /usr/bin/$WATCHDOG_SCRIPT_NAME
  2603. echo '# keep avahi daemon running' >> /usr/bin/$WATCHDOG_SCRIPT_NAME
  2604. echo 'AVAHI_RUNNING=$(pgrep avahi-daemon > /dev/null && echo Running)' >> /usr/bin/$WATCHDOG_SCRIPT_NAME
  2605. echo 'if [ ! $AVAHI_RUNNING ]; then' >> /usr/bin/$WATCHDOG_SCRIPT_NAME
  2606. echo ' systemctl start avahi-daemon' >> /usr/bin/$WATCHDOG_SCRIPT_NAME
  2607. echo ' echo -n $CURRENT_DATE >> $LOGFILE' >> /usr/bin/$WATCHDOG_SCRIPT_NAME
  2608. echo ' echo " Avahi daemon restarted" >> $LOGFILE' >> /usr/bin/$WATCHDOG_SCRIPT_NAME
  2609. echo 'fi' >> /usr/bin/$WATCHDOG_SCRIPT_NAME
  2610. systemctl restart avahi-daemon
  2611. echo 'configure_avahi' >> $COMPLETION_FILE
  2612. }
  2613. function mesh_babel {
  2614. if grep -Fxq "mesh_babel" $COMPLETION_FILE; then
  2615. return
  2616. fi
  2617. if [[ $ENABLE_BABEL != "yes" ]]; then
  2618. return
  2619. fi
  2620. apt-get -y install babeld
  2621. babel_script=/var/lib/babel
  2622. echo '#!/bin/bash' > $babel_script
  2623. echo '' >> $babel_script
  2624. echo 'if [[ $1 == "ls" || $1 == "list" ]]; then' >> $babel_script
  2625. echo ' avahi-browse -atl' >> $babel_script
  2626. echo ' exit 0' >> $babel_script
  2627. echo 'fi' >> $babel_script
  2628. echo '' >> $babel_script
  2629. echo 'if [[ $1 == "start" ]]; then' >> $babel_script
  2630. echo ' sed -i "s|#host-name=.*|host-name=$(hostname)|g" /etc/avahi/avahi-daemon.conf' >> $babel_script
  2631. echo ' sed -i "s|host-name=.*|host-name=$(hostname)|g" /etc/avahi/avahi-daemon.conf' >> $babel_script
  2632. echo ' sed -i "s|use-ipv4=.*|use-ipv4=yes|g" /etc/avahi/avahi-daemon.conf' >> $babel_script
  2633. echo ' sed -i "s|use-ipv6=.*|use-ipv6=no|g" /etc/avahi/avahi-daemon.conf' >> $babel_script
  2634. echo ' sed -i "s|hosts:.*|hosts: files mdns4_minimal dns mdns4 mdns|g" /etc/nsswitch.conf' >> $babel_script
  2635. echo ' systemctl restart avahi-daemon' >> $babel_script
  2636. echo 'fi' >> $babel_script
  2637. echo '' >> $babel_script
  2638. echo "IFACE=$WIFI_INTERFACE" >> $babel_script
  2639. echo 'if [[ $IFACE == "wlan0" ]]; then' >> $babel_script
  2640. echo ' if grep -q "wlan1" /proc/net/dev; then' >> $babel_script
  2641. echo ' IFACE=wlan1' >> $babel_script
  2642. echo ' fi' >> $babel_script
  2643. echo 'fi' >> $babel_script
  2644. echo 'if [[ $IFACE == "wlan0" ]]; then' >> $babel_script
  2645. echo ' if grep -q "wlan2" /proc/net/dev; then' >> $babel_script
  2646. echo ' IFACE=wlan2' >> $babel_script
  2647. echo ' fi' >> $babel_script
  2648. echo 'fi' >> $babel_script
  2649. echo 'if [[ $IFACE == "wlan0" ]]; then' >> $babel_script
  2650. echo ' if grep -q "wlan3" /proc/net/dev; then' >> $babel_script
  2651. echo ' IFACE=wlan3' >> $babel_script
  2652. echo ' fi' >> $babel_script
  2653. echo 'fi' >> $babel_script
  2654. echo '' >> $babel_script
  2655. echo 'if [[ ! grep -q "$IFACE" /proc/net/dev || $1 == "stop" ]]; then' >> $babel_script
  2656. echo ' if ! grep -q "$IFACE" /proc/net/dev; then' >> $babel_script
  2657. echo ' echo "Interface $IFACE was not found"' >> $babel_script
  2658. echo ' else' >> $babel_script
  2659. echo ' echo "Stopping"' >> $babel_script
  2660. echo ' fi' >> $babel_script
  2661. echo ' ifconfig $IFACE down' >> $babel_script
  2662. echo ' pkill babeld' >> $babel_script
  2663. echo ' systemctl restart network-manager' >> $babel_script
  2664. echo ' exit 1' >> $babel_script
  2665. echo 'fi' >> $babel_script
  2666. echo '' >> $babel_script
  2667. echo 'systemctl stop network-manager' >> $babel_script
  2668. echo 'ifconfig $IFACE down' >> $babel_script
  2669. echo -n 'iwconfig $IFACE mode ad-hoc channel ' >> $babel_script
  2670. echo "$WIFI_CHANNEL essid \"$ESSID\"" >> $babel_script
  2671. echo 'ifconfig $IFACE up' >> $babel_script
  2672. echo -n 'ifconfig $IFACE:avahi ' >> $babel_script
  2673. echo -n "$LOCAL_NETWORK_STATIC_IP_ADDRESS netmask " >> $babel_script
  2674. echo '255.255.255.0 broadcast 192.168.13.255' >> $babel_script
  2675. echo -n 'babeld -D $IFACE:avahi -p ' >> $babel_script
  2676. echo -n "$BABEL_PORT -d 5 " >> $babel_script
  2677. echo '$IFACE' >> $babel_script
  2678. echo 'exit 0' >> $babel_script
  2679. chmod +x $babel_script
  2680. echo '[Unit]' > /etc/systemd/system/babel.service
  2681. echo 'Description=Babel Mesh' >> /etc/systemd/system/babel.service
  2682. echo '' >> /etc/systemd/system/babel.service
  2683. echo '[Service]' >> /etc/systemd/system/babel.service
  2684. echo 'Type=oneshot' >> /etc/systemd/system/babel.service
  2685. echo "ExecStart=$babel_script start" >> /etc/systemd/system/babel.service
  2686. echo "ExecStop=$babel_script stop" >> /etc/systemd/system/babel.service
  2687. echo 'RemainAfterExit=yes' >> /etc/systemd/system/babel.service
  2688. echo '' >> /etc/systemd/system/babel.service
  2689. echo '# Allow time for the server to start/stop' >> /etc/systemd/system/babel.service
  2690. echo 'TimeoutSec=300' >> /etc/systemd/system/babel.service
  2691. echo '' >> /etc/systemd/system/babel.service
  2692. echo '[Install]' >> /etc/systemd/system/babel.service
  2693. echo 'WantedBy=multi-user.target' >> /etc/systemd/system/babel.service
  2694. systemctl enable babel
  2695. echo 'mesh_babel' >> $COMPLETION_FILE
  2696. }
  2697. function mesh_batman_bridge {
  2698. # https://sudoroom.org/wiki/Mesh/Relay_setup
  2699. # also see http://www.netlore.co.uk/airmesh/
  2700. # https://www.youtube.com/watch?v=CLKHWfQlFqQ
  2701. # http://pastebin.com/4U9vdFFm
  2702. # http://pastebin.com/eeTmL5XL
  2703. if grep -Fxq "mesh_batman_bridge" $COMPLETION_FILE; then
  2704. return
  2705. fi
  2706. if [[ $ENABLE_BATMAN != "yes" ]]; then
  2707. return
  2708. fi
  2709. apt-get -y install iproute bridge-utils libnetfilter-conntrack3 batctl
  2710. apt-get -y install python-dev libevent-dev ebtables python-pip git
  2711. apt-get -y install wireless-tools rfkill
  2712. #install_vpn_tunnel
  2713. modprobe batman-adv
  2714. [ $? -ne 0 ] && echo "B.A.T.M.A.N module not available" && exit 76482
  2715. if ! grep -q "batman_adv" /etc/modules; then
  2716. echo 'batman_adv' >> /etc/modules
  2717. fi
  2718. batman_script=/var/lib/batman
  2719. echo '#!/bin/bash' > $batman_script
  2720. echo '' >> $batman_script
  2721. echo 'if [[ $1 == "start" ]]; then' >> $batman_script
  2722. echo ' # install avahi' >> $batman_script
  2723. echo ' sed -i "s|#host-name=.*|host-name=$(hostname)|g" /etc/avahi/avahi-daemon.conf' >> $batman_script
  2724. echo ' sed -i "s|host-name=.*|host-name=$(hostname)|g" /etc/avahi/avahi-daemon.conf' >> $batman_script
  2725. echo ' sed -i "s|use-ipv4=.*|use-ipv4=yes|g" /etc/avahi/avahi-daemon.conf' >> $batman_script
  2726. echo ' sed -i "s|use-ipv6=.*|use-ipv6=no|g" /etc/avahi/avahi-daemon.conf' >> $batman_script
  2727. echo ' sed -i "s|#disallow-other-stacks=.*|disallow-other-stacks=yes|g" /etc/avahi/avahi-daemon.conf' >> $batman_script
  2728. echo ' sed -i "s|hosts:.*|hosts: files mdns4_minimal dns mdns4 mdns|g" /etc/nsswitch.conf' >> $batman_script
  2729. echo 'fi' >> $batman_script
  2730. echo '' >> $batman_script
  2731. echo '# Mesh definition' >> $batman_script
  2732. echo "ESSID=$ESSID" >> $batman_script
  2733. echo "CELLID=$BATMAN_CELLID" >> $batman_script
  2734. echo "CHANNEL=$WIFI_CHANNEL" >> $batman_script
  2735. echo '' >> $batman_script
  2736. echo '# Ethernet bridge definition (bridged to bat0)' >> $batman_script
  2737. echo 'BRIDGE=br-mesh' >> $batman_script
  2738. echo "IFACE=$WIFI_INTERFACE" >> $batman_script
  2739. echo 'EIFACE=eth0' >> $batman_script
  2740. echo '' >> $batman_script
  2741. echo 'if [[ $IFACE == "wlan0" ]]; then' >> $batman_script
  2742. echo ' if grep -q "wlan1" /proc/net/dev; then' >> $batman_script
  2743. echo ' IFACE=wlan1' >> $batman_script
  2744. echo ' fi' >> $batman_script
  2745. echo 'fi' >> $batman_script
  2746. echo 'if [[ $IFACE == "wlan0" ]]; then' >> $batman_script
  2747. echo ' if grep -q "wlan2" /proc/net/dev; then' >> $batman_script
  2748. echo ' IFACE=wlan2' >> $batman_script
  2749. echo ' fi' >> $batman_script
  2750. echo 'fi' >> $batman_script
  2751. echo 'if [[ $IFACE == "wlan0" ]]; then' >> $batman_script
  2752. echo ' if grep -q "wlan3" /proc/net/dev; then' >> $batman_script
  2753. echo ' IFACE=wlan3' >> $batman_script
  2754. echo ' fi' >> $batman_script
  2755. echo 'fi' >> $batman_script
  2756. echo '' >> $batman_script
  2757. echo 'if [ -e /etc/default/batctl ]; then' >> $batman_script
  2758. echo ' . /etc/default/batctl' >> $batman_script
  2759. echo 'fi' >> $batman_script
  2760. echo '' >> $batman_script
  2761. echo 'start() {' >> $batman_script
  2762. echo ' if [ -z "$IFACE" ] ; then' >> $batman_script
  2763. echo ' echo "error: unable to find wifi interface, not enabling batman-adv mesh"' >> $batman_script
  2764. echo ' return' >> $batman_script
  2765. echo ' fi' >> $batman_script
  2766. echo ' echo "info: enabling batman-adv mesh network $ESSID on $IFACE"' >> $batman_script
  2767. echo ' systemctl stop network-manager' >> $batman_script
  2768. echo ' sleep 5' >> $batman_script
  2769. echo '' >> $batman_script
  2770. echo " # remove an avahi service which isn't used" >> $batman_script
  2771. echo ' if [ -f /etc/avahi/services/udisks.service ]; then' >> $batman_script
  2772. echo ' sudo rm /etc/avahi/services/udisks.service' >> $batman_script
  2773. echo ' fi' >> $batman_script
  2774. echo '' >> $batman_script
  2775. echo ' # Might have to re-enable wifi' >> $batman_script
  2776. echo ' rfkill unblock $(rfkill list|awk -F: "/phy/ {print $1}") || true' >> $batman_script
  2777. echo '' >> $batman_script
  2778. echo ' ifconfig $IFACE down' >> $batman_script
  2779. echo ' ifconfig $IFACE mtu 1532' >> $batman_script
  2780. echo ' iwconfig $IFACE enc off' >> $batman_script
  2781. echo ' iwconfig $IFACE mode ad-hoc essid $ESSID channel $CHANNEL' >> $batman_script
  2782. echo ' sleep 1' >> $batman_script
  2783. echo ' iwconfig $IFACE ap $CELLID' >> $batman_script
  2784. echo '' >> $batman_script
  2785. echo ' modprobe batman-adv' >> $batman_script
  2786. echo ' batctl if add $IFACE' >> $batman_script
  2787. echo ' ifconfig $IFACE up' >> $batman_script
  2788. echo ' avahi-autoipd --force-bind --daemonize --wait $BRIDGE' >> $batman_script
  2789. echo ' avahi-autoipd --force-bind --daemonize --wait $IFACE' >> $batman_script
  2790. echo ' ifconfig bat0 up promisc' >> $batman_script
  2791. echo '' >> $batman_script
  2792. echo ' #Use persistent HWAddr' >> $batman_script
  2793. echo ' ether_new=$(ifconfig eth0 | grep HWaddr | sed -e "s/.*HWaddr //")' >> $batman_script
  2794. echo ' if [ ! -f /var/lib/mesh-node/bat0 ]; then' >> $batman_script
  2795. echo ' mkdir /var/lib/mesh-node' >> $batman_script
  2796. echo ' echo "${ether_new}" > /var/lib/mesh-node/bat0' >> $batman_script
  2797. echo ' else' >> $batman_script
  2798. echo ' ether=$(cat /var/lib/mesh-node/bat0)' >> $batman_script
  2799. echo ' ifconfig bat0 hw ether ${ether}' >> $batman_script
  2800. echo ' fi' >> $batman_script
  2801. echo '' >> $batman_script
  2802. echo ' if [ "$EIFACE" ] ; then' >> $batman_script
  2803. echo ' brctl addbr $BRIDGE' >> $batman_script
  2804. echo ' brctl addif $BRIDGE bat0' >> $batman_script
  2805. echo ' brctl addif $BRIDGE $EIFACE' >> $batman_script
  2806. echo ' ifconfig bat0 0.0.0.0' >> $batman_script
  2807. echo ' ifconfig $EIFACE 0.0.0.0' >> $batman_script
  2808. echo ' ifconfig $EIFACE up promisc' >> $batman_script
  2809. echo ' ifconfig $BRIDGE up' >> $batman_script
  2810. echo ' fi' >> $batman_script
  2811. echo '' >> $batman_script
  2812. echo ' iptables -A INPUT -p tcp --dport 548 -j ACCEPT' >> $batman_script
  2813. echo ' iptables -A INPUT -p udp --dport 548 -j ACCEPT' >> $batman_script
  2814. echo ' iptables -A INPUT -p tcp --dport 5353 -j ACCEPT' >> $batman_script
  2815. echo ' iptables -A INPUT -p udp --dport 5353 -j ACCEPT' >> $batman_script
  2816. echo ' iptables -A INPUT -p tcp --dport 5354 -j ACCEPT' >> $batman_script
  2817. echo ' iptables -A INPUT -p udp --dport 5354 -j ACCEPT' >> $batman_script
  2818. echo " iptables -A INPUT -p tcp --dport $ZERONET_PORT -j ACCEPT" >> $batman_script
  2819. echo " iptables -A INPUT -p udp --dport $ZERONET_PORT -j ACCEPT" >> $batman_script
  2820. echo " iptables -A INPUT -p tcp --dport $IPFS_PORT -j ACCEPT" >> $batman_script
  2821. echo '' >> $batman_script
  2822. echo ' systemctl restart avahi-daemon' >> $batman_script
  2823. echo '}' >> $batman_script
  2824. echo '' >> $batman_script
  2825. echo 'stop() {' >> $batman_script
  2826. echo ' if [ -z "$IFACE" ]; then' >> $batman_script
  2827. echo ' echo "error: unable to find wifi interface, not enabling batman-adv mesh"' >> $batman_script
  2828. echo ' return' >> $batman_script
  2829. echo ' fi' >> $batman_script
  2830. echo ' if [ "$EIFACE" ]; then' >> $batman_script
  2831. echo ' brctl delif $BRIDGE bat0' >> $batman_script
  2832. echo ' brctl delif $BRIDGE $EIFACE' >> $batman_script
  2833. echo ' ifconfig $BRIDGE down || true' >> $batman_script
  2834. echo ' brctl delbr $BRIDGE' >> $batman_script
  2835. echo ' ifconfig $EIFACE down -promisc' >> $batman_script
  2836. echo ' fi' >> $batman_script
  2837. echo '' >> $batman_script
  2838. echo ' avahi-autoipd -k $BRIDGE' >> $batman_script
  2839. echo ' avahi-autoipd -k $IFACE' >> $batman_script
  2840. echo ' ifconfig bat0 down -promisc' >> $batman_script
  2841. echo '' >> $batman_script
  2842. echo ' batctl if del $IFACE' >> $batman_script
  2843. echo ' rmmod batman-adv' >> $batman_script
  2844. echo ' ifconfig $IFACE mtu 1500' >> $batman_script
  2845. echo ' ifconfig $IFACE down' >> $batman_script
  2846. echo ' iwconfig $IFACE mode managed' >> $batman_script
  2847. echo '' >> $batman_script
  2848. echo ' iptables -D INPUT -p tcp --dport 548 -j ACCEPT' >> $batman_script
  2849. echo ' iptables -D INPUT -p udp --dport 548 -j ACCEPT' >> $batman_script
  2850. echo ' iptables -D INPUT -p tcp --dport 5353 -j ACCEPT' >> $batman_script
  2851. echo ' iptables -D INPUT -p udp --dport 5353 -j ACCEPT' >> $batman_script
  2852. echo ' iptables -D INPUT -p tcp --dport 5354 -j ACCEPT' >> $batman_script
  2853. echo ' iptables -D INPUT -p udp --dport 5354 -j ACCEPT' >> $batman_script
  2854. echo " iptables -D INPUT -p tcp --dport $ZERONET_PORT -j ACCEPT" >> $batman_script
  2855. echo " iptables -D INPUT -p udp --dport $ZERONET_PORT -j ACCEPT" >> $batman_script
  2856. echo " iptables -D INPUT -p tcp --dport $IPFS_PORT -j ACCEPT" >> $batman_script
  2857. echo '' >> $batman_script
  2858. echo ' systemctl restart network-manager' >> $batman_script
  2859. echo '}' >> $batman_script
  2860. echo '' >> $batman_script
  2861. echo 'if ! grep -q "$IFACE" /proc/net/dev; then' >> $batman_script
  2862. echo ' echo "Interface $IFACE was not found"' >> $batman_script
  2863. echo ' stop' >> $batman_script
  2864. echo ' exit 1' >> $batman_script
  2865. echo 'fi' >> $batman_script
  2866. echo '' >> $batman_script
  2867. echo 'case "$1" in' >> $batman_script
  2868. echo ' start|stop)' >> $batman_script
  2869. echo ' $1' >> $batman_script
  2870. echo ' ;;' >> $batman_script
  2871. echo ' restart)' >> $batman_script
  2872. echo ' stop' >> $batman_script
  2873. echo ' sleep 10' >> $batman_script
  2874. echo ' start' >> $batman_script
  2875. echo ' ;;' >> $batman_script
  2876. echo ' status)' >> $batman_script
  2877. echo ' batctl o' >> $batman_script
  2878. echo ' ;;' >> $batman_script
  2879. echo ' ping)' >> $batman_script
  2880. echo ' batctl ping $2' >> $batman_script
  2881. echo ' ;;' >> $batman_script
  2882. echo ' ls|list)' >> $batman_script
  2883. echo ' avahi-browse -atl' >> $batman_script
  2884. echo ' ;;' >> $batman_script
  2885. echo ' *)' >> $batman_script
  2886. echo ' echo "error: invalid parameter $1"' >> $batman_script
  2887. echo ' echo "usage: $0 {start|stop|restart|status|ping|ls|list}"' >> $batman_script
  2888. echo ' exit 2' >> $batman_script
  2889. echo ' ;;' >> $batman_script
  2890. echo 'esac' >> $batman_script
  2891. echo 'exit 0' >> $batman_script
  2892. chmod +x $batman_script
  2893. echo '[Unit]' > /etc/systemd/system/batman.service
  2894. echo 'Description=B.A.T.M.A.N. Advanced' >> /etc/systemd/system/batman.service
  2895. echo '' >> /etc/systemd/system/batman.service
  2896. echo '[Service]' >> /etc/systemd/system/batman.service
  2897. echo 'Type=oneshot' >> /etc/systemd/system/batman.service
  2898. echo "ExecStart=$batman_script start" >> /etc/systemd/system/batman.service
  2899. echo "ExecStop=$batman_script stop" >> /etc/systemd/system/batman.service
  2900. echo 'RemainAfterExit=yes' >> /etc/systemd/system/batman.service
  2901. echo '' >> /etc/systemd/system/batman.service
  2902. echo '# Allow time for the server to start/stop' >> /etc/systemd/system/batman.service
  2903. echo 'TimeoutSec=300' >> /etc/systemd/system/batman.service
  2904. echo '' >> /etc/systemd/system/batman.service
  2905. echo '[Install]' >> /etc/systemd/system/batman.service
  2906. echo 'WantedBy=multi-user.target' >> /etc/systemd/system/batman.service
  2907. systemctl enable batman
  2908. if ! grep -q "Mesh Networking (B.A.T.M.A.N)" /home/$MY_USERNAME/README; then
  2909. echo '' >> /home/$MY_USERNAME/README
  2910. echo '' >> /home/$MY_USERNAME/README
  2911. echo 'Mesh Networking (B.A.T.M.A.N)' >> /home/$MY_USERNAME/README
  2912. echo '=============================' >> /home/$MY_USERNAME/README
  2913. echo "Mesh ESSID: $ESSID" >> /home/$MY_USERNAME/README
  2914. echo "Mesh cell ID: $BATMAN_CELLID" >> /home/$MY_USERNAME/README
  2915. echo "Mesh wifi channel: $WIFI_CHANNEL" >> /home/$MY_USERNAME/README
  2916. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
  2917. chmod 600 /home/$MY_USERNAME/README
  2918. fi
  2919. echo 'mesh_batman_bridge' >> $COMPLETION_FILE
  2920. }
  2921. function remove_instructions_from_motd {
  2922. sed -i '/## /d' /etc/motd
  2923. }
  2924. function check_hwrng {
  2925. if [[ $HWRNG_TYPE == "beaglebone" ]]; then
  2926. # If hardware random number generation was enabled then make sure that the device exists.
  2927. # if /dev/hwrng is not found then any subsequent cryptographic key generation would
  2928. # suffer from low entropy and might be insecure
  2929. if [ ! -e /dev/hwrng ]; then
  2930. ls /dev/hw*
  2931. echo $'The hardware random number generator is enabled but could not be detected on'
  2932. echo $'/dev/hwrng. There may be a problem with the installation or the Beaglebone hardware.'
  2933. exit 75
  2934. fi
  2935. fi
  2936. # If a OneRNG device was installed then verify its firmware
  2937. #check_onerng_verification
  2938. }
  2939. function get_mariadb_password {
  2940. if [ -f /home/$MY_USERNAME/README ]; then
  2941. if grep -q "MariaDB password" /home/$MY_USERNAME/README; then
  2942. if [ -f $DATABASE_PASSWORD_FILE ]; then
  2943. MARIADB_PASSWORD=$(cat $DATABASE_PASSWORD_FILE)
  2944. else
  2945. MARIADB_PASSWORD=$(cat /home/$MY_USERNAME/README | grep "MariaDB password" | awk -F ':' '{print $2}' | sed 's/^ *//')
  2946. echo "$MARIADB_PASSWORD" > $DATABASE_PASSWORD_FILE
  2947. chmod 600 $DATABASE_PASSWORD_FILE
  2948. fi
  2949. fi
  2950. fi
  2951. }
  2952. function get_mariadb_gnusocial_admin_password {
  2953. if [ -f /home/$MY_USERNAME/README ]; then
  2954. if grep -q "MariaDB gnusocial admin password" /home/$MY_USERNAME/README; then
  2955. MICROBLOG_ADMIN_PASSWORD=$(cat /home/$MY_USERNAME/README | grep "MariaDB gnusocial admin password" | awk -F ':' '{print $2}' | sed 's/^ *//')
  2956. fi
  2957. fi
  2958. }
  2959. function get_mariadb_git_admin_password {
  2960. if [ -f /home/$MY_USERNAME/README ]; then
  2961. if grep -q "Gogs admin user password" /home/$MY_USERNAME/README; then
  2962. GIT_ADMIN_PASSWORD=$(cat /home/$MY_USERNAME/README | grep "Gogs admin user password" | awk -F ':' '{print $2}' | sed 's/^ *//')
  2963. fi
  2964. fi
  2965. }
  2966. function get_mariadb_hubzilla_admin_password {
  2967. if [ -f /home/$MY_USERNAME/README ]; then
  2968. if grep -q "MariaDB Hubzilla admin password" /home/$MY_USERNAME/README; then
  2969. HUBZILLA_ADMIN_PASSWORD=$(cat /home/$MY_USERNAME/README | grep "MariaDB Hubzilla admin password" | awk -F ':' '{print $2}' | sed 's/^ *//')
  2970. fi
  2971. fi
  2972. }
  2973. function get_mariadb_owncloud_admin_password {
  2974. if [ -f /home/$MY_USERNAME/README ]; then
  2975. if grep -q "Owncloud database password" /home/$MY_USERNAME/README; then
  2976. OWNCLOUD_ADMIN_PASSWORD=$(cat /home/$MY_USERNAME/README | grep "Owncloud database password" | awk -F ':' '{print $2}' | sed 's/^ *//')
  2977. fi
  2978. fi
  2979. }
  2980. function create_freedns_updater {
  2981. if [[ $ONION_ONLY != "no" ]]; then
  2982. return
  2983. fi
  2984. # currently inadyn doesn't work as expected with freeDNS, so this is a workaround
  2985. if grep -Fxq "create_freedns_updater" $COMPLETION_FILE; then
  2986. return
  2987. fi
  2988. if [[ $DDNS_PROVIDER != "default@freedns.afraid.org" ]]; then
  2989. return
  2990. fi
  2991. if [[ $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  2992. return
  2993. fi
  2994. FREEDNS_WGET='wget -q --read-timeout=0.0 --waitretry=5 --tries=4 https://freedns.afraid.org/dynamic/update.php?'
  2995. echo '#!/bin/bash' > /usr/bin/dynamicdns
  2996. echo 'cd /tmp' >> /usr/bin/dynamicdns
  2997. if [ $DEFAULT_DOMAIN_CODE ]; then
  2998. echo "# $DEFAULT_DOMAIN_NAME" >> /usr/bin/dynamicdns
  2999. echo "$FREEDNS_WGET$DEFAULT_DOMAIN_CODE=" >> /usr/bin/dynamicdns
  3000. fi
  3001. if [ $WIKI_CODE ]; then
  3002. if [[ $WIKI_CODE != "$DEFAULT_DOMAIN_CODE" ]]; then
  3003. echo "# $WIKI_DOMAIN_NAME" >> /usr/bin/dynamicdns
  3004. echo "$FREEDNS_WGET$WIKI_CODE=" >> /usr/bin/dynamicdns
  3005. fi
  3006. fi
  3007. if [ $FULLBLOG_CODE ]; then
  3008. if [[ $FULLBLOG_CODE != "$DEFAULT_DOMAIN_CODE" ]]; then
  3009. echo "# $FULLBLOG_DOMAIN_NAME" >> /usr/bin/dynamicdns
  3010. echo "$FREEDNS_WGET$FULLBLOG_CODE=" >> /usr/bin/dynamicdns
  3011. fi
  3012. fi
  3013. if [ $HUBZILLA_CODE ]; then
  3014. if [[ $HUBZILLA_CODE != "$DEFAULT_DOMAIN_CODE" ]]; then
  3015. echo "# $HUBZILLA_DOMAIN_NAME" >> /usr/bin/dynamicdns
  3016. echo "$FREEDNS_WGET$HUBZILLA_CODE=" >> /usr/bin/dynamicdns
  3017. fi
  3018. fi
  3019. if [ $OWNCLOUD_CODE ]; then
  3020. if [[ $OWNCLOUD_CODE != "$DEFAULT_DOMAIN_CODE" ]]; then
  3021. echo "# $OWNCLOUD_DOMAIN_NAME" >> /usr/bin/dynamicdns
  3022. echo "$FREEDNS_WGET$OWNCLOUD_CODE=" >> /usr/bin/dynamicdns
  3023. fi
  3024. fi
  3025. if [ $MICROBLOG_CODE ]; then
  3026. if [[ $MICROBLOG_CODE != "$DEFAULT_DOMAIN_CODE" ]]; then
  3027. echo "# $MICROBLOG_DOMAIN_NAME" >> /usr/bin/dynamicdns
  3028. echo "$FREEDNS_WGET$MICROBLOG_CODE=" >> /usr/bin/dynamicdns
  3029. fi
  3030. fi
  3031. if [ $GIT_CODE ]; then
  3032. if [[ $GIT_CODE != "$DEFAULT_DOMAIN_CODE" ]]; then
  3033. echo "# $GIT_DOMAIN_NAME" >> /usr/bin/dynamicdns
  3034. echo "$FREEDNS_WGET$GIT_CODE=" >> /usr/bin/dynamicdns
  3035. fi
  3036. fi
  3037. if [ $MEDIAGOBLIN_CODE ]; then
  3038. if [[ $MEDIAGOBLIN_CODE != "$DEFAULT_DOMAIN_CODE" ]]; then
  3039. echo "# $MEDIAGOBLIN_DOMAIN_NAME" >> /usr/bin/dynamicdns
  3040. echo "$FREEDNS_WGET$MEDIAGOBLIN_CODE=" >> /usr/bin/dynamicdns
  3041. fi
  3042. fi
  3043. echo 'exit 0' >> /usr/bin/dynamicdns
  3044. chmod 600 /usr/bin/dynamicdns
  3045. chmod +x /usr/bin/dynamicdns
  3046. if ! grep -q "/usr/bin/dynamicdns" /etc/crontab; then
  3047. echo '*/3 * * * * root /usr/bin/dynamicdns' >> /etc/crontab
  3048. systemctl restart cron
  3049. fi
  3050. echo 'create_freedns_updater' >> $COMPLETION_FILE
  3051. }
  3052. function backup_to_friends_servers {
  3053. # update crontab
  3054. echo '#!/bin/bash' > /etc/cron.daily/backuptofriends
  3055. echo "if [ -f /usr/local/bin/${PROJECT_NAME}-backup-remote ]; then" >> /etc/cron.daily/backuptofriends
  3056. echo " /usr/local/bin/${PROJECT_NAME}-backup-remote" >> /etc/cron.daily/backuptofriends
  3057. echo 'else' >> /etc/cron.daily/backuptofriends
  3058. echo " /usr/bin/${PROJECT_NAME}-backup-remote" >> /etc/cron.daily/backuptofriends
  3059. echo 'fi' >> /etc/cron.daily/backuptofriends
  3060. chmod +x /etc/cron.daily/backuptofriends
  3061. }
  3062. function remove_default_user {
  3063. # make sure you don't use the default user account
  3064. if [[ $MY_USERNAME == "debian" ]]; then
  3065. echo 'Do not use the default debian user account. Create a different user with: adduser [username]'
  3066. exit 68
  3067. fi
  3068. # remove the default debian user to prevent it from becoming an attack vector
  3069. if [ -d /home/debian ]; then
  3070. userdel -r debian
  3071. echo 'Default debian user account removed'
  3072. fi
  3073. }
  3074. function enforce_good_passwords {
  3075. # because humans are generally bad at choosing passwords
  3076. if grep -Fxq "enforce_good_passwords" $COMPLETION_FILE; then
  3077. return
  3078. fi
  3079. apt-get -y install libpam-cracklib
  3080. 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
  3081. echo 'enforce_good_passwords' >> $COMPLETION_FILE
  3082. }
  3083. function change_login_message {
  3084. if grep -Fxq "change_login_message" $COMPLETION_FILE; then
  3085. return
  3086. fi
  3087. # remove automatic motd creator if it exists
  3088. if [ -f /etc/init.d/motd ]; then
  3089. rm -f /etc/init.d/motd
  3090. fi
  3091. echo '' > /etc/motd
  3092. echo ".---. . . " >> /etc/motd
  3093. echo "| | | " >> /etc/motd
  3094. echo "|--- .--. .-. .-. .-.| .-. .--.--. |.-. .-. .--. .-. " >> /etc/motd
  3095. echo "| | (.-' (.-' ( | ( )| | | | )( )| | (.-' " >> /etc/motd
  3096. echo "' ' --' --' -' - -' ' ' -' -' -' ' - --'" >> /etc/motd
  3097. if [[ $SYSTEM_TYPE == "$VARIANT_MAILBOX" ]]; then
  3098. echo $' M A I L B O X E D I T I O N' >> /etc/motd
  3099. fi
  3100. if [[ $SYSTEM_TYPE == "$VARIANT_SOCIAL" ]]; then
  3101. echo $' S O C I A L E D I T I O N' >> /etc/motd
  3102. fi
  3103. if [[ $SYSTEM_TYPE == "$VARIANT_CHAT" ]]; then
  3104. echo $' C H A T E D I T I O N' >> /etc/motd
  3105. fi
  3106. if [[ $SYSTEM_TYPE == "$VARIANT_CLOUD" ]]; then
  3107. echo $' C L O U D E D I T I O N' >> /etc/motd
  3108. fi
  3109. if [[ $SYSTEM_TYPE == "$VARIANT_WRITER" ]]; then
  3110. echo $' W R I T E R E D I T I O N ' >> /etc/motd
  3111. fi
  3112. if [[ $SYSTEM_TYPE == "$VARIANT_MEDIA" ]]; then
  3113. echo $' M E D I A E D I T I O N' >> /etc/motd
  3114. fi
  3115. if [[ $SYSTEM_TYPE == "$VARIANT_DEVELOPER" ]]; then
  3116. echo $' D E V E L O P E R E D I T I O N' >> /etc/motd
  3117. fi
  3118. echo '' >> /etc/motd
  3119. if [[ $SYSTEM_TYPE != "$VARIANT_MESH" ]]; then
  3120. echo $' Freedom in the Cloud' >> /etc/motd
  3121. else
  3122. echo $' Freedom in the Mesh' >> /etc/motd
  3123. fi
  3124. echo '' >> /etc/motd
  3125. echo 'change_login_message' >> $COMPLETION_FILE
  3126. }
  3127. function search_for_attached_usb_drive {
  3128. # If a USB drive is attached then search for email,
  3129. # gpg, ssh keys and emacs configuration
  3130. if grep -Fxq "search_for_attached_usb_drive" $COMPLETION_FILE; then
  3131. return
  3132. fi
  3133. if [ -b $USB_DRIVE ]; then
  3134. if [ ! -d $USB_MOUNT ]; then
  3135. echo $'Mounting USB drive'
  3136. mkdir $USB_MOUNT
  3137. mount $USB_DRIVE $USB_MOUNT
  3138. fi
  3139. 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
  3140. if [ -d $USB_MOUNT/Maildir ]; then
  3141. echo $'Maildir found on USB drive'
  3142. IMPORT_MAILDIR=$USB_MOUNT/Maildir
  3143. fi
  3144. if [ -d $USB_MOUNT/.gnupg ]; then
  3145. echo $'Importing GPG keyring'
  3146. cp -r $USB_MOUNT/.gnupg /home/$MY_USERNAME
  3147. chown -R $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.gnupg
  3148. GPG_KEYS_IMPORTED="yes"
  3149. if [ ! -f /home/$MY_USERNAME/.gnupg/secring.gpg ]; then
  3150. echo $'GPG files did not copy'
  3151. exit 73529
  3152. fi
  3153. fi
  3154. if [ -f $USB_MOUNT/.procmailrc ]; then
  3155. echo $'Importing procmail settings'
  3156. cp $USB_MOUNT/.procmailrc /home/$MY_USERNAME
  3157. chown -R $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.procmailrc
  3158. fi
  3159. if [ -f $USB_MOUNT/private_key.gpg ]; then
  3160. echo $'GPG private key found on USB drive'
  3161. MY_GPG_PRIVATE_KEY=$USB_MOUNT/private_key.gpg
  3162. fi
  3163. if [ -f $USB_MOUNT/public_key.gpg ]; then
  3164. echo $'GPG public key found on USB drive'
  3165. MY_GPG_PUBLIC_KEY=$USB_MOUNT/public_key.gpg
  3166. fi
  3167. fi
  3168. if [ -d $USB_MOUNT/prosody ]; then
  3169. if [ ! -d $XMPP_DIRECTORY ]; then
  3170. mkdir $XMPP_DIRECTORY
  3171. fi
  3172. cp -r $USB_MOUNT/prosody/* $XMPP_DIRECTORY
  3173. chown -R prosody:prosody $XMPP_DIRECTORY
  3174. fi
  3175. if [ -d $USB_MOUNT/.ssh ]; then
  3176. echo $'Importing ssh keys'
  3177. cp -r $USB_MOUNT/.ssh /home/$MY_USERNAME
  3178. chown -R $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.ssh
  3179. # for security delete the ssh keys from the usb drive
  3180. if [ ! -f /home/$MY_USERNAME/.ssh/id_rsa ]; then
  3181. echo $'ssh files did not copy'
  3182. exit 8
  3183. fi
  3184. fi
  3185. if [ -f $USB_MOUNT/.emacs ]; then
  3186. echo $'Importing .emacs file'
  3187. cp -f $USB_MOUNT/.emacs /home/$MY_USERNAME/.emacs
  3188. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.emacs
  3189. fi
  3190. if [ -d $USB_MOUNT/.emacs.d ]; then
  3191. echo $'Importing .emacs.d directory'
  3192. cp -r $USB_MOUNT/.emacs.d /home/$MY_USERNAME
  3193. chown -R $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.emacs.d
  3194. fi
  3195. if [ -d $USB_MOUNT/ssl ]; then
  3196. echo $'Importing SSL certificates'
  3197. cp -r $USB_MOUNT/ssl/* /etc/ssl
  3198. chmod 640 /etc/ssl/certs/*
  3199. chmod 400 /etc/ssl/private/*
  3200. # change ownership of some certificates
  3201. if [ -d /etc/prosody ]; then
  3202. chown prosody:prosody /etc/ssl/private/xmpp.*
  3203. chown prosody:prosody /etc/ssl/certs/xmpp.*
  3204. fi
  3205. if [ -d /etc/dovecot ]; then
  3206. chown root:dovecot /etc/ssl/certs/dovecot.*
  3207. chown root:dovecot /etc/ssl/private/dovecot.*
  3208. fi
  3209. if [ -f /etc/ssl/private/exim.key ]; then
  3210. cp /etc/ssl/private/exim.key /etc/exim4
  3211. cp /etc/ssl/certs/exim.crt /etc/exim4
  3212. cp /etc/ssl/certs/exim.dhparam /etc/exim4
  3213. chown root:Debian-exim /etc/exim4/exim.key /etc/exim4/exim.crt /etc/exim4/exim.dhparam
  3214. chmod 640 /etc/exim4/exim.key /etc/exim4/exim.crt /etc/exim4/exim.dhparam
  3215. fi
  3216. fi
  3217. if [ -d $USB_MOUNT/personal ]; then
  3218. echo $'Importing personal directory'
  3219. cp -r $USB_MOUNT/personal /home/$MY_USERNAME
  3220. chown -R $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/personal
  3221. fi
  3222. else
  3223. if [ -d $USB_MOUNT ]; then
  3224. umount $USB_MOUNT
  3225. rm -rf $USB_MOUNT
  3226. fi
  3227. echo $'No USB drive attached'
  3228. fi
  3229. echo 'search_for_attached_usb_drive' >> $COMPLETION_FILE
  3230. }
  3231. function remove_proprietary_repos {
  3232. if grep -Fxq "remove_proprietary_repos" $COMPLETION_FILE; then
  3233. return
  3234. fi
  3235. sed -i 's/ non-free//g' /etc/apt/sources.list
  3236. echo 'remove_proprietary_repos' >> $COMPLETION_FILE
  3237. }
  3238. function change_debian_repos {
  3239. if grep -Fxq "change_debian_repos" $COMPLETION_FILE; then
  3240. return
  3241. fi
  3242. if [[ $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  3243. return
  3244. fi
  3245. rm -rf /var/lib/apt/lists/*
  3246. apt-get clean
  3247. sed -i "s/ftp.us.debian.org/$DEBIAN_REPO/g" /etc/apt/sources.list
  3248. # ensure that there is a security repo
  3249. if ! grep -q "security" /etc/apt/sources.list; then
  3250. echo "deb http://security.debian.org/ $DEBIAN_VERSION/updates main contrib" >> /etc/apt/sources.list
  3251. echo "#deb-src http://security.debian.org/ $DEBIAN_VERSION/updates main contrib" >> /etc/apt/sources.list
  3252. fi
  3253. apt-get update
  3254. apt-get -y install apt-transport-https
  3255. echo 'change_debian_repos' >> $COMPLETION_FILE
  3256. }
  3257. function initial_setup {
  3258. if grep -Fxq "initial_setup" $COMPLETION_FILE; then
  3259. return
  3260. fi
  3261. apt-get -y remove --purge apache*
  3262. apt-get -y dist-upgrade
  3263. apt-get -y install ca-certificates emacs24 cpulimit
  3264. apt-get -y install cryptsetup libgfshare-bin obnam sshpass wget
  3265. apt-get -y install avahi-daemon avahi-utils avahi-discover
  3266. apt-get -y install connect-proxy
  3267. if [ ! -d $INSTALL_DIR ]; then
  3268. mkdir -p $INSTALL_DIR
  3269. fi
  3270. echo 'initial_setup' >> $COMPLETION_FILE
  3271. }
  3272. function allow_ssh_to_onion_address {
  3273. if [ ! -d /home/$MY_USERNAME/.ssh ]; then
  3274. mkdir /home/$MY_USERNAME/.ssh
  3275. fi
  3276. if [ ! -d /etc/tor ]; then
  3277. echo $'Tor not found when updating ssh'
  3278. exit 528257
  3279. fi
  3280. if ! grep -q "onion" /home/$MY_USERNAME/.ssh/config; then
  3281. echo 'Host *.onion' >> /home/$MY_USERNAME/.ssh/config
  3282. echo 'ProxyCommand connect -R remote -5 -S 127.0.0.1:9050 %h %p' >> /home/$MY_USERNAME/.ssh/config
  3283. fi
  3284. }
  3285. function install_tor {
  3286. if [[ $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  3287. return
  3288. fi
  3289. if grep -Fxq "install_tor" $COMPLETION_FILE; then
  3290. return
  3291. fi
  3292. apt-get -y install tor
  3293. echo 'install_tor' >> $COMPLETION_FILE
  3294. }
  3295. function enable_ssh_via_onion {
  3296. if [[ $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  3297. return
  3298. fi
  3299. if grep -Fxq "enable_ssh_via_onion" $COMPLETION_FILE; then
  3300. return
  3301. fi
  3302. apt-get -y install tor connect-proxy
  3303. if ! grep -q 'Host *.onion' /home/$MY_USERNAME/.ssh/config; then
  3304. if [ ! -d /home/$MY_USERNAME/.ssh ]; then
  3305. mkdir /home/$MY_USERNAME/.ssh
  3306. fi
  3307. echo 'Host *.onion' >> /home/$MY_USERNAME/.ssh/config
  3308. echo 'ProxyCommand connect -R remote -5 -S 127.0.0.1:9050 %h %p' >> /home/$MY_USERNAME/.ssh/config
  3309. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.ssh
  3310. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.ssh/config
  3311. fi
  3312. if ! grep -q 'Host *.onion' /root/.ssh/config; then
  3313. if [ ! -d /root/.ssh ]; then
  3314. mkdir /root/.ssh
  3315. fi
  3316. echo 'Host *.onion' >> /root/.ssh/config
  3317. echo 'ProxyCommand connect -R remote -5 -S 127.0.0.1:9050 %h %p' >> /root/.ssh/config
  3318. fi
  3319. echo 'enable_ssh_via_onion' >> $COMPLETION_FILE
  3320. }
  3321. function install_editor {
  3322. if grep -Fxq "install_editor" $COMPLETION_FILE; then
  3323. return
  3324. fi
  3325. update-alternatives --set editor /usr/bin/emacs24
  3326. # A minimal emacs configuration
  3327. #echo -n "(add-to-list 'load-path " > /home/$MY_USERNAME/.emacs
  3328. #echo '"~/.emacs.d/")' >> /home/$MY_USERNAME/.emacs
  3329. #echo '' >> /home/$MY_USERNAME/.emacs
  3330. echo $';; ===== Remove trailing whitepace ======================================' >> /home/$MY_USERNAME/.emacs
  3331. echo '' >> /home/$MY_USERNAME/.emacs
  3332. echo ";;(add-hook 'before-save-hook 'delete-trailing-whitespace)" >> /home/$MY_USERNAME/.emacs
  3333. echo '' >> /home/$MY_USERNAME/.emacs
  3334. echo ';; Goto a line number with CTRL-l' >> /home/$MY_USERNAME/.emacs
  3335. echo -n '(global-set-key "\C-l" ' >> /home/$MY_USERNAME/.emacs
  3336. echo "'goto-line)" >> /home/$MY_USERNAME/.emacs
  3337. echo '' >> /home/$MY_USERNAME/.emacs
  3338. echo $';; ===== Show line numbers ==============================================' >> /home/$MY_USERNAME/.emacs
  3339. echo '' >> /home/$MY_USERNAME/.emacs
  3340. echo "(add-hook 'find-file-hook (lambda () (linum-mode 1)))" >> /home/$MY_USERNAME/.emacs
  3341. echo '' >> /home/$MY_USERNAME/.emacs
  3342. echo $';; ===== Enable line wrapping in org-mode ===============================' >> /home/$MY_USERNAME/.emacs
  3343. echo '' >> /home/$MY_USERNAME/.emacs
  3344. echo " (add-hook 'org-mode-hook" >> /home/$MY_USERNAME/.emacs
  3345. echo " '(lambda ()" >> /home/$MY_USERNAME/.emacs
  3346. echo " (visual-line-mode 1)))" >> /home/$MY_USERNAME/.emacs
  3347. echo '' >> /home/$MY_USERNAME/.emacs
  3348. echo $';; ===== Enable shift select in org mode ================================' >> /home/$MY_USERNAME/.emacs
  3349. echo '' >> /home/$MY_USERNAME/.emacs
  3350. echo '(setq org-support-shift-select t)' >> /home/$MY_USERNAME/.emacs
  3351. echo '' >> /home/$MY_USERNAME/.emacs
  3352. echo $';; ===== Set standard indent to 4 rather that 4 =========================' >> /home/$MY_USERNAME/.emacs
  3353. echo '' >> /home/$MY_USERNAME/.emacs
  3354. echo '(setq standard-indent 4)' >> /home/$MY_USERNAME/.emacs
  3355. echo '(setq-default tab-width 4)' >> /home/$MY_USERNAME/.emacs
  3356. echo '(setq c-basic-offset 4)' >> /home/$MY_USERNAME/.emacs
  3357. echo '' >> /home/$MY_USERNAME/.emacs
  3358. echo $';; ===== Support Wheel Mouse Scrolling ==================================' >> /home/$MY_USERNAME/.emacs
  3359. echo '' >> /home/$MY_USERNAME/.emacs
  3360. echo '(mouse-wheel-mode t)' >> /home/$MY_USERNAME/.emacs
  3361. echo '' >> /home/$MY_USERNAME/.emacs
  3362. echo $';; ===== Place Backup Files in Specific Directory =======================' >> /home/$MY_USERNAME/.emacs
  3363. echo '' >> /home/$MY_USERNAME/.emacs
  3364. echo '(setq make-backup-files t)' >> /home/$MY_USERNAME/.emacs
  3365. echo '(setq version-control t)' >> /home/$MY_USERNAME/.emacs
  3366. echo '(setq backup-directory-alist (quote ((".*" . "~/.emacs_backups/"))))' >> /home/$MY_USERNAME/.emacs
  3367. echo '' >> /home/$MY_USERNAME/.emacs
  3368. echo $';; ===== Make Text mode the default mode for new buffers ================' >> /home/$MY_USERNAME/.emacs
  3369. echo '' >> /home/$MY_USERNAME/.emacs
  3370. echo "(setq default-major-mode 'text-mode)" >> /home/$MY_USERNAME/.emacs
  3371. echo '' >> /home/$MY_USERNAME/.emacs
  3372. echo $';; ===== Line length ====================================================' >> /home/$MY_USERNAME/.emacs
  3373. echo '' >> /home/$MY_USERNAME/.emacs
  3374. echo '(setq-default fill-column 72)' >> /home/$MY_USERNAME/.emacs
  3375. echo '' >> /home/$MY_USERNAME/.emacs
  3376. echo $';; ===== Enable Line and Column Numbering ===============================' >> /home/$MY_USERNAME/.emacs
  3377. echo '' >> /home/$MY_USERNAME/.emacs
  3378. echo '(line-number-mode 1)' >> /home/$MY_USERNAME/.emacs
  3379. echo '(column-number-mode 1)' >> /home/$MY_USERNAME/.emacs
  3380. echo '' >> /home/$MY_USERNAME/.emacs
  3381. echo $';; ===== Turn on Auto Fill mode automatically in all modes ==============' >> /home/$MY_USERNAME/.emacs
  3382. echo '' >> /home/$MY_USERNAME/.emacs
  3383. echo ';; Auto-fill-mode the the automatic wrapping of lines and insertion of' >> /home/$MY_USERNAME/.emacs
  3384. echo ';; newlines when the cursor goes over the column limit.' >> /home/$MY_USERNAME/.emacs
  3385. echo '' >> /home/$MY_USERNAME/.emacs
  3386. echo ';; This should actually turn on auto-fill-mode by default in all major' >> /home/$MY_USERNAME/.emacs
  3387. echo ';; modes. The other way to do this is to turn on the fill for specific modes' >> /home/$MY_USERNAME/.emacs
  3388. echo ';; via hooks.' >> /home/$MY_USERNAME/.emacs
  3389. echo '' >> /home/$MY_USERNAME/.emacs
  3390. echo '(setq auto-fill-mode 1)' >> /home/$MY_USERNAME/.emacs
  3391. echo '' >> /home/$MY_USERNAME/.emacs
  3392. echo $';; ===== Enable GPG encryption =========================================' >> /home/$MY_USERNAME/.emacs
  3393. echo '' >> /home/$MY_USERNAME/.emacs
  3394. echo "(require 'epa)" >> /home/$MY_USERNAME/.emacs
  3395. echo '(epa-file-enable)' >> /home/$MY_USERNAME/.emacs
  3396. cp /home/$MY_USERNAME/.emacs /root/.emacs
  3397. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.emacs
  3398. echo 'install_editor' >> $COMPLETION_FILE
  3399. }
  3400. function enable_backports {
  3401. if grep -Fxq "enable_backports" $COMPLETION_FILE; then
  3402. return
  3403. fi
  3404. if ! grep -Fxq "deb http://$DEBIAN_REPO/debian $DEBIAN_VERSION-backports main" /etc/apt/sources.list; then
  3405. echo "deb http://$DEBIAN_REPO/debian $DEBIAN_VERSION-backports main" >> /etc/apt/sources.list
  3406. fi
  3407. echo 'enable_backports' >> $COMPLETION_FILE
  3408. }
  3409. function enable_zram {
  3410. if grep -Fxq "enable_zram" $COMPLETION_FILE; then
  3411. return
  3412. fi
  3413. if [[ $INSTALLED_WITHIN_DOCKER == "yes" || $INSTALLING_ON_BBB != "yes" ]]; then
  3414. ${PROJECT_NAME}-zram off
  3415. return
  3416. fi
  3417. ${PROJECT_NAME}-zram on
  3418. echo 'enable_zram' >> $COMPLETION_FILE
  3419. }
  3420. function check_onerng_verification {
  3421. if grep -Fxq "check_onerng_verification" $COMPLETION_FILE; then
  3422. return
  3423. fi
  3424. if [[ $HWRNG_TYPE != "onerng" ]]; then
  3425. return
  3426. fi
  3427. echo $'Checking OneRNG firmware verification'
  3428. last_onerng_validation=$(cat /var/log/syslog.1 | grep "OneRNG: firmware verification" | awk '/./{line=$0} END{print line}')
  3429. if [[ $last_onerng_validation != *"passed OK"* ]]; then
  3430. last_onerng_validation=$(cat /var/log/syslog | grep "OneRNG: firmware verification" | awk '/./{line=$0} END{print line}')
  3431. if [[ $last_onerng_validation != *"passed OK"* ]]; then
  3432. echo $last_onerng_validation
  3433. echo $'OneRNG firmware verification failed'
  3434. exit 735026
  3435. fi
  3436. fi
  3437. echo $'OneRNG firmware verification passed'
  3438. # if haveged was previously installed then remove it
  3439. apt-get -y remove haveged
  3440. echo 'check_onerng_verification' >> $COMPLETION_FILE
  3441. }
  3442. function install_onerng {
  3443. apt-get -y install rng-tools at python-gnupg
  3444. # Move to the installation directory
  3445. if [ ! -d $INSTALL_DIR ]; then
  3446. mkdir $INSTALL_DIR
  3447. fi
  3448. cd $INSTALL_DIR
  3449. # Download the package
  3450. if [ ! -f $ONERNG_PACKAGE ]; then
  3451. wget $ONERNG_PACKAGE_DOWNLOAD
  3452. mv "$ONERNG_PACKAGE?raw=true" $ONERNG_PACKAGE
  3453. fi
  3454. if [ ! -f $ONERNG_PACKAGE ]; then
  3455. echo $"OneRNG package could not be downloaded"
  3456. exit 59249
  3457. fi
  3458. # Check the hash
  3459. hash=$(sha256sum $ONERNG_PACKAGE | awk -F ' ' '{print $1}')
  3460. if [[ $hash != $ONERNG_PACKAGE_HASH ]]; then
  3461. echo $"OneRNG package: $ONERNG_PACKAGE"
  3462. echo $"Hash does not match. This could indicate that the package has been tampered with."
  3463. echo $"OneRNG expected package hash: $ONERNG_PACKAGE_HASH"
  3464. echo $"OneRNG actual hash: $hash"
  3465. exit 25934
  3466. fi
  3467. # install the package
  3468. dpkg -i $ONERNG_PACKAGE
  3469. # Check that the install worked
  3470. if [ ! -f /etc/onerng.conf ]; then
  3471. echo $'OneRNG configuration file not found. The package may not have installed successfully.'
  3472. exit 42904
  3473. fi
  3474. dialog --title $"OneRNG Device" \
  3475. --msgbox $"Please plug in the OneRNG device" 6 40
  3476. # check rng-tools configuration
  3477. if ! grep -q "/dev/$ONERNG_DEVICE" /etc/default/rng-tools; then
  3478. echo "HRNGDEVICE=/dev/$ONERNG_DEVICE" >> /etc/default/rng-tools
  3479. fi
  3480. systemctl restart rng-tools
  3481. }
  3482. function random_number_generator {
  3483. if grep -Fxq "random_number_generator" $COMPLETION_FILE; then
  3484. return
  3485. fi
  3486. if [[ $INSTALLED_WITHIN_DOCKER == "yes" ]]; then
  3487. # it is assumed that docker uses the random number
  3488. # generator of the host system
  3489. return
  3490. fi
  3491. # if the hrng type has not been set but /dev/hwrng is detected
  3492. if [[ $HWRNG_TYPE != "beaglebone" ]]; then
  3493. if [ -e /dev/hwrng ]; then
  3494. HWRNG_TYPE="beaglebone"
  3495. fi
  3496. fi
  3497. case $HWRNG_TYPE in
  3498. beaglebone)
  3499. apt-get -y install rng-tools
  3500. sed -i 's|#HRNGDEVICE=/dev/hwrng|HRNGDEVICE=/dev/hwrng|g' /etc/default/rng-tools
  3501. ;;
  3502. onerng)
  3503. install_onerng
  3504. ;;
  3505. *)
  3506. apt-get -y install haveged
  3507. ;;
  3508. esac
  3509. echo 'random_number_generator' >> $COMPLETION_FILE
  3510. }
  3511. function configure_ssh {
  3512. if grep -Fxq "configure_ssh" $COMPLETION_FILE; then
  3513. return
  3514. fi
  3515. sed -i "s/Port .*/Port $SSH_PORT/g" /etc/ssh/sshd_config
  3516. sed -i 's/PermitRootLogin.*/PermitRootLogin no/g' /etc/ssh/sshd_config
  3517. sed -i 's/X11Forwarding.*/X11Forwarding no/g' /etc/ssh/sshd_config
  3518. sed -i 's/ServerKeyBits.*/ServerKeyBits 4096/g' /etc/ssh/sshd_config
  3519. sed -i 's/TCPKeepAlive.*/TCPKeepAlive no/g' /etc/ssh/sshd_config
  3520. sed -i 's|HostKey /etc/ssh/ssh_host_dsa_key|#HostKey /etc/ssh/ssh_host_dsa_key|g' /etc/ssh/sshd_config
  3521. sed -i 's|HostKey /etc/ssh/ssh_host_ecdsa_key|#HostKey /etc/ssh/ssh_host_ecdsa_key|g' /etc/ssh/sshd_config
  3522. if ! grep -q 'DebianBanner' /etc/ssh/sshd_config; then
  3523. echo 'DebianBanner no' >> /etc/ssh/sshd_config
  3524. else
  3525. sed -i 's|DebianBanner.*|DebianBanner no|g' /etc/ssh/sshd_config
  3526. fi
  3527. if grep -q 'ClientAliveInterval' /etc/ssh/sshd_config; then
  3528. sed -i 's/ClientAliveInterval.*/ClientAliveInterval 60/g' /etc/ssh/sshd_config
  3529. else
  3530. echo 'ClientAliveInterval 60' >> /etc/ssh/sshd_config
  3531. fi
  3532. if grep -q 'ClientAliveCountMax' /etc/ssh/sshd_config; then
  3533. sed -i 's/ClientAliveCountMax.*/ClientAliveCountMax 3/g' /etc/ssh/sshd_config
  3534. else
  3535. echo 'ClientAliveCountMax 3' >> /etc/ssh/sshd_config
  3536. fi
  3537. if grep -q 'Ciphers' /etc/ssh/sshd_config; then
  3538. sed -i "s|Ciphers.*|Ciphers $SSH_CIPHERS|g" /etc/ssh/sshd_config
  3539. else
  3540. echo "Ciphers $SSH_CIPHERS" >> /etc/ssh/sshd_config
  3541. fi
  3542. if grep -q 'MACs' /etc/ssh/sshd_config; then
  3543. sed -i "s|MACs.*|MACs $SSH_MACS|g" /etc/ssh/sshd_config
  3544. else
  3545. echo "MACs $SSH_MACS" >> /etc/ssh/sshd_config
  3546. fi
  3547. if grep -q 'KexAlgorithms' /etc/ssh/sshd_config; then
  3548. sed -i "s|KexAlgorithms.*|KexAlgorithms $SSH_KEX|g" /etc/ssh/sshd_config
  3549. else
  3550. echo "KexAlgorithms $SSH_KEX" >> /etc/ssh/sshd_config
  3551. fi
  3552. apt-get -y install fail2ban
  3553. echo 'configure_ssh' >> $COMPLETION_FILE
  3554. }
  3555. function configure_ssh_onion {
  3556. if grep -Fxq "configure_ssh_onion" $COMPLETION_FILE; then
  3557. return
  3558. fi
  3559. if [[ $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  3560. return
  3561. fi
  3562. SSH_ONION_HOSTNAME=$(add_onion_service ssh ${SSH_PORT} ${SSH_PORT})
  3563. if ! grep -q "ssh onion domain" $COMPLETION_FILE; then
  3564. echo "ssh onion domain:${SSH_ONION_HOSTNAME}" >> $COMPLETION_FILE
  3565. else
  3566. sed -i "s|ssh onion domain.*|ssh onion domain:${SSH_ONION_HOSTNAME}|g" $COMPLETION_FILE
  3567. fi
  3568. echo 'configure_ssh_onion' >> $COMPLETION_FILE
  3569. }
  3570. # see https://stribika.github.io/2015/01/04/secure-secure-shell.html
  3571. function ssh_remove_small_moduli {
  3572. awk '$5 > 2000' /etc/ssh/moduli > ~/moduli
  3573. mv ~/moduli /etc/ssh/moduli
  3574. }
  3575. function configure_ssh_client {
  3576. if grep -Fxq "configure_ssh_client" $COMPLETION_FILE; then
  3577. return
  3578. fi
  3579. #sed -i 's/# PasswordAuthentication.*/ PasswordAuthentication no/g' /etc/ssh/ssh_config
  3580. #sed -i 's/# ChallengeResponseAuthentication.*/ ChallengeResponseAuthentication no/g' /etc/ssh/ssh_config
  3581. sed -i "s/# HostKeyAlgorithms.*/ HostKeyAlgorithms $SSH_HOST_KEY_ALGORITHMS/g" /etc/ssh/ssh_config
  3582. sed -i "s/# Ciphers.*/ Ciphers $SSH_CIPHERS/g" /etc/ssh/ssh_config
  3583. sed -i "s/# MACs.*/ MACs $SSH_MACS/g" /etc/ssh/ssh_config
  3584. if ! grep -q "HostKeyAlgorithms" /etc/ssh/ssh_config; then
  3585. echo " HostKeyAlgorithms $SSH_HOST_KEY_ALGORITHMS" >> /etc/ssh/ssh_config
  3586. fi
  3587. sed -i "s/Ciphers.*/Ciphers $SSH_CIPHERS/g" /etc/ssh/ssh_config
  3588. if ! grep -q "Ciphers " /etc/ssh/ssh_config; then
  3589. echo " Ciphers $SSH_CIPHERS" >> /etc/ssh/ssh_config
  3590. fi
  3591. sed -i "s/MACs.*/MACs $SSH_MACS/g" /etc/ssh/ssh_config
  3592. if ! grep -q "MACs " /etc/ssh/ssh_config; then
  3593. echo " MACs $SSH_MACS" >> /etc/ssh/ssh_config
  3594. fi
  3595. # Create ssh keys
  3596. if [ ! -f ~/.ssh/id_ed25519 ]; then
  3597. ssh-keygen -t ed25519 -o -a 100
  3598. fi
  3599. if [ ! -f ~/.ssh/id_rsa ]; then
  3600. ssh-keygen -t rsa -b 4096 -o -a 100
  3601. fi
  3602. ssh_remove_small_moduli
  3603. echo 'configure_ssh_client' >> $COMPLETION_FILE
  3604. }
  3605. function regenerate_ssh_keys {
  3606. if grep -Fxq "regenerate_ssh_keys" $COMPLETION_FILE; then
  3607. return
  3608. fi
  3609. rm -f /etc/ssh/ssh_host_*
  3610. dpkg-reconfigure openssh-server
  3611. ssh_remove_small_moduli
  3612. systemctl restart ssh
  3613. echo 'regenerate_ssh_keys' >> $COMPLETION_FILE
  3614. }
  3615. function configure_dns {
  3616. if grep -Fxq "configure_dns" $COMPLETION_FILE; then
  3617. return
  3618. fi
  3619. echo 'domain localdomain' > /etc/resolv.conf
  3620. echo 'search localdomain' >> /etc/resolv.conf
  3621. echo "nameserver $NAMESERVER1" >> /etc/resolv.conf
  3622. echo "nameserver $NAMESERVER2" >> /etc/resolv.conf
  3623. echo 'configure_dns' >> $COMPLETION_FILE
  3624. }
  3625. function set_hostname {
  3626. DEFAULT_DOMAIN_NAME="$1"
  3627. echo "$DEFAULT_DOMAIN_NAME" > /etc/hostname
  3628. hostname $DEFAULT_DOMAIN_NAME
  3629. if grep -q "127.0.1.1" /etc/hosts; then
  3630. sed -i "s/127.0.1.1.*/127.0.1.1 $DEFAULT_DOMAIN_NAME/g" /etc/hosts
  3631. else
  3632. echo "127.0.1.1 $DEFAULT_DOMAIN_NAME" >> /etc/hosts
  3633. fi
  3634. }
  3635. function set_your_domain_name {
  3636. if grep -Fxq "set_your_domain_name" $COMPLETION_FILE; then
  3637. return
  3638. fi
  3639. set_hostname $DEFAULT_DOMAIN_NAME
  3640. echo 'set_your_domain_name' >> $COMPLETION_FILE
  3641. }
  3642. function time_synchronisation {
  3643. # mesh peers typically don't sync over the internet
  3644. if [[ $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  3645. return
  3646. fi
  3647. if [ -f /usr/local/bin/${PROJECT_NAME}-update-date ]; then
  3648. cp /usr/local/bin/${PROJECT_NAME}-update-date /usr/bin/updatedate
  3649. else
  3650. cp /usr/bin/${PROJECT_NAME}-update-date /usr/bin/updatedate
  3651. fi
  3652. chmod +x /usr/bin/updatedate
  3653. if grep -Fxq "time_synchronisation" $COMPLETION_FILE; then
  3654. return
  3655. fi
  3656. apt-get -y install tlsdate
  3657. apt-get -y remove ntpdate
  3658. echo '*/15 * * * * root /usr/bin/updatedate' >> /etc/crontab
  3659. systemctl restart cron
  3660. echo 'time_synchronisation' >> $COMPLETION_FILE
  3661. }
  3662. function configure_firewall {
  3663. if grep -Fxq "configure_firewall" $COMPLETION_FILE; then
  3664. return
  3665. fi
  3666. if [[ $INSTALLED_WITHIN_DOCKER == "yes" ]]; then
  3667. # docker does its own firewalling
  3668. return
  3669. fi
  3670. iptables -P INPUT ACCEPT
  3671. ip6tables -P INPUT ACCEPT
  3672. iptables -F
  3673. ip6tables -F
  3674. iptables -t nat -F
  3675. ip6tables -t nat -F
  3676. iptables -X
  3677. ip6tables -X
  3678. iptables -P INPUT DROP
  3679. ip6tables -P INPUT DROP
  3680. iptables -A INPUT -i lo -j ACCEPT
  3681. iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
  3682. # Make sure incoming tcp connections are SYN packets
  3683. iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
  3684. # Drop packets with incoming fragments
  3685. iptables -A INPUT -f -j DROP
  3686. # Drop bogons
  3687. iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
  3688. iptables -A INPUT -p tcp --tcp-flags ALL FIN,PSH,URG -j DROP
  3689. iptables -A INPUT -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP
  3690. # Incoming malformed NULL packets:
  3691. iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
  3692. echo 'configure_firewall' >> $COMPLETION_FILE
  3693. }
  3694. function configure_firewall_ping {
  3695. if grep -Fxq "configure_firewall_ping" $COMPLETION_FILE; then
  3696. return
  3697. fi
  3698. # Only allow ping for mesh installs
  3699. if [[ $SYSTEM_TYPE != "$VARIANT_MESH" ]]; then
  3700. return
  3701. fi
  3702. iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
  3703. iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT
  3704. save_firewall_settings
  3705. echo 'configure_firewall_ping' >> $COMPLETION_FILE
  3706. }
  3707. function configure_firewall_for_voip {
  3708. 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
  3709. return
  3710. fi
  3711. if grep -Fxq "configure_firewall_for_voip" $COMPLETION_FILE; then
  3712. return
  3713. fi
  3714. if [[ $ONION_ONLY != "no" ]]; then
  3715. return
  3716. fi
  3717. iptables -A INPUT -p udp --dport $VOIP_PORT -j ACCEPT
  3718. iptables -A INPUT -p tcp --dport $VOIP_PORT -j ACCEPT
  3719. save_firewall_settings
  3720. echo 'configure_firewall_for_voip' >> $COMPLETION_FILE
  3721. }
  3722. function configure_firewall_for_sip {
  3723. 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
  3724. return
  3725. fi
  3726. if grep -Fxq "configure_firewall_for_sip" $COMPLETION_FILE; then
  3727. return
  3728. fi
  3729. if [[ $ONION_ONLY != "no" ]]; then
  3730. return
  3731. fi
  3732. iptables -A INPUT -p udp --dport $SIP_PORT -j ACCEPT
  3733. iptables -A INPUT -p tcp --dport $SIP_PORT -j ACCEPT
  3734. save_firewall_settings
  3735. echo 'configure_firewall_for_sip' >> $COMPLETION_FILE
  3736. }
  3737. function configure_firewall_for_ipfs {
  3738. if [[ $SYSTEM_TYPE == "$VARIANT_MAILBOX" || $SYSTEM_TYPE == "$VARIANT_CHAT" ]]; then
  3739. return
  3740. fi
  3741. if grep -Fxq "configure_firewall_for_ipfs" $COMPLETION_FILE; then
  3742. return
  3743. fi
  3744. if [[ $ONION_ONLY != "no" ]]; then
  3745. return
  3746. fi
  3747. iptables -A INPUT -p tcp --dport $IPFS_PORT -j ACCEPT
  3748. save_firewall_settings
  3749. echo 'configure_firewall_for_ipfs' >> $COMPLETION_FILE
  3750. }
  3751. function configure_firewall_for_avahi {
  3752. if grep -Fxq "configure_firewall_for_avahi" $COMPLETION_FILE; then
  3753. return
  3754. fi
  3755. iptables -A INPUT -p tcp --dport 548 -j ACCEPT
  3756. iptables -A INPUT -p udp --dport 548 -j ACCEPT
  3757. iptables -A INPUT -p tcp --dport 5353 -j ACCEPT
  3758. iptables -A INPUT -p udp --dport 5353 -j ACCEPT
  3759. iptables -A INPUT -p tcp --dport 5354 -j ACCEPT
  3760. iptables -A INPUT -p udp --dport 5354 -j ACCEPT
  3761. save_firewall_settings
  3762. echo 'configure_firewall_for_avahi' >> $COMPLETION_FILE
  3763. }
  3764. function configure_firewall_for_cjdns {
  3765. if grep -Fxq "configure_firewall_for_cjdns" $COMPLETION_FILE; then
  3766. return
  3767. fi
  3768. if [[ $ENABLE_CJDNS != "yes" ]]; then
  3769. return
  3770. fi
  3771. ip6tables -t nat -A POSTROUTING -o tun0 -j MASQUERADE
  3772. ip6tables -A FORWARD -i tun0 -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
  3773. save_firewall_settings
  3774. echo 'configure_firewall_for_cjdns' >> $COMPLETION_FILE
  3775. }
  3776. function configure_firewall_for_batman {
  3777. if grep -Fxq "configure_firewall_for_batman" $COMPLETION_FILE; then
  3778. return
  3779. fi
  3780. if [[ $ENABLE_BATMAN != "yes" ]]; then
  3781. return
  3782. fi
  3783. save_firewall_settings
  3784. echo 'configure_firewall_for_batman' >> $COMPLETION_FILE
  3785. }
  3786. function configure_firewall_for_babel {
  3787. if grep -Fxq "configure_firewall_for_babel" $COMPLETION_FILE; then
  3788. return
  3789. fi
  3790. if [[ $ENABLE_BABEL != "yes" ]]; then
  3791. return
  3792. fi
  3793. iptables -A INPUT -i $WIFI_INTERFACE -p udp --dport $BABEL_PORT -j ACCEPT
  3794. save_firewall_settings
  3795. echo 'configure_firewall_for_babel' >> $COMPLETION_FILE
  3796. }
  3797. function configure_firewall_for_zeronet {
  3798. if grep -Fxq "configure_firewall_for_zeronet" $COMPLETION_FILE; then
  3799. return
  3800. fi
  3801. if [[ $SYSTEM_TYPE != "$VARIANT_MESH" ]]; then
  3802. return
  3803. fi
  3804. iptables -A INPUT -i $WIFI_INTERFACE -p udp --dport $ZERONET_PORT -j ACCEPT
  3805. iptables -A INPUT -i $WIFI_INTERFACE -p tcp --dport $ZERONET_PORT -j ACCEPT
  3806. iptables -A INPUT -i $WIFI_INTERFACE -p udp --dport $TRACKER_PORT -j ACCEPT
  3807. iptables -A INPUT -i $WIFI_INTERFACE -p tcp --dport $TRACKER_PORT -j ACCEPT
  3808. iptables -A INPUT -i $WIFI_INTERFACE -p udp --dport 1900 -j ACCEPT
  3809. save_firewall_settings
  3810. echo 'configure_firewall_for_zeronet' >> $COMPLETION_FILE
  3811. }
  3812. function configure_firewall_for_dlna {
  3813. if grep -Fxq "configure_firewall_for_dlna" $COMPLETION_FILE; then
  3814. return
  3815. fi
  3816. if [[ $INSTALLED_WITHIN_DOCKER == "yes" ]]; then
  3817. # docker does its own firewalling
  3818. return
  3819. fi
  3820. if [[ $SYSTEM_TYPE == "$VARIANT_CLOUD" || $SYSTEM_TYPE == "$VARIANT_MAILBOX" || $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_WRITER" || $SYSTEM_TYPE == "$VARIANT_SOCIAL" ]]; then
  3821. return
  3822. fi
  3823. iptables -A INPUT -p udp --dport 1900 -j ACCEPT
  3824. iptables -A INPUT -p tcp --dport 8200 -j ACCEPT
  3825. save_firewall_settings
  3826. echo 'configure_firewall_for_dlna' >> $COMPLETION_FILE
  3827. }
  3828. function configure_firewall_for_dns {
  3829. if grep -Fxq "configure_firewall_for_dns" $COMPLETION_FILE; then
  3830. return
  3831. fi
  3832. if [[ $INSTALLED_WITHIN_DOCKER == "yes" ]]; then
  3833. # docker does its own firewalling
  3834. return
  3835. fi
  3836. iptables -A INPUT -p udp -m udp --dport 1024:65535 --sport 53 -j ACCEPT
  3837. save_firewall_settings
  3838. echo 'configure_firewall_for_dns' >> $COMPLETION_FILE
  3839. }
  3840. function configure_firewall_for_xmpp {
  3841. if [ ! -d /etc/prosody ]; then
  3842. return
  3843. fi
  3844. if grep -Fxq "configure_firewall_for_xmpp" $COMPLETION_FILE; then
  3845. return
  3846. fi
  3847. if [[ $INSTALLED_WITHIN_DOCKER == "yes" ]]; then
  3848. # docker does its own firewalling
  3849. return
  3850. fi
  3851. if [[ $ONION_ONLY != "no" ]]; then
  3852. return
  3853. fi
  3854. iptables -A INPUT -p tcp --dport 5222:5223 -j ACCEPT
  3855. iptables -A INPUT -p tcp --dport 5269 -j ACCEPT
  3856. iptables -A INPUT -p tcp --dport 5280:5281 -j ACCEPT
  3857. save_firewall_settings
  3858. echo 'configure_firewall_for_xmpp' >> $COMPLETION_FILE
  3859. }
  3860. function configure_firewall_for_irc {
  3861. if [ ! -d /etc/ngircd ]; then
  3862. return
  3863. fi
  3864. if grep -Fxq "configure_firewall_for_irc" $COMPLETION_FILE; then
  3865. return
  3866. fi
  3867. if [[ $INSTALLED_WITHIN_DOCKER == "yes" ]]; then
  3868. # docker does its own firewalling
  3869. return
  3870. fi
  3871. if [[ $ONION_ONLY != "no" ]]; then
  3872. return
  3873. fi
  3874. iptables -A INPUT -p tcp --dport $IRC_PORT -j ACCEPT
  3875. iptables -I INPUT -p tcp --dport 1024:65535 --sport $IRC_PORT -j ACCEPT
  3876. save_firewall_settings
  3877. echo 'configure_firewall_for_irc' >> $COMPLETION_FILE
  3878. }
  3879. function configure_firewall_for_ftp {
  3880. if grep -Fxq "configure_firewall_for_ftp" $COMPLETION_FILE; then
  3881. return
  3882. fi
  3883. if [[ $INSTALLED_WITHIN_DOCKER == "yes" ]]; then
  3884. # docker does its own firewalling
  3885. return
  3886. fi
  3887. if [[ $ONION_ONLY != "no" ]]; then
  3888. return
  3889. fi
  3890. iptables -I INPUT -p tcp --dport 1024:65535 --sport 20:21 -j ACCEPT
  3891. save_firewall_settings
  3892. echo 'configure_firewall_for_ftp' >> $COMPLETION_FILE
  3893. }
  3894. function configure_firewall_for_web_access {
  3895. if grep -Fxq "configure_firewall_for_web_access" $COMPLETION_FILE; then
  3896. return
  3897. fi
  3898. if [[ $INSTALLED_WITHIN_DOCKER == "yes" ]]; then
  3899. # docker does its own firewalling
  3900. return
  3901. fi
  3902. if [[ $ONION_ONLY != "no" ]]; then
  3903. return
  3904. fi
  3905. iptables -A INPUT -p tcp --dport 32768:61000 --sport 80 -j ACCEPT
  3906. iptables -A INPUT -p tcp --dport 32768:61000 --sport 443 -j ACCEPT
  3907. save_firewall_settings
  3908. echo 'configure_firewall_for_web_access' >> $COMPLETION_FILE
  3909. }
  3910. function configure_firewall_for_web_server {
  3911. if grep -Fxq "configure_firewall_for_web_server" $COMPLETION_FILE; then
  3912. return
  3913. fi
  3914. if [[ $INSTALLED_WITHIN_DOCKER == "yes" ]]; then
  3915. # docker does its own firewalling
  3916. return
  3917. fi
  3918. if [[ $ONION_ONLY != "no" ]]; then
  3919. return
  3920. fi
  3921. iptables -A INPUT -p tcp --dport 80 -j ACCEPT
  3922. iptables -A INPUT -p tcp --dport 443 -j ACCEPT
  3923. save_firewall_settings
  3924. echo 'configure_firewall_for_web_server' >> $COMPLETION_FILE
  3925. }
  3926. function configure_firewall_for_tox {
  3927. if grep -Fxq "configure_firewall_for_tox" $COMPLETION_FILE; then
  3928. return
  3929. fi
  3930. if [[ $INSTALLED_WITHIN_DOCKER == "yes" ]]; then
  3931. # docker does its own firewalling
  3932. return
  3933. fi
  3934. if [[ $ONION_ONLY != "no" ]]; then
  3935. return
  3936. fi
  3937. iptables -A INPUT -p tcp --dport $TOX_PORT -j ACCEPT
  3938. save_firewall_settings
  3939. echo 'configure_firewall_for_tox' >> $COMPLETION_FILE
  3940. }
  3941. function configure_firewall_for_ssh {
  3942. if grep -Fxq "configure_firewall_for_ssh" $COMPLETION_FILE; then
  3943. return
  3944. fi
  3945. if [[ $INSTALLED_WITHIN_DOCKER == "yes" ]]; then
  3946. # docker does its own firewalling
  3947. return
  3948. fi
  3949. iptables -A INPUT -p tcp --dport 22 -j ACCEPT
  3950. iptables -A INPUT -p tcp --dport $SSH_PORT -j ACCEPT
  3951. save_firewall_settings
  3952. echo 'configure_firewall_for_ssh' >> $COMPLETION_FILE
  3953. }
  3954. function configure_firewall_for_git {
  3955. if grep -Fxq "configure_firewall_for_git" $COMPLETION_FILE; then
  3956. return
  3957. fi
  3958. if [[ $INSTALLED_WITHIN_DOCKER == "yes" ]]; then
  3959. # docker does its own firewalling
  3960. return
  3961. fi
  3962. if [[ $ONION_ONLY != "no" ]]; then
  3963. return
  3964. fi
  3965. iptables -A INPUT -p tcp --dport 9418 -j ACCEPT
  3966. save_firewall_settings
  3967. echo 'configure_firewall_for_git' >> $COMPLETION_FILE
  3968. }
  3969. function configure_firewall_for_email {
  3970. 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
  3971. return
  3972. fi
  3973. if grep -Fxq "configure_firewall_for_email" $COMPLETION_FILE; then
  3974. return
  3975. fi
  3976. if [[ $INSTALLED_WITHIN_DOCKER == "yes" ]]; then
  3977. # docker does its own firewalling
  3978. return
  3979. fi
  3980. if [[ $ONION_ONLY != "no" ]]; then
  3981. return
  3982. fi
  3983. iptables -A INPUT -p tcp --dport 25 -j ACCEPT
  3984. iptables -A INPUT -p tcp --dport 587 -j ACCEPT
  3985. iptables -A INPUT -p tcp --dport 465 -j ACCEPT
  3986. iptables -A INPUT -p tcp --dport 993 -j ACCEPT
  3987. save_firewall_settings
  3988. echo 'configure_firewall_for_email' >> $COMPLETION_FILE
  3989. }
  3990. function configure_internet_protocol {
  3991. if grep -Fxq "configure_internet_protocol" $COMPLETION_FILE; then
  3992. return
  3993. fi
  3994. if [[ $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  3995. return
  3996. fi
  3997. sed -i "s/#net.ipv4.tcp_syncookies=1/net.ipv4.tcp_syncookies=1/g" /etc/sysctl.conf
  3998. sed -i "s/#net.ipv4.conf.all.accept_redirects = 0/net.ipv4.conf.all.accept_redirects = 0/g" /etc/sysctl.conf
  3999. sed -i "s/#net.ipv6.conf.all.accept_redirects = 0/net.ipv6.conf.all.accept_redirects = 0/g" /etc/sysctl.conf
  4000. sed -i "s/#net.ipv4.conf.all.send_redirects = 0/net.ipv4.conf.all.send_redirects = 0/g" /etc/sysctl.conf
  4001. sed -i "s/#net.ipv4.conf.all.accept_source_route = 0/net.ipv4.conf.all.accept_source_route = 0/g" /etc/sysctl.conf
  4002. sed -i "s/#net.ipv6.conf.all.accept_source_route = 0/net.ipv6.conf.all.accept_source_route = 0/g" /etc/sysctl.conf
  4003. sed -i "s/#net.ipv4.conf.default.rp_filter=1/net.ipv4.conf.default.rp_filter=1/g" /etc/sysctl.conf
  4004. sed -i "s/#net.ipv4.conf.all.rp_filter=1/net.ipv4.conf.all.rp_filter=1/g" /etc/sysctl.conf
  4005. sed -i "s/#net.ipv4.ip_forward=1/net.ipv4.ip_forward=0/g" /etc/sysctl.conf
  4006. sed -i "s/#net.ipv6.conf.all.forwarding=1/net.ipv6.conf.all.forwarding=0/g" /etc/sysctl.conf
  4007. if ! grep -q "ignore pings" /etc/sysctl.conf; then
  4008. echo '# ignore pings' >> /etc/sysctl.conf
  4009. echo 'net.ipv4.icmp_echo_ignore_all = 1' >> /etc/sysctl.conf
  4010. echo 'net.ipv6.icmp_echo_ignore_all = 1' >> /etc/sysctl.conf
  4011. fi
  4012. if ! grep -q "disable ipv6" /etc/sysctl.conf; then
  4013. echo '# disable ipv6' >> /etc/sysctl.conf
  4014. echo 'net.ipv6.conf.all.disable_ipv6 = 1' >> /etc/sysctl.conf
  4015. fi
  4016. if ! grep -q "net.ipv4.tcp_synack_retries" /etc/sysctl.conf; then
  4017. echo 'net.ipv4.tcp_synack_retries = 2' >> /etc/sysctl.conf
  4018. echo 'net.ipv4.tcp_syn_retries = 1' >> /etc/sysctl.conf
  4019. fi
  4020. if ! grep -q "keepalive" /etc/sysctl.conf; then
  4021. echo '# keepalive' >> /etc/sysctl.conf
  4022. echo 'net.ipv4.tcp_keepalive_probes = 9' >> /etc/sysctl.conf
  4023. echo 'net.ipv4.tcp_keepalive_intvl = 75' >> /etc/sysctl.conf
  4024. echo 'net.ipv4.tcp_keepalive_time = 7200' >> /etc/sysctl.conf
  4025. fi
  4026. echo 'configure_internet_protocol' >> $COMPLETION_FILE
  4027. }
  4028. function configure_email {
  4029. if [[ $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  4030. return
  4031. fi
  4032. if grep -Fxq "configure_email" $COMPLETION_FILE; then
  4033. return
  4034. fi
  4035. apt-get -y remove postfix
  4036. apt-get -y install exim4 sasl2-bin swaks libnet-ssleay-perl procmail xinetd
  4037. if [ ! -d /etc/exim4 ]; then
  4038. echo $"ERROR: Exim does not appear to have installed. $CHECK_MESSAGE"
  4039. exit 48
  4040. fi
  4041. onion_service_name='email'
  4042. if [ ! -d /var/lib/tor ]; then
  4043. echo $"No Tor installation found. ${onion_service_name} onion site cannot be configured."
  4044. exit 877367
  4045. fi
  4046. if ! grep -q "hidden_service_${onion_service_name}" /etc/tor/torrc; then
  4047. echo "HiddenServiceDir /var/lib/tor/hidden_service_${onion_service_name}/" >> /etc/tor/torrc
  4048. echo 'HiddenServicePort 25 127.0.0.1:25' >> /etc/tor/torrc
  4049. echo 'HiddenServicePort 587 127.0.0.1:587' >> /etc/tor/torrc
  4050. echo 'HiddenServicePort 465 127.0.0.1:465' >> /etc/tor/torrc
  4051. echo 'HiddenServicePort 993 127.0.0.1:993' >> /etc/tor/torrc
  4052. echo $"Added onion site for ${onion_service_name}"
  4053. fi
  4054. systemctl restart tor
  4055. wait_for_onion_service ${onion_service_name}
  4056. if [ ! -f /var/lib/tor/hidden_service_${onion_service_name}/hostname ]; then
  4057. echo $"${onion_service_name} onion site hostname not found"
  4058. exit 76362
  4059. fi
  4060. EMAIL_ONION_HOSTNAME=$(cat /var/lib/tor/hidden_service_${onion_service_name}/hostname)
  4061. if [[ $ONION_ONLY != "no" ]]; then
  4062. set_hostname ${EMAIL_ONION_HOSTNAME}
  4063. MY_EMAIL_ADDRESS=${MY_USERNAME}@${DEFAULT_DOMAIN_NAME}
  4064. fi
  4065. if ! grep -q "Email onion domain" $COMPLETION_FILE; then
  4066. echo "Email onion domain:${EMAIL_ONION_HOSTNAME}" >> $COMPLETION_FILE
  4067. else
  4068. sed -i "s|Email onion domain.*|Email onion domain:${EMAIL_ONION_HOSTNAME}|g" $COMPLETION_FILE
  4069. fi
  4070. # see https://github.com/petterreinholdtsen/exim4-smtorp
  4071. echo '# tor stuff first' > /etc/exim4/conf.d/router/100_exim4-smtorp
  4072. echo '#' >> /etc/exim4/conf.d/router/100_exim4-smtorp
  4073. echo '# if were submitting mail *from* a .tor/.onion address,' >> /etc/exim4/conf.d/router/100_exim4-smtorp
  4074. echo '# make sure any header lines that may give us away is' >> /etc/exim4/conf.d/router/100_exim4-smtorp
  4075. echo '# stripped out, and add a new, cryptic Message-ID.' >> /etc/exim4/conf.d/router/100_exim4-smtorp
  4076. echo '# In address_data we store the name we should HELO as.' >> /etc/exim4/conf.d/router/100_exim4-smtorp
  4077. echo 'tor_to_any:' >> /etc/exim4/conf.d/router/100_exim4-smtorp
  4078. echo ' debug_print = "R: manualroute from .onion to $local_part@$domain"' >> /etc/exim4/conf.d/router/100_exim4-smtorp
  4079. echo ' driver = manualroute' >> /etc/exim4/conf.d/router/100_exim4-smtorp
  4080. echo ' domains = ! +local_domains' >> /etc/exim4/conf.d/router/100_exim4-smtorp
  4081. echo ' condition = ${if match {$sender_address_domain}{\N.*\.(onion|tor)$\N}}' >> /etc/exim4/conf.d/router/100_exim4-smtorp
  4082. echo ' address_data = $sender_address_domain' >> /etc/exim4/conf.d/router/100_exim4-smtorp
  4083. echo ' transport = remote_smtp_onion' >> /etc/exim4/conf.d/router/100_exim4-smtorp
  4084. echo ' self = send' >> /etc/exim4/conf.d/router/100_exim4-smtorp
  4085. echo ' route_list = * localhost' >> /etc/exim4/conf.d/router/100_exim4-smtorp
  4086. echo ' headers_remove = Received:Message-ID:X-Mailer:User-Agent' >> /etc/exim4/conf.d/router/100_exim4-smtorp
  4087. echo ' headers_add = Message-ID: <${lc:${sha1:$message_id}}@$sender_address_domain>' >> /etc/exim4/conf.d/router/100_exim4-smtorp
  4088. echo '' >> /etc/exim4/conf.d/router/100_exim4-smtorp
  4089. echo '# this catches the case where were submitting mail' >> /etc/exim4/conf.d/router/100_exim4-smtorp
  4090. echo '# from a regular email address where we dont need to' >> /etc/exim4/conf.d/router/100_exim4-smtorp
  4091. echo '# rewrite any headers' >> /etc/exim4/conf.d/router/100_exim4-smtorp
  4092. echo 'any_to_tor:' >> /etc/exim4/conf.d/router/100_exim4-smtorp
  4093. echo ' debug_print = "R: manualroute for $local_part@$domain"' >> /etc/exim4/conf.d/router/100_exim4-smtorp
  4094. echo ' driver = manualroute' >> /etc/exim4/conf.d/router/100_exim4-smtorp
  4095. echo ' domains = ! +local_domains' >> /etc/exim4/conf.d/router/100_exim4-smtorp
  4096. echo ' transport = remote_smtp_onion' >> /etc/exim4/conf.d/router/100_exim4-smtorp
  4097. echo ' self = send' >> /etc/exim4/conf.d/router/100_exim4-smtorp
  4098. echo ' route_list = *.onion localhost ; *.tor localhost' >> /etc/exim4/conf.d/router/100_exim4-smtorp
  4099. echo ' address_data = $smtp_active_hostname' >> /etc/exim4/conf.d/router/100_exim4-smtorp
  4100. echo 'remote_smtp_onion:' > /etc/exim4/conf.d/transport/100_exim4-smtorp
  4101. echo ' debug_print = "T: remote_smtp_onion for $local_part@$original_domain"' >> /etc/exim4/conf.d/transport/100_exim4-smtorp
  4102. echo ' driver = smtp' >> /etc/exim4/conf.d/transport/100_exim4-smtorp
  4103. echo '' >> /etc/exim4/conf.d/transport/100_exim4-smtorp
  4104. echo ' # set helo_data to where we want to connect to,' >> /etc/exim4/conf.d/transport/100_exim4-smtorp
  4105. echo ' # for the proxy program tor-smtp' >> /etc/exim4/conf.d/transport/100_exim4-smtorp
  4106. echo ' helo_data = "$address_data $original_domain"' >> /etc/exim4/conf.d/transport/100_exim4-smtorp
  4107. echo '' >> /etc/exim4/conf.d/transport/100_exim4-smtorp
  4108. echo ' # wherever we configured our script at' >> /etc/exim4/conf.d/transport/100_exim4-smtorp
  4109. echo ' port = 12668' >> /etc/exim4/conf.d/transport/100_exim4-smtorp
  4110. echo '' >> /etc/exim4/conf.d/transport/100_exim4-smtorp
  4111. echo ' # cannot use TLS otherwise it will EHLO again!!' >> /etc/exim4/conf.d/transport/100_exim4-smtorp
  4112. echo ' hosts_avoid_tls = *' >> /etc/exim4/conf.d/transport/100_exim4-smtorp
  4113. if [ ! -d $INSTALL_DIR ]; then
  4114. mkdir -p $INSTALL_DIR
  4115. fi
  4116. cd $INSTALL_DIR
  4117. git_clone $EXIM_ONION_REPO $INSTALL_DIR/exim4-smtorp
  4118. cd $INSTALL_DIR/exim4-smtorp/tor-smtp
  4119. make
  4120. if [ ! -f $INSTALL_DIR/exim4-smtorp/tor-smtp/tor-smtp ]; then
  4121. echo $'Unable to make tor smtp transport'
  4122. exit 52629
  4123. fi
  4124. if [ ! -d /usr/lib/exim4-smtorp ]; then
  4125. mkdir /usr/lib/exim4-smtorp
  4126. fi
  4127. cp $INSTALL_DIR/exim4-smtorp/tor-smtp/tor-smtp /usr/lib/exim4-smtorp/tor-smtp
  4128. if [ ! -f /usr/lib/exim4-smtorp/tor-smtp ]; then
  4129. echo $'Unable to copy tor-smtp'
  4130. exit 83503
  4131. fi
  4132. cp $INSTALL_DIR/exim4-smtorp/xinetd /etc/xinetd.d/tor-smtp
  4133. if [ ! -f /etc/xinetd.d/tor-smtp ]; then
  4134. echo $'Unable to copy to xinetd.d'
  4135. exit 835954
  4136. fi
  4137. systemctl restart xinetd
  4138. # configure for Maildir format
  4139. sed -i 's/MAIL_DIR/#MAIL_DIR/g' /etc/login.defs
  4140. sed -i 's|#MAIL_FILE.*|MAIL_FILE Maildir/|g' /etc/login.defs
  4141. if ! grep -q "export MAIL" /etc/profile; then
  4142. echo 'export MAIL=~/Maildir' >> /etc/profile
  4143. fi
  4144. sed -i 's|pam_mail.so standard|pam_mail.so dir=~/Maildir standard|g' /etc/pam.d/login
  4145. sed -i 's|pam_mail.so standard noenv|pam_mail.so dir=~/Maildir standard|g' /etc/pam.d/sshd
  4146. sed -i 's|pam_mail.so nopen|pam_mail.so dir=~/Maildir nopen|g' /etc/pam.d/su
  4147. echo 'dc_eximconfig_configtype="internet"' > /etc/exim4/update-exim4.conf.conf
  4148. if [[ $ONION_ONLY == "no" ]]; then
  4149. # both ICANN and onion domains
  4150. echo "dc_other_hostnames='${DEFAULT_DOMAIN_NAME};${EMAIL_ONION_HOSTNAME}'" >> /etc/exim4/update-exim4.conf.conf
  4151. else
  4152. echo "dc_other_hostnames='${EMAIL_ONION_HOSTNAME}'" >> /etc/exim4/update-exim4.conf.conf
  4153. fi
  4154. echo "dc_local_interfaces=''" >> /etc/exim4/update-exim4.conf.conf
  4155. echo "dc_readhost=''" >> /etc/exim4/update-exim4.conf.conf
  4156. echo "dc_relay_domains=''" >> /etc/exim4/update-exim4.conf.conf
  4157. echo "dc_minimaldns='false'" >> /etc/exim4/update-exim4.conf.conf
  4158. RELAY_NETS='192.168.1.0/24'
  4159. if [ $LOCAL_NETWORK_STATIC_IP_ADDRESS ]; then
  4160. RELAY_NETS=$(echo $LOCAL_NETWORK_STATIC_IP_ADDRESS | awk -F '.' '{print $1 "." $2 "." $3 ".0/24"}')
  4161. fi
  4162. echo "dc_relay_nets='$RELAY_NETS'" >> /etc/exim4/update-exim4.conf.conf
  4163. echo "dc_smarthost=''" >> /etc/exim4/update-exim4.conf.conf
  4164. echo "CFILEMODE='644'" >> /etc/exim4/update-exim4.conf.conf
  4165. echo "dc_use_split_config='false'" >> /etc/exim4/update-exim4.conf.conf
  4166. echo "dc_hide_mailname=''" >> /etc/exim4/update-exim4.conf.conf
  4167. echo "dc_mailname_in_oh='true'" >> /etc/exim4/update-exim4.conf.conf
  4168. echo "dc_localdelivery='maildir_home'" >> /etc/exim4/update-exim4.conf.conf
  4169. update-exim4.conf
  4170. sed -i "s/START=no/START=yes/g" /etc/default/saslauthd
  4171. systemctl start saslauthd
  4172. # make a tls certificate for email
  4173. if [ ! -f /etc/ssl/certs/exim.dhparam ]; then
  4174. ${PROJECT_NAME}-addcert -h exim --dhkey $DH_KEYLENGTH
  4175. check_certificates exim
  4176. fi
  4177. cp /etc/ssl/private/exim.key /etc/exim4
  4178. cp /etc/ssl/certs/exim.crt /etc/exim4
  4179. cp /etc/ssl/certs/exim.dhparam /etc/exim4
  4180. chown root:Debian-exim /etc/exim4/exim.key /etc/exim4/exim.crt /etc/exim4/exim.dhparam
  4181. chmod 640 /etc/exim4/exim.key /etc/exim4/exim.crt /etc/exim4/exim.dhparam
  4182. sed -i '/login_saslauthd_server/,/.endif/ s/# *//' /etc/exim4/exim4.conf.template
  4183. sed -i "/.ifdef MAIN_HARDCODE_PRIMARY_HOSTNAME/i\MAIN_HARDCODE_PRIMARY_HOSTNAME = $DEFAULT_DOMAIN_NAME\nMAIN_TLS_ENABLE = true" /etc/exim4/exim4.conf.template
  4184. sed -i "s|SMTPLISTENEROPTIONS=''|SMTPLISTENEROPTIONS='-oX 465:25:587 -oP /var/run/exim4/exim.pid'|g" /etc/default/exim4
  4185. if ! grep -q "tls_on_connect_ports=465" /etc/exim4/exim4.conf.template; then
  4186. sed -i '/SSL configuration for exim/i\tls_on_connect_ports=465' /etc/exim4/exim4.conf.template
  4187. fi
  4188. adduser $MY_USERNAME sasl
  4189. addgroup Debian-exim sasl
  4190. systemctl restart exim4
  4191. if [ ! -d /etc/skel/Maildir ]; then
  4192. mkdir -m 700 /etc/skel/.mutt
  4193. mkdir -m 700 /etc/skel/Maildir
  4194. mkdir -m 700 /etc/skel/Maildir/new
  4195. mkdir -m 700 /etc/skel/Maildir/cur
  4196. mkdir -m 700 /etc/skel/Maildir/Sent
  4197. mkdir -m 700 /etc/skel/Maildir/Sent/tmp
  4198. mkdir -m 700 /etc/skel/Maildir/Sent/cur
  4199. mkdir -m 700 /etc/skel/Maildir/Sent/new
  4200. mkdir -m 700 /etc/skel/Maildir/.learn-spam
  4201. mkdir -m 700 /etc/skel/Maildir/.learn-spam/cur
  4202. mkdir -m 700 /etc/skel/Maildir/.learn-spam/new
  4203. mkdir -m 700 /etc/skel/Maildir/.learn-spam/tmp
  4204. mkdir -m 700 /etc/skel/Maildir/.learn-ham
  4205. mkdir -m 700 /etc/skel/Maildir/.learn-ham/cur
  4206. mkdir -m 700 /etc/skel/Maildir/.learn-ham/new
  4207. mkdir -m 700 /etc/skel/Maildir/.learn-ham/tmp
  4208. ln -s /etc/skel/Maildir/.learn-spam /etc/skel/Maildir/spam
  4209. ln -s /etc/skel/Maildir/.learn-ham /etc/skel/Maildir/ham
  4210. fi
  4211. if [ ! -d /home/$MY_USERNAME/Maildir ]; then
  4212. mkdir -m 700 /home/$MY_USERNAME/.mutt
  4213. mkdir -m 700 /home/$MY_USERNAME/Maildir
  4214. mkdir -m 700 /home/$MY_USERNAME/Maildir/cur
  4215. mkdir -m 700 /home/$MY_USERNAME/Maildir/tmp
  4216. mkdir -m 700 /home/$MY_USERNAME/Maildir/new
  4217. mkdir -m 700 /home/$MY_USERNAME/Maildir/Sent
  4218. mkdir -m 700 /home/$MY_USERNAME/Maildir/Sent/cur
  4219. mkdir -m 700 /home/$MY_USERNAME/Maildir/Sent/tmp
  4220. mkdir -m 700 /home/$MY_USERNAME/Maildir/Sent/new
  4221. mkdir -m 700 /home/$MY_USERNAME/Maildir/.learn-spam
  4222. mkdir -m 700 /home/$MY_USERNAME/Maildir/.learn-spam/cur
  4223. mkdir -m 700 /home/$MY_USERNAME/Maildir/.learn-spam/new
  4224. mkdir -m 700 /home/$MY_USERNAME/Maildir/.learn-spam/tmp
  4225. mkdir -m 700 /home/$MY_USERNAME/Maildir/.learn-ham
  4226. mkdir -m 700 /home/$MY_USERNAME/Maildir/.learn-ham/cur
  4227. mkdir -m 700 /home/$MY_USERNAME/Maildir/.learn-ham/new
  4228. mkdir -m 700 /home/$MY_USERNAME/Maildir/.learn-ham/tmp
  4229. ln -s /home/$MY_USERNAME/Maildir/.learn-spam /home/$MY_USERNAME/Maildir/spam
  4230. ln -s /home/$MY_USERNAME/Maildir/.learn-ham /home/$MY_USERNAME/Maildir/ham
  4231. chown -R $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/Maildir
  4232. fi
  4233. echo 'configure_email' >> $COMPLETION_FILE
  4234. }
  4235. function create_procmail {
  4236. if [[ $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_NONMAILBOX" || $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  4237. return
  4238. fi
  4239. if grep -Fxq "create_procmail" $COMPLETION_FILE; then
  4240. return
  4241. fi
  4242. if [ ! -f /home/$MY_USERNAME/.procmailrc ]; then
  4243. echo 'MAILDIR=$HOME/Maildir' > /home/$MY_USERNAME/.procmailrc
  4244. echo 'DEFAULT=$MAILDIR/' >> /home/$MY_USERNAME/.procmailrc
  4245. echo 'LOGFILE=$HOME/log/procmail.log' >> /home/$MY_USERNAME/.procmailrc
  4246. echo 'LOGABSTRACT=all' >> /home/$MY_USERNAME/.procmailrc
  4247. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.procmailrc
  4248. fi
  4249. if [ ! -f /etc/skel/.procmailrc ]; then
  4250. cp /home/$MY_USERNAME/.procmailrc /etc/skel/.procmailrc
  4251. chown root:root /etc/skel/.procmailrc
  4252. fi
  4253. echo 'create_procmail' >> $COMPLETION_FILE
  4254. }
  4255. function spam_filtering {
  4256. if [[ $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_NONMAILBOX" || $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  4257. return
  4258. fi
  4259. if grep -Fxq "spam_filtering" $COMPLETION_FILE; then
  4260. return
  4261. fi
  4262. apt-get -y install exim4-daemon-heavy
  4263. apt-get -y install spamassassin
  4264. if [ ! -f /etc/default/spamassassin ]; then
  4265. echo 'Spamassassin was not installed'
  4266. exit 72570
  4267. fi
  4268. sa-update -v
  4269. sed -i 's/ENABLED=0/ENABLED=1/g' /etc/default/spamassassin
  4270. sed -i 's/# spamd_address = 127.0.0.1 783/spamd_address = 127.0.0.1 783/g' /etc/exim4/exim4.conf.template
  4271. # This configuration is based on https://wiki.debian.org/DebianSpamAssassin
  4272. sed -i 's/local_parts = postmaster/local_parts = postmaster:abuse/g' /etc/exim4/conf.d/acl/30_exim4-config_check_rcpt
  4273. sed -i '/domains = +local_domains : +relay_to_domains/a\ set acl_m0 = rfcnames' /etc/exim4/conf.d/acl/30_exim4-config_check_rcpt
  4274. sed -i 's/accept/accept condition = ${if eq{$acl_m0}{rfcnames} {1}{0}}/g' /etc/exim4/conf.d/acl/40_exim4-config_check_data
  4275. echo 'warn message = X-Spam-Score: $spam_score ($spam_bar)' >> /etc/exim4/conf.d/acl/40_exim4-config_check_data
  4276. echo ' spam = nobody:true' >> /etc/exim4/conf.d/acl/40_exim4-config_check_data
  4277. echo 'warn message = X-Spam-Flag: YES' >> /etc/exim4/conf.d/acl/40_exim4-config_check_data
  4278. echo ' spam = nobody' >> /etc/exim4/conf.d/acl/40_exim4-config_check_data
  4279. echo 'warn message = X-Spam-Report: $spam_report' >> /etc/exim4/conf.d/acl/40_exim4-config_check_data
  4280. echo ' spam = nobody' >> /etc/exim4/conf.d/acl/40_exim4-config_check_data
  4281. echo '# reject spam at high scores (> 12)' >> /etc/exim4/conf.d/acl/40_exim4-config_check_data
  4282. echo 'deny message = This message scored $spam_score spam points.' >> /etc/exim4/conf.d/acl/40_exim4-config_check_data
  4283. echo ' spam = nobody:true' >> /etc/exim4/conf.d/acl/40_exim4-config_check_data
  4284. echo ' condition = ${if >{$spam_score_int}{120}{1}{0}}' >> /etc/exim4/conf.d/acl/40_exim4-config_check_data
  4285. # procmail configuration
  4286. echo '# get spamassassin to check emails' >> /home/$MY_USERNAME/.procmailrc
  4287. echo ':0fw: .spamassassin.lock' >> /home/$MY_USERNAME/.procmailrc
  4288. echo ' * < 256000' >> /home/$MY_USERNAME/.procmailrc
  4289. echo '| spamc' >> /home/$MY_USERNAME/.procmailrc
  4290. echo '# strong spam are discarded' >> /home/$MY_USERNAME/.procmailrc
  4291. echo ':0' >> /home/$MY_USERNAME/.procmailrc
  4292. echo ' * ^X-Spam-Level: \*\*\*\*\*\*' >> /home/$MY_USERNAME/.procmailrc
  4293. echo '/dev/null' >> /home/$MY_USERNAME/.procmailrc
  4294. echo '# weak spam are kept just in case - clear this out every now and then' >> /home/$MY_USERNAME/.procmailrc
  4295. echo ':0' >> /home/$MY_USERNAME/.procmailrc
  4296. echo ' * ^X-Spam-Level: \*\*\*\*\*' >> /home/$MY_USERNAME/.procmailrc
  4297. echo 'maybe-spam/' >> /home/$MY_USERNAME/.procmailrc
  4298. echo '# otherwise, marginal spam goes here for revision' >> /home/$MY_USERNAME/.procmailrc
  4299. echo ':0' >> /home/$MY_USERNAME/.procmailrc
  4300. echo ' * ^X-Spam-Level: \*\*' >> /home/$MY_USERNAME/.procmailrc
  4301. echo 'spam/' >> /home/$MY_USERNAME/.procmailrc
  4302. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.procmailrc
  4303. echo '# get spamassassin to check emails' >> /etc/skel/.procmailrc
  4304. echo ':0fw: .spamassassin.lock' >> /etc/skel/.procmailrc
  4305. echo ' * < 256000' >> /etc/skel/.procmailrc
  4306. echo '| spamc' >> /etc/skel/.procmailrc
  4307. echo '# strong spam are discarded' >> /etc/skel/.procmailrc
  4308. echo ':0' >> /etc/skel/.procmailrc
  4309. echo ' * ^X-Spam-Level: \*\*\*\*\*\*' >> /etc/skel/.procmailrc
  4310. echo '/dev/null' >> /etc/skel/.procmailrc
  4311. echo '# weak spam are kept just in case - clear this out every now and then' >> /etc/skel/.procmailrc
  4312. echo ':0' >> /etc/skel/.procmailrc
  4313. echo ' * ^X-Spam-Level: \*\*\*\*\*' >> /etc/skel/.procmailrc
  4314. echo 'maybe-spam/' >> /etc/skel/.procmailrc
  4315. echo '# otherwise, marginal spam goes here for revision' >> /etc/skel/.procmailrc
  4316. echo ':0' >> /etc/skel/.procmailrc
  4317. echo ' * ^X-Spam-Level: \*\*' >> /etc/skel/.procmailrc
  4318. echo 'spam/' >> /etc/skel/.procmailrc
  4319. # filtering scripts
  4320. echo '#!/bin/bash' > /usr/bin/filterspam
  4321. echo 'for d in /home/*/ ; do' >> /usr/bin/filterspam
  4322. echo ' USERNAME=$(echo "$d" | awk -F '"'"'/'"'"' '"'"'{print $3}'"'"')' >> /usr/bin/filterspam
  4323. echo ' if [[ $USERNAME != "git" && $USERNAME != "trove" ]]; then' >> /usr/bin/filterspam
  4324. echo ' MAILDIR=/home/$USERNAME/Maildir/.learn-spam' >> /usr/bin/filterspam
  4325. echo ' if [ ! -d "$MAILDIR" ]; then' >> /usr/bin/filterspam
  4326. echo ' exit' >> /usr/bin/filterspam
  4327. echo ' fi' >> /usr/bin/filterspam
  4328. echo ' for f in `ls $MAILDIR/cur`' >> /usr/bin/filterspam
  4329. echo ' do' >> /usr/bin/filterspam
  4330. echo ' spamc -L spam < "$MAILDIR/cur/$f" > /dev/null' >> /usr/bin/filterspam
  4331. echo ' rm "$MAILDIR/cur/$f"' >> /usr/bin/filterspam
  4332. echo ' done' >> /usr/bin/filterspam
  4333. echo ' for f in `ls $MAILDIR/new`' >> /usr/bin/filterspam
  4334. echo ' do' >> /usr/bin/filterspam
  4335. echo ' spamc -L spam < "$MAILDIR/new/$f" > /dev/null' >> /usr/bin/filterspam
  4336. echo ' rm "$MAILDIR/new/$f"' >> /usr/bin/filterspam
  4337. echo ' done' >> /usr/bin/filterspam
  4338. echo ' fi' >> /usr/bin/filterspam
  4339. echo 'done' >> /usr/bin/filterspam
  4340. echo 'exit 0' >> /usr/bin/filterspam
  4341. echo '#!/bin/bash' > /usr/bin/filterham
  4342. echo 'for d in /home/*/ ; do' >> /usr/bin/filterham
  4343. echo ' USERNAME=$(echo "$d" | awk -F '"'"'/'"'"' '"'"'{print $3}'"'"')' >> /usr/bin/filterham
  4344. echo ' if [[ $USERNAME != "git" && $USERNAME != "trove" ]]; then' >> /usr/bin/filterham
  4345. echo ' MAILDIR=/home/$USERNAME/Maildir/.learn-ham' >> /usr/bin/filterham
  4346. echo ' if [ ! -d "$MAILDIR" ]; then' >> /usr/bin/filterham
  4347. echo ' exit' >> /usr/bin/filterham
  4348. echo ' fi' >> /usr/bin/filterham
  4349. echo ' for f in `ls $MAILDIR/cur`' >> /usr/bin/filterham
  4350. echo ' do' >> /usr/bin/filterham
  4351. echo ' spamc -L ham < "$MAILDIR/cur/$f" > /dev/null' >> /usr/bin/filterham
  4352. echo ' rm "$MAILDIR/cur/$f"' >> /usr/bin/filterham
  4353. echo ' done' >> /usr/bin/filterham
  4354. echo ' for f in `ls $MAILDIR/new`' >> /usr/bin/filterham
  4355. echo ' do' >> /usr/bin/filterham
  4356. echo ' spamc -L ham < "$MAILDIR/new/$f" > /dev/null' >> /usr/bin/filterham
  4357. echo ' rm "$MAILDIR/new/$f"' >> /usr/bin/filterham
  4358. echo ' done' >> /usr/bin/filterham
  4359. echo ' fi' >> /usr/bin/filterham
  4360. echo 'done' >> /usr/bin/filterham
  4361. echo 'exit 0' >> /usr/bin/filterham
  4362. if ! grep -q "filterspam" /etc/crontab; then
  4363. echo "*/3 * * * * root /usr/bin/timeout 120 /usr/bin/filterspam" >> /etc/crontab
  4364. fi
  4365. if ! grep -q "filterham" /etc/crontab; then
  4366. echo "*/3 * * * * root /usr/bin/timeout 120 /usr/bin/filterham" >> /etc/crontab
  4367. fi
  4368. chmod 655 /usr/bin/filterspam /usr/bin/filterham
  4369. sed -i 's/# use_bayes 1/use_bayes 1/g' /etc/mail/spamassassin/local.cf
  4370. sed -i 's/# bayes_auto_learn 1/bayes_auto_learn 1/g' /etc/mail/spamassassin/local.cf
  4371. # user preferences
  4372. if [ ! -d /home/$MY_USERNAME/.spamassassin ]; then
  4373. mkdir /home/$MY_USERNAME/.spamassassin
  4374. echo $'# How many points before a mail is considered spam.' > /home/$MY_USERNAME/.spamassassin/user_prefs
  4375. echo '# required_score 5' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  4376. echo '' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  4377. echo $'# Whitelist and blacklist addresses are now file-glob-style patterns, so' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  4378. echo $'# "friend@somewhere.com", "*@isp.com", or "*.domain.net" will all work.' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  4379. echo '# whitelist_from someone@somewhere.com' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  4380. echo '' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  4381. echo $'# Add your own customised scores for some tests below. The default scores are' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  4382. echo $'# read from the installed spamassassin rules files, but you can override them' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  4383. echo $'# here. To see the list of tests and their default scores, go to' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  4384. echo '# http://spamassassin.apache.org/tests.html .' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  4385. echo '#' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  4386. echo '# score SYMBOLIC_TEST_NAME n.nn' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  4387. echo '' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  4388. echo $'# Speakers of Asian languages, like Chinese, Japanese and Korean, will almost' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  4389. echo $'# definitely want to uncomment the following lines. They will switch off some' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  4390. echo $'# rules that detect 8-bit characters, which commonly trigger on mails using CJK' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  4391. echo $'# character sets, or that assume a western-style charset is in use. ' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  4392. echo '# ' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  4393. echo '# score HTML_COMMENT_8BITS 0' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  4394. echo '# score UPPERCASE_25_50 0' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  4395. echo '# score UPPERCASE_50_75 0' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  4396. echo '# score UPPERCASE_75_100 0' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  4397. echo '# score OBSCURED_EMAIL 0' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  4398. echo '' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  4399. echo $'# Speakers of any language that uses non-English, accented characters may wish' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  4400. echo $'# to uncomment the following lines. They turn off rules that fire on' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  4401. echo $'# misformatted messages generated by common mail apps in contravention of the' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  4402. echo $'# email RFCs.' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  4403. echo '' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  4404. echo '# score SUBJ_ILLEGAL_CHARS 0' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  4405. fi
  4406. # this must be accessible by root
  4407. chown -R $MY_USERNAME:root /home/$MY_USERNAME/.spamassassin
  4408. systemctl restart spamassassin
  4409. systemctl restart exim4
  4410. systemctl restart cron
  4411. echo 'spam_filtering' >> $COMPLETION_FILE
  4412. }
  4413. function configure_imap {
  4414. if [[ $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_NONMAILBOX" || $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  4415. return
  4416. fi
  4417. if grep -Fxq "configure_imap" $COMPLETION_FILE; then
  4418. return
  4419. fi
  4420. dpkg -P dovecot-imapd
  4421. dpkg -P dovecot-core
  4422. apt-get -y install dovecot-imapd
  4423. if [ ! -d /etc/dovecot ]; then
  4424. echo $"ERROR: Dovecot does not appear to have installed. $CHECK_MESSAGE"
  4425. exit 48
  4426. fi
  4427. if [ ! -f /etc/ssl/certs/dovecot.dhparam ]; then
  4428. ${PROJECT_NAME}-addcert -h dovecot --dhkey $DH_KEYLENGTH
  4429. check_certificates dovecot
  4430. fi
  4431. chown root:dovecot /etc/ssl/certs/dovecot.*
  4432. chown root:dovecot /etc/ssl/private/dovecot.*
  4433. if [ ! -f /etc/dovecot/conf.d/10-ssl.conf ]; then
  4434. echo $'Unable to find /etc/dovecot/conf.d/10-ssl.conf'
  4435. exit 83629
  4436. fi
  4437. sed -i 's|#ssl =.*|ssl = required|g' /etc/dovecot/conf.d/10-ssl.conf
  4438. sed -i 's|ssl = no|ssl = required|g' /etc/dovecot/conf.d/10-ssl.conf
  4439. sed -i 's|ssl = yes|ssl = required|g' /etc/dovecot/conf.d/10-ssl.conf
  4440. sed -i 's|#ssl_cert =.*|ssl_cert = </etc/ssl/certs/dovecot.crt|g' /etc/dovecot/conf.d/10-ssl.conf
  4441. sed -i 's|ssl_cert =.*|ssl_cert = </etc/ssl/certs/dovecot.crt|g' /etc/dovecot/conf.d/10-ssl.conf
  4442. sed -i 's|#ssl_key =.*|ssl_key = </etc/ssl/private/dovecot.key|g' /etc/dovecot/conf.d/10-ssl.conf
  4443. sed -i 's|ssl_key =.*|ssl_key = </etc/ssl/private/dovecot.key|g' /etc/dovecot/conf.d/10-ssl.conf
  4444. sed -i 's|#ssl_dh_parameters_length.*|ssl_dh_parameters_length = 2048|g' /etc/dovecot/conf.d/10-ssl.conf
  4445. sed -i 's/#ssl_prefer_server_ciphers.*/ssl_prefer_server_ciphers = yes/g' /etc/dovecot/conf.d/10-ssl.conf
  4446. sed -i "s|#ssl_protocols =.*|ssl_protocols = '$SSL_PROTOCOLS'|g" /etc/dovecot/conf.d/10-ssl.conf
  4447. sed -i "s|ssl_protocols =.*|ssl_protocols = '$SSL_PROTOCOLS'|g" /etc/dovecot/conf.d/10-ssl.conf
  4448. echo "ssl_cipher_list = '$SSL_CIPHERS'" >> /etc/dovecot/conf.d/10-ssl.conf
  4449. if [ ! -f /etc/dovecot/conf.d/10-master.conf ]; then
  4450. echo $'Unable to find /etc/dovecot/conf.d/10-master.conf'
  4451. exit 49259
  4452. fi
  4453. sed -i 's/#process_limit =.*/process_limit = 100/g' /etc/dovecot/conf.d/10-master.conf
  4454. sed -i 's/#default_client_limit.*/default_client_limit = 100/g' /etc/dovecot/conf.d/10-master.conf
  4455. sed -i 's|#default_process_limit =.*|default_process_limit = 100|g' /etc/dovecot/conf.d/10-master.conf
  4456. if [ ! -f /etc/dovecot/conf.d/10-logging.conf ]; then
  4457. echo $'Unable to find /etc/dovecot/conf.d/10-logging.conf'
  4458. exit 48936
  4459. fi
  4460. sed -i 's/#auth_verbose.*/auth_verbose = yes/g' /etc/dovecot/conf.d/10-logging.conf
  4461. if [ ! -f /etc/dovecot/dovecot.conf ]; then
  4462. echo $'Unable to find /etc/dovecot/dovecot.conf'
  4463. exit 43890
  4464. fi
  4465. sed -i 's/#listen =.*/listen = */g' /etc/dovecot/dovecot.conf
  4466. if [ ! -f /etc/dovecot/conf.d/10-auth.conf ]; then
  4467. echo $'Unable to find /etc/dovecot/conf.d/10-auth.conf'
  4468. exit 843256
  4469. fi
  4470. sed -i 's/#disable_plaintext_auth =.*/disable_plaintext_auth = no/g' /etc/dovecot/conf.d/10-auth.conf
  4471. sed -i 's/auth_mechanisms =.*/auth_mechanisms = plain login/g' /etc/dovecot/conf.d/10-auth.conf
  4472. if [ ! -f /etc/dovecot/conf.d/10-mail.conf ]; then
  4473. echo $'Unable to find /etc/dovecot/conf.d/10-mail.conf'
  4474. exit 42036
  4475. fi
  4476. sed -i 's|mail_location =.*|mail_location = maildir:~/Maildir:LAYOUT=fs|g' /etc/dovecot/conf.d/10-mail.conf
  4477. # This long notify interval makes the system more suited for use with
  4478. # battery powered mobile devices
  4479. sed -i 's|#imap_idle_notify_interval =.*|imap_idle_notify_interval = 29|g' /etc/dovecot/conf.d/20-imap.conf
  4480. if [ -f /var/lib/dovecot/ssl-parameters.dat ]; then
  4481. rm /var/lib/dovecot/ssl-parameters.dat
  4482. fi
  4483. systemctl restart dovecot
  4484. echo 'configure_imap' >> $COMPLETION_FILE
  4485. }
  4486. function configure_imap_client_certs {
  4487. if [[ $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_NONMAILBOX" || $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  4488. return
  4489. fi
  4490. if grep -Fxq "configure_imap_client_certs" $COMPLETION_FILE; then
  4491. return
  4492. fi
  4493. # http://strange.systems/certificate-based-auth-with-dovecot-sendmail/
  4494. sed -i 's|#default_process_limit =.*|default_process_limit = 100|g' /etc/dovecot/conf.d/10-master.conf
  4495. sed -i 's/disable_plaintext_auth =.*/disable_plaintext_auth = yes/g' /etc/dovecot/conf.d/10-auth.conf
  4496. sed -i 's|#auth_ssl_require_client_cert =.*|auth_ssl_require_client_cert = yes|g' /etc/dovecot/conf.d/10-auth.conf
  4497. sed -i 's|#auth_ssl_username_from_cert =.*|auth_ssl_username_from_cert = yes|g' /etc/dovecot/conf.d/10-auth.conf
  4498. sed -i "s|#ssl_ca =.*|ssl_ca = /etc/ssl/certs/ca-$DEFAULT_DOMAIN_NAME.crt|g" /etc/dovecot/conf.d/10-ssl.conf
  4499. sed -i 's|#ssl_cert_username_field =.*|ssl_cert_username_field = commonName|g' /etc/dovecot/conf.d/10-ssl.conf
  4500. sed -i 's|#ssl_verify_client_cert =.*|ssl_verify_client_cert = yes|g' /etc/dovecot/conf.d/10-ssl.conf
  4501. if ! grep -q "passdb {" /etc/dovecot/conf.d/10-auth.conf; then
  4502. echo '' >> /etc/dovecot/conf.d/10-auth.conf
  4503. echo 'passdb {' >> /etc/dovecot/conf.d/10-auth.conf
  4504. echo ' driver = passwd-file' >> /etc/dovecot/conf.d/10-auth.conf
  4505. echo ' args = /etc/dovecot/passwd-file' >> /etc/dovecot/conf.d/10-auth.conf
  4506. echo ' deny = no' >> /etc/dovecot/conf.d/10-auth.conf
  4507. echo ' master = no' >> /etc/dovecot/conf.d/10-auth.conf
  4508. echo ' pass = no' >> /etc/dovecot/conf.d/10-auth.conf
  4509. echo '}' >> /etc/dovecot/conf.d/10-auth.conf
  4510. fi
  4511. if [[ $ONION_ONLY == "no" ]]; then
  4512. # make a CA cert
  4513. if [ ! -f /etc/ssl/private/ca-$DEFAULT_DOMAIN_NAME.key ]; then
  4514. if [[ $LETSENCRYPT_ENABLED != "yes" ]]; then
  4515. ${PROJECT_NAME}-addcert -h $DEFAULT_DOMAIN_NAME --ca "" --dhkey $DH_KEYLENGTH
  4516. else
  4517. ${PROJECT_NAME}-addcert -e $DEFAULT_DOMAIN_NAME -s $LETSENCRYPT_SERVER --ca "" --dhkey $DH_KEYLENGTH --email $MY_EMAIL_ADDRESS
  4518. fi
  4519. fi
  4520. fi
  4521. # CA configuration
  4522. echo '[ ca ]' > /etc/ssl/dovecot-ca.cnf
  4523. echo "default_ca = dovecot-ca" >> /etc/ssl/dovecot-ca.cnf
  4524. echo '' >> /etc/ssl/dovecot-ca.cnf
  4525. echo '[ crl_ext ]' >> /etc/ssl/dovecot-ca.cnf
  4526. echo 'authorityKeyIdentifier=keyid:always' >> /etc/ssl/dovecot-ca.cnf
  4527. echo '' >> /etc/ssl/dovecot-ca.cnf
  4528. echo '[ dovecot-ca ]' >> /etc/ssl/dovecot-ca.cnf
  4529. echo 'new_certs_dir = .' >> /etc/ssl/dovecot-ca.cnf
  4530. echo 'unique_subject = no' >> /etc/ssl/dovecot-ca.cnf
  4531. echo "certificate = /etc/ssl/certs/ca-$DEFAULT_DOMAIN_NAME.crt" >> /etc/ssl/dovecot-ca.cnf
  4532. echo 'database = ssldb' >> /etc/ssl/dovecot-ca.cnf
  4533. echo "private_key = /etc/ssl/private/ca-$DEFAULT_DOMAIN_NAME.key" >> /etc/ssl/dovecot-ca.cnf
  4534. echo 'serial = sslserial' >> /etc/ssl/dovecot-ca.cnf
  4535. echo 'default_days = 3650' >> /etc/ssl/dovecot-ca.cnf
  4536. echo 'default_md = sha256' >> /etc/ssl/dovecot-ca.cnf
  4537. echo 'default_bits = 4096' >> /etc/ssl/dovecot-ca.cnf
  4538. echo 'policy = dovecot-ca_policy' >> /etc/ssl/dovecot-ca.cnf
  4539. echo 'x509_extensions = dovecot-ca_extensions' >> /etc/ssl/dovecot-ca.cnf
  4540. echo '' >> /etc/ssl/dovecot-ca.cnf
  4541. echo '[ dovecot-ca_policy ]' >> /etc/ssl/dovecot-ca.cnf
  4542. echo 'commonName = supplied' >> /etc/ssl/dovecot-ca.cnf
  4543. echo 'stateOrProvinceName = supplied' >> /etc/ssl/dovecot-ca.cnf
  4544. echo 'countryName = supplied' >> /etc/ssl/dovecot-ca.cnf
  4545. echo 'emailAddress = optional' >> /etc/ssl/dovecot-ca.cnf
  4546. echo 'organizationName = supplied' >> /etc/ssl/dovecot-ca.cnf
  4547. echo 'organizationalUnitName = optional' >> /etc/ssl/dovecot-ca.cnf
  4548. echo '' >> /etc/ssl/dovecot-ca.cnf
  4549. echo '[ dovecot-ca_extensions ]' >> /etc/ssl/dovecot-ca.cnf
  4550. echo 'basicConstraints = CA:false' >> /etc/ssl/dovecot-ca.cnf
  4551. echo 'subjectKeyIdentifier = hash' >> /etc/ssl/dovecot-ca.cnf
  4552. echo 'authorityKeyIdentifier = keyid:always' >> /etc/ssl/dovecot-ca.cnf
  4553. echo 'keyUsage = digitalSignature,keyEncipherment' >> /etc/ssl/dovecot-ca.cnf
  4554. echo 'extendedKeyUsage = clientAuth' >> /etc/ssl/dovecot-ca.cnf
  4555. if [ -f /etc/ssl/ssldb ]; then
  4556. rm /etc/ssl/ssldb
  4557. fi
  4558. if [ -f /etc/ssl/sslserial ]; then
  4559. rm /etc/ssl/sslserial
  4560. fi
  4561. touch /etc/ssl/ssldb
  4562. echo 0001 > /etc/ssl/sslserial
  4563. #${PROJECT_NAME}-clientcert -u $MY_USERNAME
  4564. systemctl restart dovecot
  4565. echo 'configure_imap_client_certs' >> $COMPLETION_FILE
  4566. }
  4567. function create_gpg_subkey {
  4568. if [[ $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_NONMAILBOX" || $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  4569. return
  4570. fi
  4571. if grep -Fxq "create_gpg_subkey" $COMPLETION_FILE; then
  4572. return
  4573. fi
  4574. apt-get -y install gnupg
  4575. GPG_KEY_USAGE=$1
  4576. if [[ $GPG_KEY_USAGE != "sign" && $GPG_KEY_USAGE != "auth" && $GPG_KEY_USAGE != "encrypt" ]]; then
  4577. echo $"Unknown subkey usage: $GPG_KEY_USAGE"
  4578. echo $'Available types: sign|auth|encrypt'
  4579. exit 14783
  4580. fi
  4581. KEYGRIP=$(gpg --fingerprint --fingerprint $MY_EMAIL_ADDRESS | grep fingerprint | tail -1 | cut -d= -f2 | sed -e 's/ //g')
  4582. # Generate a GPG subkey
  4583. # Here a 2048bit length is used to be compatible with yubikey
  4584. echo 'Key-Type: 1' > /home/$MY_USERNAME/gpg-genkey.conf
  4585. echo "Key-Grip: $KEYGRIP" > /home/$MY_USERNAME/gpg-genkey.conf
  4586. echo 'Subkey-Type: 1' >> /home/$MY_USERNAME/gpg-genkey.conf
  4587. echo 'Subkey-Length: 2048' >> /home/$MY_USERNAME/gpg-genkey.conf
  4588. echo "subkey-Usage: $GPG_KEY_USAGE" > /home/$MY_USERNAME/gpg-genkey.conf
  4589. echo "Name-Real: $MY_NAME" >> /home/$MY_USERNAME/gpg-genkey.conf
  4590. echo "Name-Email: $MY_EMAIL_ADDRESS" >> /home/$MY_USERNAME/gpg-genkey.conf
  4591. echo "Name-Comment: $GPG_KEY_USAGE" >> /home/$MY_USERNAME/gpg-genkey.conf
  4592. echo 'Expire-Date: 0' >> /home/$MY_USERNAME/gpg-genkey.conf
  4593. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/gpg-genkey.conf
  4594. su -c "gpg --batch --gen-key /home/$MY_USERNAME/gpg-genkey.conf" - $MY_USERNAME
  4595. shred -zu /home/$MY_USERNAME/gpg-genkey.conf
  4596. MY_GPG_SUBKEY_ID=$(su -c "gpg --list-keys $MY_EMAIL_ADDRESS | grep 'pub '" - $MY_USERNAME | awk -F ' ' '{print $2}' | awk -F '/' '{print $2}')
  4597. echo 'create_gpg_subkey' >> $COMPLETION_FILE
  4598. }
  4599. function gpg_key_exists {
  4600. key_owner_username=$1
  4601. key_search_text=$2
  4602. if [[ $key_owner_username != "root" ]]; then
  4603. KEY_EXISTS=$(su -c "gpg --list-keys \"${key_search_text}\"" - $key_owner_username)
  4604. else
  4605. KEY_EXISTS=$(gpg --list-keys "${key_search_text}")
  4606. fi
  4607. if [ ! "$KEY_EXISTS" ]; then
  4608. echo "no"
  4609. return
  4610. fi
  4611. if [ "$KEY_EXISTS" == *"error"* ]; then
  4612. echo "no"
  4613. return
  4614. fi
  4615. echo "yes"
  4616. }
  4617. function gpg_pubkey_from_email {
  4618. key_owner_username=$1
  4619. key_email_address=$2
  4620. key_id=
  4621. if [[ $key_owner_username != "root" ]]; then
  4622. key_id=$(su -c "gpg --list-keys $key_email_address | grep 'pub '" - $key_owner_username | awk -F ' ' '{print $2}' | awk -F '/' '{print $2}')
  4623. else
  4624. key_id=$(gpg --list-keys $key_email_address | grep 'pub ' | awk -F ' ' '{print $2}' | awk -F '/' '{print $2}')
  4625. fi
  4626. echo $key_id
  4627. }
  4628. function configure_gpg {
  4629. if [[ $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_NONMAILBOX" || $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  4630. return
  4631. fi
  4632. if grep -Fxq "configure_gpg" $COMPLETION_FILE; then
  4633. return
  4634. fi
  4635. apt-get -y install gnupg
  4636. gpg_dir=/home/$MY_USERNAME/.gnupg
  4637. # if gpg keys directory was previously imported from usb
  4638. if [[ $GPG_KEYS_IMPORTED == "yes" && -d $gpg_dir ]]; then
  4639. echo $'GPG keys were imported'
  4640. sed -i "s|keyserver hkp://keys.gnupg.net|keyserver $GPG_KEYSERVER|g" $gpg_dir/gpg.conf
  4641. MY_GPG_PUBLIC_KEY_ID=$(gpg_pubkey_from_email "$MY_USERNAME" "$MY_EMAIL_ADDRESS")
  4642. if [ ${#MY_GPG_PUBLIC_KEY_ID} -lt 4 ]; then
  4643. echo $'GPG public key ID could not be obtained'
  4644. fi
  4645. chown -R $MY_USERNAME:$MY_USERNAME $gpg_dir
  4646. chmod 700 $gpg_dir
  4647. chmod 600 $gpg_dir/*
  4648. echo 'configure_gpg' >> $COMPLETION_FILE
  4649. return
  4650. fi
  4651. if [ ! -d $gpg_dir ]; then
  4652. mkdir $gpg_dir
  4653. echo "keyserver $GPG_KEYSERVER" >> $gpg_dir/gpg.conf
  4654. echo 'keyserver-options auto-key-retrieve' >> $gpg_dir/gpg.conf
  4655. fi
  4656. sed -i "s|keyserver hkp://keys.gnupg.net|keyserver $GPG_KEYSERVER|g" $gpg_dir/gpg.conf
  4657. if ! grep -q "# default preferences" $gpg_dir/gpg.conf; then
  4658. echo '' >> $gpg_dir/gpg.conf
  4659. echo '# default preferences' >> $gpg_dir/gpg.conf
  4660. echo 'personal-digest-preferences SHA256' >> $gpg_dir/gpg.conf
  4661. echo 'cert-digest-algo SHA256' >> $gpg_dir/gpg.conf
  4662. echo 'default-preference-list SHA512 SHA384 SHA256 SHA224 AES256 AES192 AES CAST5 ZLIB BZIP2 ZIP Uncompressed' >> $gpg_dir/gpg.conf
  4663. fi
  4664. chown -R $MY_USERNAME:$MY_USERNAME $gpg_dir
  4665. chmod 700 $gpg_dir
  4666. chmod 600 $gpg_dir/*
  4667. if [[ $MY_GPG_PUBLIC_KEY && $MY_GPG_PRIVATE_KEY ]]; then
  4668. echo $'Importing GPG keys from file'
  4669. echo $"Public key: $MY_GPG_PUBLIC_KEY"
  4670. echo $"Private key: $MY_GPG_PRIVATE_KEY"
  4671. # use your existing GPG keys which were exported
  4672. if [ ! -f $MY_GPG_PUBLIC_KEY ]; then
  4673. echo $"GPG public key file $MY_GPG_PUBLIC_KEY was not found"
  4674. exit 2483
  4675. fi
  4676. if [ ! -f $MY_GPG_PRIVATE_KEY ]; then
  4677. echo $"GPG private key file $MY_GPG_PRIVATE_KEY was not found"
  4678. exit 5383
  4679. fi
  4680. su -c "gpg --import $MY_GPG_PUBLIC_KEY" - $MY_USERNAME
  4681. su -c "gpg --allow-secret-key-import --import $MY_GPG_PRIVATE_KEY" - $MY_USERNAME
  4682. KEY_EXISTS=$(gpg_key_exists "$MY_USERNAME" "$MY_EMAIL_ADDRESS")
  4683. if [[ $KEY_EXISTS == "no" ]]; then
  4684. echo $"The GPG key for $MY_EMAIL_ADDRESS could not be imported"
  4685. exit 13821
  4686. fi
  4687. # for security ensure that the private key file doesn't linger around
  4688. shred -zu $MY_GPG_PRIVATE_KEY
  4689. MY_GPG_PUBLIC_KEY_ID=$(gpg_pubkey_from_email "$MY_USERNAME" "$MY_EMAIL_ADDRESS")
  4690. if [ ${#MY_GPG_PUBLIC_KEY_ID} -lt 4 ]; then
  4691. echo $'GPG public key ID could not be obtained'
  4692. fi
  4693. else
  4694. # Generate a GPG key
  4695. echo 'Key-Type: 1' > /home/$MY_USERNAME/gpg-genkey.conf
  4696. echo 'Key-Length: 4096' >> /home/$MY_USERNAME/gpg-genkey.conf
  4697. echo 'Subkey-Type: 1' >> /home/$MY_USERNAME/gpg-genkey.conf
  4698. echo 'Subkey-Length: 4096' >> /home/$MY_USERNAME/gpg-genkey.conf
  4699. echo "Name-Real: $MY_NAME" >> /home/$MY_USERNAME/gpg-genkey.conf
  4700. echo "Name-Email: $MY_EMAIL_ADDRESS" >> /home/$MY_USERNAME/gpg-genkey.conf
  4701. echo 'Expire-Date: 0' >> /home/$MY_USERNAME/gpg-genkey.conf
  4702. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/gpg-genkey.conf
  4703. echo $'Generating a new GPG key'
  4704. su -c "gpg --batch --gen-key /home/$MY_USERNAME/gpg-genkey.conf" - $MY_USERNAME
  4705. KEY_EXISTS=$(gpg_key_exists "$MY_USERNAME" "$MY_EMAIL_ADDRESS")
  4706. if [[ $KEY_EXISTS == "no" ]]; then
  4707. echo $"A GPG key for $MY_EMAIL_ADDRESS could not be created"
  4708. exit 6362
  4709. fi
  4710. shred -zu /home/$MY_USERNAME/gpg-genkey.conf
  4711. MY_GPG_PUBLIC_KEY_ID=$(gpg_pubkey_from_email "$MY_USERNAME" "$MY_EMAIL_ADDRESS")
  4712. if [ ${#MY_GPG_PUBLIC_KEY_ID} -lt 4 ]; then
  4713. echo $'GPG public key ID could not be obtained'
  4714. fi
  4715. MY_GPG_PUBLIC_KEY=/tmp/public_key.gpg
  4716. su -c "gpg --output $MY_GPG_PUBLIC_KEY --armor --export $MY_GPG_PUBLIC_KEY_ID" - $MY_USERNAME
  4717. if grep -q "configure_email" $COMPLETION_FILE; then
  4718. if ! grep -q $"Change your GPG password" /home/$MY_USERNAME/README; then
  4719. echo '' >> /home/$MY_USERNAME/README
  4720. echo '' >> /home/$MY_USERNAME/README
  4721. echo $'Change your GPG password' >> /home/$MY_USERNAME/README
  4722. echo '========================' >> /home/$MY_USERNAME/README
  4723. echo $"It's very important to add a password to your GPG key so that" >> /home/$MY_USERNAME/README
  4724. echo $"if anyone does get access to your email they still won't be able" >> /home/$MY_USERNAME/README
  4725. echo $'to read them without knowning the GPG password.' >> /home/$MY_USERNAME/README
  4726. echo $'You can change the it with:' >> /home/$MY_USERNAME/README
  4727. echo '' >> /home/$MY_USERNAME/README
  4728. echo " gpg --edit-key $MY_GPG_PUBLIC_KEY_ID" >> /home/$MY_USERNAME/README
  4729. echo ' passwd' >> /home/$MY_USERNAME/README
  4730. echo ' save' >> /home/$MY_USERNAME/README
  4731. echo ' quit' >> /home/$MY_USERNAME/README
  4732. fi
  4733. if ! grep -q $"Publish your GPG public key" /home/$MY_USERNAME/README; then
  4734. echo '' >> /home/$MY_USERNAME/README
  4735. echo '' >> /home/$MY_USERNAME/README
  4736. echo $'Publish your GPG public key' >> /home/$MY_USERNAME/README
  4737. echo '===========================' >> /home/$MY_USERNAME/README
  4738. echo $'So that others can send emails to you securely you should' >> /home/$MY_USERNAME/README
  4739. echo $'publish your GPG public key with the command:' >> /home/$MY_USERNAME/README
  4740. echo '' >> /home/$MY_USERNAME/README
  4741. echo " gpg --send-keys $MY_GPG_PUBLIC_KEY_ID" >> /home/$MY_USERNAME/README
  4742. fi
  4743. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
  4744. chmod 600 /home/$MY_USERNAME/README
  4745. fi
  4746. fi
  4747. echo 'configure_gpg' >> $COMPLETION_FILE
  4748. }
  4749. function configure_backup_key {
  4750. if grep -Fxq "configure_backup_key" $COMPLETION_FILE; then
  4751. return
  4752. fi
  4753. apt-get -y install gnupg
  4754. BACKUP_KEY_EXISTS=$(gpg_key_exists "root" "$MY_NAME (backup key)")
  4755. if [[ $BACKUP_KEY_EXISTS == "yes" ]]; then
  4756. return
  4757. fi
  4758. # Generate a GPG key for backups
  4759. BACKUP_KEY_EXISTS=$(gpg_key_exists "$MY_USERNAME" "$MY_NAME (backup key)")
  4760. if [[ $BACKUP_KEY_EXISTS == "no" ]]; then
  4761. echo 'Key-Type: 1' > /home/$MY_USERNAME/gpg-genkey.conf
  4762. echo 'Key-Length: 4096' >> /home/$MY_USERNAME/gpg-genkey.conf
  4763. echo 'Subkey-Type: 1' >> /home/$MY_USERNAME/gpg-genkey.conf
  4764. echo 'Subkey-Length: 4096' >> /home/$MY_USERNAME/gpg-genkey.conf
  4765. echo "Name-Real: $MY_NAME" >> /home/$MY_USERNAME/gpg-genkey.conf
  4766. echo "Name-Email: $MY_EMAIL_ADDRESS" >> /home/$MY_USERNAME/gpg-genkey.conf
  4767. echo "Name-Comment: backup key" >> /home/$MY_USERNAME/gpg-genkey.conf
  4768. echo 'Expire-Date: 0' >> /home/$MY_USERNAME/gpg-genkey.conf
  4769. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/gpg-genkey.conf
  4770. echo $'Backup key does not exist. Creating it.'
  4771. su -c "gpg --batch --gen-key /home/$MY_USERNAME/gpg-genkey.conf" - $MY_USERNAME
  4772. shred -zu /home/$MY_USERNAME/gpg-genkey.conf
  4773. echo $'Checking that the Backup key was created'
  4774. BACKUP_KEY_EXISTS=$(gpg_key_exists "$MY_USERNAME" "$MY_NAME (backup key)")
  4775. if [[ $BACKUP_KEY_EXISTS == "no" ]]; then
  4776. echo $'Backup key could not be created'
  4777. exit 43382
  4778. fi
  4779. fi
  4780. 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}')
  4781. echo "Backup key: $MY_BACKUP_KEY_ID"
  4782. MY_BACKUP_KEY=/home/$MY_USERNAME/backup_key
  4783. su -c "gpg --output ${MY_BACKUP_KEY}_public.asc --armor --export $MY_BACKUP_KEY_ID" - $MY_USERNAME
  4784. su -c "gpg --output ${MY_BACKUP_KEY}_private.asc --armor --export-secret-key $MY_BACKUP_KEY_ID" - $MY_USERNAME
  4785. if [ ! -f ${MY_BACKUP_KEY}_public.asc ]; then
  4786. echo 'Public backup key could not be exported'
  4787. exit 36829
  4788. fi
  4789. if [ ! -f ${MY_BACKUP_KEY}_private.asc ]; then
  4790. echo 'Private backup key could not be exported'
  4791. exit 29235
  4792. fi
  4793. # import backup key to root user
  4794. gpg --import --import ${MY_BACKUP_KEY}_public.asc
  4795. gpg --allow-secret-key-import --import ${MY_BACKUP_KEY}_private.asc
  4796. shred -zu ${MY_BACKUP_KEY}_public.asc
  4797. shred -zu ${MY_BACKUP_KEY}_private.asc
  4798. echo 'configure_backup_key' >> $COMPLETION_FILE
  4799. }
  4800. function encrypt_incoming_email {
  4801. # encrypts incoming mail using your GPG public key
  4802. # so even if an attacker gains access to the data at rest they still need
  4803. # to know your GPG key password to be able to read anything
  4804. if [[ $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_NONMAILBOX" || $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  4805. return
  4806. fi
  4807. # update to the next commit
  4808. if [ -f /usr/bin/gpgit.pl ]; then
  4809. if grep -q "gpgit commit" $COMPLETION_FILE; then
  4810. CURRENT_GPGIT_COMMIT=$(grep "gpgit commit" $COMPLETION_FILE | awk -F ':' '{print $2}')
  4811. if [[ "$CURRENT_GPGIT_COMMIT" != "$GPGIT_COMMIT" ]]; then
  4812. cd $INSTALL_DIR/gpgit
  4813. git_pull $GPGIT_REPO $GPGIT_COMMIT
  4814. sed -i "s/gpgit commit.*/gpgit commit:$GPGIT_COMMIT/g" $COMPLETION_FILE
  4815. cp gpgit.pl /usr/bin/gpgit.pl
  4816. fi
  4817. else
  4818. echo "gpgit commit:$GPGIT_COMMIT" >> $COMPLETION_FILE
  4819. fi
  4820. fi
  4821. if grep -Fxq "encrypt_incoming_email" $COMPLETION_FILE; then
  4822. return
  4823. fi
  4824. if [[ $GPG_ENCRYPT_STORED_EMAIL != "yes" ]]; then
  4825. return
  4826. fi
  4827. if [ ! -f /usr/bin/gpgit.pl ]; then
  4828. apt-get -y install git libmail-gnupg-perl
  4829. cd $INSTALL_DIR
  4830. git_clone $GPGIT_REPO $INSTALL_DIR/gpgit
  4831. cd $INSTALL_DIR/gpgit
  4832. git checkout $GPGIT_COMMIT -b $GPGIT_COMMIT
  4833. if ! grep -q "gpgit commit" $COMPLETION_FILE; then
  4834. echo "gpgit commit:$GPGIT_COMMIT" >> $COMPLETION_FILE
  4835. else
  4836. sed -i "s/gpgit commit.*/gpgit commit:$GPGIT_COMMIT/g" $COMPLETION_FILE
  4837. fi
  4838. cp gpgit.pl /usr/bin
  4839. fi
  4840. # add a procmail rule
  4841. if ! grep -q "/usr/bin/gpgit.pl" /home/$MY_USERNAME/.procmailrc; then
  4842. echo '' >> /home/$MY_USERNAME/.procmailrc
  4843. echo ':0 f' >> /home/$MY_USERNAME/.procmailrc
  4844. echo "| /usr/bin/gpgit.pl --encrypt-mode prefer-inline --inline-flatten $MY_EMAIL_ADDRESS" >> /home/$MY_USERNAME/.procmailrc
  4845. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.procmailrc
  4846. echo '' >> /etc/skel/.procmailrc
  4847. echo ':0 f' >> /etc/skel/.procmailrc
  4848. echo -n '| /usr/bin/gpgit.pl --encrypt-mode prefer-inline --inline-flatten $USER@' >> /etc/skel/.procmailrc
  4849. echo "$DEFAULT_DOMAIN_NAME" >> /etc/skel/.procmailrc
  4850. fi
  4851. echo 'encrypt_incoming_email' >> $COMPLETION_FILE
  4852. }
  4853. function encrypt_outgoing_email {
  4854. # encrypts outgoing mail using your GPG public key
  4855. # so even if an attacker gains access to the data at rest they still need
  4856. # to know your GPG key password to be able to read sent mail
  4857. if [[ $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_NONMAILBOX" || $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  4858. return
  4859. fi
  4860. if grep -Fxq "encrypt_outgoing_email" $COMPLETION_FILE; then
  4861. return
  4862. fi
  4863. if [[ $GPG_ENCRYPT_STORED_EMAIL != "yes" ]]; then
  4864. return
  4865. fi
  4866. if [ ! -d /home/$MY_USERNAME/.gnupg ]; then
  4867. return
  4868. fi
  4869. if [ ! -f /home/$MY_USERNAME/.muttrc ]; then
  4870. return
  4871. fi
  4872. # obtain your public key ID
  4873. if [ ! $MY_GPG_PUBLIC_KEY_ID ]; then
  4874. MY_GPG_PUBLIC_KEY_ID=$(gpg_pubkey_from_email "$MY_USERNAME" "$MY_EMAIL_ADDRESS")
  4875. if [ ! "$MY_GPG_PUBLIC_KEY_ID" ]; then
  4876. return
  4877. fi
  4878. if [ ${#MY_GPG_PUBLIC_KEY_ID} -lt 4 ]; then
  4879. return
  4880. fi
  4881. fi
  4882. if ! grep -q "pgp_encrypt_only_command" /home/$MY_USERNAME/.muttrc; then
  4883. echo '' >> /home/$MY_USERNAME/.muttrc
  4884. echo $'# Encrypt items in the Sent folder' >> /home/$MY_USERNAME/.muttrc
  4885. 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
  4886. else
  4887. 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
  4888. fi
  4889. if ! grep -q "pgp_encrypt_sign_command" /home/$MY_USERNAME/.muttrc; then
  4890. 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
  4891. else
  4892. 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
  4893. fi
  4894. echo 'encrypt_outgoing_email' >> $COMPLETION_FILE
  4895. }
  4896. function encrypt_all_email {
  4897. if [[ $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_NONMAILBOX" || $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  4898. return
  4899. fi
  4900. if [[ $GPG_ENCRYPT_STORED_EMAIL != "yes" ]]; then
  4901. return
  4902. fi
  4903. if [ -f /usr/local/bin/${PROJECT_NAME}-encrypt-mail ]; then
  4904. cp /usr/local/bin/${PROJECT_NAME}-encrypt-mail /usr/bin/encmaildir
  4905. else
  4906. cp /usr/bin/${PROJECT_NAME}-encrypt-mail /usr/bin/encmaildir
  4907. fi
  4908. chmod +x /usr/bin/encmaildir
  4909. if grep -Fxq "encrypt_all_email" $COMPLETION_FILE; then
  4910. return
  4911. fi
  4912. if [ ! /home/$MY_USERNAME/README ]; then
  4913. touch /home/$MY_USERNAME/README
  4914. fi
  4915. if ! grep -q $"If you have imported legacy email which is not encrypted" /home/$MY_USERNAME/README; then
  4916. echo '' >> /home/$MY_USERNAME/README
  4917. echo '' >> /home/$MY_USERNAME/README
  4918. echo $'Encrypting legacy email' >> /home/$MY_USERNAME/README
  4919. echo '=======================' >> /home/$MY_USERNAME/README
  4920. echo $'If you have imported legacy email which is not encrypted' >> /home/$MY_USERNAME/README
  4921. echo $'then it can be encrypted with the command:' >> /home/$MY_USERNAME/README
  4922. echo '' >> /home/$MY_USERNAME/README
  4923. echo ' encmaildir' >> /home/$MY_USERNAME/README
  4924. echo '' >> /home/$MY_USERNAME/README
  4925. echo $'But be warned that depending upon how much email you have' >> /home/$MY_USERNAME/README
  4926. echo $'this could take a seriously LONG time on the Beaglebone' >> /home/$MY_USERNAME/README
  4927. echo $'and may be better done on a faster machine.' >> /home/$MY_USERNAME/README
  4928. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
  4929. chmod 600 /home/$MY_USERNAME/README
  4930. fi
  4931. echo 'encrypt_all_email' >> $COMPLETION_FILE
  4932. }
  4933. function email_client {
  4934. if [[ $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_NONMAILBOX" || $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  4935. return
  4936. fi
  4937. if grep -Fxq "email_client" $COMPLETION_FILE; then
  4938. return
  4939. fi
  4940. apt-get -y install mutt-patched lynx abook
  4941. if [ ! -f /etc/Muttrc ]; then
  4942. echo $"ERROR: Mutt does not appear to have installed. $CHECK_MESSAGE"
  4943. exit 49
  4944. fi
  4945. if [ ! -d /home/$MY_USERNAME/.mutt ]; then
  4946. mkdir /home/$MY_USERNAME/.mutt
  4947. fi
  4948. echo "text/html; lynx -dump -width=78 -nolist %s | sed ‘s/^ //’; copiousoutput; needsterminal; nametemplate=%s.html" > /home/$MY_USERNAME/.mutt/mailcap
  4949. cp /home/$MY_USERNAME/.mutt/mailcap /etc/skel/.mutt
  4950. chown -R $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.mutt
  4951. chown -R root:root /etc/skel/.mutt
  4952. echo 'set mbox_type=Maildir' >> /etc/Muttrc
  4953. echo 'set folder="~/Maildir"' >> /etc/Muttrc
  4954. echo 'set mask="!^\\.[^.]"' >> /etc/Muttrc
  4955. echo 'set mbox="~/Maildir"' >> /etc/Muttrc
  4956. echo 'set record="+Sent"' >> /etc/Muttrc
  4957. echo 'set postponed="+Drafts"' >> /etc/Muttrc
  4958. echo 'set trash="+Trash"' >> /etc/Muttrc
  4959. echo 'set spoolfile="~/Maildir"' >> /etc/Muttrc
  4960. echo 'auto_view text/x-vcard text/html text/enriched' >> /etc/Muttrc
  4961. echo 'set editor="emacs -q --load ~/.emacs-mutt"' >> /etc/Muttrc
  4962. echo 'set header_cache="+.cache"' >> /etc/Muttrc
  4963. echo '' >> /etc/Muttrc
  4964. echo 'macro index S "<tag-prefix><decode-save>=.learn-spam<enter>" "move to learn-spam"' >> /etc/Muttrc
  4965. echo 'macro pager S "<decode-save>=.learn-spam<enter>" "move to learn-spam"' >> /etc/Muttrc
  4966. echo 'macro index H "<tag-prefix><decode-copy>=.learn-ham<enter>" "copy to learn-ham"' >> /etc/Muttrc
  4967. echo 'macro pager H "<decode-copy>=.learn-ham<enter>" "copy to learn-ham"' >> /etc/Muttrc
  4968. echo '' >> /etc/Muttrc
  4969. echo '# set up the sidebar' >> /etc/Muttrc
  4970. echo 'set sidebar_width=22' >> /etc/Muttrc
  4971. echo 'set sidebar_visible=yes' >> /etc/Muttrc
  4972. echo "set sidebar_delim='|'" >> /etc/Muttrc
  4973. echo 'set sidebar_sort=yes' >> /etc/Muttrc
  4974. echo '' >> /etc/Muttrc
  4975. echo 'set rfc2047_parameters' >> /etc/Muttrc
  4976. echo '' >> /etc/Muttrc
  4977. echo '# Show inbox and sent items' >> /etc/Muttrc
  4978. echo 'mailboxes = =Sent =maybe-spam =spam' >> /etc/Muttrc
  4979. echo '' >> /etc/Muttrc
  4980. echo '# Alter these colours as needed for maximum bling' >> /etc/Muttrc
  4981. echo 'color sidebar_new yellow default' >> /etc/Muttrc
  4982. echo 'color normal white default' >> /etc/Muttrc
  4983. echo 'color hdrdefault brightcyan default' >> /etc/Muttrc
  4984. echo 'color signature green default' >> /etc/Muttrc
  4985. echo 'color attachment brightyellow default' >> /etc/Muttrc
  4986. echo 'color quoted green default' >> /etc/Muttrc
  4987. echo 'color quoted1 white default' >> /etc/Muttrc
  4988. echo 'color tilde blue default' >> /etc/Muttrc
  4989. echo '' >> /etc/Muttrc
  4990. echo '# ctrl-n, ctrl-p to select next, prev folder' >> /etc/Muttrc
  4991. echo '# ctrl-o to open selected folder' >> /etc/Muttrc
  4992. echo 'bind index \Cp sidebar-prev' >> /etc/Muttrc
  4993. echo 'bind index \Cn sidebar-next' >> /etc/Muttrc
  4994. echo 'bind index \Co sidebar-open' >> /etc/Muttrc
  4995. echo 'bind pager \Cp sidebar-prev' >> /etc/Muttrc
  4996. echo 'bind pager \Cn sidebar-next' >> /etc/Muttrc
  4997. echo 'bind pager \Co sidebar-open' >> /etc/Muttrc
  4998. echo '' >> /etc/Muttrc
  4999. echo '# ctrl-b toggles sidebar visibility' >> /etc/Muttrc
  5000. echo "macro index,pager \Cb '<enter-command>toggle sidebar_visible<enter><redraw-screen>' 'toggle sidebar'" >> /etc/Muttrc
  5001. echo '' >> /etc/Muttrc
  5002. echo '# esc-m Mark new messages as read' >> /etc/Muttrc
  5003. echo 'macro index <esc>m "T~N<enter>;WNT~O<enter>;WO\CT~T<enter>" "mark all messages read"' >> /etc/Muttrc
  5004. echo '' >> /etc/Muttrc
  5005. echo '# Collapsing threads' >> /etc/Muttrc
  5006. echo 'macro index [ "<collapse-thread>" "collapse/uncollapse thread"' >> /etc/Muttrc
  5007. echo 'macro index ] "<collapse-all>" "collapse/uncollapse all threads"' >> /etc/Muttrc
  5008. echo '' >> /etc/Muttrc
  5009. echo '# threads containing new messages' >> /etc/Muttrc
  5010. echo 'uncolor index "~(~N)"' >> /etc/Muttrc
  5011. echo 'color index brightblue default "~(~N)"' >> /etc/Muttrc
  5012. echo '' >> /etc/Muttrc
  5013. echo '# new messages themselves' >> /etc/Muttrc
  5014. echo 'uncolor index "~N"' >> /etc/Muttrc
  5015. echo 'color index brightyellow default "~N"' >> /etc/Muttrc
  5016. echo '' >> /etc/Muttrc
  5017. echo '# GPG/PGP integration' >> /etc/Muttrc
  5018. echo '# this set the number of seconds to keep in memory the passphrase used to encrypt/sign' >> /etc/Muttrc
  5019. echo 'set pgp_timeout=1800' >> /etc/Muttrc
  5020. echo '' >> /etc/Muttrc
  5021. echo '# automatically sign and encrypt with PGP/MIME' >> /etc/Muttrc
  5022. echo 'set pgp_autosign # autosign all outgoing mails' >> /etc/Muttrc
  5023. echo 'set pgp_autoencrypt # Try to encrypt automatically' >> /etc/Muttrc
  5024. echo 'set pgp_replyencrypt # autocrypt replies to crypted' >> /etc/Muttrc
  5025. echo 'set pgp_replysign # autosign replies to signed' >> /etc/Muttrc
  5026. echo 'set pgp_auto_decode=yes # decode attachments' >> /etc/Muttrc
  5027. echo 'set fcc_clear=no # Keep encrypted copy of sent encrypted mail' >> /etc/Muttrc
  5028. echo 'unset smime_is_default' >> /etc/Muttrc
  5029. echo '' >> /etc/Muttrc
  5030. echo 'set alias_file=~/.mutt-alias' >> /etc/Muttrc
  5031. echo 'source ~/.mutt-alias' >> /etc/Muttrc
  5032. echo 'set query_command= "abook --mutt-query \"%s\""' >> /etc/Muttrc
  5033. echo 'macro index,pager A "<pipe-message>abook --add-email-quiet<return>" "add the sender address to abook"' >> /etc/Muttrc
  5034. # create an Emacs configuration specifically for use with Mutt, which
  5035. # has word wrap and spell checking on by default
  5036. echo "(add-hook 'before-save-hook 'delete-trailing-whitespace)" > /home/$MY_USERNAME/.emacs-mutt
  5037. echo '(setq org-support-shift-select t)' >> /home/$MY_USERNAME/.emacs-mutt
  5038. echo '(setq standard-indent 4)' >> /home/$MY_USERNAME/.emacs-mutt
  5039. echo '(setq-default tab-width 4)' >> /home/$MY_USERNAME/.emacs-mutt
  5040. echo '(setq c-basic-offset 4)' >> /home/$MY_USERNAME/.emacs-mutt
  5041. echo '(mouse-wheel-mode t)' >> /home/$MY_USERNAME/.emacs-mutt
  5042. echo '(setq make-backup-files t)' >> /home/$MY_USERNAME/.emacs-mutt
  5043. echo '(setq version-control t)' >> /home/$MY_USERNAME/.emacs-mutt
  5044. echo '(setq backup-directory-alist (quote ((".*" . "~/.emacs_backups/"))))' >> /home/$MY_USERNAME/.emacs-mutt
  5045. echo "(setq default-major-mode 'text-mode)" >> /home/$MY_USERNAME/.emacs-mutt
  5046. echo "(dolist (hook '(text-mode-hook))" >> /home/$MY_USERNAME/.emacs-mutt
  5047. echo ' (add-hook hook (lambda () (flyspell-mode 1))))' >> /home/$MY_USERNAME/.emacs-mutt
  5048. echo '(setq-default fill-column 72)' >> /home/$MY_USERNAME/.emacs-mutt
  5049. echo '(setq auto-fill-mode 0)' >> /home/$MY_USERNAME/.emacs-mutt
  5050. echo "(add-hook 'text-mode-hook 'turn-on-auto-fill)" >> /home/$MY_USERNAME/.emacs-mutt
  5051. echo "(setq-default auto-fill-function 'do-auto-fill)" >> /home/$MY_USERNAME/.emacs-mutt
  5052. # add the emacs mutt configuration to the user profile skeleton
  5053. if [ ! -f /etc/skel/.emacs-mutt ]; then
  5054. cp /home/$MY_USERNAME/.emacs-mutt /etc/skel/.emacs-mutt
  5055. chown root:root /etc/skel/.emacs-mutt
  5056. fi
  5057. cp -f /etc/Muttrc /home/$MY_USERNAME/.muttrc
  5058. cp -f /etc/Muttrc /etc/skel/.muttrc
  5059. touch /home/$MY_USERNAME/.mutt-alias
  5060. cp /home/$MY_USERNAME/.mutt-alias /etc/skel/.mutt-alias
  5061. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.emacs-mutt
  5062. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.muttrc
  5063. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.mutt-alias
  5064. # default user on generic images
  5065. if [ -d /home/${GENERIC_IMAGE_USERNAME} ]; then
  5066. cp -f /etc/Muttrc /home/${GENERIC_IMAGE_USERNAME}/.muttrc
  5067. chown ${GENERIC_IMAGE_USERNAME}:${GENERIC_IMAGE_USERNAME} /home/${GENERIC_IMAGE_USERNAME}/.muttrc
  5068. touch /home/${GENERIC_IMAGE_USERNAME}/.mutt-alias
  5069. chown ${GENERIC_IMAGE_USERNAME}:${GENERIC_IMAGE_USERNAME} /home/${GENERIC_IMAGE_USERNAME}/.mutt-alias
  5070. cp /etc/skel/.emacs-mutt /home/${GENERIC_IMAGE_USERNAME}/.emacs-mutt
  5071. chown ${GENERIC_IMAGE_USERNAME}:${GENERIC_IMAGE_USERNAME} /home/${GENERIC_IMAGE_USERNAME}/.emacs-mutt
  5072. fi
  5073. echo 'email_client' >> $COMPLETION_FILE
  5074. }
  5075. function email_archiving {
  5076. if [[ $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_NONMAILBOX" || $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  5077. return
  5078. fi
  5079. # ensure that the mail archive script is up to date
  5080. if [ -f /usr/local/bin/${PROJECT_NAME}-archive-mail ]; then
  5081. cp /usr/local/bin/${PROJECT_NAME}-archive-mail /etc/cron.daily/archivemail
  5082. else
  5083. if [ -f /usr/bin/${PROJECT_NAME}-archive-mail ]; then
  5084. cp /usr/bin/${PROJECT_NAME}-archive-mail /etc/cron.daily/archivemail
  5085. else
  5086. echo "/usr/bin/${PROJECT_NAME}-archive-email was not found. ${PROJECT_NAME} might not have fully installed."
  5087. exit 62379
  5088. fi
  5089. fi
  5090. chmod +x /etc/cron.daily/archivemail
  5091. # update to the next commit
  5092. if [ -d $INSTALL_DIR/cleanup-maildir ]; then
  5093. if grep -q "cleanup-maildir commit" $COMPLETION_FILE; then
  5094. CURRENT_CLEANUP_MAILDIR_COMMIT=$(grep "cleanup-maildir commit" $COMPLETION_FILE | awk -F ':' '{print $2}')
  5095. if [[ "$CURRENT_CLEANUP_MAILDIR_COMMIT" != "$CLEANUP_MAILDIR_COMMIT" ]]; then
  5096. cd $INSTALL_DIR/cleanup-maildir
  5097. git_pull $CLEANUP_MAILDIR_REPO $CLEANUP_MAILDIR_COMMIT
  5098. sed -i "s/cleanup-maildir commit.*/cleanup-maildir commit:$CLEANUP_MAILDIR_COMMIT/g" $COMPLETION_FILE
  5099. cp $INSTALL_DIR/cleanup-maildir/cleanup-maildir /usr/bin
  5100. fi
  5101. else
  5102. echo "cleanup-maildir commit:$CLEANUP_MAILDIR_COMMIT" >> $COMPLETION_FILE
  5103. fi
  5104. fi
  5105. if grep -Fxq "email_archiving" $COMPLETION_FILE; then
  5106. return
  5107. fi
  5108. if [ ! -d $INSTALL_DIR ]; then
  5109. mkdir $INSTALL_DIR
  5110. fi
  5111. cd $INSTALL_DIR
  5112. git_clone $CLEANUP_MAILDIR_REPO $INSTALL_DIR/cleanup-maildir
  5113. cd $INSTALL_DIR/cleanup-maildir
  5114. git checkout $CLEANUP_MAILDIR_COMMIT -b $CLEANUP_MAILDIR_COMMIT
  5115. if ! grep -q "cleanup-maildir commit" $COMPLETION_FILE; then
  5116. echo "cleanup-maildir commit:$CLEANUP_MAILDIR_COMMIT" >> $COMPLETION_FILE
  5117. else
  5118. sed -i "s/cleanup-maildir commit.*/cleanup-maildir commit:$CLEANUP_MAILDIR_COMMIT/g" $COMPLETION_FILE
  5119. fi
  5120. cp $INSTALL_DIR/cleanup-maildir/cleanup-maildir /usr/bin
  5121. echo 'email_archiving' >> $COMPLETION_FILE
  5122. }
  5123. # Ensure that the from field is correct when sending email from Mutt
  5124. function email_from_address {
  5125. if grep -Fxq "email_from_address" $COMPLETION_FILE; then
  5126. return
  5127. fi
  5128. if [ ! -f /home/$MY_USERNAME/.muttrc ]; then
  5129. return
  5130. fi
  5131. if grep -q "set from=" /home/$MY_USERNAME/.muttrc; then
  5132. sed -i "s|set from=.*|set from='$MY_NAME <$MY_EMAIL_ADDRESS>'|g" /home/$MY_USERNAME/.muttrc
  5133. else
  5134. echo "set from='$MY_NAME <$MY_EMAIL_ADDRESS>'" >> /home/$MY_USERNAME/.muttrc
  5135. fi
  5136. echo 'email_from_address' >> $COMPLETION_FILE
  5137. }
  5138. function create_public_mailing_list {
  5139. if [[ $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_NONMAILBOX" || $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  5140. return
  5141. fi
  5142. if grep -Fxq "create_public_mailing_list" $COMPLETION_FILE; then
  5143. return
  5144. fi
  5145. if [ ! $PUBLIC_MAILING_LIST ]; then
  5146. return
  5147. fi
  5148. # does the mailing list have a separate domain name?
  5149. if [ ! $PUBLIC_MAILING_LIST_DOMAIN_NAME ]; then
  5150. PUBLIC_MAILING_LIST_DOMAIN_NAME=$DEFAULT_DOMAIN_NAME
  5151. fi
  5152. PUBLIC_MAILING_LIST_USER="mlmmj"
  5153. apt-get -y install mlmmj
  5154. adduser --system $PUBLIC_MAILING_LIST_USER
  5155. addgroup $PUBLIC_MAILING_LIST_USER
  5156. adduser $PUBLIC_MAILING_LIST_USER $PUBLIC_MAILING_LIST_USER
  5157. echo ''
  5158. echo $"Creating the $PUBLIC_MAILING_LIST mailing list"
  5159. echo ''
  5160. # create the list
  5161. mlmmj-make-ml -a -L "$PUBLIC_MAILING_LIST" -c $PUBLIC_MAILING_LIST_USER
  5162. echo 'SYSTEM_ALIASES_PIPE_TRANSPORT = address_pipe' > /etc/exim4/conf.d/main/000_localmacros
  5163. echo "SYSTEM_ALIASES_USER = $PUBLIC_MAILING_LIST_USER" >> /etc/exim4/conf.d/main/000_localmacros
  5164. echo "SYSTEM_ALIASES_GROUP = $PUBLIC_MAILING_LIST_USER" >> /etc/exim4/conf.d/main/000_localmacros
  5165. # router
  5166. echo 'mlmmj_router:' > /etc/exim4/conf.d/router/750_exim4-config_mlmmj
  5167. echo ' debug_print = "R: mlmmj_router for $local_part@$domain"' >> /etc/exim4/conf.d/router/750_exim4-config_mlmmj
  5168. echo ' driver = accept' >> /etc/exim4/conf.d/router/750_exim4-config_mlmmj
  5169. echo ' domains = +mlmmj_domains' >> /etc/exim4/conf.d/router/750_exim4-config_mlmmj
  5170. echo ' #require_files = MLMMJ_HOME/${lc::$local_part}' >> /etc/exim4/conf.d/router/750_exim4-config_mlmmj
  5171. 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
  5172. echo ' # Exim will then spawn a new process running under the UID of "mlmmj".' >> /etc/exim4/conf.d/router/750_exim4-config_mlmmj
  5173. echo ' require_files = mlmmj:MLMMJ_HOME/${lc::$local_part}' >> /etc/exim4/conf.d/router/750_exim4-config_mlmmj
  5174. echo ' local_part_suffix = +*' >> /etc/exim4/conf.d/router/750_exim4-config_mlmmj
  5175. echo ' local_part_suffix_optional' >> /etc/exim4/conf.d/router/750_exim4-config_mlmmj
  5176. echo ' headers_remove = Delivered-To' >> /etc/exim4/conf.d/router/750_exim4-config_mlmmj
  5177. echo ' headers_add = Delivered-To: $local_part$local_part_suffix@$domain' >> /etc/exim4/conf.d/router/750_exim4-config_mlmmj
  5178. echo ' transport = mlmmj_transport' >> /etc/exim4/conf.d/router/750_exim4-config_mlmmj
  5179. # transport
  5180. echo 'mlmmj_transport:' > /etc/exim4/conf.d/transport/40_exim4-config_mlmmj
  5181. echo ' debug_print = "T: mlmmj_transport for $local_part@$domain"' >> /etc/exim4/conf.d/transport/40_exim4-config_mlmmj
  5182. echo ' driver = pipe' >> /etc/exim4/conf.d/transport/40_exim4-config_mlmmj
  5183. echo ' return_path_add' >> /etc/exim4/conf.d/transport/40_exim4-config_mlmmj
  5184. echo ' user = mlmmj' >> /etc/exim4/conf.d/transport/40_exim4-config_mlmmj
  5185. echo ' group = mlmmj' >> /etc/exim4/conf.d/transport/40_exim4-config_mlmmj
  5186. echo ' home_directory = MLMMJ_HOME' >> /etc/exim4/conf.d/transport/40_exim4-config_mlmmj
  5187. echo ' current_directory = MLMMJ_HOME' >> /etc/exim4/conf.d/transport/40_exim4-config_mlmmj
  5188. echo ' command = /usr/bin/mlmmj-receive -F -L MLMMJ_HOME/${lc:$local_part}' >> /etc/exim4/conf.d/transport/40_exim4-config_mlmmj
  5189. if ! grep -q "MLMMJ_HOME=/var/spool/mlmmj" /etc/exim4/conf.d/main/01_exim4-config_listmacrosdefs; then
  5190. sed -i '/MAIN CONFIGURATION SETTINGS/a\MLMMJ_HOME=/var/spool/mlmmj' /etc/exim4/conf.d/main/01_exim4-config_listmacrosdefs
  5191. fi
  5192. if ! grep -q "domainlist mlmmj_domains =" /etc/exim4/conf.d/main/01_exim4-config_listmacrosdefs; then
  5193. sed -i "/MLMMJ_HOME/a\domainlist mlmmj_domains = $PUBLIC_MAILING_LIST_DOMAIN_NAME" /etc/exim4/conf.d/main/01_exim4-config_listmacrosdefs
  5194. fi
  5195. if ! grep -q "delay_warning_condition =" /etc/exim4/conf.d/main/01_exim4-config_listmacrosdefs; then
  5196. 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
  5197. fi
  5198. if ! grep -q ": +mlmmj_domains" /etc/exim4/conf.d/main/01_exim4-config_listmacrosdefs; then
  5199. 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
  5200. fi
  5201. if ! grep -q "! +mlmmj_domains" /etc/exim4/conf.d/router/200_exim4-config_primary; then
  5202. sed -i 's/domains = ! +local_domains/domains = ! +mlmmj_domains : ! +local_domains/g' /etc/exim4/conf.d/router/200_exim4-config_primary
  5203. fi
  5204. newaliases
  5205. update-exim4.conf.template -r
  5206. update-exim4.conf
  5207. systemctl restart exim4
  5208. if ! grep -q $"$PUBLIC_MAILING_LIST mailing list" /home/$MY_USERNAME/README; then
  5209. echo '' >> /home/$MY_USERNAME/README
  5210. echo '' >> /home/$MY_USERNAME/README
  5211. echo $"$PUBLIC_MAILING_LIST mailing list" >> /home/$MY_USERNAME/README
  5212. echo '=================================' >> /home/$MY_USERNAME/README
  5213. echo $"To subscribe to the $PUBLIC_MAILING_LIST mailing list send a" >> /home/$MY_USERNAME/README
  5214. echo $"cleartext email to $PUBLIC_MAILING_LIST+subscribe@$DEFAULT_DOMAIN_NAME" >> /home/$MY_USERNAME/README
  5215. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
  5216. chmod 600 /home/$MY_USERNAME/README
  5217. fi
  5218. ${PROJECT_NAME}-addlist -u $MY_USERNAME -l "$PUBLIC_MAILING_LIST" -s "$PUBLIC_MAILING_LIST"
  5219. echo 'create_public_mailing_list' >> $COMPLETION_FILE
  5220. }
  5221. function create_private_mailing_list {
  5222. if [[ $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_NONMAILBOX" || $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  5223. return
  5224. fi
  5225. # This installation doesn't work, results in ruby errors
  5226. # There is currently no schleuder package for Debian jessie
  5227. if grep -Fxq "create_private_mailing_list" $COMPLETION_FILE; then
  5228. return
  5229. fi
  5230. if [ ! $PRIVATE_MAILING_LIST ]; then
  5231. return
  5232. fi
  5233. if [[ $PRIVATE_MAILING_LIST == $MY_USERNAME ]]; then
  5234. echo $'The name of the private mailing list should not be the same as your username'
  5235. exit 10
  5236. fi
  5237. if [ ! $MY_GPG_PUBLIC_KEY ]; then
  5238. echo $'To create a private mailing list you need to specify a file'
  5239. echo $'containing your exported GPG key within MY_GPG_PUBLIC_KEY at'
  5240. echo $'the top of the script'
  5241. exit 11
  5242. fi
  5243. apt-get -y install ruby ruby-dev ruby-gpgme libgpgme11-dev libmagic-dev
  5244. gem install schleuder
  5245. schleuder-fix-gem-dependencies
  5246. schleuder-init-setup --gem
  5247. # NOTE: this is version number sensitive and so might need changing
  5248. ln -s /var/lib/gems/2.1.0/gems/schleuder-2.2.4 /var/lib/schleuder
  5249. sed -i 's/#smtp_port: 25/smtp_port: 465/g' /etc/schleuder/schleuder.conf
  5250. sed -i 's/#superadminaddr: root@localhost/superadminaddr: root@localhost' /etc/schleuder/schleuder.conf
  5251. 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
  5252. ${PROJECT_NAME}-addemail -u $MY_USERNAME -e $PRIVATE_MAILING_LIST@$DEFAULT_DOMAIN_NAME -l $PRIVATE_MAILING_LIST
  5253. echo 'schleuder:' > /etc/exim4/conf.d/router/550_exim4-config_schleuder
  5254. echo ' debug_print = "R: schleuder for $local_part@$domain"' >> /etc/exim4/conf.d/router/550_exim4-config_schleuder
  5255. echo ' driver = accept' >> /etc/exim4/conf.d/router/550_exim4-config_schleuder
  5256. echo ' local_part_suffix_optional' >> /etc/exim4/conf.d/router/550_exim4-config_schleuder
  5257. echo ' local_part_suffix = +* : -bounce : -sendkey' >> /etc/exim4/conf.d/router/550_exim4-config_schleuder
  5258. echo ' domains = +local_domains' >> /etc/exim4/conf.d/router/550_exim4-config_schleuder
  5259. echo ' user = schleuder' >> /etc/exim4/conf.d/router/550_exim4-config_schleuder
  5260. echo ' group = schleuder' >> /etc/exim4/conf.d/router/550_exim4-config_schleuder
  5261. echo ' require_files = schleuder:+/var/lib/schleuder/$domain/${local_part}' >> /etc/exim4/conf.d/router/550_exim4-config_schleuder
  5262. echo ' transport = schleuder_transport' >> /etc/exim4/conf.d/router/550_exim4-config_schleuder
  5263. echo 'schleuder_transport:' > /etc/exim4/conf.d/transport/30_exim4-config_schleuder
  5264. echo ' debug_print = "T: schleuder_transport for $local_part@$domain"' >> /etc/exim4/conf.d/transport/30_exim4-config_schleuder
  5265. echo ' driver = pipe' >> /etc/exim4/conf.d/transport/30_exim4-config_schleuder
  5266. echo ' home_directory = "/var/lib/schleuder/$domain/$local_part"' >> /etc/exim4/conf.d/transport/30_exim4-config_schleuder
  5267. echo ' command = "/usr/bin/schleuder $local_part@$domain"' >> /etc/exim4/conf.d/transport/30_exim4-config_schleuder
  5268. chown -R schleuder:schleuder /var/lib/schleuder
  5269. update-exim4.conf.template -r
  5270. update-exim4.conf
  5271. systemctl restart exim4
  5272. useradd -d /var/schleuderlists -s /bin/false schleuder
  5273. adduser Debian-exim schleuder
  5274. usermod -a -G mail schleuder
  5275. #exim -d -bt $PRIVATE_MAILING_LIST@$DEFAULT_DOMAIN_NAME
  5276. echo 'create_private_mailing_list' >> $COMPLETION_FILE
  5277. }
  5278. function split_gpg_key_into_fragments {
  5279. # split the gpg key into fragments if social key management is enabled
  5280. if [[ $ENABLE_SOCIAL_KEY_MANAGEMENT == "yes" ]]; then
  5281. echo 'Splitting GPG key. You may need to enter your passphrase.'
  5282. ${PROJECT_NAME}-splitkey -u $MY_USERNAME -e $MY_EMAIL_ADDRESS --fullname "$MY_NAME"
  5283. if [ ! -d /home/$MY_USERNAME/.gnupg_fragments ]; then
  5284. echo 'Yhe GPG key could not be split'
  5285. exit 86548
  5286. fi
  5287. fi
  5288. }
  5289. function import_email {
  5290. if [[ $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_NONMAILBOX" || $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  5291. return
  5292. fi
  5293. EMAIL_COMPLETE_MSG=$"
  5294. *** ${PROJECT_NAME} mailbox installation is complete ***
  5295. Now on your internet router forward ports
  5296. 25, 587, 465, 993 and 2222 to the ${PROJECT_NAME}
  5297. "
  5298. if grep -Fxq "import_email" $COMPLETION_FILE; then
  5299. if [[ $SYSTEM_TYPE == "$VARIANT_MAILBOX" ]]; then
  5300. backup_to_friends_servers
  5301. intrusion_detection
  5302. split_gpg_key_into_fragments
  5303. clear
  5304. echo ''
  5305. echo "$EMAIL_COMPLETE_MSG"
  5306. if [ -d $USB_MOUNT ]; then
  5307. umount $USB_MOUNT
  5308. rm -rf $USB_MOUNT
  5309. echo $' You can now remove the USB drive'
  5310. fi
  5311. exit 0
  5312. fi
  5313. return
  5314. fi
  5315. if [ $IMPORT_MAILDIR ]; then
  5316. if [ -d $IMPORT_MAILDIR ]; then
  5317. echo $'Transfering email files'
  5318. cp -r $IMPORT_MAILDIR /home/$MY_USERNAME
  5319. chown -R $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/Maildir
  5320. else
  5321. echo $"Email import directory $IMPORT_MAILDIR not found"
  5322. exit 9
  5323. fi
  5324. fi
  5325. echo 'import_email' >> $COMPLETION_FILE
  5326. if [[ $SYSTEM_TYPE == "$VARIANT_MAILBOX" ]]; then
  5327. backup_to_friends_servers
  5328. intrusion_detection
  5329. split_gpg_key_into_fragments
  5330. # unmount any attached usb drive
  5331. clear
  5332. echo ''
  5333. echo "$EMAIL_COMPLETE_MSG"
  5334. echo ''
  5335. if [ -d $USB_MOUNT ]; then
  5336. umount $USB_MOUNT
  5337. rm -rf $USB_MOUNT
  5338. echo $' You can now remove the USB drive'
  5339. fi
  5340. exit 0
  5341. fi
  5342. }
  5343. function install_web_server {
  5344. if [[ $SYSTEM_TYPE == "$VARIANT_CHAT" ]]; then
  5345. return
  5346. fi
  5347. # update to the next commit
  5348. if [ -d $INSTALL_DIR/nginx_ensite ]; then
  5349. if grep -q "Nginx-ensite commit" $COMPLETION_FILE; then
  5350. CURRENT_NGINX_ENSITE_COMMIT=$(grep "Nginx-ensite commit" $COMPLETION_FILE | awk -F ':' '{print $2}')
  5351. if [[ "$CURRENT_NGINX_ENSITE_COMMIT" != "$NGINX_ENSITE_COMMIT" ]]; then
  5352. $INSTALL_DIR/nginx_ensite
  5353. git_pull $NGINX_ENSITE_REPO $NGINX_ENSITE_COMMIT
  5354. sed -i "s/Nginx-ensite commit.*/Nginx-ensite commit:$NGINX_ENSITE_COMMIT/g" $COMPLETION_FILE
  5355. make install
  5356. fi
  5357. else
  5358. echo "Nginx-ensite commit:$NGINX_ENSITE_COMMIT" >> $COMPLETION_FILE
  5359. fi
  5360. fi
  5361. if grep -Fxq "install_web_server" $COMPLETION_FILE; then
  5362. return
  5363. fi
  5364. # remove apache
  5365. apt-get -y remove --purge apache2
  5366. if [ -d /etc/apache2 ]; then
  5367. rm -rf /etc/apache2
  5368. fi
  5369. # install nginx
  5370. apt-get -y install nginx php5-fpm git
  5371. # limit the number of php processes
  5372. sed -i 's/; process.max =.*/process.max = 32/g' /etc/php5/fpm/php-fpm.conf
  5373. sed -i 's/;process_control_timeout =.*/process_control_timeout = 300/g' /etc/php5/fpm/php-fpm.conf
  5374. if ! grep -q "pm.max_children" /etc/php5/fpm/php-fpm.conf; then
  5375. echo 'pm.max_children = 10' >> /etc/php5/fpm/php-fpm.conf
  5376. echo 'pm.start_servers = 2' >> /etc/php5/fpm/php-fpm.conf
  5377. echo 'pm.min_spare_servers = 2' >> /etc/php5/fpm/php-fpm.conf
  5378. echo 'pm.max_spare_servers = 5' >> /etc/php5/fpm/php-fpm.conf
  5379. echo 'pm.max_requests = 50' >> /etc/php5/fpm/php-fpm.conf
  5380. fi
  5381. if [ ! -d /etc/nginx ]; then
  5382. echo $"ERROR: nginx does not appear to have installed. $CHECK_MESSAGE"
  5383. exit 51
  5384. fi
  5385. # Nginx settings
  5386. echo 'user www-data;' > /etc/nginx/nginx.conf
  5387. #echo "worker_processes; $CPU_CORES" >> /etc/nginx/nginx.conf
  5388. echo 'pid /run/nginx.pid;' >> /etc/nginx/nginx.conf
  5389. echo '' >> /etc/nginx/nginx.conf
  5390. echo 'events {' >> /etc/nginx/nginx.conf
  5391. echo ' worker_connections 50;' >> /etc/nginx/nginx.conf
  5392. echo ' # multi_accept on;' >> /etc/nginx/nginx.conf
  5393. echo '}' >> /etc/nginx/nginx.conf
  5394. echo '' >> /etc/nginx/nginx.conf
  5395. echo 'http {' >> /etc/nginx/nginx.conf
  5396. echo ' # limit the number of connections per single IP' >> /etc/nginx/nginx.conf
  5397. echo ' limit_conn_zone $binary_remote_addr zone=conn_limit_per_ip:10m;' >> /etc/nginx/nginx.conf
  5398. echo '' >> /etc/nginx/nginx.conf
  5399. echo ' # limit the number of requests for a given session' >> /etc/nginx/nginx.conf
  5400. echo ' # Note that the Owncloud web interface seems to require a rate of around 140r/s' >> /etc/nginx/nginx.conf
  5401. echo ' limit_req_zone $binary_remote_addr zone=req_limit_per_ip:10m rate=140r/s;' >> /etc/nginx/nginx.conf
  5402. echo '' >> /etc/nginx/nginx.conf
  5403. 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
  5404. echo ' client_body_buffer_size 128k;' >> /etc/nginx/nginx.conf
  5405. echo '' >> /etc/nginx/nginx.conf
  5406. echo ' # headerbuffer size for the request header from client, its set for testing purpose' >> /etc/nginx/nginx.conf
  5407. echo ' client_header_buffer_size 3m;' >> /etc/nginx/nginx.conf
  5408. echo '' >> /etc/nginx/nginx.conf
  5409. echo ' # maximum number and size of buffers for large headers to read from client request' >> /etc/nginx/nginx.conf
  5410. echo ' large_client_header_buffers 4 256k;' >> /etc/nginx/nginx.conf
  5411. echo '' >> /etc/nginx/nginx.conf
  5412. echo ' # read timeout for the request body from client, its set for testing purpose' >> /etc/nginx/nginx.conf
  5413. echo ' client_body_timeout 3m;' >> /etc/nginx/nginx.conf
  5414. echo '' >> /etc/nginx/nginx.conf
  5415. echo ' # how long to wait for the client to send a request header, its set for testing purpose' >> /etc/nginx/nginx.conf
  5416. echo ' client_header_timeout 3m;' >> /etc/nginx/nginx.conf
  5417. echo '' >> /etc/nginx/nginx.conf
  5418. echo ' ##' >> /etc/nginx/nginx.conf
  5419. echo ' # Basic Settings' >> /etc/nginx/nginx.conf
  5420. echo ' ##' >> /etc/nginx/nginx.conf
  5421. echo '' >> /etc/nginx/nginx.conf
  5422. echo ' sendfile on;' >> /etc/nginx/nginx.conf
  5423. echo ' tcp_nopush on;' >> /etc/nginx/nginx.conf
  5424. echo ' tcp_nodelay on;' >> /etc/nginx/nginx.conf
  5425. echo ' keepalive_timeout 65;' >> /etc/nginx/nginx.conf
  5426. echo ' types_hash_max_size 2048;' >> /etc/nginx/nginx.conf
  5427. echo ' server_tokens off;' >> /etc/nginx/nginx.conf
  5428. echo '' >> /etc/nginx/nginx.conf
  5429. echo ' # server_names_hash_bucket_size 64;' >> /etc/nginx/nginx.conf
  5430. echo ' # server_name_in_redirect off;' >> /etc/nginx/nginx.conf
  5431. echo '' >> /etc/nginx/nginx.conf
  5432. echo ' include /etc/nginx/mime.types;' >> /etc/nginx/nginx.conf
  5433. echo ' default_type application/octet-stream;' >> /etc/nginx/nginx.conf
  5434. echo '' >> /etc/nginx/nginx.conf
  5435. echo ' ##' >> /etc/nginx/nginx.conf
  5436. echo ' # Logging Settings' >> /etc/nginx/nginx.conf
  5437. echo ' ##' >> /etc/nginx/nginx.conf
  5438. echo '' >> /etc/nginx/nginx.conf
  5439. echo ' access_log /var/log/nginx/access.log;' >> /etc/nginx/nginx.conf
  5440. echo ' error_log /var/log/nginx/error.log;' >> /etc/nginx/nginx.conf
  5441. echo '' >> /etc/nginx/nginx.conf
  5442. echo ' ###' >> /etc/nginx/nginx.conf
  5443. echo ' # Gzip Settings' >> /etc/nginx/nginx.conf
  5444. echo ' ##' >> /etc/nginx/nginx.conf
  5445. echo ' gzip on;' >> /etc/nginx/nginx.conf
  5446. echo ' gzip_disable "msie6";' >> /etc/nginx/nginx.conf
  5447. echo '' >> /etc/nginx/nginx.conf
  5448. echo ' # gzip_vary on;' >> /etc/nginx/nginx.conf
  5449. echo ' # gzip_proxied any;' >> /etc/nginx/nginx.conf
  5450. echo ' # gzip_comp_level 6;' >> /etc/nginx/nginx.conf
  5451. echo ' # gzip_buffers 16 8k;' >> /etc/nginx/nginx.conf
  5452. echo ' # gzip_http_version 1.1;' >> /etc/nginx/nginx.conf
  5453. echo ' # gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;' >> /etc/nginx/nginx.conf
  5454. echo '' >> /etc/nginx/nginx.conf
  5455. echo ' ##' >> /etc/nginx/nginx.conf
  5456. echo ' # Virtual Host Configs' >> /etc/nginx/nginx.conf
  5457. echo ' ##' >> /etc/nginx/nginx.conf
  5458. echo '' >> /etc/nginx/nginx.conf
  5459. echo ' include /etc/nginx/conf.d/*.conf;' >> /etc/nginx/nginx.conf
  5460. echo ' include /etc/nginx/sites-enabled/*;' >> /etc/nginx/nginx.conf
  5461. echo '}' >> /etc/nginx/nginx.conf
  5462. # install a script to easily enable and disable nginx virtual hosts
  5463. if [ ! -d $INSTALL_DIR ]; then
  5464. mkdir $INSTALL_DIR
  5465. fi
  5466. cd $INSTALL_DIR
  5467. git_clone $NGINX_ENSITE_REPO $INSTALL_DIR/nginx_ensite
  5468. cd $INSTALL_DIR/nginx_ensite
  5469. git checkout $NGINX_ENSITE_COMMIT -b $NGINX_ENSITE_COMMIT
  5470. if ! grep -q "Nginx-ensite commit" $COMPLETION_FILE; then
  5471. echo "Nginx-ensite commit:$NGINX_ENSITE_COMMIT" >> $COMPLETION_FILE
  5472. else
  5473. sed -i "s/Nginx-ensite commit.*/Nginx-ensite commit:$NGINX_ENSITE_COMMIT/g" $COMPLETION_FILE
  5474. fi
  5475. make install
  5476. nginx_dissite default
  5477. echo 'install_web_server' >> $COMPLETION_FILE
  5478. }
  5479. function configure_php {
  5480. sed -i "s/memory_limit = 128M/memory_limit = ${MAX_PHP_MEMORY}M/g" /etc/php5/fpm/php.ini
  5481. sed -i 's/;cgi.fix_pathinfo=1/cgi.fix_pathinfo=0/g' /etc/php5/fpm/php.ini
  5482. sed -i "s/memory_limit = -1/memory_limit = ${MAX_PHP_MEMORY}M/g" /etc/php5/cli/php.ini
  5483. sed -i "s/upload_max_filesize = 2M/upload_max_filesize = 50M/g" /etc/php5/fpm/php.ini
  5484. sed -i "s/post_max_size = 8M/post_max_size = 50M/g" /etc/php5/fpm/php.ini
  5485. }
  5486. function install_mariadb {
  5487. if grep -Fxq "install_mariadb" $COMPLETION_FILE; then
  5488. return
  5489. fi
  5490. apt-get -y install python-software-properties debconf-utils
  5491. apt-get -y install software-properties-common
  5492. apt-get -y update
  5493. get_mariadb_password
  5494. if [ ! $MARIADB_PASSWORD ]; then
  5495. if [ -f $IMAGE_PASSWORD_FILE ]; then
  5496. MARIADB_PASSWORD="$(printf `cat $IMAGE_PASSWORD_FILE`)"
  5497. else
  5498. MARIADB_PASSWORD="$(openssl rand -base64 32)"
  5499. fi
  5500. echo "$MARIADB_PASSWORD" > $DATABASE_PASSWORD_FILE
  5501. chmod 600 $DATABASE_PASSWORD_FILE
  5502. echo '' >> /home/$MY_USERNAME/README
  5503. echo '' >> /home/$MY_USERNAME/README
  5504. echo 'MariaDB / MySql' >> /home/$MY_USERNAME/README
  5505. echo '===============' >> /home/$MY_USERNAME/README
  5506. echo $"Your MariaDB password is: $MARIADB_PASSWORD" >> /home/$MY_USERNAME/README
  5507. echo '' >> /home/$MY_USERNAME/README
  5508. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
  5509. chmod 600 /home/$MY_USERNAME/README
  5510. fi
  5511. debconf-set-selections <<< "mariadb-server mariadb-server/root_password password $MARIADB_PASSWORD"
  5512. debconf-set-selections <<< "mariadb-server mariadb-server/root_password_again password $MARIADB_PASSWORD"
  5513. apt-get -y install mariadb-server
  5514. apt-get -y remove --purge apache*
  5515. if [ -d /etc/apache2 ]; then
  5516. rm -rf /etc/apache2
  5517. echo $'Removed Apache installation after MariaDB install'
  5518. fi
  5519. if [ ! -d /etc/mysql ]; then
  5520. echo $"ERROR: mariadb-server does not appear to have installed. $CHECK_MESSAGE"
  5521. exit 54
  5522. fi
  5523. mysqladmin -u root password "$MARIADB_PASSWORD"
  5524. echo 'install_mariadb' >> $COMPLETION_FILE
  5525. }
  5526. function backup_databases_script_header {
  5527. if [ ! -f /usr/bin/backupdatabases ]; then
  5528. # daily
  5529. echo '#!/bin/sh' > /usr/bin/backupdatabases
  5530. echo '' >> /usr/bin/backupdatabases
  5531. echo "EMAIL='$MY_EMAIL_ADDRESS'" >> /usr/bin/backupdatabases
  5532. echo '' >> /usr/bin/backupdatabases
  5533. echo -n 'MYSQL_PASSWORD=$(cat ' >> /usr/bin/backupdatabases
  5534. echo "$DATABASE_PASSWORD_FILE)" >> /usr/bin/backupdatabases
  5535. echo 'umask 0077' >> /usr/bin/backupdatabases
  5536. echo '' >> /usr/bin/backupdatabases
  5537. echo '# exit if we are backing up to friends servers' >> /usr/bin/backupdatabases
  5538. echo "if [ -f $FRIENDS_SERVERS_LIST ]; then" >> /usr/bin/backupdatabases
  5539. echo ' exit 1' >> /usr/bin/backupdatabases
  5540. echo 'fi' >> /usr/bin/backupdatabases
  5541. chmod 600 /usr/bin/backupdatabases
  5542. chmod +x /usr/bin/backupdatabases
  5543. echo '#!/bin/sh' > /etc/cron.daily/backupdatabasesdaily
  5544. echo '/usr/bin/backupdatabases' >> /etc/cron.daily/backupdatabasesdaily
  5545. chmod 600 /etc/cron.daily/backupdatabasesdaily
  5546. chmod +x /etc/cron.daily/backupdatabasesdaily
  5547. # weekly
  5548. echo '#!/bin/sh' > /etc/cron.weekly/backupdatabasesweekly
  5549. echo '' >> /etc/cron.weekly/backupdatabasesweekly
  5550. echo 'umask 0077' >> /etc/cron.weekly/backupdatabasesweekly
  5551. chmod 600 /etc/cron.weekly/backupdatabasesweekly
  5552. chmod +x /etc/cron.weekly/backupdatabasesweekly
  5553. # monthly
  5554. echo '#!/bin/sh' > /etc/cron.monthly/backupdatabasesmonthly
  5555. echo '' >> /etc/cron.monthly/backupdatabasesmonthly
  5556. echo 'umask 0077' >> /etc/cron.monthly/backupdatabasesmonthly
  5557. chmod 600 /etc/cron.monthly/backupdatabasesmonthly
  5558. chmod +x /etc/cron.monthly/backupdatabasesmonthly
  5559. fi
  5560. }
  5561. function repair_databases_script {
  5562. if [ -f /etc/cron.hourly/repair ]; then
  5563. sed -i "s|/usr/bin/repairdatabase|${PROJECT_NAME}-repair-database|g" /etc/cron.hourly/repair
  5564. fi
  5565. if grep -Fxq "repair_databases_script" $COMPLETION_FILE; then
  5566. return
  5567. fi
  5568. if [ ! -f $DATABASE_PASSWORD_FILE ]; then
  5569. return
  5570. fi
  5571. echo '#!/bin/bash' > /etc/cron.hourly/repair
  5572. echo '' >> /etc/cron.hourly/repair
  5573. chmod 600 /etc/cron.hourly/repair
  5574. chmod +x /etc/cron.hourly/repair
  5575. echo 'repair_databases_script' >> $COMPLETION_FILE
  5576. }
  5577. function install_owncloud_music_app {
  5578. 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
  5579. return
  5580. fi
  5581. if ! grep -Fxq "install_owncloud" $COMPLETION_FILE; then
  5582. echo $'Tried to install the Owncloud music app, but Owncloud installation was not found'
  5583. exit 9823
  5584. fi
  5585. # update to the next commit
  5586. if [ -d /usr/share/owncloud/apps/music ]; then
  5587. if grep -q "Owncloud music app commit" $COMPLETION_FILE; then
  5588. CURRENT_OWNCLOUD_MUSIC_APP_COMMIT=$(grep "Owncloud music app commit" $COMPLETION_FILE | awk -F ':' '{print $2}')
  5589. if [[ "$OWNCLOUD_MUSIC_APP_COMMIT" != "$OWNCLOUD_MUSIC_APP_COMMIT" ]]; then
  5590. cd /usr/share/owncloud/apps/music
  5591. git_pull $OWNCLOUD_MUSIC_APP_REPO $OWNCLOUD_MUSIC_APP_COMMIT
  5592. sed -i "s/Owncloud music app commit.*/Owncloud music app commit:$OWNCLOUD_MUSIC_APP_COMMIT/g" $COMPLETION_FILE
  5593. fi
  5594. else
  5595. echo "Owncloud music app commit:$OWNCLOUD_MUSIC_APP_COMMIT" >> $COMPLETION_FILE
  5596. fi
  5597. fi
  5598. if grep -Fxq "install_owncloud_music_app" $COMPLETION_FILE; then
  5599. return
  5600. fi
  5601. cd /usr/share/owncloud/apps
  5602. git_clone $OWNCLOUD_MUSIC_APP_REPO Music
  5603. cd /usr/share/owncloud/apps/Music
  5604. git checkout $OWNCLOUD_MUSIC_APP_COMMIT -b $OWNCLOUD_MUSIC_APP_COMMIT
  5605. if ! grep -q "Owncloud music app commit" $COMPLETION_FILE; then
  5606. echo "Owncloud music app commit:$OWNCLOUD_MUSIC_APP_COMMIT" >> $COMPLETION_FILE
  5607. else
  5608. sed -i "s/Owncloud music app commit.*/Owncloud music app commit:$OWNCLOUD_MUSIC_APP_COMMIT/g" $COMPLETION_FILE
  5609. fi
  5610. if grep -q $"Music player in Owncloud" /home/$MY_USERNAME/README; then
  5611. echo '' >> /home/$MY_USERNAME/README
  5612. echo '' >> /home/$MY_USERNAME/README
  5613. echo $'Music player in Owncloud' >> /home/$MY_USERNAME/README
  5614. echo '========================' >> /home/$MY_USERNAME/README
  5615. echo $'To enable the music app within ouwncloud log in to the Owncloud' >> /home/$MY_USERNAME/README
  5616. echo $'administrator account then go to Apps on the left hand dropdown' >> /home/$MY_USERNAME/README
  5617. echo $'menu and enable the music app. You can then log out and log back' >> /home/$MY_USERNAME/README
  5618. echo $'in as your Owncloud user and select music from the left hand' >> /home/$MY_USERNAME/README
  5619. echo $'dropdown menu.' >> /home/$MY_USERNAME/README
  5620. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
  5621. chmod 600 /home/$MY_USERNAME/README
  5622. fi
  5623. echo 'install_owncloud_music_app' >> $COMPLETION_FILE
  5624. }
  5625. function add_ddns_domain {
  5626. if [[ $ONION_ONLY != "no" ]]; then
  5627. return
  5628. fi
  5629. if [ ! $CURRENT_DDNS_DOMAIN ]; then
  5630. echo $'ddns domain not specified'
  5631. exit 5638
  5632. fi
  5633. if [ ! -f /etc/inadyn.conf ]; then
  5634. echo $'Unable to find inadyn configuration file /etc/inadyn.conf'
  5635. exit 5745
  5636. fi
  5637. if ! grep -q "$DDNS_PROVIDER" /etc/inadyn.conf; then
  5638. echo '' >> /etc/inadyn.conf
  5639. echo "system $DDNS_PROVIDER" >> /etc/inadyn.conf
  5640. echo ' ssl' >> /etc/inadyn.conf
  5641. echo " checkip-url $GET_IP_ADDRESS_URL /" >> /etc/inadyn.conf
  5642. if [ $DDNS_USERNAME ]; then
  5643. echo " username $DDNS_USERNAME" >> /etc/inadyn.conf
  5644. fi
  5645. if [ $DDNS_PASSWORD ]; then
  5646. echo " password $DDNS_PASSWORD" >> /etc/inadyn.conf
  5647. fi
  5648. fi
  5649. if ! grep -q "$CURRENT_DDNS_DOMAIN" /etc/inadyn.conf; then
  5650. echo " alias $CURRENT_DDNS_DOMAIN" >> /etc/inadyn.conf
  5651. fi
  5652. chmod 600 /etc/inadyn.conf
  5653. systemctl restart inadyn
  5654. systemctl daemon-reload
  5655. # clear the arguments
  5656. CURRENT_DDNS_DOMAIN=
  5657. }
  5658. function configure_owncloud_onion_site {
  5659. if [ ! $OWNCLOUD_DOMAIN_NAME ]; then
  5660. return
  5661. fi
  5662. if [ ! -f /etc/owncloud/config.php ]; then
  5663. return
  5664. fi
  5665. if [ ! -f /var/lib/tor/hidden_service_owncloud/hostname ]; then
  5666. return
  5667. fi
  5668. OWNCLOUD_ONION_HOSTNAME=$(cat /var/lib/tor/hidden_service_owncloud/hostname)
  5669. if ! grep -q "${OWNCLOUD_ONION_HOSTNAME}" /etc/owncloud/config.php; then
  5670. sed -i "s|0 => '${OWNCLOUD_DOMAIN_NAME}',|0 => '${OWNCLOUD_DOMAIN_NAME}',
  5671. 1 => '${OWNCLOUD_ONION_HOSTNAME}',|g" /etc/owncloud/config.php
  5672. sed -i "s|'writable' => false,|'writable' => false,
  5673. ),
  5674. 1 =>
  5675. array (
  5676. 'path' => '/usr/share/owncloud/apps',
  5677. 'url' => '/apps',
  5678. 'writable' => false,|g" /etc/owncloud/config.php
  5679. echo $'Owncloud configured for onion site'
  5680. fi
  5681. }
  5682. function install_owncloud {
  5683. 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
  5684. return
  5685. fi
  5686. OWNCLOUD_COMPLETION_MSG1=$" *** ${PROJECT_NAME} $SYSTEM_TYPE is now installed ***"
  5687. OWNCLOUD_COMPLETION_MSG2=$"Open $OWNCLOUD_DOMAIN_NAME in a web browser to complete the setup"
  5688. if grep -Fxq "install_owncloud" $COMPLETION_FILE; then
  5689. if [[ $SYSTEM_TYPE == "$VARIANT_CLOUD" ]]; then
  5690. install_owncloud_music_app
  5691. backup_to_friends_servers
  5692. intrusion_detection
  5693. split_gpg_key_into_fragments
  5694. # unmount any attached usb drive
  5695. if [ -d $USB_MOUNT ]; then
  5696. umount $USB_MOUNT
  5697. rm -rf $USB_MOUNT
  5698. fi
  5699. echo ''
  5700. echo "$OWNCLOUD_COMPLETION_MSG1"
  5701. echo "$OWNCLOUD_COMPLETION_MSG2"
  5702. exit 0
  5703. fi
  5704. return
  5705. fi
  5706. # if this is exclusively a cloud setup
  5707. if [[ $SYSTEM_TYPE == "$VARIANT_CLOUD" ]]; then
  5708. if [ ! $DEFAULT_DOMAIN_NAME ]; then
  5709. echo $'No default domain name when installing cloud variant'
  5710. exit 5380
  5711. fi
  5712. fi
  5713. if [ ! $OWNCLOUD_DOMAIN_NAME ]; then
  5714. echo $'No Owncloud domain name was specified'
  5715. exit 3095
  5716. fi
  5717. if [[ $SYSTEM_TYPE != "$VARIANT_CLOUD" ]]; then
  5718. if [[ $SYSTEM_TYPE != "$VARIANT_FULL" ]]; then
  5719. echo $"Owncloud install did not recognise the system type $SYSTEM_TYPE"
  5720. exit 6746
  5721. fi
  5722. fi
  5723. apt-get -y install fonts-linuxlibertine fonts-sil-gentium-basic fonts-way-microhei
  5724. apt-get -y install libjs-twitter-bootstrap
  5725. apt-get -y install owncloud
  5726. apt-get -y remove --purge apache*
  5727. if [ -d /etc/apache2 ]; then
  5728. rm -rf /etc/apache2
  5729. echo $'Removed Apache installation after Owncloud install'
  5730. fi
  5731. install_mariadb
  5732. get_mariadb_password
  5733. get_mariadb_owncloud_admin_password
  5734. if [ ! $OWNCLOUD_ADMIN_PASSWORD ]; then
  5735. if [ -f $IMAGE_PASSWORD_FILE ]; then
  5736. OWNCLOUD_ADMIN_PASSWORD="$(printf `cat $IMAGE_PASSWORD_FILE`)"
  5737. else
  5738. OWNCLOUD_ADMIN_PASSWORD="$(openssl rand -base64 32)"
  5739. fi
  5740. fi
  5741. if ! grep -q "Owncloud database user" /home/$MY_USERNAME/README; then
  5742. echo '' >> /home/$MY_USERNAME/README
  5743. echo '' >> /home/$MY_USERNAME/README
  5744. echo 'Owncloud' >> /home/$MY_USERNAME/README
  5745. echo '========' >> /home/$MY_USERNAME/README
  5746. echo $'Owncloud database user: owncloudadmin' >> /home/$MY_USERNAME/README
  5747. echo $"Owncloud database password: $OWNCLOUD_ADMIN_PASSWORD" >> /home/$MY_USERNAME/README
  5748. echo $'Owncloud database name: owncloud' >> /home/$MY_USERNAME/README
  5749. echo '' >> /home/$MY_USERNAME/README
  5750. echo $'After creating an administrator account then create a user account via' >> /home/$MY_USERNAME/README
  5751. echo $"the Users dropdown menu entry. The username should be '$MY_USERNAME'." >> /home/$MY_USERNAME/README
  5752. echo '' >> /home/$MY_USERNAME/README
  5753. echo $'On mobile devices you can download the Owncloud client via F-Droid.' >> /home/$MY_USERNAME/README
  5754. echo '' >> /home/$MY_USERNAME/README
  5755. echo $'To synchronise calendar entries with Android "install CalDAV Sync Adapter"' >> /home/$MY_USERNAME/README
  5756. echo $'using F-Droid then go to settings/accounts and add a CalDav account with' >> /home/$MY_USERNAME/README
  5757. echo $"the URL https://$OWNCLOUD_DOMAIN_NAME/remote.php/caldav/principals/$MY_USERNAME" >> /home/$MY_USERNAME/README
  5758. echo $'and the username and password shown above.' >> /home/$MY_USERNAME/README
  5759. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
  5760. chmod 600 /home/$MY_USERNAME/README
  5761. fi
  5762. create_database owncloud "$OWNCLOUD_ADMIN_PASSWORD"
  5763. if [ ! -d /var/www/$OWNCLOUD_DOMAIN_NAME ]; then
  5764. mkdir /var/www/$OWNCLOUD_DOMAIN_NAME
  5765. fi
  5766. if [ -d /var/www/$OWNCLOUD_DOMAIN_NAME/htdocs ]; then
  5767. rm -rf /var/www/$OWNCLOUD_DOMAIN_NAME/htdocs
  5768. fi
  5769. ln -s /usr/share/owncloud /var/www/$OWNCLOUD_DOMAIN_NAME/htdocs
  5770. if [[ $ONION_ONLY == "no" ]]; then
  5771. echo 'server {' > /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5772. echo ' listen 80;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5773. echo " server_name $OWNCLOUD_DOMAIN_NAME;" >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5774. echo ' access_log off;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5775. echo " error_log /var/log/nginx/${OWNCLOUD_DOMAIN_NAME}_error.log $WEBSERVER_LOG_LEVEL;" >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5776. echo ' limit_conn conn_limit_per_ip 10;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5777. echo ' limit_req zone=req_limit_per_ip burst=10 nodelay;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5778. echo ' rewrite ^ https://$server_name$request_uri? permanent;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5779. echo '}' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5780. echo '' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5781. echo 'server {' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5782. echo ' listen 443 ssl;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5783. echo " root /var/www/$OWNCLOUD_DOMAIN_NAME/htdocs;" >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5784. echo " server_name $OWNCLOUD_DOMAIN_NAME;" >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5785. echo ' access_log off;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5786. echo " error_log /var/log/nginx/${OWNCLOUD_DOMAIN_NAME}_error.log $WEBSERVER_LOG_LEVEL;" >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5787. echo '' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5788. echo ' limit_conn conn_limit_per_ip 10;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5789. echo ' limit_req zone=req_limit_per_ip burst=10 nodelay;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5790. echo '' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5791. echo ' ssl on;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5792. echo " ssl_certificate /etc/ssl/certs/$OWNCLOUD_DOMAIN_NAME.crt;" >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5793. echo " ssl_certificate_key /etc/ssl/private/$OWNCLOUD_DOMAIN_NAME.key;" >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5794. echo " ssl_dhparam /etc/ssl/certs/$OWNCLOUD_DOMAIN_NAME.dhparam;" >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5795. echo '' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5796. echo ' ssl_session_timeout 60m;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5797. echo ' ssl_prefer_server_ciphers on;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5798. echo " ssl_protocols $SSL_PROTOCOLS; # not possible to do exclusive" >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5799. echo " ssl_ciphers '$SSL_CIPHERS';" >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5800. echo ' add_header X-Frame-Options DENY;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5801. echo ' add_header X-Content-Type-Options nosniff;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5802. echo ' add_header Strict-Transport-Security max-age=15768000;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5803. echo ' # if you want to be able to access the site via HTTP' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5804. echo ' # then replace the above with the following:' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5805. echo ' # add_header Strict-Transport-Security "max-age=0;";' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5806. echo " # make sure webfinger and other well known services aren't blocked" >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5807. echo ' # by denying dot files and rewrite request to the front controller' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5808. echo ' location ^~ /.well-known/ {' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5809. echo ' allow all;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5810. echo ' }' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5811. echo '' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5812. echo ' client_max_body_size 10G; # set max upload size' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5813. echo ' client_body_buffer_size 128k;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5814. echo ' fastcgi_buffers 64 4K;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5815. echo '' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5816. echo ' rewrite ^/caldav(.*)$ /remote.php/caldav$1 redirect;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5817. echo ' rewrite ^/carddav(.*)$ /remote.php/carddav$1 redirect;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5818. echo ' rewrite ^/webdav(.*)$ /remote.php/webdav$1 redirect;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5819. echo '' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5820. echo ' index index.php;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5821. echo ' error_page 403 /core/templates/403.php;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5822. echo ' error_page 404 /core/templates/404.php;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5823. echo '' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5824. echo ' location = /robots.txt {' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5825. echo ' allow all;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5826. echo ' log_not_found off;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5827. echo ' access_log off;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5828. echo ' }' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5829. echo '' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5830. echo ' location ~ ^/(data|config|\.ht|db_structure\.xml|README) {' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5831. echo ' deny all;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5832. echo ' }' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5833. echo '' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5834. echo ' location / {' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5835. echo ' # The following 2 rules are only needed with webfinger' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5836. echo ' rewrite ^/.well-known/host-meta /public.php?service=host-meta last;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5837. echo ' rewrite ^/.well-known/host-meta.json /public.php?service=host-meta-json last;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5838. echo ' rewrite ^/.well-known/carddav /remote.php/carddav/ redirect;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5839. echo ' rewrite ^/.well-known/caldav /remote.php/caldav/ redirect;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5840. echo ' rewrite ^(/core/doc/[^\/]+/)$ $1/index.html;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5841. echo ' try_files $uri $uri/ index.php;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5842. echo ' }' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5843. echo '' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5844. echo ' location ~ ^(.+?\.php)(/.*)?$ {' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5845. echo ' try_files $1 =404;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5846. echo ' fastcgi_split_path_info ^(.+\.php)(/.+)$;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5847. echo ' fastcgi_pass unix:/var/run/php5-fpm.sock;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5848. echo ' fastcgi_index index.php;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5849. echo ' include fastcgi_params;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5850. echo ' fastcgi_param SCRIPT_FILENAME $document_root$1;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5851. echo ' fastcgi_param PATH_INFO $2;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5852. echo ' fastcgi_param HTTPS on;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5853. echo ' }' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5854. echo '' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5855. echo ' # Optional: set long EXPIRES header on static assets' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5856. echo ' location ~* ^.+\.(jpg|jpeg|gif|bmp|ico|png|css|js|swf)$ {' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5857. echo ' expires 30d;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5858. echo " # Optional: Don't log access to assets" >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5859. echo ' access_log off;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5860. echo ' }' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5861. echo '}' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5862. echo '' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5863. else
  5864. echo -n '' > /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5865. fi
  5866. echo 'server {' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5867. echo " listen 127.0.0.1:${OWNCLOUD_ONION_PORT} default_server;" >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5868. echo " root /var/www/$OWNCLOUD_DOMAIN_NAME/htdocs;" >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5869. echo " server_name $OWNCLOUD_DOMAIN_NAME;" >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5870. echo ' access_log off;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5871. echo " error_log /var/log/nginx/${OWNCLOUD_DOMAIN_NAME}_error.log $WEBSERVER_LOG_LEVEL;" >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5872. echo '' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5873. echo ' limit_conn conn_limit_per_ip 10;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5874. echo ' limit_req zone=req_limit_per_ip burst=10 nodelay;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5875. echo '' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5876. echo ' add_header X-Frame-Options DENY;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5877. echo ' add_header X-Content-Type-Options nosniff;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5878. echo ' add_header Strict-Transport-Security max-age=15768000;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5879. echo ' # if you want to be able to access the site via HTTP' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5880. echo ' # then replace the above with the following:' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5881. echo ' # add_header Strict-Transport-Security "max-age=0;";' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5882. echo " # make sure webfinger and other well known services aren't blocked" >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5883. echo ' # by denying dot files and rewrite request to the front controller' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5884. echo ' location ^~ /.well-known/ {' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5885. echo ' allow all;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5886. echo ' }' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5887. echo '' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5888. echo ' client_max_body_size 10G; # set max upload size' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5889. echo ' client_body_buffer_size 128k;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5890. echo ' fastcgi_buffers 64 4K;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5891. echo '' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5892. echo ' rewrite ^/caldav(.*)$ /remote.php/caldav$1 redirect;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5893. echo ' rewrite ^/carddav(.*)$ /remote.php/carddav$1 redirect;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5894. echo ' rewrite ^/webdav(.*)$ /remote.php/webdav$1 redirect;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5895. echo '' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5896. echo ' index index.php;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5897. echo ' error_page 403 /core/templates/403.php;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5898. echo ' error_page 404 /core/templates/404.php;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5899. echo '' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5900. echo ' location = /robots.txt {' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5901. echo ' allow all;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5902. echo ' log_not_found off;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5903. echo ' access_log off;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5904. echo ' }' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5905. echo '' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5906. echo ' location ~ ^/(data|config|\.ht|db_structure\.xml|README) {' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5907. echo ' deny all;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5908. echo ' }' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5909. echo '' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5910. echo ' location / {' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5911. echo ' # The following 2 rules are only needed with webfinger' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5912. echo ' rewrite ^/.well-known/host-meta /public.php?service=host-meta last;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5913. echo ' rewrite ^/.well-known/host-meta.json /public.php?service=host-meta-json last;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5914. echo ' rewrite ^/.well-known/carddav /remote.php/carddav/ redirect;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5915. echo ' rewrite ^/.well-known/caldav /remote.php/caldav/ redirect;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5916. echo ' rewrite ^(/core/doc/[^\/]+/)$ $1/index.html;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5917. echo ' try_files $uri $uri/ index.php;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5918. echo ' }' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5919. echo '' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5920. echo ' location ~ ^(.+?\.php)(/.*)?$ {' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5921. echo ' try_files $1 =404;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5922. echo ' fastcgi_split_path_info ^(.+\.php)(/.+)$;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5923. echo ' fastcgi_pass unix:/var/run/php5-fpm.sock;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5924. echo ' fastcgi_index index.php;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5925. echo ' include fastcgi_params;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5926. echo ' fastcgi_param SCRIPT_FILENAME $document_root$1;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5927. echo ' fastcgi_param PATH_INFO $2;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5928. echo ' fastcgi_param HTTPS off;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5929. echo ' }' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5930. echo '' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5931. echo ' # Optional: set long EXPIRES header on static assets' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5932. echo ' location ~* ^.+\.(jpg|jpeg|gif|bmp|ico|png|css|js|swf)$ {' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5933. echo ' expires 30d;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5934. echo " # Optional: Don't log access to assets" >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5935. echo ' access_log off;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5936. echo ' }' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5937. echo '}' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5938. configure_php
  5939. if [[ $ONION_ONLY == "no" ]]; then
  5940. if [ ! -f /etc/ssl/certs/$OWNCLOUD_DOMAIN_NAME.dhparam ]; then
  5941. if [[ $LETSENCRYPT_ENABLED != "yes" ]]; then
  5942. ${PROJECT_NAME}-addcert -h $OWNCLOUD_DOMAIN_NAME --dhkey $DH_KEYLENGTH
  5943. else
  5944. ${PROJECT_NAME}-addcert -e $OWNCLOUD_DOMAIN_NAME -s $LETSENCRYPT_SERVER --dhkey $DH_KEYLENGTH --email $MY_EMAIL_ADDRESS
  5945. fi
  5946. check_certificates $OWNCLOUD_DOMAIN_NAME
  5947. fi
  5948. fi
  5949. # Ensure that the database gets backed up locally, if remote
  5950. # backups are not being used
  5951. backup_databases_script_header
  5952. echo '' >> /usr/bin/backupdatabases
  5953. echo $'# Backup Owncloud database' >> /usr/bin/backupdatabases
  5954. echo 'TEMPFILE=/root/owncloud.sql' >> /usr/bin/backupdatabases
  5955. echo 'DAILYFILE=/var/backups/owncloud_daily.sql' >> /usr/bin/backupdatabases
  5956. echo 'mysqldump --password="$MYSQL_PASSWORD" owncloud > $TEMPFILE' >> /usr/bin/backupdatabases
  5957. echo 'FILESIZE=$(stat -c%s $TEMPFILE)' >> /usr/bin/backupdatabases
  5958. echo 'if [ "$FILESIZE" -eq "0" ]; then' >> /usr/bin/backupdatabases
  5959. echo ' if [ -f $DAILYFILE ]; then' >> /usr/bin/backupdatabases
  5960. echo ' cp $DAILYFILE $TEMPFILE' >> /usr/bin/backupdatabases
  5961. echo '' >> /usr/bin/backupdatabases
  5962. echo ' # try to restore yesterdays database' >> /usr/bin/backupdatabases
  5963. echo ' mysql -u root --password="$MYSQL_PASSWORD" owncloud -o < $DAILYFILE' >> /usr/bin/backupdatabases
  5964. echo '' >> /usr/bin/backupdatabases
  5965. echo ' # Send a warning email' >> /usr/bin/backupdatabases
  5966. 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
  5967. echo ' else' >> /usr/bin/backupdatabases
  5968. echo ' # Send a warning email' >> /usr/bin/backupdatabases
  5969. echo ' echo "Unable to create a backup of the Owncloud database." | mail -s "Owncloud backup" $EMAIL' >> /usr/bin/backupdatabases
  5970. echo ' fi' >> /usr/bin/backupdatabases
  5971. echo 'else' >> /usr/bin/backupdatabases
  5972. echo ' chmod 600 $TEMPFILE' >> /usr/bin/backupdatabases
  5973. echo ' mv $TEMPFILE $DAILYFILE' >> /usr/bin/backupdatabases
  5974. echo '' >> /usr/bin/backupdatabases
  5975. echo ' # Make the backup readable only by root' >> /usr/bin/backupdatabases
  5976. echo ' chmod 600 $DAILYFILE' >> /usr/bin/backupdatabases
  5977. echo 'fi' >> /usr/bin/backupdatabases
  5978. nginx_ensite $OWNCLOUD_DOMAIN_NAME
  5979. OWNCLOUD_ONION_HOSTNAME=$(add_onion_service owncloud 80 ${OWNCLOUD_ONION_PORT})
  5980. systemctl restart php5-fpm
  5981. systemctl restart nginx
  5982. if ! grep -q "Owncloud onion domain" /home/$MY_USERNAME/README; then
  5983. echo "Owncloud onion domain: ${OWNCLOUD_ONION_HOSTNAME}" >> /home/$MY_USERNAME/README
  5984. echo '' >> /home/$MY_USERNAME/README
  5985. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
  5986. chmod 600 /home/$MY_USERNAME/README
  5987. fi
  5988. echo "Owncloud onion domain:${OWNCLOUD_ONION_HOSTNAME}" >> $COMPLETION_FILE
  5989. # update the dynamic DNS
  5990. CURRENT_DDNS_DOMAIN=$OWNCLOUD_DOMAIN_NAME
  5991. add_ddns_domain
  5992. echo "Owncloud domain:$OWNCLOUD_DOMAIN_NAME" >> $COMPLETION_FILE
  5993. echo 'install_owncloud' >> $COMPLETION_FILE
  5994. if [[ $SYSTEM_TYPE == "$VARIANT_CLOUD" ]]; then
  5995. install_owncloud_music_app
  5996. backup_to_friends_servers
  5997. intrusion_detection
  5998. split_gpg_key_into_fragments
  5999. # unmount any attached usb drive
  6000. if [ -d $USB_MOUNT ]; then
  6001. umount $USB_MOUNT
  6002. rm -rf $USB_MOUNT
  6003. fi
  6004. echo ''
  6005. echo "$OWNCLOUD_COMPLETION_MSG1"
  6006. echo "$OWNCLOUD_COMPLETION_MSG2"
  6007. exit 0
  6008. fi
  6009. }
  6010. function install_gogs {
  6011. 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
  6012. return
  6013. fi
  6014. if [ ! $GIT_DOMAIN_NAME ]; then
  6015. return
  6016. fi
  6017. export GOPATH=/home/git/go
  6018. systemctl set-environment GOPATH=/home/git/go
  6019. # update to the next commit
  6020. if [ -d /var/www/$GIT_DOMAIN_NAME ]; then
  6021. if grep -q "Gogs commit" $COMPLETION_FILE; then
  6022. CURRENT_GOGS_COMMIT=$(grep "Gogs commit" $COMPLETION_FILE | awk -F ':' '{print $2}')
  6023. if [[ "$CURRENT_GOGS_COMMIT" != "$GOGS_COMMIT" ]]; then
  6024. cd $GOPATH/src/github.com/gogits/gogs
  6025. git_pull $GIT_DOMAIN_REPO $GOGS_COMMIT
  6026. sed -i "s/Gogs commit.*/Gogs commit:$GOGS_COMMIT/g" $COMPLETION_FILE
  6027. go get -u ./...
  6028. if [ ! "$?" = "0" ]; then
  6029. exit 52792
  6030. fi
  6031. go build
  6032. if [ ! "$?" = "0" ]; then
  6033. exit 36226
  6034. fi
  6035. systemctl restart gogs
  6036. fi
  6037. else
  6038. echo "Gogs commit:$GOGS_COMMIT" >> $COMPLETION_FILE
  6039. fi
  6040. fi
  6041. if grep -Fxq "install_gogs" $COMPLETION_FILE; then
  6042. return
  6043. fi
  6044. # http://gogs.io/docs/installation/install_from_source.md
  6045. # add a gogs user account
  6046. adduser --disabled-login --gecos 'Gogs' git
  6047. # install Go
  6048. apt-get -y install golang libpam0g-dev
  6049. if ! grep -q "export GOPATH=/home/git/go" ~/.bashrc; then
  6050. echo 'export GOPATH=/home/git/go' >> ~/.bashrc
  6051. echo 'systemctl set-environment GOPATH=/home/git/go' >> ~/.bashrc
  6052. fi
  6053. if [ ! -d $GOPATH ]; then
  6054. mkdir -p $GOPATH
  6055. fi
  6056. go get -u $GO_PACKAGE_MANAGER_REPO
  6057. if [ ! "$?" = "0" ]; then
  6058. exit 479832
  6059. fi
  6060. # clone the repo
  6061. if [ ! -d $GOPATH/src/github.com/gogits ]; then
  6062. mkdir -p $GOPATH/src/github.com/gogits
  6063. fi
  6064. cd $GOPATH/src/github.com/gogits
  6065. git_clone $GIT_DOMAIN_REPO $GOPATH/src/github.com/gogits/gogs
  6066. cd gogs
  6067. git checkout $GOGS_COMMIT -b $GOGS_COMMIT
  6068. if ! grep -q "Gogs commit" $COMPLETION_FILE; then
  6069. echo "Gogs commit:$GOGS_COMMIT" >> $COMPLETION_FILE
  6070. else
  6071. sed -i "s/Gogs commit.*/Gogs commit:$GOGS_COMMIT/g" $COMPLETION_FILE
  6072. fi
  6073. # install
  6074. go get -u ./...
  6075. go build
  6076. if [ ! "$?" = "0" ]; then
  6077. exit 546750
  6078. fi
  6079. install_mariadb
  6080. get_mariadb_password
  6081. get_mariadb_git_admin_password
  6082. if [ ! $GIT_ADMIN_PASSWORD ]; then
  6083. if [ -f $IMAGE_PASSWORD_FILE ]; then
  6084. GIT_ADMIN_PASSWORD="$(printf `cat $IMAGE_PASSWORD_FILE`)"
  6085. else
  6086. GIT_ADMIN_PASSWORD="$(openssl rand -base64 32)"
  6087. fi
  6088. fi
  6089. if ! grep -q $"Gogs admin user password" /home/$MY_USERNAME/README; then
  6090. echo '' >> /home/$MY_USERNAME/README
  6091. echo '' >> /home/$MY_USERNAME/README
  6092. echo 'Gogs' >> /home/$MY_USERNAME/README
  6093. echo '====' >> /home/$MY_USERNAME/README
  6094. echo $'Database type: MySql' >> /home/$MY_USERNAME/README
  6095. echo $'Database host: 127.0.0.1:3306' >> /home/$MY_USERNAME/README
  6096. echo $'Database user: root' >> /home/$MY_USERNAME/README
  6097. echo $"Database password: $MARIADB_PASSWORD" >> /home/$MY_USERNAME/README
  6098. echo $'Database name: gogs' >> /home/$MY_USERNAME/README
  6099. echo $'Gogs admin user: gogsadmin' >> /home/$MY_USERNAME/README
  6100. echo $"Gogs admin user password: $GIT_ADMIN_PASSWORD" >> /home/$MY_USERNAME/README
  6101. echo $"Gogs admin user email: $MY_EMAIL_ADDRESS" >> /home/$MY_USERNAME/README
  6102. echo '' >> /home/$MY_USERNAME/README
  6103. echo $'Install Steps For First-time Run:' >> /home/$MY_USERNAME/README
  6104. echo $'Leave email service settings empty' >> /home/$MY_USERNAME/README
  6105. echo $'Check "Enable Register Confirmation"' >> /home/$MY_USERNAME/README
  6106. echo $'Check "Enable Mail Notification"' >> /home/$MY_USERNAME/README
  6107. echo '' >> /home/$MY_USERNAME/README
  6108. echo $'After the initial install edit /home/git/go/src/github.com/gogits/gogs/custom/conf/app.ini' >> /home/$MY_USERNAME/README
  6109. echo $'and within the [server] section set:' >> /home/$MY_USERNAME/README
  6110. echo " DOMAIN = $GIT_DOMAIN_NAME" >> /home/$MY_USERNAME/README
  6111. echo " ROOT_URL = http://$GIT_DOMAIN_NAME/" >> /home/$MY_USERNAME/README
  6112. echo " SSH_PORT = $SSH_PORT" >> /home/$MY_USERNAME/README
  6113. echo $'If you want to disable new account registrations then append the following:' >> /home/$MY_USERNAME/README
  6114. echo ' [service]' >> /home/$MY_USERNAME/README
  6115. echo ' DISABLE_REGISTRATION = true' >> /home/$MY_USERNAME/README
  6116. echo $'Then restart with:' >> /home/$MY_USERNAME/README
  6117. echo ' systemctl restart gogs' >> /home/$MY_USERNAME/README
  6118. echo '' >> /home/$MY_USERNAME/README
  6119. echo $"Note that there's a usability/security trade-off made here." >> /home/$MY_USERNAME/README
  6120. echo $"In order to allow git clone via http we don't redirect everything" >> /home/$MY_USERNAME/README
  6121. echo $'over https. Instead only critical things such as user login,' >> /home/$MY_USERNAME/README
  6122. echo $'settings and admin are encrypted.' >> /home/$MY_USERNAME/README
  6123. echo $'There are also potential security issues with cloning/pulling/pushing' >> /home/$MY_USERNAME/README
  6124. echo $'code over http, since a determined adversary could inject malware' >> /home/$MY_USERNAME/README
  6125. echo $'into the stream as it passes, so beware.' >> /home/$MY_USERNAME/README
  6126. echo $'If you have a bought domain and a non-self signed cert then you' >> /home/$MY_USERNAME/README
  6127. echo $"should change /etc/nginx/sites-available/$GIT_DOMAIN_NAME to redirect everything over https." >> /home/$MY_USERNAME/README
  6128. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
  6129. chmod 600 /home/$MY_USERNAME/README
  6130. fi
  6131. create_database gogs "$GOGS_ADMIN_PASSWORD"
  6132. chmod 600 /home/git/go/src/github.com/gogits/gogs/custom/conf/app.ini
  6133. chown -R git:git /home/git
  6134. cp $GOPATH/src/github.com/gogits/gogs/scripts/systemd/gogs.service /etc/systemd/system
  6135. sed -i 's|#After=mysqld.service|After=mysqld.service|g' /etc/systemd/system/gogs.service
  6136. sed -i "s|WorkingDirectory=.*|WorkingDirectory=$GOPATH/src/github.com/gogits/gogs|g" /etc/systemd/system/gogs.service
  6137. sed -i "s|ExecStart=.*|ExecStart=$GOPATH/src/github.com/gogits/gogs/gogs web|g" /etc/systemd/system/gogs.service
  6138. sed -i "s|Environment.*|Environment=\"USER=git\" \"HOME=/home/git\" \"GOPATH=/home/git/go\"|g" /etc/systemd/system/gogs.service
  6139. systemctl enable gogs
  6140. systemctl daemon-reload
  6141. systemctl restart gogs
  6142. if [ ! -d /var/www/$GIT_DOMAIN_NAME ]; then
  6143. mkdir /var/www/$GIT_DOMAIN_NAME
  6144. fi
  6145. if [ -d /var/www/$GIT_DOMAIN_NAME/htdocs ]; then
  6146. rm -rf /var/www/$GIT_DOMAIN_NAME/htdocs
  6147. fi
  6148. if [[ $ONION_ONLY == "no" ]]; then
  6149. echo 'server {' > /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6150. echo ' listen 80;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6151. echo " server_name $GIT_DOMAIN_NAME;" >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6152. echo ' access_log off;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6153. echo " error_log /var/log/nginx/${GIT_DOMAIN_NAME}_error.log $WEBSERVER_LOG_LEVEL;" >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6154. echo ' add_header X-Frame-Options DENY;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6155. echo ' add_header X-Content-Type-Options nosniff;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6156. echo ' limit_conn conn_limit_per_ip 10;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6157. echo ' limit_req zone=req_limit_per_ip burst=10 nodelay;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6158. echo ' location / {' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6159. echo ' proxy_pass http://localhost:3000;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6160. echo ' }' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6161. echo ' location ^~ /user/ {' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6162. echo ' rewrite ^ https://$server_name$request_uri?;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6163. echo ' }' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6164. echo ' location ^~ /admin/ {' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6165. echo ' rewrite ^ https://$server_name$request_uri?;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6166. echo ' }' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6167. echo '}' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6168. echo '' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6169. echo 'server {' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6170. echo ' listen 443 ssl;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6171. echo " root /var/www/$GIT_DOMAIN_NAME/htdocs;" >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6172. echo " server_name $GIT_DOMAIN_NAME;" >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6173. echo ' access_log off;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6174. echo " error_log /var/log/nginx/${GIT_DOMAIN_NAME}_error.log $WEBSERVER_LOG_LEVEL;" >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6175. echo '' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6176. echo ' limit_conn conn_limit_per_ip 10;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6177. echo ' limit_req zone=req_limit_per_ip burst=10 nodelay;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6178. echo '' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6179. echo ' ssl on;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6180. echo " ssl_certificate /etc/ssl/certs/$GIT_DOMAIN_NAME.crt;" >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6181. echo " ssl_certificate_key /etc/ssl/private/$GIT_DOMAIN_NAME.key;" >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6182. echo " ssl_dhparam /etc/ssl/certs/$GIT_DOMAIN_NAME.dhparam;" >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6183. echo '' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6184. echo ' ssl_session_timeout 60m;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6185. echo ' ssl_prefer_server_ciphers on;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6186. echo " ssl_protocols $SSL_PROTOCOLS; # not possible to do exclusive" >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6187. echo " ssl_ciphers '$SSL_CIPHERS';" >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6188. echo ' add_header X-Frame-Options DENY;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6189. echo ' add_header X-Content-Type-Options nosniff;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6190. echo ' add_header Strict-Transport-Security max-age=0;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6191. echo '' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6192. echo ' location / {' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6193. echo ' proxy_pass http://localhost:3000;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6194. echo ' }' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6195. echo '' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6196. echo ' client_max_body_size 10G; # set max upload size' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6197. echo ' client_body_buffer_size 128k;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6198. echo ' fastcgi_buffers 64 4K;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6199. echo '' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6200. echo ' error_page 403 /core/templates/403.php;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6201. echo ' error_page 404 /core/templates/404.php;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6202. echo '' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6203. echo ' location = /robots.txt {' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6204. echo ' allow all;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6205. echo ' log_not_found off;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6206. echo ' access_log off;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6207. echo ' }' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6208. echo '}' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6209. echo '' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6210. else
  6211. echo -n '' > /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6212. fi
  6213. echo 'server {' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6214. echo " listen 127.0.0.1:${GIT_ONION_PORT} default_server;" >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6215. echo " root /var/www/$GIT_DOMAIN_NAME/htdocs;" >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6216. echo " server_name $GIT_DOMAIN_NAME;" >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6217. echo ' access_log off;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6218. echo " error_log /var/log/nginx/${GIT_DOMAIN_NAME}_error.log $WEBSERVER_LOG_LEVEL;" >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6219. echo '' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6220. echo ' limit_conn conn_limit_per_ip 10;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6221. echo ' limit_req zone=req_limit_per_ip burst=10 nodelay;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6222. echo '' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6223. echo ' add_header X-Frame-Options DENY;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6224. echo ' add_header X-Content-Type-Options nosniff;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6225. echo ' add_header Strict-Transport-Security max-age=0;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6226. echo '' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6227. echo ' location / {' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6228. echo ' proxy_pass http://localhost:3000;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6229. echo ' }' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6230. echo '' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6231. echo ' client_max_body_size 10G; # set max upload size' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6232. echo ' client_body_buffer_size 128k;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6233. echo ' fastcgi_buffers 64 4K;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6234. echo '' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6235. echo ' error_page 403 /core/templates/403.php;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6236. echo ' error_page 404 /core/templates/404.php;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6237. echo '' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6238. echo ' location = /robots.txt {' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6239. echo ' allow all;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6240. echo ' log_not_found off;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6241. echo ' access_log off;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6242. echo ' }' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6243. echo '}' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6244. configure_php
  6245. if [[ $ONION_ONLY == "no" ]]; then
  6246. if [ ! -f /etc/ssl/certs/$GIT_DOMAIN_NAME.dhparam ]; then
  6247. if [[ $LETSENCRYPT_ENABLED != "yes" ]]; then
  6248. ${PROJECT_NAME}-addcert -h $GIT_DOMAIN_NAME --dhkey $DH_KEYLENGTH
  6249. else
  6250. ${PROJECT_NAME}-addcert -e $GIT_DOMAIN_NAME -s $LETSENCRYPT_SERVER --dhkey $DH_KEYLENGTH --email $MY_EMAIL_ADDRESS
  6251. fi
  6252. check_certificates $GIT_DOMAIN_NAME
  6253. fi
  6254. fi
  6255. nginx_ensite $GIT_DOMAIN_NAME
  6256. if [ ! -d /var/lib/tor ]; then
  6257. echo $'No Tor installation found. Gogs onion site cannot be configured.'
  6258. exit 877367
  6259. fi
  6260. if ! grep -q "hidden_service_gogs" /etc/tor/torrc; then
  6261. echo 'HiddenServiceDir /var/lib/tor/hidden_service_gogs/' >> /etc/tor/torrc
  6262. echo "HiddenServicePort 80 127.0.0.1:${GIT_ONION_PORT}" >> /etc/tor/torrc
  6263. echo "HiddenServicePort 9418 127.0.0.1:9418" >> /etc/tor/torrc
  6264. echo $'Added onion site for Gogs'
  6265. fi
  6266. systemctl restart tor
  6267. wait_for_onion_service 'gogs'
  6268. GIT_ONION_HOSTNAME=$(cat /var/lib/tor/hidden_service_gogs/hostname)
  6269. systemctl restart php5-fpm
  6270. systemctl restart nginx
  6271. if ! grep -q "Gogs onion domain" /home/$MY_USERNAME/README; then
  6272. echo "Gogs onion domain: ${GIT_ONION_HOSTNAME}" >> /home/$MY_USERNAME/README
  6273. echo '' >> /home/$MY_USERNAME/README
  6274. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
  6275. chmod 600 /home/$MY_USERNAME/README
  6276. fi
  6277. if ! grep -q "Gogs onion domain" $COMPLETION_FILE; then
  6278. echo "Gogs onion domain:${GIT_ONION_HOSTNAME}" >> $COMPLETION_FILE
  6279. fi
  6280. # update the dynamic DNS
  6281. CURRENT_DDNS_DOMAIN=$GIT_DOMAIN_NAME
  6282. add_ddns_domain
  6283. echo "Gogs domain:$GIT_DOMAIN_NAME" >> $COMPLETION_FILE
  6284. echo 'install_gogs' >> $COMPLETION_FILE
  6285. }
  6286. function tox_avahi {
  6287. if [[ $SYSTEM_TYPE != "$VARIANT_MESH" ]]; then
  6288. return
  6289. fi
  6290. if grep -Fxq "tox_avahi" $COMPLETION_FILE; then
  6291. return
  6292. fi
  6293. if [ ! -d /etc/avahi ]; then
  6294. echo $'tox_avahi: avahi is not installed'
  6295. exit 87359
  6296. fi
  6297. # install a command to obtain the Tox ID
  6298. cd $INSTALL_DIR
  6299. git_clone $TOXID_REPO $INSTALL_DIR/toxid
  6300. if [ ! -d $INSTALL_DIR/toxid ]; then
  6301. exit 63921
  6302. fi
  6303. cd $INSTALL_DIR/toxid
  6304. make
  6305. if [ ! "$?" = "0" ]; then
  6306. exit 58432
  6307. fi
  6308. make install
  6309. toxavahi
  6310. # publish regularly
  6311. if ! grep -q "toxavahi" /etc/crontab; then
  6312. echo "* * * * * root toxavahi > /dev/null" >> /etc/crontab
  6313. fi
  6314. systemctl restart avahi-daemon
  6315. echo 'tox_avahi' >> $COMPLETION_FILE
  6316. }
  6317. function install_tox_node {
  6318. 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
  6319. return
  6320. fi
  6321. # update to the next commit
  6322. if [ -d $INSTALL_DIR/toxcore ]; then
  6323. if grep -q "toxcore commit" $COMPLETION_FILE; then
  6324. CURRENT_TOX_COMMIT=$(grep "toxcore commit" $COMPLETION_FILE | awk -F ':' '{print $2}')
  6325. if [[ "$CURRENT_TOX_COMMIT" != "$TOX_COMMIT" ]]; then
  6326. cd $INSTALL_DIR/toxcore
  6327. git_pull $TOX_REPO $TOX_COMMIT
  6328. sed -i "s/toxcore commit.*/toxcore commit:$TOX_COMMIT/g" $COMPLETION_FILE
  6329. autoreconf -i
  6330. ./configure --enable-daemon
  6331. make
  6332. make install
  6333. systemctl restart tox-bootstrapd.service
  6334. fi
  6335. else
  6336. echo "toxcore commit:$TOX_COMMIT" >> $COMPLETION_FILE
  6337. fi
  6338. fi
  6339. if grep -Fxq "install_tox_node" $COMPLETION_FILE; then
  6340. return
  6341. fi
  6342. # toxcore
  6343. apt-get -y install build-essential libtool autotools-dev
  6344. apt-get -y install automake checkinstall check git yasm
  6345. apt-get -y install libsodium13 libsodium-dev libcap2-bin
  6346. apt-get -y install libconfig9 libconfig-dev
  6347. cd $INSTALL_DIR
  6348. git_clone $TOX_REPO $INSTALL_DIR/toxcore
  6349. cd $INSTALL_DIR/toxcore
  6350. git checkout $TOX_COMMIT -b $TOX_COMMIT
  6351. if ! grep -q "toxcore commit" $COMPLETION_FILE; then
  6352. echo "toxcore commit:$TOX_COMMIT" >> $COMPLETION_FILE
  6353. else
  6354. sed -i "s/toxcore commit.*/toxcore commit:$TOX_COMMIT/g" $COMPLETION_FILE
  6355. fi
  6356. autoreconf -i
  6357. ./configure --enable-daemon
  6358. if [ ! "$?" = "0" ]; then
  6359. exit 78467
  6360. fi
  6361. make
  6362. if [ ! "$?" = "0" ]; then
  6363. exit 84562
  6364. fi
  6365. make install
  6366. cp /usr/local/lib/libtoxcore* /usr/lib/
  6367. if [ ! -f /usr/local/bin/tox-bootstrapd ]; then
  6368. echo $"File not found /usr/local/bin/tox-bootstrapd"
  6369. exit 73862
  6370. fi
  6371. 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
  6372. chmod 700 /var/lib/tox-bootstrapd
  6373. if [ ! -f $INSTALL_DIR/toxcore/other/bootstrap_daemon/tox-bootstrapd.conf ]; then
  6374. echo $"File not found $INSTALL_DIR/toxcore/other/bootstrap_daemon/tox-bootstrapd.conf"
  6375. exit 476835
  6376. fi
  6377. # remove Maildir
  6378. if [ -d /var/lib/tox-bootstrapd/Maildir ]; then
  6379. rm -rf /var/lib/tox-bootstrapd/Maildir
  6380. fi
  6381. # create configuration file
  6382. echo "port = $TOX_PORT" > /etc/tox-bootstrapd.conf
  6383. echo 'keys_file_path = "/var/lib/tox-bootstrapd/keys"' >> /etc/tox-bootstrapd.conf
  6384. echo 'pid_file_path = "/var/run/tox-bootstrapd/tox-bootstrapd.pid"' >> /etc/tox-bootstrapd.conf
  6385. echo 'enable_ipv6 = true' >> /etc/tox-bootstrapd.conf
  6386. echo 'enable_ipv4_fallback = true' >> /etc/tox-bootstrapd.conf
  6387. echo 'enable_lan_discovery = true' >> /etc/tox-bootstrapd.conf
  6388. echo 'enable_tcp_relay = true' >> /etc/tox-bootstrapd.conf
  6389. echo "tcp_relay_ports = [443, 3389, $TOX_PORT]" >> /etc/tox-bootstrapd.conf
  6390. echo 'enable_motd = true' >> /etc/tox-bootstrapd.conf
  6391. echo 'motd = "tox-bootstrapd"' >> /etc/tox-bootstrapd.conf
  6392. if [ $TOX_NODES ]; then
  6393. echo 'bootstrap_nodes = (' >> /etc/tox-bootstrapd.conf
  6394. toxcount=0
  6395. while [ "x${TOX_NODES[toxcount]}" != "x" ]
  6396. do
  6397. toxval_ipv4=$(echo $TOX_NODES[toxcount] | awk -F ',' '{print $1}')
  6398. toxval_ipv6=$(echo $TOX_NODES[toxcount] | awk -F ',' '{print $2}')
  6399. toxval_port=$(echo $TOX_NODES[toxcount] | awk -F ',' '{print $3}')
  6400. toxval_pubkey=$(echo $TOX_NODES[toxcount] | awk -F ',' '{print $4}')
  6401. toxval_maintainer=$(echo $TOX_NODES[toxcount] | awk -F ',' '{print $5}')
  6402. echo "{ // $toxval_maintainer" >> /etc/tox-bootstrapd.conf
  6403. if [[ $toxval_ipv6 != 'NONE' ]]; then
  6404. echo " address = \"$toxval_ipv6\"" >> /etc/tox-bootstrapd.conf
  6405. else
  6406. echo " address = \"$toxval_ipv4\"" >> /etc/tox-bootstrapd.conf
  6407. fi
  6408. echo " port = $toxval_port" >> /etc/tox-bootstrapd.conf
  6409. echo " public_key = \"$toxval_pubkey\"" >> /etc/tox-bootstrapd.conf
  6410. toxcount=$(( $toxcount + 1 ))
  6411. if [ "x${TOX_NODES[toxcount]}" != "x" ]; then
  6412. echo "}," >> /etc/tox-bootstrapd.conf
  6413. else
  6414. echo "}" >> /etc/tox-bootstrapd.conf
  6415. fi
  6416. done
  6417. echo ')' >> /etc/tox-bootstrapd.conf
  6418. fi
  6419. if [ ! -f $INSTALL_DIR/toxcore/other/bootstrap_daemon/tox-bootstrapd.service ]; then
  6420. echo $"File not found $INSTALL_DIR/toxcore/other/bootstrap_daemon/tox-bootstrapd.service"
  6421. exit 7359
  6422. fi
  6423. cp $INSTALL_DIR/toxcore/other/bootstrap_daemon/tox-bootstrapd.service /etc/systemd/system/
  6424. enable_ipv6
  6425. systemctl daemon-reload
  6426. systemctl enable tox-bootstrapd.service
  6427. systemctl start tox-bootstrapd.service
  6428. if [ ! "$?" = "0" ]; then
  6429. systemctl status tox-bootstrapd.service
  6430. exit 5846
  6431. fi
  6432. TOX_ONION_HOSTNAME=$(add_onion_service tox ${TOX_PORT} ${TOX_PORT})
  6433. if ! grep -q "tox onion domain" $COMPLETION_FILE; then
  6434. echo "tox onion domain:${TOX_ONION_HOSTNAME}" >> $COMPLETION_FILE
  6435. else
  6436. sed -i "s|tox onion domain.*|tox onion domain:${TOX_ONION_HOSTNAME}|g" $COMPLETION_FILE
  6437. fi
  6438. systemctl restart tox-bootstrapd.service
  6439. TOX_PUBLIC_KEY=$(cat /var/log/syslog | grep tox | grep "Public Key" | awk -F ' ' '{print $8}' | tail -1)
  6440. if [ ${#TOX_PUBLIC_KEY} -lt 30 ]; then
  6441. echo $'Could not obtain the tox node public key'
  6442. exit 6529
  6443. fi
  6444. # save the public key for later reference
  6445. echo "$TOX_PUBLIC_KEY" > $TOX_BOOTSTRAP_ID_FILE
  6446. configure_firewall_for_tox
  6447. if ! grep -q $"Your Tox node public key is" /home/$MY_USERNAME/README; then
  6448. echo '' >> /home/$MY_USERNAME/README
  6449. echo '' >> /home/$MY_USERNAME/README
  6450. echo 'Tox' >> /home/$MY_USERNAME/README
  6451. echo '===' >> /home/$MY_USERNAME/README
  6452. echo $"tox onion domain: ${TOX_ONION_HOSTNAME}" >> /home/$MY_USERNAME/README
  6453. echo $"Your Tox node public key is: $TOX_PUBLIC_KEY" >> /home/$MY_USERNAME/README
  6454. echo $'In the Toxic client you can connect to it with:' >> /home/$MY_USERNAME/README
  6455. echo " /connect $DEFAULT_DOMAIN_NAME.local $TOX_PORT $TOX_PUBLIC_KEY" >> /home/$MY_USERNAME/README
  6456. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
  6457. chmod 600 /home/$MY_USERNAME/README
  6458. fi
  6459. echo 'install_tox_node' >> $COMPLETION_FILE
  6460. }
  6461. function install_tox_client {
  6462. 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
  6463. return
  6464. fi
  6465. # update to the next commit
  6466. if [ -d $INSTALL_DIR/toxic ]; then
  6467. if grep -q "Toxic commit" $COMPLETION_FILE; then
  6468. CURRENT_TOXIC_COMMIT=$(grep "Toxic commit" $COMPLETION_FILE | awk -F ':' '{print $2}')
  6469. if [[ "$CURRENT_TOXIC_COMMIT" != "$TOXIC_COMMIT" ]]; then
  6470. cd $INSTALL_DIR/toxic
  6471. git_pull $TOXIC_REPO $TOXIC_COMMIT
  6472. sed -i "s/Toxic commit.*/Toxic commit:$TOXIC_COMMIT/g" $COMPLETION_FILE
  6473. make
  6474. make install
  6475. fi
  6476. else
  6477. echo "Toxic commit:$TOXIC_COMMIT" >> $COMPLETION_FILE
  6478. fi
  6479. fi
  6480. if grep -Fxq "install_tox_client" $COMPLETION_FILE; then
  6481. return
  6482. fi
  6483. apt-get -y install libncursesw5-dev libconfig-dev libqrencode-dev libcurl4-openssl-dev
  6484. cd $INSTALL_DIR
  6485. git_clone $TOXIC_REPO $INSTALL_DIR/toxic
  6486. cd $INSTALL_DIR/toxic
  6487. git checkout $TOXIC_COMMIT -b $TOXIC_COMMIT
  6488. if ! grep -q "Toxic commit" $COMPLETION_FILE; then
  6489. echo "Toxic commit:$TOXIC_COMMIT" >> $COMPLETION_FILE
  6490. else
  6491. sed -i "s/Toxic commit.*/Toxic commit:$TOXIC_COMMIT/g" $COMPLETION_FILE
  6492. fi
  6493. make
  6494. if [ ! -f $INSTALL_DIR/toxic/build/toxic ]; then
  6495. exit 74872
  6496. fi
  6497. make install
  6498. su -c "echo 'n
  6499. /nick $MY_USERNAME
  6500. /exit
  6501. ' | /usr/bin/toxic -d" - $MY_USERNAME
  6502. echo 'install_tox_client' >> $COMPLETION_FILE
  6503. }
  6504. function install_xmpp {
  6505. 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
  6506. return
  6507. fi
  6508. if grep -Fxq "install_xmpp" $COMPLETION_FILE; then
  6509. return
  6510. fi
  6511. apt-get -y install lua-sec lua-bitop
  6512. apt-get -y install prosody prosody-modules mercurial
  6513. if [ ! -d /etc/prosody ]; then
  6514. echo $"ERROR: prosody does not appear to have installed. $CHECK_MESSAGE"
  6515. exit 52
  6516. fi
  6517. # obtain the prosody modules
  6518. cd $INSTALL_DIR
  6519. hg clone https://hg.prosody.im/prosody-modules/ prosody-modules
  6520. if [ ! -d $INSTALL_DIR/prosody-modules/mod_onions ]; then
  6521. echo $'mod_onions prosody module could not be found'
  6522. exit 73254
  6523. fi
  6524. # install the onions module
  6525. cp $INSTALL_DIR/prosody-modules/mod_onions/mod_onions.lua /usr/lib/prosody/modules/mod_onions.lua
  6526. if [ ! -f /usr/lib/prosody/modules/mod_onions.lua ]; then
  6527. echo $'mod_onions.lua could not be copied to the prosody modules directory'
  6528. exit 63952
  6529. fi
  6530. # create a certificate
  6531. if [ ! -f /etc/ssl/certs/xmpp.dhparam ]; then
  6532. ${PROJECT_NAME}-addcert -h xmpp --dhkey $DH_KEYLENGTH
  6533. check_certificates xmpp
  6534. fi
  6535. chown prosody:prosody /etc/ssl/private/xmpp.key
  6536. chown prosody:prosody /etc/ssl/certs/xmpp.*
  6537. cp -a /etc/prosody/conf.avail/example.com.cfg.lua /etc/prosody/conf.avail/xmpp.cfg.lua
  6538. sed -i 's|/etc/prosody/certs/example.com.key|/etc/ssl/private/xmpp.key|g' /etc/prosody/conf.avail/xmpp.cfg.lua
  6539. sed -i 's|/etc/prosody/certs/example.com.crt|/etc/ssl/certs/xmpp.crt|g' /etc/prosody/conf.avail/xmpp.cfg.lua
  6540. if ! grep -q "xmpp.dhparam" /etc/prosody/conf.avail/xmpp.cfg.lua; then
  6541. sed -i '/certificate =/a\ dhparam = "/etc/ssl/certs/xmpp.dhparam";' /etc/prosody/conf.avail/xmpp.cfg.lua
  6542. fi
  6543. if ! grep -q 'options = {"no_sslv2", "no_sslv3" }' /etc/prosody/conf.avail/xmpp.cfg.lua; then
  6544. sed -i '/certificate =/a\ options = {"no_sslv2", "no_sslv3" };' /etc/prosody/conf.avail/xmpp.cfg.lua
  6545. fi
  6546. if ! grep -q 'ciphers =' /etc/prosody/conf.avail/xmpp.cfg.lua; then
  6547. sed -i "/certificate =/a\ ciphers = $XMPP_CIPHERS;" /etc/prosody/conf.avail/xmpp.cfg.lua
  6548. fi
  6549. if ! grep -q 'depth = "1";' /etc/prosody/conf.avail/xmpp.cfg.lua; then
  6550. sed -i '/certificate =/a\ depth = "1";' /etc/prosody/conf.avail/xmpp.cfg.lua
  6551. fi
  6552. if ! grep -q 'curve =' /etc/prosody/conf.avail/xmpp.cfg.lua; then
  6553. sed -i "/certificate =/a\ curve = $XMPP_ECC_CURVE;" /etc/prosody/conf.avail/xmpp.cfg.lua
  6554. fi
  6555. sed -i "s/example.com/$DEFAULT_DOMAIN_NAME/g" /etc/prosody/conf.avail/xmpp.cfg.lua
  6556. sed -i 's/enabled = false -- Remove this line to enable this host//g' /etc/prosody/conf.avail/xmpp.cfg.lua
  6557. if ! grep -q "modules_enabled" /etc/prosody/conf.avail/xmpp.cfg.lua; then
  6558. echo '' >> /etc/prosody/conf.avail/xmpp.cfg.lua
  6559. echo 'modules_enabled = {' >> /etc/prosody/conf.avail/xmpp.cfg.lua
  6560. echo ' "bosh"; -- Enable mod_bosh' >> /etc/prosody/conf.avail/xmpp.cfg.lua
  6561. echo ' "tls"; -- Enable mod_tls' >> /etc/prosody/conf.avail/xmpp.cfg.lua
  6562. echo ' "saslauth"; -- Enable mod_saslauth' >> /etc/prosody/conf.avail/xmpp.cfg.lua
  6563. echo ' "onions"; -- Enable chat via onion service' >> /etc/prosody/conf.avail/xmpp.cfg.lua
  6564. echo '}' >> /etc/prosody/conf.avail/xmpp.cfg.lua
  6565. echo '' >> /etc/prosody/conf.avail/xmpp.cfg.lua
  6566. echo 'c2s_require_encryption = true' >> /etc/prosody/conf.avail/xmpp.cfg.lua
  6567. echo 's2s_require_encryption = true' >> /etc/prosody/conf.avail/xmpp.cfg.lua
  6568. echo 'allow_unencrypted_plain_auth = false' >> /etc/prosody/conf.avail/xmpp.cfg.lua
  6569. fi
  6570. ln -sf /etc/prosody/conf.avail/xmpp.cfg.lua /etc/prosody/conf.d/xmpp.cfg.lua
  6571. sed -i 's|/etc/prosody/certs/localhost.key|/etc/ssl/private/xmpp.key|g' /etc/prosody/prosody.cfg.lua
  6572. sed -i 's|/etc/prosody/certs/localhost.crt|/etc/ssl/certs/xmpp.crt|g' /etc/prosody/prosody.cfg.lua
  6573. if ! grep -q "xmpp.dhparam" /etc/prosody/prosody.cfg.lua; then
  6574. sed -i '/certificate =/a\ dhparam = "/etc/ssl/certs/xmpp.dhparam";' /etc/prosody/prosody.cfg.lua
  6575. fi
  6576. if ! grep -q 'options = {"no_sslv2", "no_sslv3" }' /etc/prosody/prosody.cfg.lua; then
  6577. sed -i '/certificate =/a\ options = {"no_sslv2", "no_sslv3" };' /etc/prosody/prosody.cfg.lua
  6578. fi
  6579. if ! grep -q 'ciphers =' /etc/prosody/prosody.cfg.lua; then
  6580. sed -i "/certificate =/a\ ciphers = $XMPP_CIPHERS;" /etc/prosody/prosody.cfg.lua
  6581. fi
  6582. if ! grep -q 'depth = "1";' /etc/prosody/prosody.cfg.lua; then
  6583. sed -i '/certificate =/a\ depth = "1";' /etc/prosody/prosody.cfg.lua
  6584. fi
  6585. if ! grep -q 'curve =' /etc/prosody/prosody.cfg.lua; then
  6586. sed -i "/certificate =/a\ curve = $XMPP_ECC_CURVE;" /etc/prosody/prosody.cfg.lua
  6587. fi
  6588. sed -i 's/c2s_require_encryption = false/c2s_require_encryption = true/g' /etc/prosody/prosody.cfg.lua
  6589. if ! grep -q "s2s_require_encryption" /etc/prosody/prosody.cfg.lua; then
  6590. sed -i '/c2s_require_encryption/a\s2s_require_encryption = true' /etc/prosody/prosody.cfg.lua
  6591. fi
  6592. if ! grep -q "allow_unencrypted_plain_auth" /etc/prosody/prosody.cfg.lua; then
  6593. echo 'allow_unencrypted_plain_auth = false' >> /etc/prosody/conf.avail/xmpp.cfg.lua
  6594. fi
  6595. sed -i 's/--"bosh";/"bosh";/g' /etc/prosody/prosody.cfg.lua
  6596. sed -i 's/authentication = "internal_plain"/authentication = "internal_hashed"/g' /etc/prosody/prosody.cfg.lua
  6597. sed -i 's/enabled = false -- Remove this line to enable this host//g' /etc/prosody/prosody.cfg.lua
  6598. sed -i 's|key = "/etc/prosody/certs/example.com.key"|key = "/etc/ssl/private/xmpp.key"|g' /etc/prosody/prosody.cfg.lua
  6599. sed -i 's|certificate = "/etc/prosody/certs/example.com.crt"|certificate = "/etc/ssl/certs/xmpp.crt"|g' /etc/prosody/prosody.cfg.lua
  6600. sed -i "s/example.com/$DEFAULT_DOMAIN_NAME/g" /etc/prosody/prosody.cfg.lua
  6601. systemctl restart prosody
  6602. touch /home/$MY_USERNAME/README
  6603. if [ ! -d /var/lib/tor ]; then
  6604. echo $'No Tor installation found. XMPP onion site cannot be configured.'
  6605. exit 877367
  6606. fi
  6607. if ! grep -q "hidden_service_xmpp" /etc/tor/torrc; then
  6608. echo 'HiddenServiceDir /var/lib/tor/hidden_service_xmpp/' >> /etc/tor/torrc
  6609. echo "HiddenServicePort 5222 127.0.0.1:5222" >> /etc/tor/torrc
  6610. echo "HiddenServicePort 5269 127.0.0.1:5269" >> /etc/tor/torrc
  6611. echo $'Added onion site for XMPP chat'
  6612. fi
  6613. systemctl restart tor
  6614. wait_for_onion_service 'xmpp'
  6615. if [ ! -f /var/lib/tor/hidden_service_xmpp/hostname ]; then
  6616. echo $'XMPP onion site hostname not found'
  6617. exit 65349
  6618. fi
  6619. XMPP_ONION_HOSTNAME=$(cat /var/lib/tor/hidden_service_xmpp/hostname)
  6620. if ! grep -q "${XMPP_ONION_HOSTNAME}" /etc/prosody/conf.avail/xmpp.cfg.lua; then
  6621. echo '' >> /etc/prosody/conf.avail/xmpp.cfg.lua
  6622. echo "VirtualHost \"${XMPP_ONION_HOSTNAME}\"" >> /etc/prosody/conf.avail/xmpp.cfg.lua
  6623. echo ' modules_enabled = { "onions" };' >> /etc/prosody/conf.avail/xmpp.cfg.lua
  6624. fi
  6625. if ! grep -q "XMPP onion domain" $COMPLETION_FILE; then
  6626. echo "XMPP onion domain:${XMPP_ONION_HOSTNAME}" >> $COMPLETION_FILE
  6627. else
  6628. sed -i "s|XMPP onion domain.*|XMPP onion domain:${XMPP_ONION_HOSTNAME}|g" $COMPLETION_FILE
  6629. fi
  6630. if ! grep -q "Your XMPP password is" /home/$MY_USERNAME/README; then
  6631. if [ -f $IMAGE_PASSWORD_FILE ]; then
  6632. XMPP_PASSWORD="$(printf `cat $IMAGE_PASSWORD_FILE`)"
  6633. else
  6634. XMPP_PASSWORD="$(openssl rand -base64 8)"
  6635. fi
  6636. prosodyctl register $MY_USERNAME $DEFAULT_DOMAIN_NAME $XMPP_PASSWORD
  6637. echo '' >> /home/$MY_USERNAME/README
  6638. echo '' >> /home/$MY_USERNAME/README
  6639. echo $'XMPP' >> /home/$MY_USERNAME/README
  6640. echo '====' >> /home/$MY_USERNAME/README
  6641. echo $"XMPP onion domain: ${XMPP_ONION_HOSTNAME}" >> /home/$MY_USERNAME/README
  6642. echo $"Your XMPP password is: $XMPP_PASSWORD" >> /home/$MY_USERNAME/README
  6643. echo $'You can change it with: ' >> /home/$MY_USERNAME/README
  6644. echo '' >> /home/$MY_USERNAME/README
  6645. echo " prosodyctl passwd $MY_EMAIL_ADDRESS" >> /home/$MY_USERNAME/README
  6646. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
  6647. chmod 600 /home/$MY_USERNAME/README
  6648. fi
  6649. echo 'install_xmpp' >> $COMPLETION_FILE
  6650. }
  6651. function install_watchdog_script {
  6652. if grep -Fxq "install_watchdog_script" $COMPLETION_FILE; then
  6653. return
  6654. fi
  6655. echo '#!/bin/bash' > /usr/bin/$WATCHDOG_SCRIPT_NAME
  6656. echo 'LOGFILE=/var/log/keepon.log' >> /usr/bin/$WATCHDOG_SCRIPT_NAME
  6657. echo 'CURRENT_DATE=$(date)' >> /usr/bin/$WATCHDOG_SCRIPT_NAME
  6658. # application specific stuff is added later
  6659. chmod +x /usr/bin/$WATCHDOG_SCRIPT_NAME
  6660. if ! grep -q "/usr/bin/$WATCHDOG_SCRIPT_NAME" /etc/crontab; then
  6661. echo "* * * * * root /usr/bin/$WATCHDOG_SCRIPT_NAME" >> /etc/crontab
  6662. fi
  6663. echo 'install_watchdog_script' >> $COMPLETION_FILE
  6664. }
  6665. function install_irc_server {
  6666. 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
  6667. return
  6668. fi
  6669. if grep -Fxq "install_irc_server" $COMPLETION_FILE; then
  6670. return
  6671. fi
  6672. apt-get -y install ngircd
  6673. # for mesh peers also install an irc client
  6674. if [[ $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  6675. apt-get -y install irssi
  6676. fi
  6677. if [ ! -d /etc/ngircd ]; then
  6678. echo $"ERROR: ngircd does not appear to have installed. $CHECK_MESSAGE"
  6679. exit 53
  6680. fi
  6681. if [ ! -f /etc/ssl/certs/ngircd.dhparam ]; then
  6682. ${PROJECT_NAME}-addcert -h ngircd --dhkey $DH_KEYLENGTH
  6683. check_certificates ngircd
  6684. fi
  6685. DEFAULTDOMAIN=$DEFAULT_DOMAIN_NAME
  6686. if [[ $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  6687. DEFAULTDOMAIN="${DEFAULT_DOMAIN_NAME}.local"
  6688. fi
  6689. echo '**************************************************' > /etc/ngircd/motd
  6690. echo $'* F R E E D O M B O N E I R C *' >> /etc/ngircd/motd
  6691. echo '* *' >> /etc/ngircd/motd
  6692. echo $'* Freedom in the Cloud *' >> /etc/ngircd/motd
  6693. echo '**************************************************' >> /etc/ngircd/motd
  6694. sed -i 's|MotdFile = /etc/ngircd/ngircd.motd|MotdFile = /etc/ngircd/motd|g' /etc/ngircd/ngircd.conf
  6695. sed -i "s/irc@irc.example.com/$MY_EMAIL_ADDRESS/g" /etc/ngircd/ngircd.conf
  6696. sed -i "s/irc.example.net/$DEFAULTDOMAIN/g" /etc/ngircd/ngircd.conf
  6697. sed -i "s|Yet another IRC Server running on Debian GNU/Linux|IRC Server of $DEFAULTDOMAIN|g" /etc/ngircd/ngircd.conf
  6698. sed -i 's/;Password = wealllikedebian/Password =/g' /etc/ngircd/ngircd.conf
  6699. sed -i 's|;CertFile = /etc/ssl/certs/server.crt|CertFile = /etc/ssl/certs/ngircd.crt|g' /etc/ngircd/ngircd.conf
  6700. sed -i 's|;DHFile = /etc/ngircd/dhparams.pem|DHFile = /etc/ssl/certs/ngircd.dhparam|g' /etc/ngircd/ngircd.conf
  6701. sed -i 's|;KeyFile = /etc/ssl/private/server.key|KeyFile = /etc/ssl/private/ngircd.key|g' /etc/ngircd/ngircd.conf
  6702. sed -i "s/;Ports =.*/Ports = $IRC_PORT, $IRC_ONION_PORT/g" /etc/ngircd/ngircd.conf
  6703. sed -i "s/;Name = #ngircd/Name = #${PROJECT_NAME}/g" /etc/ngircd/ngircd.conf
  6704. sed -i "s/;Topic = Our ngircd testing channel/Topic = ${PROJECT_NAME} chat channel/g" /etc/ngircd/ngircd.conf
  6705. sed -i 's/;MaxUsers = 23/MaxUsers = 23/g' /etc/ngircd/ngircd.conf
  6706. sed -i "s|;KeyFile = /etc/ngircd/#chan.key|KeyFile = /etc/ngircd/#${PROJECT_NAME}.key|g" /etc/ngircd/ngircd.conf
  6707. sed -i "s/;CloakHost = cloaked.host/CloakHost = ${PROJECT_NAME}/g" /etc/ngircd/ngircd.conf
  6708. IRC_SALT="$(openssl rand -base64 32)"
  6709. if [ -f $IMAGE_PASSWORD_FILE ]; then
  6710. IRC_OPERATOR_PASSWORD="$(printf `cat $IMAGE_PASSWORD_FILE`)"
  6711. else
  6712. IRC_OPERATOR_PASSWORD="$(openssl rand -base64 8)"
  6713. fi
  6714. sed -i "s|;CloakHostSalt = abcdefghijklmnopqrstuvwxyz|CloakHostSalt = $IRC_SALT|g" /etc/ngircd/ngircd.conf
  6715. sed -i 's/;ConnectIPv4 = yes/ConnectIPv4 = yes/g' /etc/ngircd/ngircd.conf
  6716. sed -i 's/;MorePrivacy = no/MorePrivacy = yes/g' /etc/ngircd/ngircd.conf
  6717. sed -i 's/;RequireAuthPing = no/RequireAuthPing = no/g' /etc/ngircd/ngircd.conf
  6718. sed -i "s/;Name = TheOper/Name = $MY_USERNAME/g" /etc/ngircd/ngircd.conf
  6719. sed -i "s/;Password = ThePwd/Password = $IRC_OPERATOR_PASSWORD/g" /etc/ngircd/ngircd.conf
  6720. if [ $IRC_PASSWORD ]; then
  6721. sed -i "0,/RE/s/Password =.*/Password = $IRC_PASSWORD/" /etc/ngircd/ngircd.conf
  6722. fi
  6723. # If we are on a mesh then DNS is not available
  6724. if [[ $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  6725. sed -i "s/;DNS =.*/DNS = no/g" /etc/ngircd/ngircd.conf
  6726. fi
  6727. mkdir /var/run/ircd
  6728. chown -R irc:irc /var/run/ircd
  6729. mkdir /var/run/ngircd
  6730. touch /var/run/ngircd/ngircd.pid
  6731. chown -R irc:irc /var/run/ngircd
  6732. IRC_ONION_HOSTNAME=$(add_onion_service irc ${IRC_PORT} ${IRC_PORT})
  6733. if ! grep -q $"IRC onion domain" $COMPLETION_FILE; then
  6734. echo "IRC onion domain:$IRC_ONION_HOSTNAME" >> $COMPLETION_FILE
  6735. fi
  6736. systemctl restart ngircd
  6737. # keep the daemon running
  6738. echo '' >> /usr/bin/$WATCHDOG_SCRIPT_NAME
  6739. echo '# keep irc daemon running' >> /usr/bin/$WATCHDOG_SCRIPT_NAME
  6740. echo 'IRC_RUNNING=$(pgrep ngircd > /dev/null && echo Running)' >> /usr/bin/$WATCHDOG_SCRIPT_NAME
  6741. echo 'if [ ! $IRC_RUNNING ]; then' >> /usr/bin/$WATCHDOG_SCRIPT_NAME
  6742. echo ' systemctl start ngircd' >> /usr/bin/$WATCHDOG_SCRIPT_NAME
  6743. echo ' echo -n $CURRENT_DATE >> $LOGFILE' >> /usr/bin/$WATCHDOG_SCRIPT_NAME
  6744. echo ' echo " IRC daemon restarted" >> $LOGFILE' >> /usr/bin/$WATCHDOG_SCRIPT_NAME
  6745. echo 'fi' >> /usr/bin/$WATCHDOG_SCRIPT_NAME
  6746. if ! grep -q $"IRC Server" /home/$MY_USERNAME/README; then
  6747. echo '' >> /home/$MY_USERNAME/README
  6748. echo '' >> /home/$MY_USERNAME/README
  6749. echo $'IRC Server' >> /home/$MY_USERNAME/README
  6750. echo '==========' >> /home/$MY_USERNAME/README
  6751. echo $'To connect to your IRC server in irssi:' >> /home/$MY_USERNAME/README
  6752. echo '' >> /home/$MY_USERNAME/README
  6753. echo " /server add -auto -ssl $DEFAULTDOMAIN $IRC_PORT" >> /home/$MY_USERNAME/README
  6754. echo " /connect $DEFAULT_DOMAIN_NAME" >> /home/$MY_USERNAME/README
  6755. echo " /join #${PROJECT_NAME}" >> /home/$MY_USERNAME/README
  6756. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
  6757. chmod 600 /home/$MY_USERNAME/README
  6758. fi
  6759. echo 'install_irc_server' >> $COMPLETION_FILE
  6760. }
  6761. function get_wiki_admin_password {
  6762. if [ -f /home/$MY_USERNAME/README ]; then
  6763. if grep -q "Wiki password" /home/$MY_USERNAME/README; then
  6764. WIKI_ADMIN_PASSWORD=$(cat /home/$MY_USERNAME/README | grep "Wiki password:" | awk -F ':' '{print $2}' | sed 's/^ *//')
  6765. fi
  6766. fi
  6767. }
  6768. function install_wiki {
  6769. 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
  6770. return
  6771. fi
  6772. if grep -Fxq "install_wiki" $COMPLETION_FILE; then
  6773. return
  6774. fi
  6775. if [ ! $WIKI_DOMAIN_NAME ]; then
  6776. return
  6777. fi
  6778. apt-get -y install dokuwiki
  6779. apt-get -y remove --purge apache*
  6780. if [ -d /etc/apache2 ]; then
  6781. rm -rf /etc/apache2
  6782. echo $'Removed Apache installation after Dokuwiki install'
  6783. fi
  6784. if [ ! -d /var/www/$WIKI_DOMAIN_NAME ]; then
  6785. mkdir /var/www/$WIKI_DOMAIN_NAME
  6786. fi
  6787. if [ -d /var/www/$WIKI_DOMAIN_NAME/htdocs ]; then
  6788. rm -rf /var/www/$WIKI_DOMAIN_NAME/htdocs
  6789. fi
  6790. ln -s /usr/share/dokuwiki /var/www/$WIKI_DOMAIN_NAME/htdocs
  6791. mkdir /var/lib/dokuwiki/custom
  6792. cp /etc/dokuwiki/local.php.dist /var/lib/dokuwiki/custom/local.php
  6793. ln -s /var/lib/dokuwiki/custom/local.php /etc/dokuwiki/local.php
  6794. chown www-data /var/lib/dokuwiki/custom
  6795. chown www-data /var/lib/dokuwiki/custom/local.php
  6796. chown -R www-data /etc/dokuwiki
  6797. chown -R www-data /usr/share/dokuwiki/lib/
  6798. chmod 600 /var/lib/dokuwiki/custom/local.php
  6799. chmod -R 755 /usr/share/dokuwiki/lib
  6800. sed -i 's|//$conf|$conf|g' /var/lib/dokuwiki/custom/local.php
  6801. sed -i "s|joe|$MY_USERNAME|g" /var/lib/dokuwiki/custom/local.php
  6802. sed -i "s|Debian DokuWiki|$WIKI_TITLE|g" /etc/dokuwiki/local.php
  6803. # set the admin user
  6804. sed -i "s/@admin/$MY_USERNAME/g" /etc/dokuwiki/local.php
  6805. # disallow registration of new users
  6806. if ! grep -q "disableactions" /etc/dokuwiki/local.php; then
  6807. echo "\$conf['disableactions'] = 'register';" >> /etc/dokuwiki/local.php
  6808. fi
  6809. if ! grep -q "disableactions" /var/lib/dokuwiki/custom/local.php; then
  6810. echo "\$conf['disableactions'] = 'register';" >> /var/lib/dokuwiki/custom/local.php
  6811. fi
  6812. if ! grep -q "authtype" /var/lib/dokuwiki/custom/local.php; then
  6813. echo "\$conf['authtype'] = 'authplain';" >> /var/lib/dokuwiki/custom/local.php
  6814. fi
  6815. if ! grep -q "authtype" /etc/dokuwiki/local.php; then
  6816. echo "\$conf['authtype'] = 'authplain';" >> /etc/dokuwiki/local.php
  6817. fi
  6818. get_wiki_admin_password
  6819. if [ ! $WIKI_ADMIN_PASSWORD ]; then
  6820. if [ -f $IMAGE_PASSWORD_FILE ]; then
  6821. WIKI_ADMIN_PASSWORD="$(printf `cat $IMAGE_PASSWORD_FILE`)"
  6822. else
  6823. WIKI_ADMIN_PASSWORD="$(openssl rand -base64 16)"
  6824. fi
  6825. fi
  6826. HASHED_WIKI_PASSWORD=$(echo -n "$WIKI_ADMIN_PASSWORD" | md5sum | awk -F ' ' '{print $1}')
  6827. echo -n "$MY_USERNAME:$HASHED_WIKI_PASSWORD:$MY_NAME:$MY_EMAIL:admin,user,upload" > /var/lib/dokuwiki/acl/users.auth.php
  6828. chmod 640 /var/lib/dokuwiki/acl/users.auth.php
  6829. if ! grep -q "video/ogg" /etc/dokuwiki/mime.conf; then
  6830. echo 'ogv video/ogg' >> /etc/dokuwiki/mime.conf
  6831. fi
  6832. if ! grep -q "video/mp4" /etc/dokuwiki/mime.conf; then
  6833. echo 'mp4 video/mp4' >> /etc/dokuwiki/mime.conf
  6834. fi
  6835. if ! grep -q "video/webm" /etc/dokuwiki/mime.conf; then
  6836. echo 'webm video/webm' >> /etc/dokuwiki/mime.conf
  6837. fi
  6838. if [[ $ONION_ONLY == "no" ]]; then
  6839. echo 'server {' > /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6840. echo ' listen 80;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6841. echo " root /var/www/$WIKI_DOMAIN_NAME/htdocs;" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6842. echo " server_name $WIKI_DOMAIN_NAME;" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6843. echo ' access_log off;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6844. echo " error_log /var/log/nginx/${WIKI_DOMAIN_NAME}_error.log $WEBSERVER_LOG_LEVEL;" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6845. echo ' index index.php;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6846. echo ' charset utf-8;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6847. echo ' client_max_body_size 20m;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6848. echo ' client_body_buffer_size 128k;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6849. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6850. echo ' add_header X-Frame-Options DENY;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6851. echo ' add_header X-Content-Type-Options nosniff;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6852. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6853. echo ' limit_conn conn_limit_per_ip 10;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6854. echo ' limit_req zone=req_limit_per_ip burst=10 nodelay;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6855. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6856. echo ' # rewrite to front controller as default rule' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6857. echo ' location / {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6858. echo ' rewrite ^/(.*) /index.php?q=$uri&$args last;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6859. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6860. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6861. echo " # make sure webfinger and other well known services aren't blocked" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6862. echo ' # by denying dot files and rewrite request to the front controller' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6863. echo ' location ^~ /.well-known/ {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6864. echo ' allow all;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6865. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6866. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6867. echo ' # statically serve these file types when possible' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6868. echo ' # otherwise fall back to front controller' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6869. echo ' # allow browser to cache them' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6870. echo ' # added .htm for advanced source code editor library' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6871. echo ' location ~* \.(jpg|jpeg|gif|png|ico|css|js|htm|html|ttf|woff|svg)$ {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6872. echo ' expires 30d;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6873. echo ' try_files $uri /index.php?q=$uri&$args;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6874. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6875. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6876. echo ' # block these file types' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6877. echo ' location ~* \.(tpl|md|tgz|log|out)$ {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6878. echo ' deny all;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6879. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6880. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6881. echo ' # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6882. echo ' # or a unix socket' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6883. echo ' location ~* \.php$ {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6884. echo ' # Zero-day exploit defense.' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6885. echo ' # http://forum.nginx.org/read.php?2,88845,page=3' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6886. echo " # Won't work properly (404 error) if the file is not stored on this" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6887. echo " # server, which is entirely possible with php-fpm/php-fcgi." >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6888. echo " # Comment the 'try_files' line out if you set up php-fpm/php-fcgi on" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6889. echo " # another machine. And then cross your fingers that you won't get hacked." >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6890. echo ' try_files $uri $uri/ /index.php;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6891. echo ' # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6892. echo ' fastcgi_split_path_info ^(.+\.php)(/.+)$;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6893. echo ' # With php5-cgi alone:' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6894. echo ' # fastcgi_pass 127.0.0.1:9000;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6895. echo ' # With php5-fpm:' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6896. echo ' fastcgi_pass unix:/var/run/php5-fpm.sock;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6897. echo ' include fastcgi_params;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6898. echo ' fastcgi_index index.php;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6899. echo ' fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6900. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6901. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6902. echo ' # deny access to all dot files' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6903. echo ' location ~ /\. {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6904. echo ' deny all;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6905. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6906. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6907. echo ' #deny access to store' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6908. echo ' location ~ /store {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6909. echo ' deny all;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6910. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6911. echo ' location ~ /(data|conf|bin|inc)/ {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6912. echo ' deny all;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6913. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6914. echo ' location ~ /\.ht {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6915. echo ' deny all;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6916. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6917. echo '}' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6918. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6919. echo 'server {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6920. echo ' listen 443 ssl;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6921. echo " root /var/www/$WIKI_DOMAIN_NAME/htdocs;" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6922. echo " server_name $WIKI_DOMAIN_NAME;" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6923. echo ' access_log off;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6924. echo " error_log /var/log/nginx/${WIKI_DOMAIN_NAME}_error_ssl.log $WEBSERVER_LOG_LEVEL;" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6925. echo ' index index.php;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6926. echo ' charset utf-8;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6927. echo ' client_max_body_size 20m;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6928. echo ' client_body_buffer_size 128k;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6929. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6930. echo ' limit_conn conn_limit_per_ip 10;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6931. echo ' limit_req zone=req_limit_per_ip burst=10 nodelay;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6932. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6933. echo ' ssl on;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6934. echo " ssl_certificate /etc/ssl/certs/$WIKI_DOMAIN_NAME.crt;" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6935. echo " ssl_certificate_key /etc/ssl/private/$WIKI_DOMAIN_NAME.key;" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6936. echo " ssl_dhparam /etc/ssl/certs/$WIKI_DOMAIN_NAME.dhparam;" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6937. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6938. echo ' ssl_session_timeout 60m;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6939. echo ' ssl_prefer_server_ciphers on;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6940. echo ' ssl_session_cache builtin:1000 shared:SSL:10m;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6941. echo " ssl_protocols $SSL_PROTOCOLS; # not possible to do exclusive" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6942. echo " ssl_ciphers '$SSL_CIPHERS';" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6943. echo ' add_header X-Frame-Options DENY;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6944. echo ' add_header X-Content-Type-Options nosniff;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6945. echo ' add_header Strict-Transport-Security "max-age=0;";' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6946. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6947. echo ' # rewrite to front controller as default rule' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6948. echo ' location / {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6949. echo ' rewrite ^/(.*) /index.php?q=$uri&$args last;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6950. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6951. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6952. echo " # make sure webfinger and other well known services aren't blocked" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6953. echo ' # by denying dot files and rewrite request to the front controller' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6954. echo ' location ^~ /.well-known/ {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6955. echo ' allow all;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6956. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6957. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6958. echo ' # statically serve these file types when possible' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6959. echo ' # otherwise fall back to front controller' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6960. echo ' # allow browser to cache them' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6961. echo ' # added .htm for advanced source code editor library' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6962. echo ' location ~* \.(jpg|jpeg|gif|png|ico|css|js|htm|html|ttf|woff|svg)$ {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6963. echo ' expires 30d;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6964. echo ' try_files $uri /index.php?q=$uri&$args;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6965. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6966. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6967. echo ' # block these file types' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6968. echo ' location ~* \.(tpl|md|tgz|log|out)$ {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6969. echo ' deny all;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6970. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6971. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6972. echo ' # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6973. echo ' # or a unix socket' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6974. echo ' location ~* \.php$ {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6975. echo ' # Zero-day exploit defense.' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6976. echo ' # http://forum.nginx.org/read.php?2,88845,page=3' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6977. echo " # Won't work properly (404 error) if the file is not stored on this" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6978. echo " # server, which is entirely possible with php-fpm/php-fcgi." >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6979. echo " # Comment the 'try_files' line out if you set up php-fpm/php-fcgi on" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6980. echo " # another machine. And then cross your fingers that you won't get hacked." >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6981. echo ' try_files $uri $uri/ /index.php;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6982. echo ' # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6983. echo ' fastcgi_split_path_info ^(.+\.php)(/.+)$;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6984. echo ' # With php5-cgi alone:' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6985. echo ' # fastcgi_pass 127.0.0.1:9000;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6986. echo ' # With php5-fpm:' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6987. echo ' fastcgi_pass unix:/var/run/php5-fpm.sock;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6988. echo ' include fastcgi_params;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6989. echo ' fastcgi_index index.php;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6990. echo ' fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6991. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6992. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6993. echo ' # deny access to all dot files' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6994. echo ' location ~ /\. {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6995. echo ' deny all;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6996. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6997. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6998. echo ' #deny access to store' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6999. echo ' location ~ /store {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7000. echo ' deny all;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7001. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7002. echo ' location ~ /(data|conf|bin|inc)/ {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7003. echo ' deny all;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7004. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7005. echo ' location ~ /\.ht {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7006. echo ' deny all;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7007. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7008. echo '}' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7009. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7010. else
  7011. echo -n '' > /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7012. fi
  7013. echo 'server {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7014. echo " listen 127.0.0.1:${WIKI_ONION_PORT} default_server;" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7015. echo " root /var/www/$WIKI_DOMAIN_NAME/htdocs;" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7016. echo " server_name $WIKI_DOMAIN_NAME;" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7017. echo ' access_log off;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7018. echo " error_log /var/log/nginx/${WIKI_DOMAIN_NAME}_error_ssl.log $WEBSERVER_LOG_LEVEL;" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7019. echo ' index index.php;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7020. echo ' charset utf-8;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7021. echo ' client_max_body_size 20m;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7022. echo ' client_body_buffer_size 128k;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7023. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7024. echo ' limit_conn conn_limit_per_ip 10;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7025. echo ' limit_req zone=req_limit_per_ip burst=10 nodelay;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7026. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7027. echo ' add_header X-Frame-Options DENY;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7028. echo ' add_header X-Content-Type-Options nosniff;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7029. echo ' add_header Strict-Transport-Security "max-age=0;";' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7030. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7031. echo ' # rewrite to front controller as default rule' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7032. echo ' location / {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7033. echo ' rewrite ^/(.*) /index.php?q=$uri&$args last;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7034. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7035. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7036. echo " # make sure webfinger and other well known services aren't blocked" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7037. echo ' # by denying dot files and rewrite request to the front controller' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7038. echo ' location ^~ /.well-known/ {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7039. echo ' allow all;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7040. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7041. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7042. echo ' # statically serve these file types when possible' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7043. echo ' # otherwise fall back to front controller' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7044. echo ' # allow browser to cache them' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7045. echo ' # added .htm for advanced source code editor library' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7046. echo ' location ~* \.(jpg|jpeg|gif|png|ico|css|js|htm|html|ttf|woff|svg)$ {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7047. echo ' expires 30d;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7048. echo ' try_files $uri /index.php?q=$uri&$args;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7049. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7050. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7051. echo ' # block these file types' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7052. echo ' location ~* \.(tpl|md|tgz|log|out)$ {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7053. echo ' deny all;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7054. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7055. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7056. echo ' # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7057. echo ' # or a unix socket' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7058. echo ' location ~* \.php$ {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7059. echo ' # Zero-day exploit defense.' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7060. echo ' # http://forum.nginx.org/read.php?2,88845,page=3' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7061. echo " # Won't work properly (404 error) if the file is not stored on this" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7062. echo " # server, which is entirely possible with php-fpm/php-fcgi." >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7063. echo " # Comment the 'try_files' line out if you set up php-fpm/php-fcgi on" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7064. echo " # another machine. And then cross your fingers that you won't get hacked." >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7065. echo ' try_files $uri $uri/ /index.php;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7066. echo ' # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7067. echo ' fastcgi_split_path_info ^(.+\.php)(/.+)$;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7068. echo ' # With php5-cgi alone:' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7069. echo ' # fastcgi_pass 127.0.0.1:9000;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7070. echo ' # With php5-fpm:' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7071. echo ' fastcgi_pass unix:/var/run/php5-fpm.sock;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7072. echo ' include fastcgi_params;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7073. echo ' fastcgi_index index.php;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7074. echo ' fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7075. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7076. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7077. echo ' # deny access to all dot files' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7078. echo ' location ~ /\. {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7079. echo ' deny all;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7080. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7081. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7082. echo ' #deny access to store' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7083. echo ' location ~ /store {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7084. echo ' deny all;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7085. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7086. echo ' location ~ /(data|conf|bin|inc)/ {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7087. echo ' deny all;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7088. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7089. echo ' location ~ /\.ht {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7090. echo ' deny all;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7091. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7092. echo '}' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7093. if [[ $ONION_ONLY == "no" ]]; then
  7094. if [ ! -f /etc/ssl/certs/$WIKI_DOMAIN_NAME.dhparam ]; then
  7095. if [[ $LETSENCRYPT_ENABLED != "yes" ]]; then
  7096. ${PROJECT_NAME}-addcert -h $WIKI_DOMAIN_NAME --dhkey $DH_KEYLENGTH
  7097. else
  7098. ${PROJECT_NAME}-addcert -e $WIKI_DOMAIN_NAME -s $LETSENCRYPT_SERVER --dhkey $DH_KEYLENGTH --email $MY_EMAIL_ADDRESS
  7099. fi
  7100. check_certificates $WIKI_DOMAIN_NAME
  7101. fi
  7102. fi
  7103. configure_php
  7104. nginx_ensite $WIKI_DOMAIN_NAME
  7105. WIKI_ONION_HOSTNAME=$(add_onion_service wiki 80 ${WIKI_ONION_PORT})
  7106. systemctl restart php5-fpm
  7107. systemctl restart nginx
  7108. echo "Wiki onion domain:${WIKI_ONION_HOSTNAME}" >> $COMPLETION_FILE
  7109. # update the dynamic DNS
  7110. CURRENT_DDNS_DOMAIN=$WIKI_DOMAIN_NAME
  7111. add_ddns_domain
  7112. # add some post-install instructions
  7113. if ! grep -q $"Wiki password" /home/$MY_USERNAME/README; then
  7114. echo '' >> /home/$MY_USERNAME/README
  7115. echo '' >> /home/$MY_USERNAME/README
  7116. echo $'Wiki' >> /home/$MY_USERNAME/README
  7117. echo '====' >> /home/$MY_USERNAME/README
  7118. echo $"Wiki onion domain: ${WIKI_ONION_HOSTNAME}" >> /home/$MY_USERNAME/README
  7119. echo $"Wiki username: $MY_USERNAME" >> /home/$MY_USERNAME/README
  7120. echo $"Wiki password: $WIKI_ADMIN_PASSWORD" >> /home/$MY_USERNAME/README
  7121. echo '' >> /home/$MY_USERNAME/README
  7122. echo $'Once you have set up the wiki then remove the install file:' >> /home/$MY_USERNAME/README
  7123. echo '' >> /home/$MY_USERNAME/README
  7124. echo " rm /var/www/$WIKI_DOMAIN_NAME/htdocs/install.php" >> /home/$MY_USERNAME/README
  7125. echo '' >> /home/$MY_USERNAME/README
  7126. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
  7127. chmod 600 /home/$MY_USERNAME/README
  7128. fi
  7129. echo "Wiki domain:$WIKI_DOMAIN_NAME" >> $COMPLETION_FILE
  7130. echo 'install_wiki' >> $COMPLETION_FILE
  7131. }
  7132. function get_blog_admin_password {
  7133. if [ -f /home/$MY_USERNAME/README ]; then
  7134. if grep -q "Your blog password is" /home/$MY_USERNAME/README; then
  7135. FULLBLOG_ADMIN_PASSWORD=$(cat /home/$MY_USERNAME/README | grep "Your blog password is" | awk -F ':' '{print $2}' | sed 's/^ *//')
  7136. fi
  7137. fi
  7138. }
  7139. function install_blog {
  7140. 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
  7141. return
  7142. fi
  7143. if [ ! $FULLBLOG_DOMAIN_NAME ]; then
  7144. echo $'The blog domain name was not specified'
  7145. exit 5062
  7146. fi
  7147. # update to the next commit
  7148. if [ -d /var/www/$FULLBLOG_DOMAIN_NAME/htdocs ]; then
  7149. if grep -q "Blog commit" $COMPLETION_FILE; then
  7150. CURRENT_FULLBLOG_COMMIT=$(grep "Blog commit" $COMPLETION_FILE | awk -F ':' '{print $2}')
  7151. if [[ "$CURRENT_FULLBLOG_COMMIT" != "$FULLBLOG_COMMIT" ]]; then
  7152. cd /var/www/$FULLBLOG_DOMAIN_NAME/htdocs
  7153. git_pull $FULLBLOG_REPO $FULLBLOG_COMMIT
  7154. sed -i "s/Blog commit.*/Blog commit:$FULLBLOG_COMMIT/g" $COMPLETION_FILE
  7155. chown -R www-data:www-data /var/www/$FULLBLOG_DOMAIN_NAME/htdocs
  7156. fi
  7157. else
  7158. echo "Blog commit:$FULLBLOG_COMMIT" >> $COMPLETION_FILE
  7159. fi
  7160. fi
  7161. if grep -Fxq "install_blog" $COMPLETION_FILE; then
  7162. return
  7163. fi
  7164. if [ ! -d /var/www/$FULLBLOG_DOMAIN_NAME ]; then
  7165. mkdir /var/www/$FULLBLOG_DOMAIN_NAME
  7166. fi
  7167. cd /var/www/$FULLBLOG_DOMAIN_NAME
  7168. git_clone $FULLBLOG_REPO htdocs
  7169. cd htdocs
  7170. git checkout $FULLBLOG_COMMIT -b $FULLBLOG_COMMIT
  7171. if ! grep -q "Blog commit" $COMPLETION_FILE; then
  7172. echo "Blog commit:$FULLBLOG_COMMIT" >> $COMPLETION_FILE
  7173. else
  7174. sed -i "s/Blog commit.*/Blog commit:$FULLBLOG_COMMIT/g" $COMPLETION_FILE
  7175. fi
  7176. cd /var/www/$FULLBLOG_DOMAIN_NAME
  7177. chown -R www-data:www-data /var/www/$FULLBLOG_DOMAIN_NAME/htdocs
  7178. if [[ $ONION_ONLY == "no" ]]; then
  7179. echo 'server {' > /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7180. echo ' listen 80;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7181. echo " root /var/www/$FULLBLOG_DOMAIN_NAME/htdocs;" >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7182. echo " server_name $FULLBLOG_DOMAIN_NAME;" >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7183. echo ' access_log off;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7184. echo " error_log /var/log/nginx/${FULLBLOG_DOMAIN_NAME}_error.log $WEBSERVER_LOG_LEVEL;" >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7185. echo ' index index.php;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7186. echo ' charset utf-8;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7187. echo ' client_max_body_size 20m;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7188. echo ' client_body_buffer_size 128k;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7189. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7190. echo ' limit_conn conn_limit_per_ip 10;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7191. echo ' limit_req zone=req_limit_per_ip burst=10 nodelay;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7192. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7193. echo ' add_header X-Frame-Options DENY;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7194. echo ' add_header X-Content-Type-Options nosniff;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7195. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7196. echo ' # Always redirect the login page to https' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7197. echo ' location /login {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7198. echo ' rewrite ^ https://$server_name$request_uri?;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7199. echo ' }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7200. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7201. echo ' # rewrite to front controller as default rule' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7202. echo ' location / {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7203. echo ' rewrite ^/(.*) /index.php?q=$uri&$args last;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7204. echo ' }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7205. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7206. echo " # make sure webfinger and other well known services aren't blocked" >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7207. echo ' # by denying dot files and rewrite request to the front controller' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7208. echo ' location ^~ /.well-known/ {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7209. echo ' allow all;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7210. echo ' }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7211. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7212. echo ' # statically serve these file types when possible' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7213. echo ' # otherwise fall back to front controller' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7214. echo ' # allow browser to cache them' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7215. echo ' # added .htm for advanced source code editor library' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7216. echo ' location ~* \.(jpg|jpeg|gif|png|ico|css|js|htm|html|ttf|woff|svg)$ {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7217. echo ' expires 30d;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7218. echo ' try_files $uri /index.php?q=$uri&$args;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7219. echo ' }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7220. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7221. echo ' # block these file types' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7222. echo ' location ~* \.(tpl|md|tgz|log|out)$ {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7223. echo ' deny all;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7224. echo ' }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7225. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7226. echo ' # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7227. echo ' # or a unix socket' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7228. echo ' location ~* \.php$ {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7229. echo ' # Zero-day exploit defense.' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7230. echo ' # http://forum.nginx.org/read.php?2,88845,page=3' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7231. echo " # Won't work properly (404 error) if the file is not stored on this" >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7232. echo " # server, which is entirely possible with php-fpm/php-fcgi." >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7233. echo " # Comment the 'try_files' line out if you set up php-fpm/php-fcgi on" >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7234. echo " # another machine. And then cross your fingers that you won't get hacked." >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7235. echo ' try_files $uri $uri/ /index.php;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7236. echo ' # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7237. echo ' fastcgi_split_path_info ^(.+\.php)(/.+)$;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7238. echo ' # With php5-cgi alone:' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7239. echo ' # fastcgi_pass 127.0.0.1:9000;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7240. echo ' # With php5-fpm:' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7241. echo ' fastcgi_pass unix:/var/run/php5-fpm.sock;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7242. echo ' include fastcgi_params;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7243. echo ' fastcgi_index index.php;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7244. echo ' fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7245. echo ' }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7246. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7247. echo ' # deny access to all dot files' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7248. echo ' location ~ /\. {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7249. echo ' deny all;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7250. echo ' }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7251. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7252. echo ' #deny access to store' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7253. echo ' location ~ /store {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7254. echo ' deny all;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7255. echo ' }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7256. echo ' location ~ /(data|conf|bin|inc)/ {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7257. echo ' deny all;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7258. echo ' }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7259. echo ' location ~ /\.ht {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7260. echo ' deny all;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7261. echo ' }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7262. echo '}' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7263. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7264. echo 'server {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7265. echo ' listen 443 ssl;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7266. echo " root /var/www/$FULLBLOG_DOMAIN_NAME/htdocs;" >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7267. echo " server_name $FULLBLOG_DOMAIN_NAME;" >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7268. echo ' access_log off;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7269. echo " error_log /var/log/nginx/${FULLBLOG_DOMAIN_NAME}_error_ssl.log $WEBSERVER_LOG_LEVEL;" >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7270. echo ' index index.php;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7271. echo ' charset utf-8;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7272. echo ' client_max_body_size 20m;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7273. echo ' client_body_buffer_size 128k;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7274. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7275. echo ' limit_conn conn_limit_per_ip 10;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7276. echo ' limit_req zone=req_limit_per_ip burst=10 nodelay;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7277. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7278. echo ' ssl on;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7279. echo " ssl_certificate /etc/ssl/certs/$FULLBLOG_DOMAIN_NAME.crt;" >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7280. echo " ssl_certificate_key /etc/ssl/private/$FULLBLOG_DOMAIN_NAME.key;" >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7281. echo " ssl_dhparam /etc/ssl/certs/$FULLBLOG_DOMAIN_NAME.dhparam;" >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7282. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7283. echo ' ssl_session_timeout 60m;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7284. echo ' ssl_prefer_server_ciphers on;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7285. echo ' ssl_session_cache builtin:1000 shared:SSL:10m;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7286. echo " ssl_protocols $SSL_PROTOCOLS; # not possible to do exclusive" >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7287. echo " ssl_ciphers '$SSL_CIPHERS';" >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7288. echo ' add_header X-Frame-Options DENY;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7289. echo ' add_header X-Content-Type-Options nosniff;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7290. echo ' add_header Strict-Transport-Security "max-age=0;";' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7291. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7292. echo ' # rewrite to front controller as default rule' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7293. echo ' location / {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7294. echo ' rewrite ^/(.*) /index.php?q=$uri&$args last;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7295. echo ' }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7296. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7297. echo " # make sure webfinger and other well known services aren't blocked" >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7298. echo ' # by denying dot files and rewrite request to the front controller' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7299. echo ' location ^~ /.well-known/ {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7300. echo ' allow all;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7301. echo ' }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7302. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7303. echo ' # statically serve these file types when possible' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7304. echo ' # otherwise fall back to front controller' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7305. echo ' # allow browser to cache them' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7306. echo ' # added .htm for advanced source code editor library' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7307. echo ' location ~* \.(jpg|jpeg|gif|png|ico|css|js|htm|html|ttf|woff|svg)$ {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7308. echo ' expires 30d;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7309. echo ' try_files $uri /index.php?q=$uri&$args;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7310. echo ' }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7311. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7312. echo ' # block these file types' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7313. echo ' location ~* \.(tpl|md|tgz|log|out)$ {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7314. echo ' deny all;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7315. echo ' }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7316. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7317. echo ' # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7318. echo ' # or a unix socket' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7319. echo ' location ~* \.php$ {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7320. echo ' # Zero-day exploit defense.' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7321. echo ' # http://forum.nginx.org/read.php?2,88845,page=3' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7322. echo " # Won't work properly (404 error) if the file is not stored on this" >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7323. echo " # server, which is entirely possible with php-fpm/php-fcgi." >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7324. echo " # Comment the 'try_files' line out if you set up php-fpm/php-fcgi on" >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7325. echo " # another machine. And then cross your fingers that you won't get hacked." >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7326. echo ' try_files $uri $uri/ /index.php;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7327. echo ' # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7328. echo ' fastcgi_split_path_info ^(.+\.php)(/.+)$;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7329. echo ' # With php5-cgi alone:' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7330. echo ' # fastcgi_pass 127.0.0.1:9000;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7331. echo ' # With php5-fpm:' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7332. echo ' fastcgi_pass unix:/var/run/php5-fpm.sock;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7333. echo ' include fastcgi_params;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7334. echo ' fastcgi_index index.php;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7335. echo ' fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7336. echo ' }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7337. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7338. echo ' # deny access to all dot files' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7339. echo ' location ~ /\. {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7340. echo ' deny all;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7341. echo ' }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7342. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7343. echo ' #deny access to store' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7344. echo ' location ~ /store {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7345. echo ' deny all;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7346. echo ' }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7347. echo ' location ~ /(data|conf|bin|inc)/ {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7348. echo ' deny all;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7349. echo ' }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7350. echo ' location ~ /\.ht {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7351. echo ' deny all;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7352. echo ' }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7353. echo '}' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7354. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7355. else
  7356. echo -n '' > /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7357. fi
  7358. echo 'server {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7359. echo " listen 127.0.0.1:${FULLBLOG_ONION_PORT} default_server;" >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7360. echo " root /var/www/$FULLBLOG_DOMAIN_NAME/htdocs;" >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7361. echo " server_name $FULLBLOG_DOMAIN_NAME;" >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7362. echo ' access_log off;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7363. echo " error_log /var/log/nginx/${FULLBLOG_DOMAIN_NAME}_error_ssl.log $WEBSERVER_LOG_LEVEL;" >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7364. echo ' index index.php;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7365. echo ' charset utf-8;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7366. echo ' client_max_body_size 20m;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7367. echo ' client_body_buffer_size 128k;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7368. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7369. echo ' limit_conn conn_limit_per_ip 10;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7370. echo ' limit_req zone=req_limit_per_ip burst=10 nodelay;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7371. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7372. echo ' add_header X-Frame-Options DENY;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7373. echo ' add_header X-Content-Type-Options nosniff;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7374. echo ' add_header Strict-Transport-Security "max-age=0;";' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7375. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7376. echo ' # rewrite to front controller as default rule' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7377. echo ' location / {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7378. echo ' rewrite ^/(.*) /index.php?q=$uri&$args last;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7379. echo ' }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7380. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7381. echo " # make sure webfinger and other well known services aren't blocked" >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7382. echo ' # by denying dot files and rewrite request to the front controller' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7383. echo ' location ^~ /.well-known/ {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7384. echo ' allow all;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7385. echo ' }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7386. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7387. echo ' # statically serve these file types when possible' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7388. echo ' # otherwise fall back to front controller' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7389. echo ' # allow browser to cache them' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7390. echo ' # added .htm for advanced source code editor library' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7391. echo ' location ~* \.(jpg|jpeg|gif|png|ico|css|js|htm|html|ttf|woff|svg)$ {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7392. echo ' expires 30d;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7393. echo ' try_files $uri /index.php?q=$uri&$args;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7394. echo ' }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7395. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7396. echo ' # block these file types' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7397. echo ' location ~* \.(tpl|md|tgz|log|out)$ {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7398. echo ' deny all;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7399. echo ' }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7400. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7401. echo ' # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7402. echo ' # or a unix socket' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7403. echo ' location ~* \.php$ {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7404. echo ' # Zero-day exploit defense.' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7405. echo ' # http://forum.nginx.org/read.php?2,88845,page=3' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7406. echo " # Won't work properly (404 error) if the file is not stored on this" >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7407. echo " # server, which is entirely possible with php-fpm/php-fcgi." >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7408. echo " # Comment the 'try_files' line out if you set up php-fpm/php-fcgi on" >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7409. echo " # another machine. And then cross your fingers that you won't get hacked." >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7410. echo ' try_files $uri $uri/ /index.php;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7411. echo ' # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7412. echo ' fastcgi_split_path_info ^(.+\.php)(/.+)$;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7413. echo ' # With php5-cgi alone:' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7414. echo ' # fastcgi_pass 127.0.0.1:9000;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7415. echo ' # With php5-fpm:' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7416. echo ' fastcgi_pass unix:/var/run/php5-fpm.sock;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7417. echo ' include fastcgi_params;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7418. echo ' fastcgi_index index.php;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7419. echo ' fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7420. echo ' }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7421. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7422. echo ' # deny access to all dot files' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7423. echo ' location ~ /\. {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7424. echo ' deny all;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7425. echo ' }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7426. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7427. echo ' #deny access to store' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7428. echo ' location ~ /store {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7429. echo ' deny all;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7430. echo ' }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7431. echo ' location ~ /(data|conf|bin|inc)/ {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7432. echo ' deny all;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7433. echo ' }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7434. echo ' location ~ /\.ht {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7435. echo ' deny all;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7436. echo ' }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7437. echo '}' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7438. if [[ $ONION_ONLY == "no" ]]; then
  7439. if [ ! -f /etc/ssl/certs/$FULLBLOG_DOMAIN_NAME.dhparam ]; then
  7440. if [[ $LETSENCRYPT_ENABLED != "yes" ]]; then
  7441. ${PROJECT_NAME}-addcert -h $FULLBLOG_DOMAIN_NAME --dhkey $DH_KEYLENGTH
  7442. else
  7443. ${PROJECT_NAME}-addcert -e $FULLBLOG_DOMAIN_NAME -s $LETSENCRYPT_SERVER --dhkey $DH_KEYLENGTH --email $MY_EMAIL_ADDRESS
  7444. fi
  7445. check_certificates $FULLBLOG_DOMAIN_NAME
  7446. fi
  7447. fi
  7448. configure_php
  7449. # blog settings
  7450. cp /var/www/$FULLBLOG_DOMAIN_NAME/htdocs/config/config.ini.example /var/www/$FULLBLOG_DOMAIN_NAME/htdocs/config/config.ini
  7451. sed -i "s|site.url.*|site.url = '/'|g" /var/www/$FULLBLOG_DOMAIN_NAME/htdocs/config/config.ini
  7452. sed -i "s|blog.title.*|blog.title = '$MY_BLOG_TITLE'|g" /var/www/$FULLBLOG_DOMAIN_NAME/htdocs/config/config.ini
  7453. sed -i "s|blog.tagline.*|blog.tagline = '$MY_BLOG_SUBTITLE'|g" /var/www/$FULLBLOG_DOMAIN_NAME/htdocs/config/config.ini
  7454. sed -i 's|timezone.*|timezone = "Europe/London"|g' /var/www/$FULLBLOG_DOMAIN_NAME/htdocs/config/config.ini
  7455. sed -i "s|Your name|$MY_NAME|g" /var/www/$FULLBLOG_DOMAIN_NAME/htdocs/config/config.ini
  7456. # create a user password
  7457. get_blog_admin_password
  7458. if [ ! $FULLBLOG_ADMIN_PASSWORD ]; then
  7459. if [ -f $IMAGE_PASSWORD_FILE ]; then
  7460. FULLBLOG_ADMIN_PASSWORD="$(printf `cat $IMAGE_PASSWORD_FILE`)"
  7461. else
  7462. FULLBLOG_ADMIN_PASSWORD="$(openssl rand -base64 16)"
  7463. fi
  7464. echo '' >> /home/$MY_USERNAME/README
  7465. echo '' >> /home/$MY_USERNAME/README
  7466. echo $'HTMLy Blog' >> /home/$MY_USERNAME/README
  7467. echo '==========' >> /home/$MY_USERNAME/README
  7468. echo $"Your blog username: $MY_USERNAME" >> /home/$MY_USERNAME/README
  7469. echo $"Your blog password is: $FULLBLOG_ADMIN_PASSWORD" >> /home/$MY_USERNAME/README
  7470. echo $"Log into your blog at https://$FULLBLOG_DOMAIN_NAME/login" >> /home/$MY_USERNAME/README
  7471. echo $'Edit your blog title and time zone at:' >> /home/$MY_USERNAME/README
  7472. echo " /var/www/$FULLBLOG_DOMAIN_NAME/htdocs/config/config.ini" >> /home/$MY_USERNAME/README
  7473. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
  7474. chmod 600 /home/$MY_USERNAME/README
  7475. fi
  7476. # create a user
  7477. echo ';Password' > /var/www/$FULLBLOG_DOMAIN_NAME/htdocs/config/users/$MY_USERNAME.ini
  7478. echo "password = '$FULLBLOG_ADMIN_PASSWORD'" >> /var/www/$FULLBLOG_DOMAIN_NAME/htdocs/config/users/$MY_USERNAME.ini
  7479. echo 'encryption = clear' >> /var/www/$FULLBLOG_DOMAIN_NAME/htdocs/config/users/$MY_USERNAME.ini
  7480. echo ';Role' >> /var/www/$FULLBLOG_DOMAIN_NAME/htdocs/config/users/$MY_USERNAME.ini
  7481. echo 'role = admin' >> /var/www/$FULLBLOG_DOMAIN_NAME/htdocs/config/users/$MY_USERNAME.ini
  7482. nginx_ensite $FULLBLOG_DOMAIN_NAME
  7483. FULLBLOG_ONION_HOSTNAME=$(add_onion_service blog 80 ${FULLBLOG_ONION_PORT})
  7484. systemctl restart php5-fpm
  7485. systemctl restart nginx
  7486. if ! grep -q "Blog onion domain" /home/$MY_USERNAME/README; then
  7487. echo "Blog onion domain: ${FULLBLOG_ONION_HOSTNAME}" >> /home/$MY_USERNAME/README
  7488. echo '' >> /home/$MY_USERNAME/README
  7489. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
  7490. chmod 600 /home/$MY_USERNAME/README
  7491. fi
  7492. echo "Blog onion domain:${FULLBLOG_ONION_HOSTNAME}" >> $COMPLETION_FILE
  7493. # update the dynamic DNS
  7494. CURRENT_DDNS_DOMAIN=$FULLBLOG_DOMAIN_NAME
  7495. add_ddns_domain
  7496. echo 'install_blog' >> $COMPLETION_FILE
  7497. }
  7498. function install_gnu_social {
  7499. 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
  7500. return
  7501. fi
  7502. if [ ! $MICROBLOG_DOMAIN_NAME ]; then
  7503. echo $'No domain name was given for the microblog'
  7504. exit 7359
  7505. fi
  7506. # update to the next commit
  7507. if [ -d /var/www/$MICROBLOG_DOMAIN_NAME/htdocs ]; then
  7508. if grep -q "GNU Social commit" $COMPLETION_FILE; then
  7509. CURRENT_GNUSOCIAL_COMMIT=$(grep "GNU Social commit" $COMPLETION_FILE | awk -F ':' '{print $2}')
  7510. if [[ "$CURRENT_GNUSOCIAL_COMMIT" != "$GNUSOCIAL_COMMIT" ]]; then
  7511. cd /var/www/$MICROBLOG_DOMAIN_NAME/htdocs
  7512. git_pull $MICROBLOG_REPO $GNUSOCIAL_COMMIT
  7513. sed -i "s/GNU Social commit.*/GNU Social commit:$GNUSOCIAL_COMMIT/g" $COMPLETION_FILE
  7514. chown -R www-data:www-data /var/www/$MICROBLOG_DOMAIN_NAME/htdocs
  7515. fi
  7516. else
  7517. echo "GNU Social commit:$GNUSOCIAL_COMMIT" >> $COMPLETION_FILE
  7518. fi
  7519. fi
  7520. if grep -Fxq "install_gnu_social" $COMPLETION_FILE; then
  7521. return
  7522. fi
  7523. install_mariadb
  7524. get_mariadb_password
  7525. repair_databases_script
  7526. apt-get -y install php-gettext php5-curl php5-gd php5-mysql git curl php-xml-parser
  7527. if [ ! -d /var/www/$MICROBLOG_DOMAIN_NAME ]; then
  7528. mkdir /var/www/$MICROBLOG_DOMAIN_NAME
  7529. fi
  7530. if [ ! -d /var/www/$MICROBLOG_DOMAIN_NAME/htdocs ]; then
  7531. git_clone $MICROBLOG_REPO /var/www/$MICROBLOG_DOMAIN_NAME/htdocs
  7532. if [ ! -d /var/www/$MICROBLOG_DOMAIN_NAME/htdocs ]; then
  7533. echo $'Unable to clone gnusocial repo'
  7534. exit 87525
  7535. fi
  7536. fi
  7537. cd /var/www/$MICROBLOG_DOMAIN_NAME/htdocs
  7538. git checkout $GNUSOCIAL_COMMIT -b $GNUSOCIAL_COMMIT
  7539. if ! grep -q "GNU Social commit" $COMPLETION_FILE; then
  7540. echo "GNU Social commit:$GNUSOCIAL_COMMIT" >> $COMPLETION_FILE
  7541. else
  7542. sed -i "s/GNU Social commit.*/GNU Social commit:$GNUSOCIAL_COMMIT/g" $COMPLETION_FILE
  7543. fi
  7544. chmod a+w /var/www/$MICROBLOG_DOMAIN_NAME/htdocs
  7545. chown www-data:www-data /var/www/$MICROBLOG_DOMAIN_NAME/htdocs
  7546. chmod a+w /var/www/$MICROBLOG_DOMAIN_NAME/htdocs/avatar
  7547. chmod a+w /var/www/$MICROBLOG_DOMAIN_NAME/htdocs/background
  7548. chmod a+w /var/www/$MICROBLOG_DOMAIN_NAME/htdocs/file
  7549. chmod +x /var/www/$MICROBLOG_DOMAIN_NAME/htdocs/scripts/maildaemon.php
  7550. get_mariadb_gnusocial_admin_password
  7551. if [ ! $MICROBLOG_ADMIN_PASSWORD ]; then
  7552. if [ -f $IMAGE_PASSWORD_FILE ]; then
  7553. MICROBLOG_ADMIN_PASSWORD="$(printf `cat $IMAGE_PASSWORD_FILE`)"
  7554. else
  7555. MICROBLOG_ADMIN_PASSWORD="$(openssl rand -base64 32)"
  7556. fi
  7557. echo '' >> /home/$MY_USERNAME/README
  7558. echo '' >> /home/$MY_USERNAME/README
  7559. echo $'GNU Social' >> /home/$MY_USERNAME/README
  7560. echo '==========' >> /home/$MY_USERNAME/README
  7561. echo $"Your MariaDB gnusocial admin password is: $MICROBLOG_ADMIN_PASSWORD" >> /home/$MY_USERNAME/README
  7562. echo '' >> /home/$MY_USERNAME/README
  7563. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
  7564. chmod 600 /home/$MY_USERNAME/README
  7565. fi
  7566. create_database gnusocial "$MICROBLOG_ADMIN_PASSWORD"
  7567. if [ ! -f "/etc/aliases" ]; then
  7568. touch /etc/aliases
  7569. fi
  7570. if grep -q "www-data: root" /etc/aliases; then
  7571. echo 'www-data: root' >> /etc/aliases
  7572. fi
  7573. if grep -q "/var/www/$MICROBLOG_DOMAIN_NAME/htdocs/scripts/maildaemon.php" /etc/aliases; then
  7574. echo "*: /var/www/$MICROBLOG_DOMAIN_NAME/htdocs/scripts/maildaemon.php" >> /etc/aliases
  7575. fi
  7576. newaliases
  7577. # update the dynamic DNS
  7578. CURRENT_DDNS_DOMAIN=$MICROBLOG_DOMAIN_NAME
  7579. add_ddns_domain
  7580. if [[ $ONION_ONLY == "no" ]]; then
  7581. echo 'server {' > /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7582. echo ' listen 80;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7583. echo " server_name $MICROBLOG_DOMAIN_NAME;" >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7584. echo " root /var/www/$MICROBLOG_DOMAIN_NAME/htdocs;" >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7585. echo ' access_log off;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7586. echo " error_log /var/log/nginx/${MICROBLOG_DOMAIN_NAME}_error.log $WEBSERVER_LOG_LEVEL;" >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7587. echo ' index index.php;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7588. echo ' limit_conn conn_limit_per_ip 10;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7589. echo ' limit_req zone=req_limit_per_ip burst=10 nodelay;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7590. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7591. echo '' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7592. echo ' rewrite ^ https://$server_name$request_uri? permanent;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7593. echo '}' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7594. echo '' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7595. echo 'server {' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7596. echo ' listen 443 ssl;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7597. echo " server_name $MICROBLOG_DOMAIN_NAME;" >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7598. echo " root /var/www/$MICROBLOG_DOMAIN_NAME/htdocs;" >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7599. echo ' index index.php index.html index.htm;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7600. echo ' access_log off;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7601. echo '' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7602. echo ' limit_conn conn_limit_per_ip 10;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7603. echo ' limit_req zone=req_limit_per_ip burst=10 nodelay;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7604. echo '' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7605. echo ' location ~* \.php$ {' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7606. echo ' # Zero-day exploit defense.' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7607. echo ' # http://forum.nginx.org/read.php?2,88845,page=3' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7608. echo ' try_files $uri $uri/ /index.php;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7609. echo ' fastcgi_split_path_info ^(.+\.php)(/.+)$;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7610. echo ' fastcgi_pass unix:/var/run/php5-fpm.sock;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7611. echo ' include fastcgi_params;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7612. echo ' fastcgi_index index.php;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7613. echo ' fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7614. echo ' fastcgi_read_timeout 300;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7615. echo ' }' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7616. echo '' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7617. echo ' ssl on;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7618. echo " ssl_certificate /etc/ssl/certs/$MICROBLOG_DOMAIN_NAME.crt;" >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7619. echo " ssl_certificate_key /etc/ssl/private/$MICROBLOG_DOMAIN_NAME.key;" >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7620. echo " ssl_dhparam /etc/ssl/certs/$MICROBLOG_DOMAIN_NAME.dhparam;" >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7621. echo '' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7622. echo ' ssl_session_timeout 60m;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7623. echo ' ssl_prefer_server_ciphers on;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7624. echo ' ssl_session_cache builtin:1000 shared:SSL:10m;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7625. echo " ssl_protocols $SSL_PROTOCOLS; # not possible to do exclusive" >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7626. echo " ssl_ciphers '$SSL_CIPHERS';" >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7627. echo ' add_header X-Frame-Options DENY;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7628. echo ' add_header X-Content-Type-Options nosniff;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7629. echo ' add_header Strict-Transport-Security max-age=15768000;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7630. echo '' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7631. echo ' location / {' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7632. echo ' rewrite ^(.*)$ /index.php?p=$1 last;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7633. echo ' break;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7634. echo ' }' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7635. echo '' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7636. echo ' location ~* ^/(.*)\.(ico|css|js|gif|png|jpg|bmp|JPG|jpeg)$ {' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7637. echo " root /var/www/$MICROBLOG_DOMAIN_NAME/htdocs;" >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7638. echo ' rewrite ^/(.*)$ /$1 break;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7639. echo ' access_log off;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7640. echo ' expires max;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7641. echo ' }' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7642. echo '' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7643. echo ' client_max_body_size 15m;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7644. echo '' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7645. echo " error_log /var/log/nginx/${MICROBLOG_DOMAIN_NAME}_error_ssl.log $WEBSERVER_LOG_LEVEL;" >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7646. echo '}' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7647. echo '' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7648. else
  7649. echo -n '' > /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7650. fi
  7651. echo 'server {' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7652. echo " listen 127.0.0.1:${MICROBLOG_ONION_PORT} default_server;" >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7653. echo " server_name $MICROBLOG_DOMAIN_NAME;" >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7654. echo " root /var/www/$MICROBLOG_DOMAIN_NAME/htdocs;" >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7655. echo ' index index.php index.html index.htm;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7656. echo ' access_log off;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7657. echo '' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7658. echo ' limit_conn conn_limit_per_ip 10;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7659. echo ' limit_req zone=req_limit_per_ip burst=10 nodelay;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7660. echo '' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7661. echo ' location ~* \.php$ {' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7662. echo ' # Zero-day exploit defense.' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7663. echo ' # http://forum.nginx.org/read.php?2,88845,page=3' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7664. echo ' try_files $uri $uri/ /index.php;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7665. echo ' fastcgi_split_path_info ^(.+\.php)(/.+)$;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7666. echo ' fastcgi_pass unix:/var/run/php5-fpm.sock;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7667. echo ' include fastcgi_params;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7668. echo ' fastcgi_index index.php;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7669. echo ' fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7670. echo ' fastcgi_read_timeout 300;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7671. echo ' }' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7672. echo '' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7673. echo ' add_header X-Frame-Options DENY;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7674. echo ' add_header X-Content-Type-Options nosniff;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7675. echo ' add_header Strict-Transport-Security max-age=15768000;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7676. echo '' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7677. echo ' location / {' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7678. echo ' rewrite ^(.*)$ /index.php?p=$1 last;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7679. echo ' break;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7680. echo ' }' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7681. echo '' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7682. echo ' location ~* ^/(.*)\.(ico|css|js|gif|png|jpg|bmp|JPG|jpeg)$ {' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7683. echo " root /var/www/$MICROBLOG_DOMAIN_NAME/htdocs;" >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7684. echo ' rewrite ^/(.*)$ /$1 break;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7685. echo ' access_log off;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7686. echo ' expires max;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7687. echo ' }' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7688. echo '' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7689. echo ' client_max_body_size 15m;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7690. echo '' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7691. echo " error_log /var/log/nginx/${MICROBLOG_DOMAIN_NAME}_error_ssl.log $WEBSERVER_LOG_LEVEL;" >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7692. echo '}' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7693. configure_php
  7694. if [[ $ONION_ONLY == "no" ]]; then
  7695. if [ ! -f /etc/ssl/certs/$MICROBLOG_DOMAIN_NAME.dhparam ]; then
  7696. ${PROJECT_NAME}-addcert -e $MICROBLOG_DOMAIN_NAME -s $LETSENCRYPT_SERVER --dhkey $DH_KEYLENGTH --email $MY_EMAIL_ADDRESS
  7697. check_certificates $MICROBLOG_DOMAIN_NAME
  7698. fi
  7699. fi
  7700. # Ensure that the database gets backed up locally, if remote
  7701. # backups are not being used
  7702. backup_databases_script_header
  7703. if ! grep -q "GNU Social" /usr/bin/backupdatabases; then
  7704. echo '' >> /usr/bin/backupdatabases
  7705. echo $'# Backup the GNU Social database' >> /usr/bin/backupdatabases
  7706. echo 'TEMPFILE=/root/gnusocial.sql' >> /usr/bin/backupdatabases
  7707. echo 'DAILYFILE=/var/backups/gnusocial_daily.sql' >> /usr/bin/backupdatabases
  7708. echo 'mysqldump --password="$MYSQL_PASSWORD" gnusocial > $TEMPFILE' >> /usr/bin/backupdatabases
  7709. echo 'FILESIZE=$(stat -c%s $TEMPFILE)' >> /usr/bin/backupdatabases
  7710. echo 'if [ "$FILESIZE" -eq "0" ]; then' >> /usr/bin/backupdatabases
  7711. echo ' if [ -f $DAILYFILE ]; then' >> /usr/bin/backupdatabases
  7712. echo ' cp $DAILYFILE $TEMPFILE' >> /usr/bin/backupdatabases
  7713. echo '' >> /usr/bin/backupdatabases
  7714. echo ' # try to restore yesterdays database' >> /usr/bin/backupdatabases
  7715. echo ' mysql -u root --password="$MYSQL_PASSWORD" gnusocial -o < $DAILYFILE' >> /usr/bin/backupdatabases
  7716. echo '' >> /usr/bin/backupdatabases
  7717. echo ' # Send a warning email' >> /usr/bin/backupdatabases
  7718. 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
  7719. echo ' else' >> /usr/bin/backupdatabases
  7720. echo ' # Send a warning email' >> /usr/bin/backupdatabases
  7721. echo ' echo "Unable to create a backup of the GNU Social database." | mail -s "GNU Social backup" $EMAIL' >> /usr/bin/backupdatabases
  7722. echo ' fi' >> /usr/bin/backupdatabases
  7723. echo 'else' >> /usr/bin/backupdatabases
  7724. echo ' chmod 600 $TEMPFILE' >> /usr/bin/backupdatabases
  7725. echo ' mv $TEMPFILE $DAILYFILE' >> /usr/bin/backupdatabases
  7726. echo '' >> /usr/bin/backupdatabases
  7727. echo ' # Make the backup readable only by root' >> /usr/bin/backupdatabases
  7728. echo ' chmod 600 $DAILYFILE' >> /usr/bin/backupdatabases
  7729. echo 'fi' >> /usr/bin/backupdatabases
  7730. fi
  7731. if ! grep -q "GNU Social" /etc/cron.weekly/backupdatabasesweekly; then
  7732. echo '' >> /etc/cron.weekly/backupdatabasesweekly
  7733. echo $'# GNU Social' >> /etc/cron.weekly/backupdatabasesweekly
  7734. echo 'if [ -f /var/backups/gnusocial_weekly.sql ]; then' >> /etc/cron.weekly/backupdatabasesweekly
  7735. echo ' cp -f /var/backups/gnusocial_weekly.sql /var/backups/gnusocial_2weekly.sql' >> /etc/cron.weekly/backupdatabasesweekly
  7736. echo 'fi' >> /etc/cron.weekly/backupdatabasesweekly
  7737. echo 'if [ -f /var/backups/gnusocial_daily.sql ]; then' >> /etc/cron.weekly/backupdatabasesweekly
  7738. echo ' cp -f /var/backups/gnusocial_daily.sql /var/backups/gnusocial_weekly.sql' >> /etc/cron.weekly/backupdatabasesweekly
  7739. echo 'fi' >> /etc/cron.weekly/backupdatabasesweekly
  7740. fi
  7741. if ! grep -q "GNU Social" /etc/cron.monthly/backupdatabasesmonthly; then
  7742. echo '' >> /etc/cron.monthly/backupdatabasesmonthly
  7743. echo $'# GNU Social' >> /etc/cron.monthly/backupdatabasesmonthly
  7744. echo 'if [ -f /var/backups/gnusocial_monthly.sql ]; then' >> /etc/cron.monthly/backupdatabasesmonthly
  7745. echo ' cp -f /var/backups/gnusocial_monthly.sql /var/backups/gnusocial_2monthly.sql' >> /etc/cron.monthly/backupdatabasesmonthly
  7746. echo 'fi' >> /etc/cron.monthly/backupdatabasesmonthly
  7747. echo 'if [ -f /var/backups/gnusocial_weekly.sql ]; then' >> /etc/cron.monthly/backupdatabasesmonthly
  7748. echo ' cp -f /var/backups/gnusocial_weekly.sql /var/backups/gnusocial_monthly.sql' >> /etc/cron.monthly/backupdatabasesmonthly
  7749. echo 'fi' >> /etc/cron.monthly/backupdatabasesmonthly
  7750. fi
  7751. if ! grep -q "gnusocial" /etc/cron.hourly/repair; then
  7752. echo "${PROJECT_NAME}-repair-database gnusocial" >> /etc/cron.hourly/repair
  7753. fi
  7754. nginx_ensite $MICROBLOG_DOMAIN_NAME
  7755. # Create the configuration
  7756. #echo '<?php' > /var/www/${MICROBLOG_DOMAIN_NAME}/htdocs/config.php
  7757. #echo "if (!defined('GNUSOCIAL')) { exit(1); }" >> /var/www/${MICROBLOG_DOMAIN_NAME}/htdocs/config.php
  7758. #echo '' >> /var/www/${MICROBLOG_DOMAIN_NAME}/htdocs/config.php
  7759. #echo "$config['site']['name'] = 'Freedombone Social';" >> /var/www/${MICROBLOG_DOMAIN_NAME}/htdocs/config.php
  7760. #echo '' >> /var/www/${MICROBLOG_DOMAIN_NAME}/htdocs/config.php
  7761. #echo "$config['site']['server'] = '$MICROBLOG_DOMAIN_NAME';" >> /var/www/${MICROBLOG_DOMAIN_NAME}/htdocs/config.php
  7762. #echo "$config['site']['path'] = false;" >> /var/www/${MICROBLOG_DOMAIN_NAME}/htdocs/config.php
  7763. #echo '' >> /var/www/${MICROBLOG_DOMAIN_NAME}/htdocs/config.php
  7764. #if [[ $ONION_ONLY == "no" ]]; then
  7765. # echo "$config['site']['ssl'] = 'always'; " >> /var/www/${MICROBLOG_DOMAIN_NAME}/htdocs/config.php
  7766. #else
  7767. # echo "$config['site']['ssl'] = 'never'; " >> /var/www/${MICROBLOG_DOMAIN_NAME}/htdocs/config.php
  7768. #fi
  7769. #echo '' >> /var/www/${MICROBLOG_DOMAIN_NAME}/htdocs/config.php
  7770. #echo "$config['site']['fancy'] = true;" >> /var/www/${MICROBLOG_DOMAIN_NAME}/htdocs/config.php
  7771. #echo '' >> /var/www/${MICROBLOG_DOMAIN_NAME}/htdocs/config.php
  7772. #echo "$config['db']['database'] = 'mysqli://root:${MARIADB_PASSWORD}@localhost/gnusocial';" >> /var/www/${MICROBLOG_DOMAIN_NAME}/htdocs/config.php
  7773. #echo '' >> /var/www/${MICROBLOG_DOMAIN_NAME}/htdocs/config.php
  7774. #echo "$config['db']['type'] = 'mysql';" >> /var/www/${MICROBLOG_DOMAIN_NAME}/htdocs/config.php
  7775. #echo '' >> /var/www/${MICROBLOG_DOMAIN_NAME}/htdocs/config.php
  7776. #echo '// Uncomment below for better performance. Just remember you must run' >> /var/www/${MICROBLOG_DOMAIN_NAME}/htdocs/config.php
  7777. #echo '// php scripts/checkschema.php whenever your enabled plugins change!' >> /var/www/${MICROBLOG_DOMAIN_NAME}/htdocs/config.php
  7778. #echo "$config['db']['schemacheck'] = 'script';" >> /var/www/${MICROBLOG_DOMAIN_NAME}/htdocs/config.php
  7779. #echo '' >> /var/www/${MICROBLOG_DOMAIN_NAME}/htdocs/config.php
  7780. #echo "$config['site']['profile'] = 'community';" >> /var/www/${MICROBLOG_DOMAIN_NAME}/htdocs/config.php
  7781. MICROBLOG_ONION_HOSTNAME=$(add_onion_service microblog 80 ${MICROBLOG_ONION_PORT})
  7782. systemctl restart php5-fpm
  7783. systemctl restart nginx
  7784. if ! grep -q "GNU Social onion domain" /home/$MY_USERNAME/README; then
  7785. echo "GNU Social onion domain: ${MICROBLOG_ONION_HOSTNAME}" >> /home/$MY_USERNAME/README
  7786. echo '' >> /home/$MY_USERNAME/README
  7787. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
  7788. chmod 600 /home/$MY_USERNAME/README
  7789. fi
  7790. echo "GNU Social onion domain:${MICROBLOG_ONION_HOSTNAME}" >> $COMPLETION_FILE
  7791. # some post-install instructions for the user
  7792. if ! grep -q $"To set up your microblog go to" /home/$MY_USERNAME/README; then
  7793. echo '' >> /home/$MY_USERNAME/README
  7794. echo '' >> /home/$MY_USERNAME/README
  7795. echo $'Microblog' >> /home/$MY_USERNAME/README
  7796. echo '=========' >> /home/$MY_USERNAME/README
  7797. echo $"To set up your microblog go to" >> /home/$MY_USERNAME/README
  7798. echo $"https://$MICROBLOG_DOMAIN_NAME/install.php" >> /home/$MY_USERNAME/README
  7799. echo $'and enter the following settings:' >> /home/$MY_USERNAME/README
  7800. echo $' - Set a name for the site' >> /home/$MY_USERNAME/README
  7801. echo $' - Server SSL: enable' >> /home/$MY_USERNAME/README
  7802. echo $' - Hostname: localhost' >> /home/$MY_USERNAME/README
  7803. echo $' - Type: MySql/MariaDB' >> /home/$MY_USERNAME/README
  7804. echo $' - Name: gnusocial' >> /home/$MY_USERNAME/README
  7805. echo $' - DB username: root' >> /home/$MY_USERNAME/README
  7806. echo $" - DB Password; $MARIADB_PASSWORD" >> /home/$MY_USERNAME/README
  7807. echo $" - Administrator nickname: $MY_USERNAME" >> /home/$MY_USERNAME/README
  7808. echo $" - Administrator password: $MICROBLOG_ADMIN_PASSWORD" >> /home/$MY_USERNAME/README
  7809. echo $' - Subscribe to announcements: ticked' >> /home/$MY_USERNAME/README
  7810. echo $' - Site profile: Community' >> /home/$MY_USERNAME/README
  7811. echo '' >> /home/$MY_USERNAME/README
  7812. echo $'When the install is complete you will see a lot of warnings' >> /home/$MY_USERNAME/README
  7813. echo $'but just ignore those and navigate to ' >> /home/$MY_USERNAME/README
  7814. echo $"https://$MICROBLOG_DOMAIN_NAME and you can then " >> /home/$MY_USERNAME/README
  7815. echo $'complete the configuration via the *Admin* section on the header' >> /home/$MY_USERNAME/README
  7816. echo $'bar. Some recommended admin settings are:' >> /home/$MY_USERNAME/README
  7817. echo '' >> /home/$MY_USERNAME/README
  7818. echo $'Under the *Site* settings:' >> /home/$MY_USERNAME/README
  7819. echo ' Text limit: 140' >> /home/$MY_USERNAME/README
  7820. echo ' Dupe Limit: 60000' >> /home/$MY_USERNAME/README
  7821. echo '' >> /home/$MY_USERNAME/README
  7822. echo $'Under the *User* settings:' >> /home/$MY_USERNAME/README
  7823. echo ' Bio limit: 1000' >> /home/$MY_USERNAME/README
  7824. echo '' >> /home/$MY_USERNAME/README
  7825. echo $'Under the *Access* settings:' >> /home/$MY_USERNAME/README
  7826. echo ' /Invite only/ ticked' >> /home/$MY_USERNAME/README
  7827. echo '' >> /home/$MY_USERNAME/README
  7828. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
  7829. chmod 600 /home/$MY_USERNAME/README
  7830. fi
  7831. echo "GNU Social domain:$MICROBLOG_DOMAIN_NAME" >> $COMPLETION_FILE
  7832. echo 'install_gnu_social' >> $COMPLETION_FILE
  7833. }
  7834. function install_hubzilla {
  7835. 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
  7836. return
  7837. fi
  7838. if [ ! $HUBZILLA_DOMAIN_NAME ]; then
  7839. return
  7840. fi
  7841. # For now it probably won't install as onion-only. This might change in future
  7842. if [[ $ONION_ONLY != "no" ]]; then
  7843. return
  7844. fi
  7845. # update to the next commit
  7846. if [ -d /var/www/$HUBZILLA_DOMAIN_NAME/htdocs ]; then
  7847. if grep -q "Hubzilla commit" $COMPLETION_FILE; then
  7848. CURRENT_HUBZILLA_COMMIT=$(grep "Hubzilla commit" $COMPLETION_FILE | awk -F ':' '{print $2}')
  7849. if [[ "$CURRENT_HUBZILLA_COMMIT" != "$HUBZILLA_COMMIT" ]]; then
  7850. cd /var/www/$HUBZILLA_DOMAIN_NAME/htdocs
  7851. git_pull $HUBZILLA_REPO $HUBZILLA_COMMIT
  7852. sed -i "s/Hubzilla commit.*/Hubzilla commit:$HUBZILLA_COMMIT/g" $COMPLETION_FILE
  7853. chown -R www-data:www-data /var/www/$HUBZILLA_DOMAIN_NAME/htdocs
  7854. fi
  7855. else
  7856. echo "Hubzilla commit:$HUBZILLA_COMMIT" >> $COMPLETION_FILE
  7857. fi
  7858. if grep -q "Hubzilla addons commit" $COMPLETION_FILE; then
  7859. CURRENT_HUBZILLA_ADDONS_COMMIT=$(grep "Hubzilla addons commit" $COMPLETION_FILE | awk -F ':' '{print $2}')
  7860. if [[ "$CURRENT_HUBZILLA_ADDONS_COMMIT" != "$HUBZILLA_ADDONS_COMMIT" ]]; then
  7861. cd /var/www/$HUBZILLA_DOMAIN_NAME/htdocs/addon
  7862. git_pull $HUBZILLA_ADDONS_REPO $HUBZILLA_ADDONS_COMMIT
  7863. sed -i "s/Hubzilla addons commit.*/Hubzilla addons commit:$HUBZILLA_ADDONS_COMMIT/g" $COMPLETION_FILE
  7864. chown -R www-data:www-data /var/www/$HUBZILLA_DOMAIN_NAME/htdocs
  7865. fi
  7866. else
  7867. echo "Hubzilla addons commit:$HUBZILLA_ADDONS_COMMIT" >> $COMPLETION_FILE
  7868. fi
  7869. fi
  7870. if grep -Fxq "install_hubzilla" $COMPLETION_FILE; then
  7871. return
  7872. fi
  7873. install_mariadb
  7874. get_mariadb_password
  7875. repair_databases_script
  7876. apt-get -y install php5-common php5-cli php5-curl php5-gd php5-mysql php5-mcrypt git
  7877. apt-get -y install php5-dev imagemagick php5-imagick
  7878. if [ ! -d /var/www/$HUBZILLA_DOMAIN_NAME ]; then
  7879. mkdir /var/www/$HUBZILLA_DOMAIN_NAME
  7880. fi
  7881. if [ ! -d /var/www/$HUBZILLA_DOMAIN_NAME/htdocs ]; then
  7882. mkdir /var/www/$HUBZILLA_DOMAIN_NAME/htdocs
  7883. fi
  7884. if [ ! -f /var/www/$HUBZILLA_DOMAIN_NAME/htdocs/index.php ]; then
  7885. cd $INSTALL_DIR
  7886. git_clone $HUBZILLA_REPO hubzilla
  7887. git checkout $HUBZILLA_COMMIT -b $HUBZILLA_COMMIT
  7888. if ! grep -q "Hubzilla commit" $COMPLETION_FILE; then
  7889. echo "Hubzilla commit:$HUBZILLA_COMMIT" >> $COMPLETION_FILE
  7890. else
  7891. sed -i "s/Hubzilla commit.*/Hubzilla commit:$HUBZILLA_COMMIT/g" $COMPLETION_FILE
  7892. fi
  7893. rm -rf /var/www/$HUBZILLA_DOMAIN_NAME/htdocs
  7894. mv hubzilla /var/www/$HUBZILLA_DOMAIN_NAME/htdocs
  7895. git_clone $HUBZILLA_ADDONS_REPO /var/www/$HUBZILLA_DOMAIN_NAME/htdocs/addon
  7896. cd /var/www/$HUBZILLA_DOMAIN_NAME/htdocs/addon
  7897. git checkout $HUBZILLA_ADDONS_COMMIT -b $HUBZILLA_ADDONS_COMMIT
  7898. if ! grep -q "Hubzilla addons commit" $COMPLETION_FILE; then
  7899. echo "Hubzilla addons commit:$HUBZILLA_ADDONS_COMMIT" >> $COMPLETION_FILE
  7900. else
  7901. sed -i "s/Hubzilla addons commit.*/Hubzilla addons commit:$HUBZILLA_ADDONS_COMMIT/g" $COMPLETION_FILE
  7902. fi
  7903. # some extra themes
  7904. git_clone $HUBZILLA_THEMES_REPO /var/www/$HUBZILLA_DOMAIN_NAME/htdocs/redmatrix-themes1
  7905. cp -r /var/www/$HUBZILLA_DOMAIN_NAME/htdocs/redmatrix-themes1/* view/theme/
  7906. chown -R www-data:www-data /var/www/$HUBZILLA_DOMAIN_NAME/htdocs
  7907. fi
  7908. get_mariadb_hubzilla_admin_password
  7909. if [ ! $HUBZILLA_ADMIN_PASSWORD ]; then
  7910. if [ -f $IMAGE_PASSWORD_FILE ]; then
  7911. HUBZILLA_ADMIN_PASSWORD="$(printf `cat $IMAGE_PASSWORD_FILE`)"
  7912. else
  7913. HUBZILLA_ADMIN_PASSWORD="$(openssl rand -base64 32)"
  7914. fi
  7915. echo '' >> /home/$MY_USERNAME/README
  7916. echo '' >> /home/$MY_USERNAME/README
  7917. echo 'Hubzilla' >> /home/$MY_USERNAME/README
  7918. echo '==========' >> /home/$MY_USERNAME/README
  7919. echo $"Your MariaDB Hubzilla admin password is: $HUBZILLA_ADMIN_PASSWORD" >> /home/$MY_USERNAME/README
  7920. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
  7921. chmod 600 /home/$MY_USERNAME/README
  7922. fi
  7923. create_database hubzilla "$HUBZILLA_ADMIN_PASSWORD"
  7924. if ! grep -q "/var/www/$HUBZILLA_DOMAIN_NAME/htdocs" /etc/crontab; then
  7925. 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
  7926. fi
  7927. # update the dynamic DNS
  7928. CURRENT_DDNS_DOMAIN=$HUBZILLA_DOMAIN_NAME
  7929. add_ddns_domain
  7930. if [[ $ONION_ONLY == "no" ]]; then
  7931. echo 'server {' > /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7932. echo ' listen 80;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7933. echo " server_name $HUBZILLA_DOMAIN_NAME;" >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7934. echo " root /var/www/$HUBZILLA_DOMAIN_NAME/htdocs;" >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7935. echo ' access_log off;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7936. echo " error_log /var/log/nginx/${HUBZILLA_DOMAIN_NAME}_error.log $WEBSERVER_LOG_LEVEL;" >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7937. echo ' limit_conn conn_limit_per_ip 10;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7938. echo ' limit_req zone=req_limit_per_ip burst=10 nodelay;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7939. echo ' index index.php;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7940. echo '' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7941. echo ' rewrite ^ https://$server_name$request_uri? permanent;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7942. echo '}' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7943. echo '' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7944. echo 'server {' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7945. echo ' listen 443 ssl;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7946. echo " root /var/www/$HUBZILLA_DOMAIN_NAME/htdocs;" >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7947. echo " server_name $HUBZILLA_DOMAIN_NAME;" >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7948. echo " error_log /var/log/nginx/${HUBZILLA_DOMAIN_NAME}_error_ssl.log $WEBSERVER_LOG_LEVEL;" >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7949. echo ' index index.php;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7950. echo ' charset utf-8;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7951. echo ' client_max_body_size 20m;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7952. echo ' client_body_buffer_size 128k;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7953. echo ' access_log off;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7954. echo '' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7955. echo ' limit_conn conn_limit_per_ip 10;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7956. echo ' limit_req zone=req_limit_per_ip burst=10 nodelay;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7957. echo '' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7958. echo ' ssl on;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7959. echo " ssl_certificate /etc/ssl/certs/$HUBZILLA_DOMAIN_NAME.bundle.crt;" >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7960. echo " ssl_certificate_key /etc/ssl/private/$HUBZILLA_DOMAIN_NAME.key;" >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7961. echo " ssl_dhparam /etc/ssl/certs/$HUBZILLA_DOMAIN_NAME.dhparam;" >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7962. echo '' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7963. echo ' ssl_session_timeout 60m;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7964. echo ' ssl_prefer_server_ciphers on;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7965. echo ' ssl_session_cache builtin:1000 shared:SSL:10m;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7966. echo " ssl_protocols $SSL_PROTOCOLS; # not possible to do exclusive" >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7967. echo " ssl_ciphers '$SSL_CIPHERS';" >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7968. echo ' add_header X-Frame-Options DENY;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7969. echo ' add_header X-Content-Type-Options nosniff;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7970. echo ' add_header Strict-Transport-Security max-age=15768000;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7971. echo '' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7972. echo ' # rewrite to front controller as default rule' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7973. echo ' location / {' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7974. echo ' rewrite ^/(.*) /index.php?q=$uri&$args last;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7975. echo ' }' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7976. echo '' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7977. echo " # make sure webfinger and other well known services aren't blocked" >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7978. echo ' # by denying dot files and rewrite request to the front controller' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7979. echo ' location ^~ /.well-known/ {' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7980. echo ' allow all;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7981. echo ' rewrite ^/(.*) /index.php?q=$uri&$args last;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7982. echo ' }' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7983. echo '' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7984. echo ' # statically serve these file types when possible' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7985. echo ' # otherwise fall back to front controller' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7986. echo ' # allow browser to cache them' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7987. echo ' # added .htm for advanced source code editor library' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7988. echo ' location ~* \.(jpg|jpeg|gif|png|ico|css|js|htm|html|ttf|woff|svg)$ {' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7989. echo ' expires 30d;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7990. echo ' try_files $uri /index.php?q=$uri&$args;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7991. echo ' }' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7992. echo '' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7993. echo ' # block these file types' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7994. echo ' location ~* \.(tpl|md|tgz|log|out)$ {' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7995. echo ' deny all;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7996. echo ' }' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7997. echo '' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7998. echo ' # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7999. echo ' # or a unix socket' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8000. echo ' location ~* \.php$ {' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8001. echo ' # Zero-day exploit defense.' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8002. echo ' # http://forum.nginx.org/read.php?2,88845,page=3' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8003. echo " # Won't work properly (404 error) if the file is not stored on this" >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8004. echo " # server, which is entirely possible with php-fpm/php-fcgi." >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8005. echo " # Comment the 'try_files' line out if you set up php-fpm/php-fcgi on" >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8006. echo " # another machine. And then cross your fingers that you won't get hacked." >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8007. echo ' try_files $uri $uri/ /index.php;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8008. echo ' # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8009. echo ' fastcgi_split_path_info ^(.+\.php)(/.+)$;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8010. echo ' # With php5-cgi alone:' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8011. echo ' # fastcgi_pass 127.0.0.1:9000;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8012. echo ' # With php5-fpm:' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8013. echo ' fastcgi_pass unix:/var/run/php5-fpm.sock;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8014. echo ' include fastcgi_params;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8015. echo ' fastcgi_index index.php;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8016. echo ' fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8017. echo ' fastcgi_read_timeout 300;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8018. echo ' }' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8019. echo '' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8020. echo ' # deny access to all dot files' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8021. echo ' location ~ /\. {' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8022. echo ' deny all;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8023. echo ' }' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8024. echo '' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8025. echo ' location ~ /\.ht {' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8026. echo ' deny all;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8027. echo ' }' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8028. echo '}' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8029. echo '' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8030. else
  8031. echo -n '' > /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8032. fi
  8033. echo 'server {' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8034. echo " listen 127.0.0.1:${HUBZILLA_ONION_PORT} default_server;" >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8035. echo " root /var/www/$HUBZILLA_DOMAIN_NAME/htdocs;" >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8036. echo " server_name $HUBZILLA_DOMAIN_NAME;" >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8037. echo " error_log /var/log/nginx/${HUBZILLA_DOMAIN_NAME}_error_ssl.log $WEBSERVER_LOG_LEVEL;" >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8038. echo ' index index.php;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8039. echo ' charset utf-8;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8040. echo ' client_max_body_size 20m;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8041. echo ' client_body_buffer_size 128k;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8042. echo ' access_log off;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8043. echo '' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8044. echo ' limit_conn conn_limit_per_ip 10;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8045. echo ' limit_req zone=req_limit_per_ip burst=10 nodelay;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8046. echo '' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8047. echo ' add_header X-Frame-Options DENY;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8048. echo ' add_header X-Content-Type-Options nosniff;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8049. echo ' add_header Strict-Transport-Security max-age=15768000;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8050. echo '' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8051. echo ' # rewrite to front controller as default rule' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8052. echo ' location / {' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8053. echo ' rewrite ^/(.*) /index.php?q=$uri&$args last;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8054. echo ' }' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8055. echo '' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8056. echo " # make sure webfinger and other well known services aren't blocked" >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8057. echo ' # by denying dot files and rewrite request to the front controller' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8058. echo ' location ^~ /.well-known/ {' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8059. echo ' allow all;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8060. echo ' rewrite ^/(.*) /index.php?q=$uri&$args last;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8061. echo ' }' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8062. echo '' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8063. echo ' # statically serve these file types when possible' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8064. echo ' # otherwise fall back to front controller' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8065. echo ' # allow browser to cache them' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8066. echo ' # added .htm for advanced source code editor library' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8067. echo ' location ~* \.(jpg|jpeg|gif|png|ico|css|js|htm|html|ttf|woff|svg)$ {' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8068. echo ' expires 30d;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8069. echo ' try_files $uri /index.php?q=$uri&$args;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8070. echo ' }' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8071. echo '' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8072. echo ' # block these file types' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8073. echo ' location ~* \.(tpl|md|tgz|log|out)$ {' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8074. echo ' deny all;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8075. echo ' }' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8076. echo '' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8077. echo ' # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8078. echo ' # or a unix socket' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8079. echo ' location ~* \.php$ {' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8080. echo ' # Zero-day exploit defense.' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8081. echo ' # http://forum.nginx.org/read.php?2,88845,page=3' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8082. echo " # Won't work properly (404 error) if the file is not stored on this" >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8083. echo " # server, which is entirely possible with php-fpm/php-fcgi." >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8084. echo " # Comment the 'try_files' line out if you set up php-fpm/php-fcgi on" >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8085. echo " # another machine. And then cross your fingers that you won't get hacked." >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8086. echo ' try_files $uri $uri/ /index.php;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8087. echo ' # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8088. echo ' fastcgi_split_path_info ^(.+\.php)(/.+)$;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8089. echo ' # With php5-cgi alone:' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8090. echo ' # fastcgi_pass 127.0.0.1:9000;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8091. echo ' # With php5-fpm:' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8092. echo ' fastcgi_pass unix:/var/run/php5-fpm.sock;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8093. echo ' include fastcgi_params;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8094. echo ' fastcgi_index index.php;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8095. echo ' fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8096. echo ' fastcgi_read_timeout 300;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8097. echo ' }' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8098. echo '' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8099. echo ' # deny access to all dot files' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8100. echo ' location ~ /\. {' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8101. echo ' deny all;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8102. echo ' }' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8103. echo '' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8104. echo ' location ~ /\.ht {' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8105. echo ' deny all;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8106. echo ' }' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8107. echo '}' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8108. configure_php
  8109. if [[ $ONION_ONLY == "no" ]]; then
  8110. if [ ! -f /etc/ssl/certs/$HUBZILLA_DOMAIN_NAME.dhparam ]; then
  8111. ${PROJECT_NAME}-addcert -e $HUBZILLA_DOMAIN_NAME -s $LETSENCRYPT_SERVER --dhkey $DH_KEYLENGTH --email $MY_EMAIL_ADDRESS
  8112. check_certificates $HUBZILLA_DOMAIN_NAME
  8113. fi
  8114. fi
  8115. if [ ! -d /var/www/$HUBZILLA_DOMAIN_NAME/htdocs/view/tpl/smarty3 ]; then
  8116. mkdir /var/www/$HUBZILLA_DOMAIN_NAME/htdocs/view/tpl/smarty3
  8117. fi
  8118. if [ ! -d "/var/www/$HUBZILLA_DOMAIN_NAME/htdocs/store" ]; then
  8119. mkdir "/var/www/$HUBZILLA_DOMAIN_NAME/htdocs/store"
  8120. fi
  8121. if [ ! -d "/var/www/$HUBZILLA_DOMAIN_NAME/htdocs/store/[data]" ]; then
  8122. mkdir "/var/www/$HUBZILLA_DOMAIN_NAME/htdocs/store/[data]"
  8123. fi
  8124. if [ ! -d "/var/www/$HUBZILLA_DOMAIN_NAME/htdocs/store/[data]/smarty3" ]; then
  8125. mkdir "/var/www/$HUBZILLA_DOMAIN_NAME/htdocs/store/[data]/smarty3"
  8126. chmod 777 "/var/www/$HUBZILLA_DOMAIN_NAME/htdocs/store/[data]/smarty3"
  8127. fi
  8128. chmod 777 /var/www/$HUBZILLA_DOMAIN_NAME/htdocs/view/tpl
  8129. chown -R www-data:www-data "/var/www/$HUBZILLA_DOMAIN_NAME/htdocs/store"
  8130. chmod 777 /var/www/$HUBZILLA_DOMAIN_NAME/htdocs/view/tpl/smarty3
  8131. # Ensure that the database gets backed up locally, if remote
  8132. # backups are not being used
  8133. backup_databases_script_header
  8134. echo '' >> /usr/bin/backupdatabases
  8135. echo $'# Backup the Hubzilla database' >> /usr/bin/backupdatabases
  8136. echo 'TEMPFILE=/root/hubzilla.sql' >> /usr/bin/backupdatabases
  8137. echo 'DAILYFILE=/var/backups/hubzilla_daily.sql' >> /usr/bin/backupdatabases
  8138. echo 'mysqldump --password="$MYSQL_PASSWORD" hubzilla > $TEMPFILE' >> /usr/bin/backupdatabases
  8139. echo 'FILESIZE=$(stat -c%s $TEMPFILE)' >> /usr/bin/backupdatabases
  8140. echo 'if [ "$FILESIZE" -lt "1024" ]; then' >> /usr/bin/backupdatabases
  8141. echo ' if [ -f $DAILYFILE ]; then' >> /usr/bin/backupdatabases
  8142. echo ' cp $DAILYFILE $TEMPFILE' >> /usr/bin/backupdatabases
  8143. echo '' >> /usr/bin/backupdatabases
  8144. echo ' # try to restore yesterdays database' >> /usr/bin/backupdatabases
  8145. echo ' mysql -u root --password="$MYSQL_PASSWORD" hubzilla -o < $DAILYFILE' >> /usr/bin/backupdatabases
  8146. echo '' >> /usr/bin/backupdatabases
  8147. echo ' # Send a warning email' >> /usr/bin/backupdatabases
  8148. 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
  8149. echo ' else' >> /usr/bin/backupdatabases
  8150. echo ' # Send a warning email' >> /usr/bin/backupdatabases
  8151. echo ' echo "Unable to create a backup of the Hubzilla database." | mail -s "Hubzilla backup" $EMAIL' >> /usr/bin/backupdatabases
  8152. echo ' fi' >> /usr/bin/backupdatabases
  8153. echo 'else' >> /usr/bin/backupdatabases
  8154. echo ' chmod 600 $TEMPFILE' >> /usr/bin/backupdatabases
  8155. echo ' mv $TEMPFILE $DAILYFILE' >> /usr/bin/backupdatabases
  8156. echo '' >> /usr/bin/backupdatabases
  8157. echo ' # Make the backup readable only by root' >> /usr/bin/backupdatabases
  8158. echo ' chmod 600 $DAILYFILE' >> /usr/bin/backupdatabases
  8159. echo 'fi' >> /usr/bin/backupdatabases
  8160. echo '' >> /etc/cron.weekly/backupdatabasesweekly
  8161. echo '# Hubzilla' >> /etc/cron.weekly/backupdatabasesweekly
  8162. echo 'if [ -f /var/backups/hubzilla_weekly.sql ]; then' >> /etc/cron.weekly/backupdatabasesweekly
  8163. echo ' cp -f /var/backups/hubzilla_weekly.sql /var/backups/hubzilla_2weekly.sql' >> /etc/cron.weekly/backupdatabasesweekly
  8164. echo 'fi' >> /etc/cron.weekly/backupdatabasesweekly
  8165. echo 'if [ -f /var/backups/hubzilla_daily.sql ]; then' >> /etc/cron.weekly/backupdatabasesweekly
  8166. echo ' cp -f /var/backups/hubzilla_daily.sql /var/backups/hubzilla_weekly.sql' >> /etc/cron.weekly/backupdatabasesweekly
  8167. echo 'fi' >> /etc/cron.weekly/backupdatabasesweekly
  8168. echo '' >> /etc/cron.monthly/backupdatabasesmonthly
  8169. echo '# Hubzilla' >> /etc/cron.monthly/backupdatabasesmonthly
  8170. echo 'if [ -f /var/backups/hubzilla_monthly.sql ]; then' >> /etc/cron.monthly/backupdatabasesmonthly
  8171. echo ' cp -f /var/backups/hubzilla_monthly.sql /var/backups/hubzilla_2monthly.sql' >> /etc/cron.monthly/backupdatabasesmonthly
  8172. echo 'fi' >> /etc/cron.monthly/backupdatabasesmonthly
  8173. echo 'if [ -f /var/backups/hubzilla_weekly.sql ]; then' >> /etc/cron.monthly/backupdatabasesmonthly
  8174. echo ' cp -f /var/backups/hubzilla_weekly.sql /var/backups/hubzilla_monthly.sql' >> /etc/cron.monthly/backupdatabasesmonthly
  8175. echo 'fi' >> /etc/cron.monthly/backupdatabasesmonthly
  8176. if ! grep -q "hubzilla" /etc/cron.hourly/repair; then
  8177. echo "${PROJECT_NAME}-repair-database hubzilla" >> /etc/cron.hourly/repair
  8178. # remove legacy stuff
  8179. sed -i 's|/usr/bin/repairdatabase redmatrix||g' /etc/cron.hourly/repair
  8180. fi
  8181. chown -R www-data:www-data /var/www/$HUBZILLA_DOMAIN_NAME/htdocs
  8182. nginx_ensite $HUBZILLA_DOMAIN_NAME
  8183. HUBZILLA_ONION_HOSTNAME=$(add_onion_service hubzilla 80 ${HUBZILLA_ONION_PORT})
  8184. systemctl restart php5-fpm
  8185. systemctl restart nginx
  8186. systemctl restart cron
  8187. if ! grep -q "Hubzilla onion domain" /home/$MY_USERNAME/README; then
  8188. echo "Hubzilla onion domain: ${HUBZILLA_ONION_HOSTNAME}" >> /home/$MY_USERNAME/README
  8189. echo '' >> /home/$MY_USERNAME/README
  8190. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
  8191. chmod 600 /home/$MY_USERNAME/README
  8192. fi
  8193. echo "Hubzilla domain:${HUBZILLA_DOMAIN_NAME}" >> $COMPLETION_FILE
  8194. echo "Hubzilla onion domain:${HUBZILLA_ONION_HOSTNAME}" >> $COMPLETION_FILE
  8195. echo 'install_hubzilla' >> $COMPLETION_FILE
  8196. }
  8197. function script_for_attaching_usb_drive {
  8198. if grep -Fxq "script_for_attaching_usb_drive" $COMPLETION_FILE; then
  8199. return
  8200. fi
  8201. echo '#!/bin/bash' > /usr/bin/attach-music
  8202. echo 'remove-music' >> /usr/bin/attach-music
  8203. echo "if [ ! -d $USB_MOUNT ]; then" >> /usr/bin/attach-music
  8204. echo " mkdir $USB_MOUNT" >> /usr/bin/attach-music
  8205. echo 'fi' >> /usr/bin/attach-music
  8206. echo "mount /dev/sda1 $USB_MOUNT" >> /usr/bin/attach-music
  8207. echo "chown root:root $USB_MOUNT" >> /usr/bin/attach-music
  8208. echo "chown -R minidlna:minidlna $USB_MOUNT/*" >> /usr/bin/attach-music
  8209. echo 'service minidlna restart' >> /usr/bin/attach-music
  8210. echo 'minidlnad -R' >> /usr/bin/attach-music
  8211. chmod +x /usr/bin/attach-music
  8212. ln -s /usr/bin/attach-music /usr/bin/attach-usb
  8213. ln -s /usr/bin/attach-music /usr/bin/attach-videos
  8214. ln -s /usr/bin/attach-music /usr/bin/attach-pictures
  8215. ln -s /usr/bin/attach-music /usr/bin/attach-media
  8216. echo '#!/bin/bash' > /usr/bin/remove-music
  8217. echo "if [ -d $USB_MOUNT ]; then" >> /usr/bin/remove-music
  8218. echo " umount $USB_MOUNT" >> /usr/bin/remove-music
  8219. echo " rm -rf $USB_MOUNT" >> /usr/bin/remove-music
  8220. echo 'fi' >> /usr/bin/remove-music
  8221. chmod +x /usr/bin/remove-music
  8222. ln -s /usr/bin/remove-music /usr/bin/detach-music
  8223. ln -s /usr/bin/remove-music /usr/bin/detach-usb
  8224. ln -s /usr/bin/remove-music /usr/bin/remove-usb
  8225. ln -s /usr/bin/remove-music /usr/bin/detach-media
  8226. ln -s /usr/bin/remove-music /usr/bin/remove-media
  8227. ln -s /usr/bin/remove-music /usr/bin/detach-videos
  8228. ln -s /usr/bin/remove-music /usr/bin/remove-videos
  8229. ln -s /usr/bin/remove-music /usr/bin/detach-pictures
  8230. ln -s /usr/bin/remove-music /usr/bin/remove-pictures
  8231. echo 'script_for_attaching_usb_drive' >> $COMPLETION_FILE
  8232. }
  8233. function install_dlna_server {
  8234. if grep -Fxq "install_dlna_server" $COMPLETION_FILE; then
  8235. return
  8236. fi
  8237. 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
  8238. return
  8239. fi
  8240. apt-get -y install minidlna
  8241. if [ ! -f /etc/minidlna.conf ]; then
  8242. echo $"ERROR: minidlna does not appear to have installed. $CHECK_MESSAGE"
  8243. exit 55
  8244. fi
  8245. sed -i "s|media_dir=/var/lib/minidlna|media_dir=A,/home/$MY_USERNAME/Music|g" /etc/minidlna.conf
  8246. if ! grep -q "/home/$MY_USERNAME/Pictures" /etc/minidlna.conf; then
  8247. echo "media_dir=P,/home/$MY_USERNAME/Pictures" >> /etc/minidlna.conf
  8248. fi
  8249. if ! grep -q "/home/$MY_USERNAME/Videos" /etc/minidlna.conf; then
  8250. echo "media_dir=V,/home/$MY_USERNAME/Videos" >> /etc/minidlna.conf
  8251. fi
  8252. if ! grep -q "$USB_MOUNT/Music" /etc/minidlna.conf; then
  8253. echo "media_dir=A,$USB_MOUNT/Music" >> /etc/minidlna.conf
  8254. fi
  8255. if ! grep -q "$USB_MOUNT/Pictures" /etc/minidlna.conf; then
  8256. echo "media_dir=P,$USB_MOUNT/Pictures" >> /etc/minidlna.conf
  8257. fi
  8258. if ! grep -q "$USB_MOUNT/Videos" /etc/minidlna.conf; then
  8259. echo "media_dir=V,$USB_MOUNT/Videos" >> /etc/minidlna.conf
  8260. fi
  8261. sed -i 's/#root_container=./root_container=B/g' /etc/minidlna.conf
  8262. if [[ $SYSTEM_TYPE != "$VARIANT_MESH" ]]; then
  8263. sed -i 's/#network_interface=/network_interface=eth0/g' /etc/minidlna.conf
  8264. else
  8265. sed -i 's/#network_interface=/network_interface=$WIFI_INTERFACE/g' /etc/minidlna.conf
  8266. fi
  8267. sed -i "s/#friendly_name=/friendly_name=\"${PROJECT_NAME} Media\"/g" /etc/minidlna.conf
  8268. sed -i 's|#db_dir=/var/cache/minidlna|db_dir=/var/cache/minidlna|g' /etc/minidlna.conf
  8269. sed -i 's/#inotify=yes/inotify=yes/g' /etc/minidlna.conf
  8270. sed -i 's/#notify_interval=895/notify_interval=300/g' /etc/minidlna.conf
  8271. sed -i "s|#presentation_url=/|presentation_url=http://localhost:8200|g" /etc/minidlna.conf
  8272. service minidlna force-reload
  8273. service minidlna reload
  8274. sed -i 's/fs.inotify.max_user_watches*/fs.inotify.max_user_watches=65536/g' /etc/sysctl.conf
  8275. if ! grep -q "max_user_watches" $COMPLETION_FILE; then
  8276. echo 'fs.inotify.max_user_watches=65536' >> /etc/sysctl.conf
  8277. fi
  8278. /sbin/sysctl -p
  8279. echo 'install_dlna_server' >> $COMPLETION_FILE
  8280. }
  8281. function install_mediagoblin {
  8282. return
  8283. if grep -Fxq "install_mediagoblin" $COMPLETION_FILE; then
  8284. return
  8285. fi
  8286. 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
  8287. return
  8288. fi
  8289. if [ ! $MEDIAGOBLIN_DOMAIN_NAME ]; then
  8290. return
  8291. fi
  8292. apt-get -y install git-core python python-dev python-lxml python-imaging python-virtualenv
  8293. apt-get -y install postgresql postgresql-client python-psycopg2
  8294. apt-get -y install python-gst-1.0 libjpeg62-turbo-dev gstreamer1.0-plugins-base python-gobject
  8295. apt-get -y install gstreamer1.0-plugins-good gstreamer1.0-libav libav-tools gstreamer0.10-tools
  8296. apt-get -y install python-numpy python-scipy libsndfile1-dev python-gst0.10-dev
  8297. apt-get -y install gstreamer0.10-plugins-base gstreamer0.10-plugins-good gstreamer1.0-tools
  8298. su -c "createuser -A -D mediagoblin" - postgres
  8299. su -c "createdb -E UNICODE -O mediagoblin mediagoblin" - postgres
  8300. adduser --disabled-login --gecos 'Mediagoblin' mediagoblin
  8301. MEDIAGOBLIN_DOMAIN_ROOT="/home/mediagoblin"
  8302. MEDIAGOBLIN_PATH="$MEDIAGOBLIN_DOMAIN_ROOT/mediagoblin"
  8303. MEDIAGOBLIN_PATH_BIN="$MEDIAGOBLIN_PATH/mediagoblin/bin"
  8304. mkdir -p $MEDIAGOBLIN_DOMAIN_ROOT
  8305. chown -hR mediagoblin: $MEDIAGOBLIN_DOMAIN_ROOT
  8306. su -c "cd $MEDIAGOBLIN_DOMAIN_ROOT; git clone $MEDIAGOBLIN_REPO" - mediagoblin
  8307. cd $MEDIAGOBLIN_DOMAIN_ROOT
  8308. git checkout -q v0.7.1
  8309. su -c "cd $MEDIAGOBLIN_PATH; git submodule init" - mediagoblin
  8310. su -c "cd $MEDIAGOBLIN_PATH; git submodule update" - mediagoblin
  8311. su -c "cd $MEDIAGOBLIN_PATH; (virtualenv --python=python2 --system-site-packages . || cd $MEDIAGOBLIN_PATH; virtualenv --python=python2 .) && ./bin/python setup.py develop" - mediagoblin
  8312. su -c "cd $MEDIAGOBLIN_PATH; ./bin/easy_install flup" - mediagoblin
  8313. if [ -f $MEDIAGOBLIN_PATH/lib/python2.7/no-global-site-packages.txt ]; then
  8314. virtualenv deactivate
  8315. rm -f $MEDIAGOBLIN_PATH/lib/python2.7/no-global-site-packages.txt
  8316. su -c "cd $MEDIAGOBLIN_PATH; source bin/activate" - mediagoblin
  8317. fi
  8318. if [ -f $MEDIAGOBLIN_PATH/mediagoblin.example.ini ]; then
  8319. # this is for versions > 0.7.1
  8320. su -c "cp $MEDIAGOBLIN_PATH/mediagoblin.example.ini $MEDIAGOBLIN_PATH/mediagoblin_local.ini" - mediagoblin
  8321. sed -i 's|# data_basedir.*|data_basedir = "/var/lib/mediagoblin"|g' $MEDIAGOBLIN_PATH/mediagoblin_local.ini
  8322. else
  8323. su -c "cp $MEDIAGOBLIN_PATH/mediagoblin.ini $MEDIAGOBLIN_PATH/mediagoblin_local.ini" - mediagoblin
  8324. fi
  8325. sed -i 's|# sql_engine.*|sql_engine = postgresql:///mediagoblin|g' $MEDIAGOBLIN_PATH/mediagoblin_local.ini
  8326. sed -i "s/email_sender_address.*/email_sender_address = \"$MY_EMAIL_ADDRESS\"/g" $MEDIAGOBLIN_PATH/mediagoblin_local.ini
  8327. sed -i 's|email_debug_mode.*|email_debug_mode = false|g' $MEDIAGOBLIN_PATH/mediagoblin_local.ini
  8328. # add extra media types
  8329. if ! grep -q "media_types.stl" $MEDIAGOBLIN_PATH/mediagoblin_local.ini; then
  8330. echo '[[mediagoblin.media_types.stl]]' >> $MEDIAGOBLIN_PATH/mediagoblin_local.ini
  8331. fi
  8332. if ! grep -q "media_types.audio" $MEDIAGOBLIN_PATH/mediagoblin_local.ini; then
  8333. echo '[[mediagoblin.media_types.audio]]' >> $MEDIAGOBLIN_PATH/mediagoblin_local.ini
  8334. fi
  8335. if ! grep -q "media_types.video" $MEDIAGOBLIN_PATH/mediagoblin_local.ini; then
  8336. echo '[[mediagoblin.media_types.video]]' >> $MEDIAGOBLIN_PATH/mediagoblin_local.ini
  8337. fi
  8338. #su -c 'cd $MEDIAGOBLIN_PATH; ./bin/pip install scikits.audiolab' - mediagoblin
  8339. #su -c "cd $MEDIAGOBLIN_PATH; git submodule update && ./bin/python setup.py develop --upgrade && ./bin/gmg dbupdate" - mediagoblin
  8340. su -c "cd $MEDIAGOBLIN_PATH; ./bin/gmg dbupdate" - mediagoblin
  8341. echo 'server {' > /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8342. echo ' listen 80;' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8343. echo " server_name $MEDIAGOBLIN_DOMAIN_NAME;" >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8344. echo ' access_log off;' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8345. echo " error_log /var/log/nginx/${MEDIAGOBLIN_DOMAIN_NAME}_error.log $WEBSERVER_LOG_LEVEL;" >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8346. echo ' limit_conn conn_limit_per_ip 10;' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8347. echo ' limit_req zone=req_limit_per_ip burst=10 nodelay;' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8348. echo ' location / {' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8349. echo ' proxy_pass http://localhost:6543;' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8350. echo ' }' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8351. echo ' location ^~ /auth/ {' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8352. echo ' rewrite ^ https://$server_name$request_uri?;' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8353. echo ' }' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8354. echo ' location ^~ /u/ {' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8355. echo ' rewrite ^ https://$server_name$request_uri?;' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8356. echo ' }' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8357. echo ' location ^~ /submit/ {' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8358. echo ' rewrite ^ https://$server_name$request_uri?;' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8359. echo ' }' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8360. echo '}' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8361. echo '' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8362. echo 'server {' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8363. echo ' listen 443 ssl;' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8364. echo " root /var/www/$MEDIAGOBLIN_DOMAIN_NAME/htdocs;" >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8365. echo " server_name $MEDIAGOBLIN_DOMAIN_NAME;" >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8366. echo ' access_log off;' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8367. echo " error_log /var/log/nginx/${MEDIAGOBLIN_DOMAIN_NAME}_error.log $WEBSERVER_LOG_LEVEL;" >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8368. echo '' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8369. echo ' limit_conn conn_limit_per_ip 10;' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8370. echo ' limit_req zone=req_limit_per_ip burst=10 nodelay;' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8371. echo '' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8372. echo ' ssl on;' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8373. echo " ssl_certificate /etc/ssl/certs/$MEDIAGOBLIN_DOMAIN_NAME.crt;" >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8374. echo " ssl_certificate_key /etc/ssl/private/$MEDIAGOBLIN_DOMAIN_NAME.key;" >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8375. echo " ssl_dhparam /etc/ssl/certs/$MEDIAGOBLIN_DOMAIN_NAME.dhparam;" >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8376. echo '' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8377. echo ' ssl_session_timeout 60m;' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8378. echo ' ssl_prefer_server_ciphers on;' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8379. echo " ssl_protocols $SSL_PROTOCOLS; # not possible to do exclusive" >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8380. echo " ssl_ciphers '$SSL_CIPHERS';" >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8381. echo ' add_header X-Frame-Options DENY;' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8382. echo ' add_header X-Content-Type-Options nosniff;' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8383. echo ' add_header Strict-Transport-Security max-age=0;' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8384. echo '' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8385. echo ' location / {' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8386. echo ' proxy_pass http://localhost:6543;' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8387. echo ' }' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8388. echo '' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8389. echo ' client_max_body_size 10G; # set max upload size' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8390. echo ' client_body_buffer_size 128k;' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8391. echo ' fastcgi_buffers 64 4K;' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8392. echo '' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8393. echo ' error_page 403 /core/templates/403.php;' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8394. echo ' error_page 404 /core/templates/404.php;' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8395. echo '' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8396. echo ' location = /robots.txt {' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8397. echo ' allow all;' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8398. echo ' log_not_found off;' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8399. echo ' access_log off;' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8400. echo ' }' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8401. echo '}' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8402. if [ ! -f /etc/ssl/certs/$MEDIAGOBLIN_DOMAIN_NAME.dhparam ]; then
  8403. if [[ $LETSENCRYPT_ENABLED != "yes" ]]; then
  8404. ${PROJECT_NAME}-addcert -h $MEDIAGOBLIN_DOMAIN_NAME --dhkey $DH_KEYLENGTH
  8405. else
  8406. ${PROJECT_NAME}-addcert -e $MEDIAGOBLIN_DOMAIN_NAME -s $LETSENCRYPT_SERVER --dhkey $DH_KEYLENGTH --email $MY_EMAIL_ADDRESS
  8407. fi
  8408. check_certificates $MEDIAGOBLIN_DOMAIN_NAME
  8409. fi
  8410. nginx_ensite $MEDIAGOBLIN_DOMAIN_NAME
  8411. systemctl restart php5-fpm
  8412. systemctl restart nginx
  8413. /usr/sbin/nginx -s reload
  8414. # update the dynamic DNS
  8415. CURRENT_DDNS_DOMAIN=$MEDIAGOBLIN_DOMAIN_NAME
  8416. add_ddns_domain
  8417. # init with systemd
  8418. echo '[Unit]' > /etc/systemd/system/mediagoblin.service
  8419. echo 'Description=Mediagoblin (Media Server)' >> /etc/systemd/system/mediagoblin.service
  8420. echo 'After=syslog.target' >> /etc/systemd/system/mediagoblin.service
  8421. echo 'After=network.target' >> /etc/systemd/system/mediagoblin.service
  8422. echo 'After=postgresql.service' >> /etc/systemd/system/mediagoblin.service
  8423. echo '' >> /etc/systemd/system/mediagoblin.service
  8424. echo '[Service]' >> /etc/systemd/system/mediagoblin.service
  8425. echo 'Type=simple' >> /etc/systemd/system/mediagoblin.service
  8426. echo 'User=mediagoblin' >> /etc/systemd/system/mediagoblin.service
  8427. echo 'Group=mediagoblin' >> /etc/systemd/system/mediagoblin.service
  8428. echo 'WorkingDirectory=/home/mediagoblin/mediagoblin' >> /etc/systemd/system/mediagoblin.service
  8429. echo 'ExecStart=/home/mediagoblin/mediagoblin/lazyserver.sh --server-name=broadcast' >> /etc/systemd/system/mediagoblin.service
  8430. echo 'Restart=always' >> /etc/systemd/system/mediagoblin.service
  8431. echo 'Environment="USER=mediagoblin","HOME=/home/mediagoblin"' >> /etc/systemd/system/mediagoblin.service
  8432. echo '' >> /etc/systemd/system/mediagoblin.service
  8433. echo '[Install]' >> /etc/systemd/system/mediagoblin.service
  8434. echo 'WantedBy=multi-user.target' >> /etc/systemd/system/mediagoblin.service
  8435. systemctl enable mediagoblin
  8436. systemctl restart mediagoblin
  8437. echo 'install_mediagoblin' >> $COMPLETION_FILE
  8438. }
  8439. function create_upgrade_script {
  8440. if [ -f /usr/local/bin/${PROJECT_NAME}-upgrade ]; then
  8441. cp /usr/local/bin/${PROJECT_NAME}-upgrade /etc/cron.weekly/$UPGRADE_SCRIPT_NAME
  8442. else
  8443. cp /usr/bin/${PROJECT_NAME}-upgrade /etc/cron.weekly/$UPGRADE_SCRIPT_NAME
  8444. fi
  8445. if grep -Fxq "create_upgrade_script" $COMPLETION_FILE; then
  8446. return
  8447. fi
  8448. apt-get -y install unattended-upgrades
  8449. echo 'create_upgrade_script' >> $COMPLETION_FILE
  8450. }
  8451. function intrusion_detection {
  8452. if grep -Fxq "intrusion_detection" $COMPLETION_FILE; then
  8453. return
  8454. fi
  8455. if [[ $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  8456. return
  8457. fi
  8458. apt-get -y install tripwire
  8459. apt-get -y autoremove
  8460. cd /etc/tripwire
  8461. cp site.key $DEFAULT_DOMAIN_NAME-site.key
  8462. echo '*** Installing intrusion detection ***'
  8463. echo '
  8464. ' | tripwire --init
  8465. # make a script for easy resetting of the tripwire
  8466. echo '#!/bin/sh' > /usr/bin/reset-tripwire
  8467. echo 'tripwire --update-policy --secure-mode low /etc/tripwire/twpol.txt' >> /usr/bin/reset-tripwire
  8468. chmod +x /usr/bin/reset-tripwire
  8469. sed -i 's/SYSLOGREPORTING.*/SYSLOGREPORTING =false/g' /etc/tripwire/twcfg.txt
  8470. # only send emails if something has changed
  8471. sed -i 's|MAILNOVIOLATIONS.*|MAILNOVIOLATIONS = false|g' /etc/tripwire/twcfg.txt
  8472. sed -i '/# These files change the behavior of the root account/,/}/ s/.*//g' /etc/tripwire/twpol.txt
  8473. sed -i 's|/etc/rc.boot.*||g' /etc/tripwire/twpol.txt
  8474. # Don't show any changes to /proc
  8475. sed -i 's|/proc.*||g' /etc/tripwire/twpol.txt
  8476. # Don't report log changes
  8477. sed -i 's|/var/log.*||g' /etc/tripwire/twpol.txt
  8478. # Ignore /etc/tripwire
  8479. if ! grep -q "!/etc/tripwire" /etc/tripwire/twpol.txt; then
  8480. sed -i '\|/etc\t\t->.*|a\ !/etc/tripwire;' /etc/tripwire/twpol.txt
  8481. fi
  8482. # Avoid logging the changed database
  8483. sed -i 's|$(TWETC)/tw.pol.*||g' /etc/tripwire/twpol.txt
  8484. # recreate the configuration
  8485. echo '
  8486. ' | twadmin --create-cfgfile -S /etc/tripwire/site.key /etc/tripwire/twcfg.txt
  8487. # reset
  8488. echo '
  8489. ' | reset-tripwire
  8490. echo 'intrusion_detection' >> $COMPLETION_FILE
  8491. }
  8492. # see https://trac.torproject.org/projects/tor/wiki/doc/TransparentProxy
  8493. # Local Redirection and Anonymizing Middlebox
  8494. function route_outgoing_traffic_through_tor {
  8495. if grep -Fxq "route_outgoing_traffic_through_tor" $COMPLETION_FILE; then
  8496. return
  8497. fi
  8498. if [[ $ROUTE_THROUGH_TOR != "yes" ]]; then
  8499. return
  8500. fi
  8501. apt-get -y install tor tor-arm
  8502. ### set variables
  8503. # Destinations you don't want routed through Tor
  8504. _non_tor="192.168.1.0/24 192.168.0.0/24"
  8505. # The user that Tor runs as
  8506. _tor_uid="debian-tor"
  8507. # Tor's TransPort
  8508. _trans_port="9040"
  8509. # Your internal interface
  8510. _int_if="eth0"
  8511. ### Set iptables *nat
  8512. iptables -t nat -A OUTPUT -o lo -j RETURN
  8513. iptables -t nat -A OUTPUT -m owner --uid-owner $_tor_uid -j RETURN
  8514. iptables -t nat -A OUTPUT -p udp --dport 53 -j REDIRECT --to-ports 53
  8515. # Allow clearnet access for hosts in $_non_tor
  8516. for _clearnet in $_non_tor; do
  8517. iptables -t nat -A OUTPUT -d $_clearnet -j RETURN
  8518. iptables -t nat -A PREROUTING -i $_int_if -d $_clearnet -j RETURN
  8519. done
  8520. # Redirect all other pre-routing and output to Tor
  8521. iptables -t nat -A OUTPUT -p tcp --syn -j REDIRECT --to-ports $_trans_port
  8522. iptables -t nat -A PREROUTING -i $_int_if -p udp --dport 53 -j REDIRECT --to-ports 53
  8523. iptables -t nat -A PREROUTING -i $_int_if -p tcp --syn -j REDIRECT --to-ports $_trans_port
  8524. ### set iptables *filter
  8525. iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
  8526. # Allow clearnet access for hosts in $_non_tor
  8527. for _clearnet in $_non_tor 127.0.0.0/8; do
  8528. iptables -A OUTPUT -d $_clearnet -j ACCEPT
  8529. done
  8530. # Allow only Tor output
  8531. iptables -A OUTPUT -m owner --uid-owner $_tor_uid -j ACCEPT
  8532. iptables -A OUTPUT -j REJECT
  8533. save_firewall_settings
  8534. if ! grep -q "fs.file-max" /etc/sysctl.conf; then
  8535. echo "fs.file-max=100000" >> /etc/sysctl.conf
  8536. /sbin/sysctl -p
  8537. fi
  8538. echo 'domain localdomain' > /etc/resolv.conf
  8539. echo 'search localdomain' >> /etc/resolv.conf
  8540. echo 'nameserver 127.0.0.1' >> /etc/resolv.conf
  8541. if ! grep -q "VirtualAddrNetworkIPv4" /etc/tor/torrc; then
  8542. echo 'VirtualAddrNetworkIPv4 10.192.0.0/10' >> /etc/tor/torrc
  8543. fi
  8544. if ! grep -q "AutomapHostsOnResolve" /etc/tor/torrc; then
  8545. echo 'AutomapHostsOnResolve 1' >> /etc/tor/torrc
  8546. fi
  8547. if ! grep -q "TransPort" /etc/tor/torrc; then
  8548. echo 'TransPort 9040' >> /etc/tor/torrc
  8549. fi
  8550. if ! grep -q "TransListenAddress 127.0.0.1" /etc/tor/torrc; then
  8551. echo 'TransListenAddress 127.0.0.1' >> /etc/tor/torrc
  8552. fi
  8553. if ! grep -q "TransListenAddress $LOCAL_NETWORK_STATIC_IP_ADDRESS" /etc/tor/torrc; then
  8554. echo "TransListenAddress $LOCAL_NETWORK_STATIC_IP_ADDRESS" >> /etc/tor/torrc
  8555. fi
  8556. if ! grep -q "DNSPort" /etc/tor/torrc; then
  8557. echo 'DNSPort 53' >> /etc/tor/torrc
  8558. fi
  8559. if ! grep -q "DNSListenAddress 127.0.0.1" /etc/tor/torrc; then
  8560. echo 'DNSListenAddress 127.0.0.1' >> /etc/tor/torrc
  8561. fi
  8562. if ! grep -q "DNSListenAddress $LOCAL_NETWORK_STATIC_IP_ADDRESS" /etc/tor/torrc; then
  8563. echo "DNSListenAddress $LOCAL_NETWORK_STATIC_IP_ADDRESS" >> /etc/tor/torrc
  8564. fi
  8565. echo 'route_outgoing_traffic_through_tor' >> $COMPLETION_FILE
  8566. }
  8567. # A command to create a git repository for a project
  8568. function create_git_project {
  8569. if grep -Fxq "create_git_project" $COMPLETION_FILE; then
  8570. return
  8571. fi
  8572. apt-get -y install git
  8573. echo '#!/bin/bash' > /usr/bin/$CREATE_GIT_PROJECT_COMMAND
  8574. echo '' >> /usr/bin/$CREATE_GIT_PROJECT_COMMAND
  8575. echo 'GIT_PROJECT_NAME=$1' >> /usr/bin/$CREATE_GIT_PROJECT_COMMAND
  8576. echo 'if [ ! $GIT_PROJECT_NAME ]; then' >> /usr/bin/$CREATE_GIT_PROJECT_COMMAND
  8577. echo ' echo "Please specify a project name, without any spaces"' >> /usr/bin/$CREATE_GIT_PROJECT_COMMAND
  8578. echo ' exit 1' >> /usr/bin/$CREATE_GIT_PROJECT_COMMAND
  8579. echo 'fi' >> /usr/bin/$CREATE_GIT_PROJECT_COMMAND
  8580. echo '' >> /usr/bin/$CREATE_GIT_PROJECT_COMMAND
  8581. echo 'if [ ! -d /home/$USER/projects/$GIT_PROJECT_NAME ]; then' >> /usr/bin/$CREATE_GIT_PROJECT_COMMAND
  8582. echo ' mkdir -p /home/$USER/projects/$GIT_PROJECT_NAME' >> /usr/bin/$CREATE_GIT_PROJECT_COMMAND
  8583. echo 'fi' >> /usr/bin/$CREATE_GIT_PROJECT_COMMAND
  8584. echo '' >> /usr/bin/$CREATE_GIT_PROJECT_COMMAND
  8585. echo 'cd /home/$USER/projects/$GIT_PROJECT_NAME' >> /usr/bin/$CREATE_GIT_PROJECT_COMMAND
  8586. echo 'git init --bare' >> /usr/bin/$CREATE_GIT_PROJECT_COMMAND
  8587. echo '' >> /usr/bin/$CREATE_GIT_PROJECT_COMMAND
  8588. echo -n 'echo "Your project has been created, ' >> /usr/bin/$CREATE_GIT_PROJECT_COMMAND
  8589. echo 'use the following command to clone the repository"' >> /usr/bin/$CREATE_GIT_PROJECT_COMMAND
  8590. echo -n " git clone ssh://$MY_USERNAME@$DEFAULT_DOMAIN_NAME:$SSH_PORT" >> /usr/bin/$CREATE_GIT_PROJECT_COMMAND
  8591. echo '/home/$USER/projects/$GIT_PROJECT_NAME' >> /usr/bin/$CREATE_GIT_PROJECT_COMMAND
  8592. echo '' >> /usr/bin/$CREATE_GIT_PROJECT_COMMAND
  8593. echo 'exit 0' >> /usr/bin/$CREATE_GIT_PROJECT_COMMAND
  8594. chmod +x /usr/bin/$CREATE_GIT_PROJECT_COMMAND
  8595. echo 'create_git_project' >> $COMPLETION_FILE
  8596. }
  8597. function check_date {
  8598. curr_date=$(date)
  8599. if [[ $curr_date == *"1970"* ]]; then
  8600. apt-get -y install ntp
  8601. fi
  8602. }
  8603. function install_dynamicdns {
  8604. if [[ $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  8605. return
  8606. fi
  8607. if [[ $ONION_ONLY != "no" ]]; then
  8608. return
  8609. fi
  8610. # update to the next commit
  8611. if [ -d $INSTALL_DIR/inadyn ]; then
  8612. if grep -q "inadyn commit" $COMPLETION_FILE; then
  8613. CURRENT_INADYN_COMMIT=$(grep "inadyn commit" $COMPLETION_FILE | awk -F ':' '{print $2}')
  8614. if [[ "$CURRENT_INADYN_COMMIT" != "$INADYN_COMMIT" ]]; then
  8615. cd $INSTALL_DIR/inadyn
  8616. git_pull $INADYN_REPO $INADYN_COMMIT
  8617. sed -i "s/inadyn commit.*/inadyn commit:$INADYN_COMMIT/g" $COMPLETION_FILE
  8618. ./configure
  8619. USE_OPENSSL=1 make
  8620. make install
  8621. systemctl restart inadyn
  8622. fi
  8623. else
  8624. echo "inadyn commit:$INADYN_COMMIT" >> $COMPLETION_FILE
  8625. fi
  8626. fi
  8627. if grep -Fxq "install_dynamicdns" $COMPLETION_FILE; then
  8628. return
  8629. fi
  8630. # Here we compile from source because the current package
  8631. # doesn't support https, which could result in passwords
  8632. # being leaked
  8633. # Debian version 1.99.4-1
  8634. # https version 1.99.8
  8635. apt-get -y install build-essential curl libgnutls28-dev automake1.11
  8636. git_clone $INADYN_REPO $INSTALL_DIR/inadyn
  8637. if [ ! -d $INSTALL_DIR/inadyn ]; then
  8638. echo 'inadyn repo not cloned'
  8639. echo -n | openssl s_client -showcerts -connect github.com:443 -CApath /etc/ssl/certs
  8640. exit 6785
  8641. fi
  8642. cd $INSTALL_DIR/inadyn
  8643. git checkout $INADYN_COMMIT -b $INADYN_COMMIT
  8644. if ! grep -q "inadyn commit" $COMPLETION_FILE; then
  8645. echo "inadyn commit:$INADYN_COMMIT" >> $COMPLETION_FILE
  8646. else
  8647. sed -i "s/inadyn commit.*/inadyn commit:$INADYN_COMMIT/g" $COMPLETION_FILE
  8648. fi
  8649. ./configure
  8650. if [ ! "$?" = "0" ]; then
  8651. exit 74890
  8652. fi
  8653. USE_OPENSSL=1 make
  8654. if [ ! "$?" = "0" ]; then
  8655. exit 74858
  8656. fi
  8657. make install
  8658. if [ ! "$?" = "0" ]; then
  8659. exit 3785
  8660. fi
  8661. # create an unprivileged user
  8662. #useradd -r -s /bin/false debian-inadyn
  8663. # create a configuration file
  8664. echo 'background' > /etc/inadyn.conf
  8665. echo 'verbose 1' >> /etc/inadyn.conf
  8666. echo 'period 300' >> /etc/inadyn.conf
  8667. echo 'startup-delay 60' >> /etc/inadyn.conf
  8668. echo 'cache-dir /run/inadyn' >> /etc/inadyn.conf
  8669. echo 'logfile /dev/null' >> /etc/inadyn.conf
  8670. chmod 600 /etc/inadyn.conf
  8671. echo '[Unit]' > /etc/systemd/system/inadyn.service
  8672. echo 'Description=inadyn (DynDNS updater)' >> /etc/systemd/system/inadyn.service
  8673. echo 'After=network.target' >> /etc/systemd/system/inadyn.service
  8674. echo '' >> /etc/systemd/system/inadyn.service
  8675. echo '[Service]' >> /etc/systemd/system/inadyn.service
  8676. echo 'ExecStart=/usr/local/sbin/inadyn --config /etc/inadyn.conf' >> /etc/systemd/system/inadyn.service
  8677. echo 'Restart=always' >> /etc/systemd/system/inadyn.service
  8678. echo 'Type=forking' >> /etc/systemd/system/inadyn.service
  8679. echo '' >> /etc/systemd/system/inadyn.service
  8680. echo '[Install]' >> /etc/systemd/system/inadyn.service
  8681. echo 'WantedBy=multi-user.target' >> /etc/systemd/system/inadyn.service
  8682. systemctl enable inadyn
  8683. systemctl start inadyn
  8684. systemctl daemon-reload
  8685. echo 'install_dynamicdns' >> $COMPLETION_FILE
  8686. }
  8687. function get_voip_server_password {
  8688. if [ -f /home/$MY_USERNAME/README ]; then
  8689. if grep -q "VoIP server password" /home/$MY_USERNAME/README; then
  8690. if [ ! $VOIP_SERVER_PASSWORD ]; then
  8691. VOIP_SERVER_PASSWORD=$(cat /home/$MY_USERNAME/README | grep "VoIP server password" | awk -F ':' '{print $2}' | sed 's/^ *//')
  8692. fi
  8693. fi
  8694. fi
  8695. }
  8696. function get_sip_server_password {
  8697. if [ -f /home/$MY_USERNAME/README ]; then
  8698. if grep -q "SIP server password" /home/$MY_USERNAME/README; then
  8699. if [ ! $SIP_SERVER_PASSWORD ]; then
  8700. SIP_SERVER_PASSWORD=$(cat /home/$MY_USERNAME/README | grep "SIP server password" | awk -F ':' '{print $2}' | sed 's/^ *//')
  8701. fi
  8702. fi
  8703. fi
  8704. }
  8705. function install_ipfs {
  8706. if [[ $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_MAILBOX" ]]; then
  8707. return
  8708. fi
  8709. export GOPATH=/home/git/go
  8710. systemctl set-environment GOPATH=/home/git/go
  8711. # update to the next commit
  8712. if [ -d /home/git/go/src/github.com/ipfs/go-ipfs ]; then
  8713. if grep -q "ipfs commit" $COMPLETION_FILE; then
  8714. CURRENT_IPFS_COMMIT=$(grep "ipfs commit" $COMPLETION_FILE | awk -F ':' '{print $2}')
  8715. if [[ "$CURRENT_IPFS_COMMIT" != "$IPFS_COMMIT" ]]; then
  8716. cd /home/git/go/src/github.com/ipfs/go-ipfs
  8717. git_pull $IPFS_GO_REPO $IPFS_COMMIT
  8718. sed -i "s/ipfs commit.*/ipfs commit:$IPFS_COMMIT/g" $COMPLETION_FILE
  8719. chown -R git:git /home/git
  8720. systemctl restart ipfs
  8721. systemctl daemon-reload
  8722. fi
  8723. else
  8724. echo "ipfs commit:$IPFS_COMMIT" >> $COMPLETION_FILE
  8725. fi
  8726. fi
  8727. if grep -Fxq "install_ipfs" $COMPLETION_FILE; then
  8728. return
  8729. fi
  8730. apt-get -y install golang libpam0g-dev fuse
  8731. if [ ! -d /home/git ]; then
  8732. # add a gogs user account
  8733. adduser --disabled-login --gecos 'Gogs' git
  8734. # install Go
  8735. if ! grep -q "export GOPATH=/home/git/go" ~/.bashrc; then
  8736. echo 'export GOPATH=/home/git/go' >> ~/.bashrc
  8737. echo 'systemctl set-environment GOPATH=/home/git/go' >> ~/.bashrc
  8738. fi
  8739. export GOPATH=/home/git/go
  8740. if [ ! -d $GOPATH ]; then
  8741. mkdir -p $GOPATH
  8742. fi
  8743. fi
  8744. IPFS_PATH=/home/git/go/bin
  8745. if ! grep -q 'GOPATH/bin' ~/.bashrc; then
  8746. export PATH="$GOPATH/bin:$PATH:"
  8747. echo 'export PATH="$GOPATH/bin:$PATH:";' >> ~/.bashrc
  8748. fi
  8749. # set gopath for the user
  8750. if ! grep -q "GOPATH=" /home/$MY_USERNAME/.bashrc; then
  8751. echo 'export GOPATH=/home/git/go' >> /home/$MY_USERNAME/.bashrc
  8752. echo 'export PATH="$GOPATH/bin:$PATH:";' >> /home/$MY_USERNAME/.bashrc
  8753. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.bashrc
  8754. fi
  8755. go get -u ${IPFS_GO_REPO}/cmd/ipfs
  8756. if [ ! "$?" = "0" ]; then
  8757. exit 8242
  8758. fi
  8759. cd /home/git/go/src/github.com/ipfs/go-ipfs
  8760. git checkout $IPFS_COMMIT -b $IPFS_COMMIT
  8761. if ! grep -q "ipfs commit" $COMPLETION_FILE; then
  8762. echo "ipfs commit:$IPFS_COMMIT" >> $COMPLETION_FILE
  8763. else
  8764. sed -i "s/ipfs commit.*/ipfs commit:$IPFS_COMMIT/g" $COMPLETION_FILE
  8765. fi
  8766. # initialise
  8767. su -c "$IPFS_PATH/ipfs init -b 4096" - $MY_USERNAME
  8768. if [ ! -d /home/$MY_USERNAME/.ipfs ]; then
  8769. echo "IPFS could not be initialised for user $MY_USERNAME"
  8770. exit 7358
  8771. fi
  8772. # directories to mount to
  8773. if [ ! -d /ipfs ]; then
  8774. mkdir /ipfs
  8775. mkdir /ipns
  8776. chown $MY_USERNAME:$MY_USERNAME /ipfs
  8777. chown $MY_USERNAME:$MY_USERNAME /ipns
  8778. fi
  8779. if [ -f /etc/fuse.conf ]; then
  8780. chown $MY_USERNAME:$MY_USERNAME /etc/fuse.conf
  8781. fi
  8782. if [ -f /dev/fuse ]; then
  8783. chown $MY_USERNAME:$MY_USERNAME /dev/fuse
  8784. fi
  8785. echo '[Unit]' > /etc/systemd/system/ipfs.service
  8786. echo 'Description=IPFS daemon' >> /etc/systemd/system/ipfs.service
  8787. echo 'After=syslog.target' >> /etc/systemd/system/ipfs.service
  8788. echo 'After=network.target' >> /etc/systemd/system/ipfs.service
  8789. echo '' >> /etc/systemd/system/ipfs.service
  8790. echo '[Service]' >> /etc/systemd/system/ipfs.service
  8791. echo 'Type=simple' >> /etc/systemd/system/ipfs.service
  8792. echo "User=$MY_USERNAME" >> /etc/systemd/system/ipfs.service
  8793. echo "Group=$MY_USERNAME" >> /etc/systemd/system/ipfs.service
  8794. echo "WorkingDirectory=/home/$MY_USERNAME" >> /etc/systemd/system/ipfs.service
  8795. echo "ExecStart=$IPFS_PATH/ipfs daemon --mount" >> /etc/systemd/system/ipfs.service
  8796. echo 'Restart=on-failure' >> /etc/systemd/system/ipfs.service
  8797. echo "Environment=\"USER=$MY_USERNAME\" \"HOME=/home/$MY_USERNAME\" \"GOPATH=/home/git/go\"" >> /etc/systemd/system/ipfs.service
  8798. echo '' >> /etc/systemd/system/ipfs.service
  8799. echo '[Install]' >> /etc/systemd/system/ipfs.service
  8800. echo 'WantedBy=multi-user.target' >> /etc/systemd/system/ipfs.service
  8801. systemctl enable ipfs
  8802. systemctl daemon-reload
  8803. systemctl restart ipfs
  8804. if [ -d /etc/avahi ]; then
  8805. su -c "echo $($IPFS_PATH/ipfs id | grep '\"ID\":' | awk -F '\"' '{print $4}') > /tmp/ipfsid" - $MY_USERNAME
  8806. if [ ! -f /tmp/ipfsid ]; then
  8807. echo 'No IPFS identity was created'
  8808. exit 37895
  8809. fi
  8810. IPFS_PEER_ID=$(cat /tmp/ipfsid)
  8811. if [ ${#IPFS_PEER_ID} -lt 10 ]; then
  8812. echo 'Invalid IPFS peer ID'
  8813. echo "$IPFS_PEER_ID"
  8814. exit 74782
  8815. fi
  8816. # Add an avahi service
  8817. echo '<?xml version="1.0" standalone="no"?><!--*-nxml-*-->' > /etc/avahi/services/ipfs.service
  8818. echo '<!DOCTYPE service-group SYSTEM "avahi-service.dtd">' >> /etc/avahi/services/ipfs.service
  8819. echo '<service-group>' >> /etc/avahi/services/ipfs.service
  8820. echo ' <name replace-wildcards="yes">%h IPFS</name>' >> /etc/avahi/services/ipfs.service
  8821. echo ' <service>' >> /etc/avahi/services/ipfs.service
  8822. echo ' <type>_ipfs._tcp</type>' >> /etc/avahi/services/ipfs.service
  8823. echo " <port>$IPFS_PORT</port>" >> /etc/avahi/services/ipfs.service
  8824. echo " <txt-record>$IPFS_PEER_ID</txt-record>" >> /etc/avahi/services/ipfs.service
  8825. echo ' </service>' >> /etc/avahi/services/ipfs.service
  8826. echo '</service-group>' >> /etc/avahi/services/ipfs.service
  8827. rm /tmp/ipfsid
  8828. fi
  8829. echo 'install_ipfs' >> $COMPLETION_FILE
  8830. }
  8831. function install_voip {
  8832. 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
  8833. return
  8834. fi
  8835. if grep -Fxq "install_voip" $COMPLETION_FILE; then
  8836. return
  8837. fi
  8838. apt-get -y install mumble-server
  8839. get_voip_server_password
  8840. if [ ! $VOIP_SERVER_PASSWORD ]; then
  8841. if [ -f $IMAGE_PASSWORD_FILE ]; then
  8842. VOIP_SERVER_PASSWORD="$(printf `cat $IMAGE_PASSWORD_FILE`)"
  8843. else
  8844. VOIP_SERVER_PASSWORD="$(openssl rand -base64 16)"
  8845. if [ ${#VOIP_SERVER_PASSWORD} -lt $MINIMUM_PASSWORD_LENGTH ]; then
  8846. VOIP_SERVER_PASSWORD="$(openssl rand -base64 16)"
  8847. fi
  8848. fi
  8849. fi
  8850. # Make an ssl cert for the server
  8851. if [ ! -f /etc/ssl/certs/mumble.dhparam ]; then
  8852. ${PROJECT_NAME}-addcert -h mumble --dhkey $DH_KEYLENGTH
  8853. check_certificates mumble
  8854. fi
  8855. # Check that the cert was created
  8856. if [ ! -f /etc/ssl/certs/mumble.crt ]; then
  8857. echo $'VoIP server certificate not created'
  8858. exit 57892
  8859. fi
  8860. if [ ! -f /etc/ssl/private/mumble.key ]; then
  8861. echo $'VoIP server key not created'
  8862. exit 57893
  8863. fi
  8864. if [ ! -d /var/lib/mumble-server ]; then
  8865. mkdir /var/lib/mumble-server
  8866. fi
  8867. cp /etc/ssl/certs/mumble.* /var/lib/mumble-server
  8868. cp /etc/ssl/private/mumble.key /var/lib/mumble-server
  8869. chown -R mumble-server:mumble-server /var/lib/mumble-server
  8870. sed -i "s|welcometext=.*|welcometext=\"<br />Welcome to $DEFAULT_DOMAIN_NAME <b>VoIP</b>.<br />Chat freely!<br />\"|g" /etc/mumble-server.ini
  8871. if [[ $VOIP_SERVER_PASSWORD && $SYSTEM_TYPE != "$VARIANT_MESH" ]]; then
  8872. sed -i "s|serverpassword=.*|serverpassword=$VOIP_SERVER_PASSWORD|g" /etc/mumble-server.ini
  8873. fi
  8874. sed -i 's|#autobanAttempts.*|autobanAttempts = 10|g' /etc/mumble-server.ini
  8875. sed -i 's|#autobanTimeframe.*|autobanTimeframe = 120|g' /etc/mumble-server.ini
  8876. sed -i 's|#autobanTime.*|autobanTime = 300|g' /etc/mumble-server.ini
  8877. sed -i 's|#sendversion=.*|sendversion=False|g' /etc/mumble-server.ini
  8878. sed -i 's|sendversion=.*|sendversion=False|g' /etc/mumble-server.ini
  8879. if ! grep -q "allowping" /etc/mumble-server.ini; then
  8880. echo 'allowping=False' >> /etc/mumble-server.ini
  8881. fi
  8882. sed -i 's|allowping=.*|allowping=False|g' /etc/mumble-server.ini
  8883. sed -i 's|#sslCert=.*|sslCert=/var/lib/mumble-server/mumble.crt|g' /etc/mumble-server.ini
  8884. sed -i 's|#sslKey=.*|sslKey=/var/lib/mumble-server/mumble.key|g' /etc/mumble-server.ini
  8885. sed -i 's|#certrequired=.*|certrequired=True|g' /etc/mumble-server.ini
  8886. sed -i 's|users=100|users=10|g' /etc/mumble-server.ini
  8887. sed -i 's|#channelnestinglimit=10|channelnestinglimit=10|g' /etc/mumble-server.ini
  8888. sed -i 's|#textmessagelength=.*|textmessagelength=1000|g' /etc/mumble-server.ini
  8889. sed -i 's|textmessagelength=.*|textmessagelength=1000|g' /etc/mumble-server.ini
  8890. sed -i 's|#imagemessagelength=.*|imagemessagelength=131072|g' /etc/mumble-server.ini
  8891. sed -i 's|#allowhtml=.*|allowhtml=False|g' /etc/mumble-server.ini
  8892. sed -i 's|allowhtml=.*|allowhtml=False|g' /etc/mumble-server.ini
  8893. sed -i "s|port=.*|port=${VOIP_PORT}|g" /etc/mumble-server.ini
  8894. VOIP_ONION_HOSTNAME=$(add_onion_service voip ${VOIP_PORT} ${VOIP_PORT})
  8895. if ! grep -q $"VoIP onion domain" $COMPLETION_FILE; then
  8896. echo "VoIP onion domain:$VOIP_ONION_HOSTNAME" >> $COMPLETION_FILE
  8897. fi
  8898. systemctl restart mumble-server
  8899. if ! grep -q $"VoIP Server" /home/$MY_USERNAME/README; then
  8900. echo '' >> /home/$MY_USERNAME/README
  8901. echo '' >> /home/$MY_USERNAME/README
  8902. echo $'VoIP Server' >> /home/$MY_USERNAME/README
  8903. echo '===========' >> /home/$MY_USERNAME/README
  8904. echo $"VoIP onion domain:$VOIP_ONION_HOSTNAME" >> /home/$MY_USERNAME/README
  8905. echo $'VoIP server username: mumble-server' >> /home/$MY_USERNAME/README
  8906. if [[ $SYSTEM_TYPE != "VARIANT_MESH" ]]; then
  8907. echo $"VoIP server password: $VOIP_SERVER_PASSWORD" >> /home/$MY_USERNAME/README
  8908. fi
  8909. echo '' >> /home/$MY_USERNAME/README
  8910. echo $'To connect to the VoIP server use your username and the server password shown above.' >> /home/$MY_USERNAME/README
  8911. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
  8912. chmod 600 /home/$MY_USERNAME/README
  8913. fi
  8914. echo 'install_voip' >> $COMPLETION_FILE
  8915. }
  8916. function install_sip {
  8917. 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
  8918. return
  8919. fi
  8920. if grep -Fxq "install_sip" $COMPLETION_FILE; then
  8921. return
  8922. fi
  8923. apt-get -y install sipwitch
  8924. get_sip_server_password
  8925. if [ ! $SIP_SERVER_PASSWORD ]; then
  8926. if [ -f $IMAGE_PASSWORD_FILE ]; then
  8927. SIP_SERVER_PASSWORD="$(printf `cat $IMAGE_PASSWORD_FILE`)"
  8928. else
  8929. SIP_SERVER_PASSWORD="$(openssl rand -base64 10)"
  8930. fi
  8931. fi
  8932. echo '<?xml version="1.0"?>' > /etc/sipwitch.conf
  8933. echo '<sipwitch>' >> /etc/sipwitch.conf
  8934. echo '<provision>' >> /etc/sipwitch.conf
  8935. echo "<user id=\"$MY_USERNAME\">" >> /etc/sipwitch.conf
  8936. echo '<extension>201</extension>' >> /etc/sipwitch.conf
  8937. echo "<secret>$SIP_SERVER_PASSWORD</secret>" >> /etc/sipwitch.conf
  8938. echo "<display>$MY_USERNAME 201</display>" >> /etc/sipwitch.conf
  8939. echo '</user>' >> /etc/sipwitch.conf
  8940. echo '</provision>' >> /etc/sipwitch.conf
  8941. echo '<access>' >> /etc/sipwitch.conf
  8942. echo '</access>' >> /etc/sipwitch.conf
  8943. echo '<stack>' >> /etc/sipwitch.conf
  8944. echo " <localnames>$DEFAULT_DOMAIN_NAME</localnames>" >> /etc/sipwitch.conf
  8945. echo ' <mapped>200</mapped>' >> /etc/sipwitch.conf
  8946. echo ' <threading>2</threading>' >> /etc/sipwitch.conf
  8947. echo ' <interface>*</interface>' >> /etc/sipwitch.conf
  8948. echo ' <dumping>false</dumping>' >> /etc/sipwitch.conf
  8949. echo ' <system>system</system>' >> /etc/sipwitch.conf
  8950. echo ' <anon>anonymous</anon>' >> /etc/sipwitch.conf
  8951. echo '</stack>' >> /etc/sipwitch.conf
  8952. echo '<timers>' >> /etc/sipwitch.conf
  8953. echo ' <!-- ring every 4 seconds -->' >> /etc/sipwitch.conf
  8954. echo ' <ring>4</ring>' >> /etc/sipwitch.conf
  8955. echo ' <!-- call forward no answer after x rings -->' >> /etc/sipwitch.conf
  8956. echo ' <cfna>4</cfna>' >> /etc/sipwitch.conf
  8957. echo ' <!-- call reset to clear cid in stack, 6 seconds -->' >> /etc/sipwitch.conf
  8958. echo ' <reset>6</reset>' >> /etc/sipwitch.conf
  8959. echo '</timers>' >> /etc/sipwitch.conf
  8960. echo '<!-- we have 2xx numbers plus space for external users -->' >> /etc/sipwitch.conf
  8961. echo '<registry>' >> /etc/sipwitch.conf
  8962. echo ' <prefix>200</prefix>' >> /etc/sipwitch.conf
  8963. echo ' <range>100</range>' >> /etc/sipwitch.conf
  8964. echo ' <keysize>77</keysize>' >> /etc/sipwitch.conf
  8965. echo ' <mapped>200</mapped>' >> /etc/sipwitch.conf
  8966. echo ' <!-- <realm>GNU Telephony</realm> -->' >> /etc/sipwitch.conf
  8967. echo '</registry>' >> /etc/sipwitch.conf
  8968. echo '<routing>' >> /etc/sipwitch.conf
  8969. echo '</routing>' >> /etc/sipwitch.conf
  8970. echo '</sipwitch>' >> /etc/sipwitch.conf
  8971. sed -i 's|#PLUGINS=|PLUGINS=|g' /etc/default/sipwitch
  8972. groupadd sipwitch
  8973. usermod -aG sipwitch $MY_USERNAME
  8974. SIP_ONION_HOSTNAME=$(add_onion_service sip ${SIP_PORT} ${SIP_PORT})
  8975. if ! grep -q $"SIP onion domain" $COMPLETION_FILE; then
  8976. echo "SIP onion domain:$SIP_ONION_HOSTNAME" >> $COMPLETION_FILE
  8977. fi
  8978. systemctl restart sipwitch
  8979. if ! grep -q $"SIP Server" /home/$MY_USERNAME/README; then
  8980. echo '' >> /home/$MY_USERNAME/README
  8981. echo '' >> /home/$MY_USERNAME/README
  8982. echo $'SIP Server' >> /home/$MY_USERNAME/README
  8983. echo '==========' >> /home/$MY_USERNAME/README
  8984. echo $"SIP onion_domain: $SIP_ONION_HOSTNAME" >> /home/$MY_USERNAME/README
  8985. echo $"SIP server username: $MY_USERNAME" >> /home/$MY_USERNAME/README
  8986. echo $"SIP server extension: 201" >> /home/$MY_USERNAME/README
  8987. echo $"SIP server password: $SIP_SERVER_PASSWORD" >> /home/$MY_USERNAME/README
  8988. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
  8989. chmod 600 /home/$MY_USERNAME/README
  8990. fi
  8991. echo 'install_sip' >> $COMPLETION_FILE
  8992. }
  8993. function install_final {
  8994. if grep -Fxq "install_final" $COMPLETION_FILE; then
  8995. return
  8996. fi
  8997. # unmount any attached usb drive
  8998. if [ -d $USB_MOUNT ]; then
  8999. umount $USB_MOUNT
  9000. rm -rf $USB_MOUNT
  9001. fi
  9002. split_gpg_key_into_fragments
  9003. echo 'install_final' >> $COMPLETION_FILE
  9004. clear
  9005. echo ''
  9006. echo $"
  9007. *** ${PROJECT_NAME} installation is complete. Rebooting... ***
  9008. Now forward these ports from your internet router
  9009. HTTP 80
  9010. HTTPS 443
  9011. SSH 2222
  9012. DLNA 1900
  9013. DLNA 8200
  9014. XMPP 5222-5223
  9015. XMPP 5269
  9016. XMPP 5280-5281
  9017. IRC 6697
  9018. Git 9418
  9019. Email 25
  9020. Email 587
  9021. Email 465
  9022. Email 993
  9023. VoIP 64738
  9024. VoIP 5060
  9025. Tox 33445
  9026. IPFS 4001
  9027. "
  9028. if [ -f "/home/$MY_USERNAME/README" ]; then
  9029. echo $"See /home/$MY_USERNAME/README for post-installation instructions."
  9030. echo ''
  9031. fi
  9032. if [ ! -f $IMAGE_PASSWORD_FILE ]; then
  9033. reboot
  9034. fi
  9035. }
  9036. read_configuration
  9037. set_default_onion_domains
  9038. locale_setup
  9039. parse_args
  9040. check_domains
  9041. install_not_on_BBB
  9042. remove_default_user
  9043. configure_firewall
  9044. configure_firewall_ping
  9045. configure_firewall_for_ssh
  9046. configure_firewall_for_dns
  9047. configure_firewall_for_ftp
  9048. configure_firewall_for_web_access
  9049. configure_firewall_for_voip
  9050. configure_firewall_for_sip
  9051. configure_firewall_for_avahi
  9052. configure_firewall_for_zeronet
  9053. configure_firewall_for_ipfs
  9054. remove_proprietary_repos
  9055. change_debian_repos
  9056. enable_backports
  9057. configure_dns
  9058. initial_setup
  9059. install_tor
  9060. enable_ssh_via_onion
  9061. check_date
  9062. install_dynamicdns
  9063. randomize_cron
  9064. create_freedns_updater
  9065. mark_admin_user_account
  9066. enforce_good_passwords
  9067. install_editor
  9068. change_login_message
  9069. enable_zram
  9070. random_number_generator
  9071. set_your_domain_name
  9072. time_synchronisation
  9073. configure_internet_protocol
  9074. create_git_project
  9075. configure_ssh
  9076. configure_ssh_onion
  9077. allow_ssh_to_onion_address
  9078. remove_instructions_from_motd
  9079. check_hwrng
  9080. search_for_attached_usb_drive
  9081. regenerate_ssh_keys
  9082. create_trove
  9083. create_upgrade_script
  9084. letsencrypt_renewals
  9085. install_zeronet
  9086. install_watchdog_script
  9087. configure_avahi
  9088. create_avahi_onion_domains
  9089. install_zeronet_blog
  9090. install_zeronet_mail
  9091. install_zeronet_forum
  9092. #install_atheros_wifi
  9093. configure_firewall_for_cjdns
  9094. mesh_cjdns
  9095. mesh_cjdns_tools
  9096. configure_firewall_for_batman
  9097. mesh_batman_bridge
  9098. configure_firewall_for_babel
  9099. mesh_babel
  9100. route_outgoing_traffic_through_tor
  9101. configure_email
  9102. create_procmail
  9103. spam_filtering
  9104. configure_imap
  9105. #configure_imap_client_certs
  9106. configure_gpg
  9107. configure_backup_key
  9108. encrypt_incoming_email
  9109. encrypt_outgoing_email
  9110. email_client
  9111. email_archiving
  9112. email_from_address
  9113. configure_firewall_for_email
  9114. create_public_mailing_list
  9115. #create_private_mailing_list
  9116. encrypt_all_email
  9117. import_email
  9118. script_for_attaching_usb_drive
  9119. install_web_server
  9120. configure_firewall_for_web_server
  9121. install_owncloud
  9122. install_owncloud_music_app
  9123. configure_owncloud_onion_site
  9124. install_gogs
  9125. install_xmpp
  9126. install_tox_node
  9127. install_tox_client
  9128. tox_avahi
  9129. configure_firewall_for_xmpp
  9130. install_irc_server
  9131. configure_firewall_for_irc
  9132. install_voip
  9133. install_sip
  9134. install_wiki
  9135. install_blog
  9136. mark_blog_domain
  9137. install_gnu_social
  9138. install_hubzilla
  9139. install_dlna_server
  9140. configure_firewall_for_dlna
  9141. #install_mediagoblin
  9142. #install_ipfs
  9143. repair_databases_script
  9144. backup_to_friends_servers
  9145. intrusion_detection
  9146. install_final
  9147. echo "${PROJECT_NAME} installation is complete"
  9148. exit 0