freedombone 490KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625562656275628562956305631563256335634563556365637563856395640564156425643564456455646564756485649565056515652565356545655565656575658565956605661566256635664566556665667566856695670567156725673567456755676567756785679568056815682568356845685568656875688568956905691569256935694569556965697569856995700570157025703570457055706570757085709571057115712571357145715571657175718571957205721572257235724572557265727572857295730573157325733573457355736573757385739574057415742574357445745574657475748574957505751575257535754575557565757575857595760576157625763576457655766576757685769577057715772577357745775577657775778577957805781578257835784578557865787578857895790579157925793579457955796579757985799580058015802580358045805580658075808580958105811581258135814581558165817581858195820582158225823582458255826582758285829583058315832583358345835583658375838583958405841584258435844584558465847584858495850585158525853585458555856585758585859586058615862586358645865586658675868586958705871587258735874587558765877587858795880588158825883588458855886588758885889589058915892589358945895589658975898589959005901590259035904590559065907590859095910591159125913591459155916591759185919592059215922592359245925592659275928592959305931593259335934593559365937593859395940594159425943594459455946594759485949595059515952595359545955595659575958595959605961596259635964596559665967596859695970597159725973597459755976597759785979598059815982598359845985598659875988598959905991599259935994599559965997599859996000600160026003600460056006600760086009601060116012601360146015601660176018601960206021602260236024602560266027602860296030603160326033603460356036603760386039604060416042604360446045604660476048604960506051605260536054605560566057605860596060606160626063606460656066606760686069607060716072607360746075607660776078607960806081608260836084608560866087608860896090609160926093609460956096609760986099610061016102610361046105610661076108610961106111611261136114611561166117611861196120612161226123612461256126612761286129613061316132613361346135613661376138613961406141614261436144614561466147614861496150615161526153615461556156615761586159616061616162616361646165616661676168616961706171617261736174617561766177617861796180618161826183618461856186618761886189619061916192619361946195619661976198619962006201620262036204620562066207620862096210621162126213621462156216621762186219622062216222622362246225622662276228622962306231623262336234623562366237623862396240624162426243624462456246624762486249625062516252625362546255625662576258625962606261626262636264626562666267626862696270627162726273627462756276627762786279628062816282628362846285628662876288628962906291629262936294629562966297629862996300630163026303630463056306630763086309631063116312631363146315631663176318631963206321632263236324632563266327632863296330633163326333633463356336633763386339634063416342634363446345634663476348634963506351635263536354635563566357635863596360636163626363636463656366636763686369637063716372637363746375637663776378637963806381638263836384638563866387638863896390639163926393639463956396639763986399640064016402640364046405640664076408640964106411641264136414641564166417641864196420642164226423642464256426642764286429643064316432643364346435643664376438643964406441644264436444644564466447644864496450645164526453645464556456645764586459646064616462646364646465646664676468646964706471647264736474647564766477647864796480648164826483648464856486648764886489649064916492649364946495649664976498649965006501650265036504650565066507650865096510651165126513651465156516651765186519652065216522652365246525652665276528652965306531653265336534653565366537653865396540654165426543654465456546654765486549655065516552655365546555655665576558655965606561656265636564656565666567656865696570657165726573657465756576657765786579658065816582658365846585658665876588658965906591659265936594659565966597659865996600660166026603660466056606660766086609661066116612661366146615661666176618661966206621662266236624662566266627662866296630663166326633663466356636663766386639664066416642664366446645664666476648664966506651665266536654665566566657665866596660666166626663666466656666666766686669667066716672667366746675667666776678667966806681668266836684668566866687668866896690669166926693669466956696669766986699670067016702670367046705670667076708670967106711671267136714671567166717671867196720672167226723672467256726672767286729673067316732673367346735673667376738673967406741674267436744674567466747674867496750675167526753675467556756675767586759676067616762676367646765676667676768676967706771677267736774677567766777677867796780678167826783678467856786678767886789679067916792679367946795679667976798679968006801680268036804680568066807680868096810681168126813681468156816681768186819682068216822682368246825682668276828682968306831683268336834683568366837683868396840684168426843684468456846684768486849685068516852685368546855685668576858685968606861686268636864686568666867686868696870687168726873687468756876687768786879688068816882688368846885688668876888688968906891689268936894689568966897689868996900690169026903690469056906690769086909691069116912691369146915691669176918691969206921692269236924692569266927692869296930693169326933693469356936693769386939694069416942694369446945694669476948694969506951695269536954695569566957695869596960696169626963696469656966696769686969697069716972697369746975697669776978697969806981698269836984698569866987698869896990699169926993699469956996699769986999700070017002700370047005700670077008700970107011701270137014701570167017701870197020702170227023702470257026702770287029703070317032703370347035703670377038703970407041704270437044704570467047704870497050705170527053705470557056705770587059706070617062706370647065706670677068706970707071707270737074707570767077707870797080708170827083708470857086708770887089709070917092709370947095709670977098709971007101710271037104710571067107710871097110711171127113711471157116711771187119712071217122712371247125712671277128712971307131713271337134713571367137713871397140714171427143714471457146714771487149715071517152715371547155715671577158715971607161716271637164716571667167716871697170717171727173717471757176717771787179718071817182718371847185718671877188718971907191719271937194719571967197719871997200720172027203720472057206720772087209721072117212721372147215721672177218721972207221722272237224722572267227722872297230723172327233723472357236723772387239724072417242724372447245724672477248724972507251725272537254725572567257725872597260726172627263726472657266726772687269727072717272727372747275727672777278727972807281728272837284728572867287728872897290729172927293729472957296729772987299730073017302730373047305730673077308730973107311731273137314731573167317731873197320732173227323732473257326732773287329733073317332733373347335733673377338733973407341734273437344734573467347734873497350735173527353735473557356735773587359736073617362736373647365736673677368736973707371737273737374737573767377737873797380738173827383738473857386738773887389739073917392739373947395739673977398739974007401740274037404740574067407740874097410741174127413741474157416741774187419742074217422742374247425742674277428742974307431743274337434743574367437743874397440744174427443744474457446744774487449745074517452745374547455745674577458745974607461746274637464746574667467746874697470747174727473747474757476747774787479748074817482748374847485748674877488748974907491749274937494749574967497749874997500750175027503750475057506750775087509751075117512751375147515751675177518751975207521752275237524752575267527752875297530753175327533753475357536753775387539754075417542754375447545754675477548754975507551755275537554755575567557755875597560756175627563756475657566756775687569757075717572757375747575757675777578757975807581758275837584758575867587758875897590759175927593759475957596759775987599760076017602760376047605760676077608760976107611761276137614761576167617761876197620762176227623762476257626762776287629763076317632763376347635763676377638763976407641764276437644764576467647764876497650765176527653765476557656765776587659766076617662766376647665766676677668766976707671767276737674767576767677767876797680768176827683768476857686768776887689769076917692769376947695769676977698769977007701770277037704770577067707770877097710771177127713771477157716771777187719772077217722772377247725772677277728772977307731773277337734773577367737773877397740774177427743774477457746774777487749775077517752775377547755775677577758775977607761776277637764776577667767776877697770777177727773777477757776777777787779778077817782778377847785778677877788778977907791779277937794779577967797779877997800780178027803780478057806780778087809781078117812781378147815781678177818781978207821782278237824782578267827782878297830783178327833783478357836783778387839784078417842784378447845784678477848784978507851785278537854785578567857785878597860786178627863786478657866786778687869787078717872787378747875787678777878787978807881788278837884788578867887788878897890789178927893789478957896789778987899790079017902790379047905790679077908790979107911791279137914791579167917791879197920792179227923792479257926792779287929793079317932793379347935793679377938793979407941794279437944794579467947794879497950795179527953795479557956795779587959796079617962796379647965796679677968796979707971797279737974797579767977797879797980798179827983798479857986798779887989799079917992799379947995799679977998799980008001800280038004800580068007800880098010801180128013801480158016801780188019802080218022802380248025802680278028802980308031803280338034803580368037803880398040804180428043804480458046804780488049805080518052805380548055805680578058805980608061806280638064806580668067806880698070807180728073807480758076807780788079808080818082808380848085808680878088808980908091809280938094809580968097809880998100810181028103810481058106810781088109811081118112811381148115811681178118811981208121812281238124812581268127812881298130813181328133813481358136813781388139814081418142814381448145814681478148814981508151815281538154815581568157815881598160816181628163816481658166816781688169817081718172817381748175817681778178817981808181818281838184818581868187818881898190819181928193819481958196819781988199820082018202820382048205820682078208820982108211821282138214821582168217821882198220822182228223822482258226822782288229823082318232823382348235823682378238823982408241824282438244824582468247824882498250825182528253825482558256825782588259826082618262826382648265826682678268826982708271827282738274827582768277827882798280828182828283828482858286828782888289829082918292829382948295829682978298829983008301830283038304830583068307830883098310831183128313831483158316831783188319832083218322832383248325832683278328832983308331833283338334833583368337833883398340834183428343834483458346834783488349835083518352835383548355835683578358835983608361836283638364836583668367836883698370837183728373837483758376837783788379838083818382838383848385838683878388838983908391839283938394839583968397839883998400840184028403840484058406840784088409841084118412841384148415841684178418841984208421842284238424842584268427842884298430843184328433843484358436843784388439844084418442844384448445844684478448844984508451845284538454845584568457845884598460846184628463846484658466846784688469847084718472847384748475847684778478847984808481848284838484848584868487848884898490849184928493849484958496849784988499850085018502850385048505850685078508850985108511851285138514851585168517851885198520852185228523852485258526852785288529853085318532853385348535853685378538853985408541854285438544854585468547854885498550855185528553855485558556855785588559856085618562856385648565856685678568856985708571857285738574857585768577857885798580858185828583858485858586858785888589859085918592859385948595859685978598859986008601860286038604860586068607860886098610861186128613861486158616861786188619862086218622862386248625862686278628862986308631863286338634863586368637863886398640864186428643864486458646864786488649865086518652865386548655865686578658865986608661866286638664866586668667866886698670867186728673867486758676867786788679868086818682868386848685868686878688868986908691869286938694869586968697869886998700870187028703870487058706870787088709871087118712871387148715871687178718871987208721872287238724872587268727872887298730873187328733873487358736873787388739874087418742874387448745874687478748874987508751875287538754875587568757875887598760876187628763876487658766876787688769877087718772877387748775877687778778877987808781878287838784878587868787878887898790879187928793879487958796879787988799880088018802880388048805880688078808880988108811881288138814881588168817881888198820882188228823882488258826882788288829883088318832883388348835883688378838883988408841884288438844884588468847884888498850885188528853885488558856885788588859886088618862886388648865886688678868886988708871887288738874887588768877887888798880888188828883888488858886888788888889889088918892889388948895889688978898889989008901890289038904890589068907890889098910891189128913891489158916891789188919892089218922892389248925892689278928892989308931893289338934893589368937893889398940894189428943894489458946894789488949895089518952895389548955895689578958895989608961896289638964896589668967896889698970897189728973897489758976897789788979898089818982898389848985898689878988898989908991899289938994899589968997899889999000900190029003900490059006900790089009901090119012901390149015901690179018901990209021902290239024902590269027902890299030903190329033903490359036903790389039904090419042904390449045904690479048904990509051905290539054905590569057905890599060906190629063906490659066906790689069907090719072907390749075907690779078907990809081908290839084908590869087908890899090909190929093909490959096909790989099910091019102910391049105910691079108910991109111911291139114911591169117911891199120912191229123912491259126912791289129913091319132913391349135913691379138913991409141914291439144914591469147914891499150915191529153915491559156915791589159916091619162916391649165916691679168916991709171917291739174917591769177917891799180918191829183918491859186918791889189919091919192919391949195919691979198919992009201920292039204920592069207920892099210921192129213921492159216921792189219922092219222922392249225922692279228922992309231923292339234923592369237923892399240924192429243924492459246924792489249925092519252925392549255925692579258925992609261926292639264926592669267926892699270927192729273927492759276927792789279928092819282928392849285928692879288928992909291929292939294929592969297929892999300930193029303930493059306930793089309931093119312931393149315931693179318931993209321932293239324932593269327932893299330933193329333933493359336933793389339934093419342934393449345934693479348934993509351935293539354935593569357935893599360936193629363936493659366936793689369937093719372937393749375937693779378937993809381938293839384938593869387938893899390939193929393939493959396939793989399940094019402940394049405940694079408940994109411941294139414941594169417941894199420942194229423942494259426942794289429943094319432943394349435943694379438943994409441944294439444944594469447944894499450945194529453945494559456945794589459946094619462946394649465946694679468946994709471947294739474947594769477947894799480948194829483948494859486948794889489949094919492949394949495949694979498949995009501950295039504950595069507950895099510951195129513951495159516951795189519952095219522952395249525952695279528952995309531953295339534953595369537953895399540954195429543954495459546954795489549955095519552955395549555955695579558955995609561956295639564956595669567956895699570957195729573957495759576957795789579958095819582958395849585958695879588958995909591959295939594959595969597959895999600960196029603960496059606960796089609961096119612961396149615961696179618961996209621962296239624962596269627962896299630963196329633963496359636963796389639964096419642964396449645964696479648964996509651965296539654965596569657965896599660966196629663966496659666966796689669967096719672967396749675967696779678967996809681968296839684968596869687968896899690969196929693969496959696969796989699970097019702970397049705970697079708970997109711971297139714971597169717971897199720972197229723972497259726972797289729973097319732973397349735973697379738973997409741974297439744974597469747974897499750975197529753975497559756975797589759976097619762976397649765976697679768976997709771977297739774977597769777977897799780978197829783978497859786978797889789979097919792979397949795979697979798979998009801980298039804980598069807980898099810981198129813981498159816981798189819982098219822982398249825982698279828982998309831983298339834983598369837983898399840984198429843984498459846984798489849985098519852985398549855985698579858985998609861986298639864986598669867986898699870987198729873987498759876987798789879988098819882988398849885988698879888988998909891989298939894989598969897989898999900990199029903990499059906990799089909991099119912991399149915991699179918991999209921992299239924992599269927992899299930993199329933993499359936993799389939994099419942994399449945994699479948994999509951995299539954995599569957995899599960996199629963996499659966996799689969997099719972997399749975997699779978997999809981998299839984998599869987998899899990999199929993999499959996999799989999100001000110002100031000410005100061000710008100091001010011100121001310014100151001610017100181001910020100211002210023100241002510026100271002810029100301003110032100331003410035100361003710038100391004010041100421004310044100451004610047100481004910050100511005210053100541005510056100571005810059100601006110062100631006410065100661006710068100691007010071100721007310074100751007610077100781007910080100811008210083100841008510086100871008810089100901009110092100931009410095100961009710098100991010010101101021010310104101051010610107101081010910110101111011210113101141011510116
  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 mirrors
  74. MY_MIRRORS_PASSWORD=
  75. # friend's repo mirrors
  76. FRIENDS_MIRRORS_PASSWORD=
  77. FRIENDS_MIRRORS_SERVER=
  78. FRIENDS_MIRRORS_SSH_PORT=2222
  79. # This isn't used here, but is included for mirrors 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. MICROBLOG_COMMIT='771f08b3c761ff122c3fff7bdb13ec6625828018'
  158. MICROBLOG_THEME_REPO="https://git.gnu.io/h2p/Qvitter.git"
  159. MICROBLOG_THEME_COMMIT='8abbdeb3c0a6a34754411452ae832d2f19cef7ab'
  160. MICROBLOG_WELCOME_MESSAGE=$'<h1>Welcome to $MICROBLOG_DOMAIN_NAME – a federated microblog</h1><p>Another Freedombone site</p>'
  161. # Domain name for hubzilla installation
  162. HUBZILLA_DOMAIN_NAME=
  163. HUBZILLA_CODE=
  164. HUBZILLA_ONION_PORT=8085
  165. HUBZILLA_REPO="https://github.com/redmatrix/hubzilla.git"
  166. HUBZILLA_THEMES_REPO="https://github.com/DeadSuperHero/redmatrix-themes"
  167. HUBZILLA_ADDONS_REPO="https://github.com/redmatrix/hubzilla-addons.git"
  168. HUBZILLA_ADMIN_PASSWORD=
  169. HUBZILLA_COMMIT='761afd029d97703f2f7609d546b7b5f3d257c601'
  170. HUBZILLA_ADDONS_COMMIT='e32f98d65850a8681e8242f3db8b6484abb35c67'
  171. # Domain name for git hosting installation
  172. GIT_DOMAIN_NAME=
  173. GIT_CODE=
  174. GIT_ONION_PORT=8090
  175. GIT_DOMAIN_REPO="https://github.com/gogits/gogs"
  176. GIT_ADMIN_PASSWORD=
  177. GOGS_COMMIT='efea642d6cf419c9587d44b95ff2bc04e89f7bfe'
  178. GO_PACKAGE_MANAGER_REPO="https://github.com/gpmgo/gopm"
  179. # Domain name for Owncloud installation
  180. OWNCLOUD_DOMAIN_NAME=
  181. OWNCLOUD_CODE=
  182. OWNCLOUD_ONION_PORT=8088
  183. OWNCLOUD_ADMIN_PASSWORD=
  184. OWNCLOUD_MUSIC_APP_REPO="https://github.com/owncloud/music"
  185. OWNCLOUD_MUSIC_APP_COMMIT='7f79afb4ae9a6ecd8f530d87106f960306c0a15a'
  186. # Domain name for your wiki
  187. WIKI_DOMAIN_NAME=
  188. WIKI_ADMIN_PASSWORD=
  189. WIKI_TITLE="${PROJECT_NAME} Wiki"
  190. WIKI_CODE=
  191. WIKI_ONION_PORT=8089
  192. # Domain name for your blog
  193. FULLBLOG_DOMAIN_NAME=
  194. FULLBLOG_CODE=
  195. FULLBLOG_ONION_PORT=8086
  196. FULLBLOG_REPO="https://github.com/danpros/htmly"
  197. FULLBLOG_COMMIT='5f271a2370cc1bfde15f2a0d5ed6928cc74b0efa'
  198. MY_BLOG_TITLE="My Blog"
  199. MY_BLOG_SUBTITLE="Another ${PROJECT_NAME} Blog"
  200. GPG_KEYSERVER="hkp://keys.gnupg.net"
  201. # whether to encrypt all incoming email with your public key
  202. GPG_ENCRYPT_STORED_EMAIL="yes"
  203. # gets set to yes if gpg keys are imported from usb
  204. GPG_KEYS_IMPORTED="no"
  205. # optionally you can provide your exported GPG key pair here
  206. # Note that the private key file will be deleted after use
  207. # If these are unspecified then a new GPG key will be created
  208. MY_GPG_PUBLIC_KEY=
  209. MY_GPG_PRIVATE_KEY=
  210. # optionally specify your public key ID
  211. MY_GPG_PUBLIC_KEY_ID=
  212. # If you have existing mail within a Maildir
  213. # you can specify the directory here and the files
  214. # will be imported
  215. IMPORT_MAILDIR=
  216. # The Debian package repository to use.
  217. DEBIAN_REPO="ftp.us.debian.org"
  218. DEBIAN_VERSION="jessie"
  219. # Directory where source code is downloaded and compiled
  220. INSTALL_DIR=$HOME/build
  221. # device name for an attached usb drive
  222. USB_DRIVE=/dev/sda1
  223. # Location where the USB drive is mounted to
  224. USB_MOUNT=/mnt/usb
  225. # name of a script used to upgrade the system
  226. UPGRADE_SCRIPT_NAME="${PROJECT_NAME}-upgrade"
  227. # name of a script which keeps running processes going even if they crash
  228. WATCHDOG_SCRIPT_NAME="keepon"
  229. # Number of days to keep backups for
  230. BACKUP_MAX_DAYS=30
  231. # memory limit for php in MB
  232. MAX_PHP_MEMORY=64
  233. # default MariaDB password
  234. MARIADB_PASSWORD=
  235. # Directory where XMPP settings are stored
  236. XMPP_DIRECTORY="/var/lib/prosody"
  237. # file containing a list of remote locations to backup to
  238. # Format: [username@friendsdomain//home/username] [ssh_password]
  239. # With the only space character being between the server and the password
  240. FRIENDS_SERVERS_LIST=/home/$MY_USERNAME/backup.list
  241. # list of encryption protocols
  242. SSL_PROTOCOLS="TLSv1 TLSv1.1 TLSv1.2"
  243. # list of ciphers to use. See bettercrypto.org recommendations
  244. 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"
  245. # ssh (from https://stribika.github.io/2015/01/04/secure-secure-shell.html)
  246. SSH_CIPHERS="chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com,aes256-ctr,aes192-ctr,aes128-ctr"
  247. 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"
  248. SSH_KEX="curve25519-sha256@libssh.org,diffie-hellman-group-exchange-sha256"
  249. 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"
  250. # xmpp ciphers and curve
  251. 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"'
  252. XMPP_ECC_CURVE='"secp384r1"'
  253. # the default email address
  254. MY_EMAIL_ADDRESS=$MY_USERNAME@$DEFAULT_DOMAIN_NAME
  255. # optionally specify your name to appear on the blog
  256. MY_NAME=$DEFAULT_DOMAIN_NAME
  257. export DEBIAN_FRONTEND=noninteractive
  258. # logging level for Nginx
  259. WEBSERVER_LOG_LEVEL='warn'
  260. # used to limit CPU usage
  261. CPULIMIT='/usr/bin/cpulimit -l 20 -e'
  262. # command to create a git repository
  263. CREATE_GIT_PROJECT_COMMAND='create-project'
  264. # File which keeps track of what has already been installed
  265. COMPLETION_FILE=$HOME/${PROJECT_NAME}-completed.txt
  266. # Used to indicate whether the backup contains MariaDB databases or not
  267. BACKUP_INCLUDES_DATABASES="no"
  268. # contains the mysql root password which
  269. # is used for backups and repair
  270. DATABASE_PASSWORD_FILE=/root/dbpass
  271. # log file where details of remote backups are stored
  272. REMOTE_BACKUPS_LOG=/var/log/remotebackups.log
  273. # message if something fails to install
  274. 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."
  275. # web site used to obtain the external IP address of the system
  276. GET_IP_ADDRESS_URL="checkip.two-dns.de"
  277. # Password used for VoIP server
  278. VOIP_SERVER_PASSWORD=
  279. # Port on which VoIP server listens
  280. VOIP_PORT=64738
  281. SIP_SERVER_PASSWORD=
  282. SIP_PORT=5060
  283. # Location of VoIP database and configuration
  284. VOIP_DATABASE="mumble-server.sqlite"
  285. VOIP_CONFIG_FILE="mumble-server.ini"
  286. # other possible services to obtain the external IP address
  287. EXTERNAL_IP_SERVICES=( \
  288. 'https://check.torproject.org/' \
  289. 'https://www.whatsmydns.net/whats-my-ip-address.html' \
  290. 'https://www.privateinternetaccess.com/pages/whats-my-ip/' \
  291. 'http://checkip.two-dns.de' \
  292. 'http://ip.dnsexit.com' \
  293. 'http://ifconfig.me/ip' \
  294. 'http://ipecho.net/plain' \
  295. 'http://checkip.dyndns.org/plain' \
  296. 'http://ipogre.com/linux.php' \
  297. 'http://whatismyipaddress.com/' \
  298. 'http://ip.my-proxy.com/' \
  299. 'http://websiteipaddress.com/WhatIsMyIp' \
  300. 'http://getmyipaddress.org/' \
  301. 'http://www.my-ip-address.net/' \
  302. 'http://myexternalip.com/raw' \
  303. 'http://www.canyouseeme.org/' \
  304. 'http://www.trackip.net/' \
  305. 'http://icanhazip.com/' \
  306. 'http://www.iplocation.net/' \
  307. 'http://www.howtofindmyipaddress.com/' \
  308. 'http://www.ipchicken.com/' \
  309. 'http://whatsmyip.net/' \
  310. 'http://www.ip-adress.com/' \
  311. 'http://checkmyip.com/' \
  312. 'http://www.tracemyip.org/' \
  313. 'http://checkmyip.net/' \
  314. 'http://www.lawrencegoetz.com/programs/ipinfo/' \
  315. 'http://www.findmyip.co/' \
  316. 'http://ip-lookup.net/' \
  317. 'http://www.dslreports.com/whois' \
  318. 'http://www.mon-ip.com/en/my-ip/' \
  319. 'http://www.myip.ru' \
  320. 'http://ipgoat.com/' \
  321. 'http://www.myipnumber.com/my-ip-address.asp' \
  322. 'http://www.whatsmyipaddress.net/' \
  323. 'http://formyip.com/' \
  324. 'http://www.displaymyip.com/' \
  325. 'http://www.bobborst.com/tools/whatsmyip/' \
  326. 'http://www.geoiptool.com/' \
  327. 'http://checkip.dyndns.com/' \
  328. 'http://myexternalip.com/' \
  329. 'http://www.ip-adress.eu/' \
  330. 'http://www.infosniper.net/' \
  331. 'http://wtfismyip.com/' \
  332. 'http://ipinfo.io/' \
  333. 'http://httpbin.org/ip')
  334. WIFI_CHANNEL=2
  335. WIFI_INTERFACE=wlan0
  336. # cjdns settings
  337. ENABLE_CJDNS="no"
  338. CJDNS_PRIVATE_KEY=
  339. CJDNS_PUBLIC_KEY=
  340. CJDNS_IPV6=
  341. CJDNS_PASSWORD=
  342. CJDNS_PORT=
  343. CJDNS_REPO="https://github.com/cjdelisle/cjdns.git"
  344. CJDNS_COMMIT='13189fde111d0500427a7a0ce06a970753527bca'
  345. CJDCMD_REPO="https://github.com/inhies/cjdcmd"
  346. CJDCMD_COMMIT='973cca6ed0eecf9041c3403a40193c0b1291b808'
  347. # B.A.T.M.A.N settings
  348. ENABLE_BATMAN="no"
  349. BATMAN_CELLID='any'
  350. ESSID='mesh'
  351. # Babel mesh
  352. ENABLE_BABEL="no"
  353. BABEL_PORT=6696
  354. # social key management
  355. ENABLE_SOCIAL_KEY_MANAGEMENT="no"
  356. TOX_PORT=33445
  357. TOX_REPO="git://github.com/irungentoo/toxcore.git"
  358. TOXID_REPO="https://github.com/bashrc/toxid"
  359. TOX_COMMIT='73b2144edcfd1ca617e9054479b66ab0c0361a14'
  360. TOX_BOOTSTRAP_ID_FILE=/var/lib/tox-bootstrapd/pubkey.txt
  361. # These are some default nodes, but you can replace them with trusted nodes
  362. # as you prefer. See https://wiki.tox.im/Nodes
  363. TOX_NODES=
  364. #TOX_NODES=(
  365. # '192.254.75.102,2607:5600:284::2,33445,951C88B7E75C867418ACDB5D273821372BB5BD652740BCDF623A4FA293E75D2F,Tox RELENG,US'
  366. # '144.76.60.215,2a01:4f8:191:64d6::1,33445,04119E835DF3E78BACF0F84235B300546AF8B936F035185E2A8E9E0A67C8924F,sonOfRa,DE'
  367. #)
  368. TOXIC_REPO="https://github.com/Tox/toxic"
  369. TOXIC_COMMIT='88270827a96b2082e254677f35585ed24581a42c'
  370. #ZERONET_REPO='https://github.com/HelloZeroNet/ZeroNet.git'
  371. ZERONET_REPO="https://github.com/HelloZeroNet/ZeroNet.git"
  372. ZERONET_COMMIT='675bd462556c541d65e2d95f91f899146a373aad'
  373. ZERONET_BLOG_REPO="https://github.com/HelloZeroNet/ZeroBlog"
  374. ZERONET_BLOG_COMMIT='bbb0d6c36465fed2e6df71f1aab45fcc9c6ad609'
  375. ZERONET_MAIL_REPO="https://github.com/HelloZeroNet/ZeroMail"
  376. ZERONET_MAIL_COMMIT='955af09d643c72b02e4983d71eca5c0c93a6c131'
  377. ZERONET_FORUM_REPO="https://github.com/HelloZeroNet/ZeroTalk"
  378. ZERONET_FORUM_COMMIT='e2d2c9cb1cfbfef91b244935efb5c14c2ad95faa'
  379. ZERONET_URL=http://127.0.0.1:43110
  380. ZERONET_PORT=15441
  381. TRACKER_PORT=6969
  382. ZERONET_DEFAULT_BLOG_TAGLINE="Blogging on the Mesh"
  383. ZERONET_DEFAULT_FORUM_TAGLINE="A decentralized discussion group"
  384. ZERONET_DEFAULT_MAIL_TAGLINE="Mail for the Mesh"
  385. # https://github.com/ipfs/go-ipfs
  386. IPFS_GO_REPO="https://github.com/ipfs/go-ipfs"
  387. IPFS_COMMIT='20b06a4cbce8884f5b194da6e98cb11f2c77f166'
  388. IPFS_PORT=4001
  389. GPGIT_REPO="https://github.com/mikecardwell/gpgit"
  390. GPGIT_COMMIT='583dc76119f19420f8a33f606744faa7c8922738'
  391. # Default diffie-hellman key length in bits
  392. DH_KEYLENGTH=2048
  393. # repo for atheros AR9271 wifi driver
  394. ATHEROS_WIFI_REPO="https://github.com/qca/open-ath9k-htc-firmware.git"
  395. # Whether Let's Encrypt is enabled for all sites
  396. LETSENCRYPT_ENABLED="no"
  397. LETSENCRYPT_SERVER='https://acme-v01.api.letsencrypt.org/directory'
  398. function show_help {
  399. echo ''
  400. echo $"${PROJECT_NAME} -c [configuration file]"
  401. echo ''
  402. echo $' -h --help Show help'
  403. echo $' menuconfig Easy interactive installation'
  404. echo $' menuconfig-full Full interactive installation'
  405. echo $' menuconfig-onion Interactive installation for onion-only sites'
  406. echo $' -c --config Installing from a configuration file'
  407. echo $' --bbb Installing on Beaglebone Black'
  408. echo $' -u --user User to install the system as'
  409. echo $' -d --domain Default domain name'
  410. echo $' -s --system System type'
  411. echo $' --ip Static LAN IP address of the system'
  412. echo $' --iprouter LAN IP address of the internet router'
  413. echo $' --ddns Dynamic DNS provider domain'
  414. echo $' --ddnsuser Dynamic DNS provider username'
  415. echo $' --ddnspass Dynamic DNS provider password'
  416. echo ''
  417. echo $' --microblogdomain Microblog domain name'
  418. echo $' --wikidomain Wiki domain name'
  419. echo $' --blogdomain Blog domain name'
  420. echo $' --ownclouddomain Owncloud domain name'
  421. echo $' --hubzilladomain Hubzilla domain name'
  422. echo $' --gitdomain Git hosting domain name'
  423. echo $' -t --time Domain used as a TLS time source'
  424. echo $' --ssh ssh port number'
  425. echo $' --list Public mailing list name'
  426. echo $' --cores Number of CPU cores'
  427. echo $' --name Your name'
  428. echo $' --email Your email address'
  429. echo $' --usb Path for the USB drive (eg. /dev/sdb1)'
  430. echo $' --cjdns Enable CJDNS'
  431. echo $' --vpass VoIP server password'
  432. echo $' --vport VoIP server port'
  433. echo $' --ns1 First DNS nameserver'
  434. echo $' --ns2 Second DNS nameserver'
  435. echo $' --repo Debian repository'
  436. echo ''
  437. echo $'system types'
  438. echo '------------'
  439. echo $'This can either be blank if you wish to install the full system,'
  440. echo $"or for more specialised variants you can specify '$VARIANT_MAILBOX', '$VARIANT_CLOUD',"
  441. echo $"'$VARIANT_CHAT', '$VARIANT_SOCIAL', '$VARIANT_MEDIA', '$VARIANT_WRITER', '$VARIANT_DEVELOPER'"
  442. echo $"or '$VARIANT_MESH'."
  443. echo ''
  444. echo $"If you wish to install everything except email then use the '$VARIANT_NONMAILBOX' variaint."
  445. echo ''
  446. exit 0
  447. }
  448. function git_clone {
  449. repo_url="$1"
  450. destination_dir="$2"
  451. if [[ "$repo_url" == "ssh:"* ]]; then
  452. if [ "${FRIENDS_MIRRORS_SERVER}" ]; then
  453. if [ ${#FRIENDS_MIRRORS_SERVER} -gt 2 ]; then
  454. if [ "$FRIENDS_MIRRORS_PASSWORD" ]; then
  455. if [ ${#FRIENDS_MIRRORS_PASSWORD} -gt 2 ]; then
  456. sshpass -p "$FRIENDS_MIRRORS_PASSWORD" git clone "$repo_url" "$destination_dir"
  457. return
  458. fi
  459. fi
  460. fi
  461. fi
  462. fi
  463. git clone "$repo_url" "$destination_dir"
  464. }
  465. function git_pull {
  466. if [ ! $1 ]; then
  467. echo $'git_pull no repo specified'
  468. fi
  469. git stash
  470. git remote set-url origin $1
  471. git checkout master
  472. if [ "${FRIENDS_MIRRORS_SERVER}" ]; then
  473. if [ ${#FRIENDS_MIRRORS_SERVER} -gt 2 ]; then
  474. if [ "$FRIENDS_MIRRORS_PASSWORD" ]; then
  475. if [ ${#FRIENDS_MIRRORS_PASSWORD} -gt 2 ]; then
  476. sshpass -p "$FRIENDS_MIRRORS_PASSWORD" git pull
  477. if [ $2 ]; then
  478. git checkout $2 -b $2
  479. fi
  480. return
  481. fi
  482. fi
  483. fi
  484. fi
  485. git pull
  486. if [ $2 ]; then
  487. git checkout $2 -b $2
  488. fi
  489. }
  490. function create_database {
  491. app_name="$1"
  492. app_admin_password="$2"
  493. app_admin_username=$3
  494. if [ ! -d $INSTALL_DIR ]; then
  495. mkdir $INSTALL_DIR
  496. fi
  497. if [ ! $app_admin_username ]; then
  498. app_admin_username=${app_name}admin
  499. fi
  500. echo "create database ${app_name};
  501. CREATE USER '$app_admin_username@localhost' IDENTIFIED BY '${app_admin_password}';
  502. GRANT ALL PRIVILEGES ON ${app_name}.* TO '$app_admin_username@localhost';
  503. quit" > $INSTALL_DIR/batch.sql
  504. chmod 600 $INSTALL_DIR/batch.sql
  505. mysql -u root --password="$MARIADB_PASSWORD" < $INSTALL_DIR/batch.sql
  506. shred -zu $INSTALL_DIR/batch.sql
  507. }
  508. function locale_setup {
  509. if grep -Fxq "locale_setup" $COMPLETION_FILE; then
  510. return
  511. fi
  512. apt-get -y install locales locales-all debconf
  513. if [ ! "$DEFAULT_LANGUAGE" ]; then
  514. DEFAULT_LANGUAGE='en_GB.UTF-8'
  515. fi
  516. if [ ${#DEFAULT_LANGUAGE} -lt 2 ]; then
  517. DEFAULT_LANGUAGE='en_GB.UTF-8'
  518. fi
  519. update-locale LANG=${DEFAULT_LANGUAGE}
  520. update-locale LANGUAGE=${DEFAULT_LANGUAGE}
  521. update-locale LC_MESSAGES=${DEFAULT_LANGUAGE}
  522. update-locale LC_ALL=${DEFAULT_LANGUAGE}
  523. update-locale LC_CTYPE=${DEFAULT_LANGUAGE}
  524. echo 'locale_setup' >> $COMPLETION_FILE
  525. }
  526. function interactive_configuration_remote_backups {
  527. if [[ $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  528. return
  529. fi
  530. if [ ! -f /usr/local/bin/${PROJECT_NAME}-remote ]; then
  531. if [ ! -f /usr/bin/${PROJECT_NAME}-remote ]; then
  532. echo $"The command ${PROJECT_NAME}-remote was not found"
  533. exit 87354
  534. fi
  535. fi
  536. ${PROJECT_NAME}-remote -u $MY_USERNAME -l $FRIENDS_SERVERS_LIST -m $MINIMUM_PASSWORD_LENGTH -r yes
  537. if [ ! "$?" = "0" ]; then
  538. echo $'Command failed:'
  539. echo ''
  540. echo $" ${PROJECT_NAME}-remote -u $MY_USERNAME -l $FRIENDS_SERVERS_LIST -m $MINIMUM_PASSWORD_LENGTH -r yes"
  541. echo ''
  542. exit 65892
  543. fi
  544. }
  545. # test a domain name to see if it's valid
  546. function validate_domain_name {
  547. # count the number of dots in the domain name
  548. dots=${TEST_DOMAIN_NAME//[^.]}
  549. no_of_dots=${#dots}
  550. if (( $no_of_dots > 3 )); then
  551. 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"
  552. fi
  553. if (( $no_of_dots == 0 )); then
  554. 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"
  555. fi
  556. }
  557. function interactive_configuration {
  558. if [ ! -f /usr/local/bin/${PROJECT_NAME}-config ]; then
  559. if [ ! -f /usr/bin/${PROJECT_NAME}-config ]; then
  560. echo $"The command ${PROJECT_NAME}-config was not found"
  561. exit 63935
  562. fi
  563. fi
  564. if [ -f /tmp/meshuserdevice ]; then
  565. rm -f /tmp/meshuserdevice
  566. fi
  567. if [[ $ONION_ONLY == "no" ]]; then
  568. if [[ $MINIMAL_INSTALL == "no" ]]; then
  569. ${PROJECT_NAME}-config \
  570. -f $CONFIGURATION_FILE \
  571. -w $PROJECT_WEBSITE \
  572. -b $PROJECT_BITMESSAGE \
  573. -m $MINIMUM_PASSWORD_LENGTH
  574. else
  575. ${PROJECT_NAME}-config \
  576. -f $CONFIGURATION_FILE \
  577. -w $PROJECT_WEBSITE \
  578. -b $PROJECT_BITMESSAGE \
  579. -m $MINIMUM_PASSWORD_LENGTH \
  580. --minimal "yes"
  581. fi
  582. else
  583. ${PROJECT_NAME}-config \
  584. -f $CONFIGURATION_FILE \
  585. -w $PROJECT_WEBSITE \
  586. -b $PROJECT_BITMESSAGE \
  587. -m $MINIMUM_PASSWORD_LENGTH \
  588. --onion "yes"
  589. fi
  590. if [ -f /tmp/meshuserdevice ]; then
  591. # mesh network user device installation
  592. rm -f /tmp/meshuserdevice
  593. exit 0
  594. fi
  595. if [ ! "$?" = "0" ]; then
  596. echo $'Command failed:'
  597. echo ''
  598. echo $" ${PROJECT_NAME}-config -u $MY_USERNAME -f $CONFIGURATION_FILE -w $PROJECT_WEBSITE -b $PROJECT_BITMESSAGE -m $MINIMUM_PASSWORD_LENGTH --minimal [yes|no]"
  599. echo ''
  600. exit 73594
  601. fi
  602. if [[ $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  603. FRIENDS_SERVERS_LIST=/home/$MY_USERNAME/backup.list
  604. dialog --title $"Encrypted backup to other servers" \
  605. --backtitle $"${PROJECT_NAME} Configuration" \
  606. --defaultno \
  607. --yesno $"\nDo you wish to configure some remote backup locations?" 7 60
  608. sel=$?
  609. case $sel in
  610. 0) interactive_configuration_remote_backups;;
  611. esac
  612. fi
  613. }
  614. command_options=$1
  615. if [[ $command_options == "menuconfig-full" ]]; then
  616. MINIMAL_INSTALL="no"
  617. command_options="menuconfig"
  618. fi
  619. if [[ $command_options == "menuconfig-onion" ]]; then
  620. MINIMAL_INSTALL="yes"
  621. ONION_ONLY="yes"
  622. command_options="menuconfig"
  623. fi
  624. if [[ $command_options == "menuconfig" ]]; then
  625. interactive_configuration
  626. else
  627. while [[ $# > 1 ]]
  628. do
  629. key="$1"
  630. case $key in
  631. -h|--help)
  632. show_help
  633. ;;
  634. # load a configuration file
  635. -c|--config)
  636. shift
  637. CONFIGURATION_FILE="$1"
  638. INSTALLING_FROM_CONFIGURATION_FILE="yes"
  639. break
  640. ;;
  641. # username within /home
  642. -u|--user)
  643. shift
  644. MY_USERNAME="$1"
  645. ;;
  646. # microblog domain name
  647. --microblogdomain)
  648. shift
  649. MICROBLOG_DOMAIN_NAME="$1"
  650. ;;
  651. # wiki domain name
  652. --wikidomain)
  653. shift
  654. WIKI_DOMAIN_NAME="$1"
  655. ;;
  656. # blog domain name
  657. --blogdomain)
  658. shift
  659. FULLBLOG_DOMAIN_NAME="$1"
  660. ;;
  661. # owncloud domain name
  662. --ownclouddomain)
  663. shift
  664. OWNCLOUD_DOMAIN_NAME="$1"
  665. ;;
  666. # hubzilla domain name
  667. --hubzilladomain)
  668. shift
  669. HUBZILLA_DOMAIN_NAME="$1"
  670. ;;
  671. # git hosting domain name
  672. --gitdomain)
  673. shift
  674. GIT_DOMAIN_NAME="$1"
  675. ;;
  676. # default domain name
  677. -d|--domain)
  678. shift
  679. DEFAULT_DOMAIN_NAME="$1"
  680. ;;
  681. # The type of system
  682. -s|--system)
  683. shift
  684. SYSTEM_TYPE="$1"
  685. ;;
  686. # The dynamic DNS provider
  687. --ddns)
  688. shift
  689. DDNS_PROVIDER="$1"
  690. ;;
  691. # Username for the synamic DNS provider
  692. --ddnsuser)
  693. shift
  694. DDNS_USERNAME="$1"
  695. ;;
  696. # Password for the synamic DNS provider
  697. --ddnspass)
  698. shift
  699. DDNS_PASSWORD="$1"
  700. ;;
  701. # Whether this installation is on a Beaglebone Black
  702. --bbb)
  703. INSTALLING_ON_BBB="yes"
  704. ;;
  705. # Domain name to use as a TLS time source
  706. -t|--time)
  707. shift
  708. TLS_TIME_SOURCE1="$1"
  709. ;;
  710. # Static IP address for the system
  711. --ip)
  712. shift
  713. LOCAL_NETWORK_STATIC_IP_ADDRESS=$1
  714. ;;
  715. # IP address for the internet router
  716. --iprouter)
  717. shift
  718. ROUTER_IP_ADDRESS=$1
  719. ;;
  720. # ssh port
  721. --ssh)
  722. shift
  723. SSH_PORT=$1
  724. ;;
  725. # public mailing list name
  726. --list)
  727. shift
  728. PUBLIC_MAILING_LIST="$1"
  729. ;;
  730. # Number of CPU cores
  731. --cores)
  732. shift
  733. CPU_CORES=$1
  734. ;;
  735. # my name
  736. --name)
  737. shift
  738. MY_NAME="$1"
  739. ;;
  740. # my email address
  741. --email)
  742. shift
  743. MY_EMAIL_ADDRESS="$1"
  744. ;;
  745. # USB drive
  746. --usb)
  747. shift
  748. USB_DRIVE=$1
  749. ;;
  750. # Enable CJDNS
  751. --cjdns)
  752. shift
  753. ENABLE_CJDNS="yes"
  754. ;;
  755. # Enable B.A.T.M.A.N
  756. --batman)
  757. shift
  758. ENABLE_BATMAN="yes"
  759. ;;
  760. # Enable Babel
  761. --babel)
  762. shift
  763. ENABLE_BABEL="yes"
  764. ;;
  765. # VoIP server password
  766. --vpass)
  767. shift
  768. VOIP_SERVER_PASSWORD=$1
  769. ;;
  770. # VoIP server port
  771. --vport)
  772. shift
  773. VOIP_PORT=$1
  774. ;;
  775. # DNS Nameserver 1
  776. --ns1)
  777. shift
  778. NAMESERVER1=$1
  779. ;;
  780. # DNS Nameserver 2
  781. --ns2)
  782. shift
  783. NAMESERVER2=$1
  784. ;;
  785. # Debian repository
  786. --repo)
  787. shift
  788. DEBIAN_REPO=$1
  789. ;;
  790. # minimal install
  791. --minimal)
  792. shift
  793. MINIMAL_INSTALL=$1
  794. ;;
  795. *)
  796. # unknown option
  797. ;;
  798. esac
  799. shift
  800. done
  801. fi
  802. function parse_args {
  803. if [[ $NO_OF_ARGS == 0 ]]; then
  804. echo 'no_of_args = 0'
  805. show_help
  806. exit 0
  807. fi
  808. if [ ! -d /home/$MY_USERNAME ]; then
  809. echo $"There is no user '$MY_USERNAME' on the system. Use 'adduser $MY_USERNAME' to create the user."
  810. exit 1
  811. fi
  812. if [ ! "$DEFAULT_DOMAIN_NAME" ]; then
  813. if [[ $SYSTEM_TYPE != "$VARIANT_MESH" ]]; then
  814. echo 'No default domain specified'
  815. show_help
  816. exit 2
  817. fi
  818. fi
  819. if [ ! $MY_USERNAME ]; then
  820. echo 'No username specified'
  821. show_help
  822. exit 3
  823. fi
  824. if [[ $SYSTEM_TYPE != "$VARIANT_MESH" ]]; then
  825. if [[ $ONION_ONLY == "no" ]]; then
  826. if [ ! $DDNS_USERNAME ]; then
  827. echo $'Please provide the username for your dynamic DNS provider with the --ddnsuser option'
  828. exit 7823
  829. fi
  830. if [ ! $DDNS_PASSWORD ]; then
  831. echo $'Please provide the password for your dynamic DNS provider with the --ddnspass option'
  832. exit 6382
  833. fi
  834. fi
  835. fi
  836. if [ ! $SYSTEM_TYPE ]; then
  837. SYSTEM_TYPE=$VARIANT_FULL
  838. fi
  839. 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
  840. echo $"'$SYSTEM_TYPE' is an unrecognised ${PROJECT_NAME} variant."
  841. exit 30
  842. fi
  843. }
  844. function read_repo_servers {
  845. if [ -f $CONFIGURATION_FILE ]; then
  846. if grep -q "FRIENDS_MIRRORS_SERVER" $CONFIGURATION_FILE; then
  847. FRIENDS_MIRRORS_SERVER=$(grep "FRIENDS_MIRRORS_SERVER" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  848. fi
  849. if grep -q "FRIENDS_MIRRORS_SSH_PORT" $CONFIGURATION_FILE; then
  850. FRIENDS_MIRRORS_SSH_PORT=$(grep "FRIENDS_MIRRORS_SSH_PORT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  851. fi
  852. if grep -q "MY_MIRRORS_PASSWORD" $CONFIGURATION_FILE; then
  853. MY_MIRRORS_PASSWORD=$(grep "MY_MIRRORS_PASSWORD" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  854. fi
  855. if grep -q "FRIENDS_MIRRORS_PASSWORD" $CONFIGURATION_FILE; then
  856. FRIENDS_MIRRORS_PASSWORD=$(grep "FRIENDS_MIRRORS_PASSWORD" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  857. fi
  858. fi
  859. if [ ! $FRIENDS_MIRRORS_SERVER ]; then
  860. return
  861. fi
  862. if [ ${#FRIENDS_MIRRORS_SERVER} -lt 2 ]; then
  863. return
  864. fi
  865. MAIN_COMMAND=/usr/local/bin/${PROJECT_NAME}
  866. if [ ! -f $MAIN_COMMAND ]; then
  867. MAIN_COMMAND=/usr/bin/${PROJECT_NAME}
  868. fi
  869. REPOS=($(cat ${MAIN_COMMAND} | grep "_REPO=\"" | uniq -u | sed 's|${PROJECT_NAME}|'"${PROJECT_NAME}"'|g'))
  870. for line in "${REPOS[@]}"
  871. do
  872. repo_name=$(echo "$line" | awk -F '=' '{print $1}')
  873. mirrors_name=$(echo "$repo_name" | sed "s|_REPO||g" | awk '{print tolower($0)}')
  874. friends_repo_url="ssh://mirrors@${FRIENDS_MIRRORS_SERVER}:${FRIENDS_MIRRORS_SSH_PORT}/home/mirrors/${mirrors_name}"
  875. ${repo_name}="${friends_repo_url}"
  876. done
  877. }
  878. function read_configuration {
  879. # if not installing on a Beaglebone then use sdb as the USB drive by default
  880. if [ ! $INSTALLING_ON_BBB ]; then
  881. if [[ $USB_DRIVE == /dev/sda1 ]]; then
  882. USB_DRIVE=/dev/sdb1
  883. fi
  884. fi
  885. if [[ $INSTALLING_FROM_CONFIGURATION_FILE == "yes" ]]; then
  886. if [ ! -f $CONFIGURATION_FILE ]; then
  887. echo $"The configuration file $CONFIGURATION_FILE was not found"
  888. exit 8935
  889. fi
  890. fi
  891. if [ -f $CONFIGURATION_FILE ]; then
  892. read_repo_servers
  893. # Ensure that a copy of the config exists for upgrade purposes
  894. if [[ $CONFIGURATION_FILE != "/root/${PROJECT_NAME}.cfg" ]]; then
  895. cp $CONFIGURATION_FILE /root/${PROJECT_NAME}.cfg
  896. fi
  897. if grep -q "MICROBLOG_WELCOME_MESSAGE" $CONFIGURATION_FILE; then
  898. MICROBLOG_WELCOME_MESSAGE=$(grep "MICROBLOG_WELCOME_MESSAGE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  899. fi
  900. if grep -q "PROJECT_WEBSITE" $CONFIGURATION_FILE; then
  901. PROJECT_WEBSITE=$(grep "PROJECT_WEBSITE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  902. fi
  903. if grep -q "PROJECT_REPO" $CONFIGURATION_FILE; then
  904. PROJECT_REPO=$(grep "PROJECT_REPO" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  905. fi
  906. if grep -q "ONION_ONLY" $CONFIGURATION_FILE; then
  907. ONION_ONLY=$(grep "ONION_ONLY" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  908. fi
  909. if grep -q "IRC_PASSWORD" $CONFIGURATION_FILE; then
  910. IRC_PASSWORD=$(grep "IRC_PASSWORD" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  911. fi
  912. if grep -q "DEFAULT_LANGUAGE" $CONFIGURATION_FILE; then
  913. DEFAULT_LANGUAGE=$(grep "DEFAULT_LANGUAGE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  914. fi
  915. if grep -q "MINIMAL_INSTALL" $CONFIGURATION_FILE; then
  916. MINIMAL_INSTALL=$(grep "MINIMAL_INSTALL" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  917. fi
  918. if grep -q "LETSENCRYPT_SERVER" $CONFIGURATION_FILE; then
  919. LETSENCRYPT_SERVER=$(grep "LETSENCRYPT_SERVER" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  920. fi
  921. if grep -q "FULLBLOG_REPO" $CONFIGURATION_FILE; then
  922. FULLBLOG_REPO=$(grep "FULLBLOG_REPO" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  923. fi
  924. if grep -q "FULLBLOG_COMMIT" $CONFIGURATION_FILE; then
  925. FULLBLOG_COMMIT=$(grep "FULLBLOG_COMMIT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  926. fi
  927. if grep -q "GOGS_COMMIT" $CONFIGURATION_FILE; then
  928. GOGS_COMMIT=$(grep "GOGS_COMMIT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  929. fi
  930. if grep -q "TOX_COMMIT" $CONFIGURATION_FILE; then
  931. TOX_COMMIT=$(grep "TOX_COMMIT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  932. fi
  933. if grep -q "TOXIC_COMMIT" $CONFIGURATION_FILE; then
  934. TOXIC_COMMIT=$(grep "TOXIC_COMMIT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  935. fi
  936. if grep -q "GPGIT_REPO" $CONFIGURATION_FILE; then
  937. GPGIT_REPO=$(grep "GPGIT_REPO" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  938. fi
  939. if grep -q "GPGIT_COMMIT" $CONFIGURATION_FILE; then
  940. GPGIT_COMMIT=$(grep "GPGIT_COMMIT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  941. fi
  942. if grep -q "OWNCLOUD_MUSIC_APP_COMMIT" $CONFIGURATION_FILE; then
  943. OWNCLOUD_MUSIC_APP_COMMIT=$(grep "OWNCLOUD_MUSIC_APP_COMMIT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  944. fi
  945. if grep -q "HUBZILLA_REPO" $CONFIGURATION_FILE; then
  946. HUBZILLA_REPO=$(grep "HUBZILLA_REPO" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  947. fi
  948. if grep -q "HUBZILLA_COMMIT" $CONFIGURATION_FILE; then
  949. HUBZILLA_COMMIT=$(grep "HUBZILLA_COMMIT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  950. fi
  951. if grep -q "IPFS_COMMIT" $CONFIGURATION_FILE; then
  952. IPFS_COMMIT=$(grep "IPFS_COMMIT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  953. fi
  954. if grep -q "ZERONET_BLOG_COMMIT" $CONFIGURATION_FILE; then
  955. ZERONET_BLOG_COMMIT=$(grep "ZERONET_BLOG_COMMIT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  956. fi
  957. if grep -q "ZERONET_MAIL_COMMIT" $CONFIGURATION_FILE; then
  958. ZERONET_MAIL_COMMIT=$(grep "ZERONET_MAIL_COMMIT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  959. fi
  960. if grep -q "ZERONET_FORUM_COMMIT" $CONFIGURATION_FILE; then
  961. ZERONET_FORUM_COMMIT=$(grep "ZERONET_FORUM_COMMIT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  962. fi
  963. if grep -q "MICROBLOG_COMMIT" $CONFIGURATION_FILE; then
  964. MICROBLOG_COMMIT=$(grep "MICROBLOG_COMMIT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  965. fi
  966. if grep -q "NGINX_ENSITE_REPO" $CONFIGURATION_FILE; then
  967. NGINX_ENSITE_REPO=$(grep "NGINX_ENSITE_REPO" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  968. fi
  969. if grep -q "NGINX_ENSITE_COMMIT" $CONFIGURATION_FILE; then
  970. NGINX_ENSITE_COMMIT=$(grep "NGINX_ENSITE_COMMIT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  971. fi
  972. if grep -q "CLEANUP_MAILDIR_COMMIT" $CONFIGURATION_FILE; then
  973. CLEANUP_MAILDIR_COMMIT=$(grep "CLEANUP_MAILDIR_COMMIT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  974. fi
  975. if grep -q "CLEANUP_MAILDIR_REPO" $CONFIGURATION_FILE; then
  976. CLEANUP_MAILDIR_REPO=$(grep "CLEANUP_MAILDIR_REPO" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  977. fi
  978. if grep -q "ZERONET_COMMIT" $CONFIGURATION_FILE; then
  979. ZERONET_COMMIT=$(grep "ZERONET_COMMIT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  980. fi
  981. if grep -q "INADYN_REPO" $CONFIGURATION_FILE; then
  982. INADYN_REPO=$(grep "INADYN_REPO" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  983. fi
  984. if grep -q "INADYN_COMMIT" $CONFIGURATION_FILE; then
  985. INADYN_COMMIT=$(grep "INADYN_COMMIT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  986. fi
  987. if grep -q "GPG_KEYSERVER" $CONFIGURATION_FILE; then
  988. GPG_KEYSERVER=$(grep "GPG_KEYSERVER" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  989. fi
  990. if grep -q "IPFS_PORT" $CONFIGURATION_FILE; then
  991. IPFS_PORT=$(grep "IPFS_PORT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  992. fi
  993. if grep -q "TRACKER_PORT" $CONFIGURATION_FILE; then
  994. TRACKER_PORT=$(grep "TRACKER_PORT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  995. fi
  996. if grep -q "ZERONET_PORT" $CONFIGURATION_FILE; then
  997. ZERONET_PORT=$(grep "ZERONET_PORT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  998. fi
  999. if grep -q "DH_KEYLENGTH" $CONFIGURATION_FILE; then
  1000. DH_KEYLENGTH=$(grep "DH_KEYLENGTH" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1001. fi
  1002. if grep -q "WIFI_INTERFACE" $CONFIGURATION_FILE; then
  1003. WIFI_INTERFACE=$(grep "WIFI_INTERFACE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1004. fi
  1005. if grep -q "IRC_PORT" $CONFIGURATION_FILE; then
  1006. IRC_PORT=$(grep "IRC_PORT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1007. fi
  1008. if grep -q "WIFI_CHANNEL" $CONFIGURATION_FILE; then
  1009. WIFI_CHANNEL=$(grep "WIFI_CHANNEL" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1010. fi
  1011. if grep -q "BATMAN_CELLID" $CONFIGURATION_FILE; then
  1012. BATMAN_CELLID=$(grep "BATMAN_CELLID" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1013. fi
  1014. if grep -q "ESSID" $CONFIGURATION_FILE; then
  1015. ESSID=$(grep "ESSID" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1016. fi
  1017. if grep -q "TOX_PORT" $CONFIGURATION_FILE; then
  1018. TOX_PORT=$(grep "TOX_PORT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1019. fi
  1020. if grep -q "TOX_NODES" $CONFIGURATION_FILE; then
  1021. TOX_NODES=$(grep "TOX_NODES" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1022. fi
  1023. if grep -q "TOX_REPO" $CONFIGURATION_FILE; then
  1024. TOX_REPO=$(grep "TOX_REPO" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1025. fi
  1026. if grep -q "ENABLE_SOCIAL_KEY_MANAGEMENT" $CONFIGURATION_FILE; then
  1027. ENABLE_SOCIAL_KEY_MANAGEMENT=$(grep "ENABLE_SOCIAL_KEY_MANAGEMENT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1028. fi
  1029. if grep -q "IPV6_NETWORK" $CONFIGURATION_FILE; then
  1030. IPV6_NETWORK=$(grep "IPV6_NETWORK" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1031. fi
  1032. if grep -q "HWRNG_TYPE" $CONFIGURATION_FILE; then
  1033. HWRNG_TYPE=$(grep "HWRNG_TYPE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1034. fi
  1035. if grep -q "MEDIAGOBLIN_DOMAIN_NAME" $CONFIGURATION_FILE; then
  1036. MEDIAGOBLIN_DOMAIN_NAME=$(grep "MEDIAGOBLIN_DOMAIN_NAME" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1037. fi
  1038. if grep -q "MEDIAGOBLIN_CODE" $CONFIGURATION_FILE; then
  1039. MEDIAGOBLIN_CODE=$(grep "MEDIAGOBLIN_CODE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1040. fi
  1041. if grep -q "GIT_ADMIN_PASSWORD" $CONFIGURATION_FILE; then
  1042. GIT_ADMIN_PASSWORD=$(grep "GIT_ADMIN_PASSWORD" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1043. fi
  1044. if grep -q "GIT_DOMAIN_NAME" $CONFIGURATION_FILE; then
  1045. GIT_DOMAIN_NAME=$(grep "GIT_DOMAIN_NAME" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1046. fi
  1047. if grep -q "GIT_CODE" $CONFIGURATION_FILE; then
  1048. GIT_CODE=$(grep "GIT_CODE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1049. fi
  1050. if grep -q "SYSTEM_TYPE" $CONFIGURATION_FILE; then
  1051. SYSTEM_TYPE=$(grep "SYSTEM_TYPE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1052. fi
  1053. if grep -q "SSL_PROTOCOLS" $CONFIGURATION_FILE; then
  1054. SSL_PROTOCOLS=$(grep "SSL_PROTOCOLS" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1055. fi
  1056. if grep -q "SSL_CIPHERS" $CONFIGURATION_FILE; then
  1057. SSL_CIPHERS=$(grep "SSL_CIPHERS" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1058. fi
  1059. if grep -q "SSH_CIPHERS" $CONFIGURATION_FILE; then
  1060. SSH_CIPHERS=$(grep "SSH_CIPHERS" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1061. fi
  1062. if grep -q "SSH_MACS" $CONFIGURATION_FILE; then
  1063. SSH_MACS=$(grep "SSH_MACS" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1064. fi
  1065. if grep -q "SSH_KEX" $CONFIGURATION_FILE; then
  1066. SSH_KEX=$(grep "SSH_KEX" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1067. fi
  1068. if grep -q "SSH_HOST_KEY_ALGORITHMS" $CONFIGURATION_FILE; then
  1069. SSH_HOST_KEY_ALGORITHMS=$(grep "SSH_HOST_KEY_ALGORITHMS" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1070. fi
  1071. if grep -q "SSH_PASSWORDS" $CONFIGURATION_FILE; then
  1072. SSH_PASSWORDS=$(grep "SSH_PASSWORDS" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1073. fi
  1074. if grep -q "XMPP_CIPHERS" $CONFIGURATION_FILE; then
  1075. XMPP_CIPHERS=$(grep "XMPP_CIPHERS" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1076. fi
  1077. if grep -q "XMPP_ECC_CURVE" $CONFIGURATION_FILE; then
  1078. XMPP_ECC_CURVE=$(grep "XMPP_ECC_CURVE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1079. fi
  1080. if grep -q "MY_USERNAME" $CONFIGURATION_FILE; then
  1081. MY_USERNAME=$(grep "MY_USERNAME" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1082. fi
  1083. if grep -q "DOMAIN_NAME" $CONFIGURATION_FILE; then
  1084. # for backwards compatability
  1085. DEFAULT_DOMAIN_NAME=$(grep "DOMAIN_NAME" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1086. fi
  1087. if grep -q "DEFAULT_DOMAIN_NAME" $CONFIGURATION_FILE; then
  1088. DEFAULT_DOMAIN_NAME=$(grep "DEFAULT_DOMAIN_NAME" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1089. fi
  1090. if grep -q "DEFAULT_DOMAIN_CODE" $CONFIGURATION_FILE; then
  1091. DEFAULT_DOMAIN_CODE=$(grep "DEFAULT_DOMAIN_CODE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1092. fi
  1093. if grep -q "NAMESERVER1" $CONFIGURATION_FILE; then
  1094. NAMESERVER1=$(grep "NAMESERVER1" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1095. fi
  1096. if grep -q "NAMESERVER2" $CONFIGURATION_FILE; then
  1097. NAMESERVER2=$(grep "NAMESERVER2" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1098. fi
  1099. if grep -q "DEBIAN_REPO" $CONFIGURATION_FILE; then
  1100. DEBIAN_REPO=$(grep "DEBIAN_REPO" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1101. 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."
  1102. fi
  1103. if grep -q "VOIP_PORT" $CONFIGURATION_FILE; then
  1104. VOIP_PORT=$(grep "VOIP_PORT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1105. fi
  1106. if grep -q "VOIP_SERVER_PASSWORD" $CONFIGURATION_FILE; then
  1107. VOIP_SERVER_PASSWORD=$(grep "VOIP_SERVER_PASSWORD" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1108. fi
  1109. if grep -q "SIP_PORT" $CONFIGURATION_FILE; then
  1110. SIP_PORT=$(grep "SIP_PORT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1111. fi
  1112. if grep -q "SIP_SERVER_PASSWORD" $CONFIGURATION_FILE; then
  1113. SIP_SERVER_PASSWORD=$(grep "SIP_SERVER_PASSWORD" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1114. fi
  1115. if grep -q "GET_IP_ADDRESS_URL" $CONFIGURATION_FILE; then
  1116. GET_IP_ADDRESS_URL=$(grep "GET_IP_ADDRESS_URL" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1117. fi
  1118. if grep -q "DDNS_PROVIDER" $CONFIGURATION_FILE; then
  1119. DDNS_PROVIDER=$(grep "DDNS_PROVIDER" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1120. fi
  1121. if grep -q "DDNS_USERNAME" $CONFIGURATION_FILE; then
  1122. DDNS_USERNAME=$(grep "DDNS_USERNAME" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1123. fi
  1124. if grep -q "DDNS_PASSWORD" $CONFIGURATION_FILE; then
  1125. DDNS_PASSWORD=$(grep "DDNS_PASSWORD" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1126. fi
  1127. if grep -q "LOCAL_NETWORK_STATIC_IP_ADDRESS" $CONFIGURATION_FILE; then
  1128. LOCAL_NETWORK_STATIC_IP_ADDRESS=$(grep "LOCAL_NETWORK_STATIC_IP_ADDRESS" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1129. fi
  1130. if grep -q "ENABLE_BABEL" $CONFIGURATION_FILE; then
  1131. ENABLE_BABEL=$(grep "ENABLE_BABEL" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1132. fi
  1133. if grep -q "ENABLE_BATMAN" $CONFIGURATION_FILE; then
  1134. ENABLE_BATMAN=$(grep "ENABLE_BATMAN" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1135. fi
  1136. if grep -q "ENABLE_CJDNS" $CONFIGURATION_FILE; then
  1137. ENABLE_CJDNS=$(grep "ENABLE_CJDNS" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1138. fi
  1139. if grep -q "CJDNS_COMMIT" $CONFIGURATION_FILE; then
  1140. CJDNS_COMMIT=$(grep "CJDNS_COMMIT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1141. fi
  1142. if grep -q "CJDNS_IPV6" $CONFIGURATION_FILE; then
  1143. CJDNS_IPV6=$(grep "CJDNS_IPV6" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1144. fi
  1145. if grep -q "CJDNS_PUBLIC_KEY" $CONFIGURATION_FILE; then
  1146. CJDNS_PUBLIC_KEY=$(grep "CJDNS_PUBLIC_KEY" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1147. fi
  1148. if grep -q "CJDNS_PRIVATE_KEY" $CONFIGURATION_FILE; then
  1149. CJDNS_PRIVATE_KEY=$(grep "CJDNS_PRIVATE_KEY" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1150. fi
  1151. if grep -q "ROUTER_IP_ADDRESS" $CONFIGURATION_FILE; then
  1152. ROUTER_IP_ADDRESS=$(grep "ROUTER_IP_ADDRESS" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1153. fi
  1154. if grep -q "CPU_CORES" $CONFIGURATION_FILE; then
  1155. CPU_CORES=$(grep "CPU_CORES" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1156. fi
  1157. if grep -q "WEBSERVER_LOG_LEVEL" $CONFIGURATION_FILE; then
  1158. WEBSERVER_LOG_LEVEL=$(grep "WEBSERVER_LOG_LEVEL" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1159. fi
  1160. if grep -q "ROUTE_THROUGH_TOR" $CONFIGURATION_FILE; then
  1161. ROUTE_THROUGH_TOR=$(grep "ROUTE_THROUGH_TOR" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1162. fi
  1163. if grep -q "WIKI_TITLE" $CONFIGURATION_FILE; then
  1164. WIKI_TITLE=$(grep "WIKI_TITLE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1165. fi
  1166. if grep -q "MY_NAME" $CONFIGURATION_FILE; then
  1167. MY_NAME=$(grep "MY_NAME" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1168. fi
  1169. if grep -q "MY_EMAIL_ADDRESS" $CONFIGURATION_FILE; then
  1170. MY_EMAIL_ADDRESS=$(grep "MY_EMAIL_ADDRESS" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1171. fi
  1172. if grep -q "INSTALLING_ON_BBB" $CONFIGURATION_FILE; then
  1173. INSTALLING_ON_BBB=$(grep "INSTALLING_ON_BBB" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1174. fi
  1175. if grep -q "SSH_PORT" $CONFIGURATION_FILE; then
  1176. SSH_PORT=$(grep "SSH_PORT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1177. fi
  1178. if grep -q "INSTALLED_WITHIN_DOCKER" $CONFIGURATION_FILE; then
  1179. INSTALLED_WITHIN_DOCKER=$(grep "INSTALLED_WITHIN_DOCKER" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1180. fi
  1181. if grep -q "PUBLIC_MAILING_LIST" $CONFIGURATION_FILE; then
  1182. PUBLIC_MAILING_LIST=$(grep "PUBLIC_MAILING_LIST" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1183. fi
  1184. if grep -q "MICROBLOG_DOMAIN_NAME" $CONFIGURATION_FILE; then
  1185. MICROBLOG_DOMAIN_NAME=$(grep "MICROBLOG_DOMAIN_NAME" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1186. fi
  1187. if grep -q "MICROBLOG_CODE" $CONFIGURATION_FILE; then
  1188. MICROBLOG_CODE=$(grep "MICROBLOG_CODE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1189. fi
  1190. if grep -q "HUBZILLA_DOMAIN_NAME" $CONFIGURATION_FILE; then
  1191. HUBZILLA_DOMAIN_NAME=$(grep "HUBZILLA_DOMAIN_NAME" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1192. fi
  1193. if grep -q "HUBZILLA_CODE" $CONFIGURATION_FILE; then
  1194. HUBZILLA_CODE=$(grep "HUBZILLA_CODE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1195. fi
  1196. if grep -q "OWNCLOUD_DOMAIN_NAME" $CONFIGURATION_FILE; then
  1197. OWNCLOUD_DOMAIN_NAME=$(grep "OWNCLOUD_DOMAIN_NAME" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1198. fi
  1199. if grep -q "OWNCLOUD_CODE" $CONFIGURATION_FILE; then
  1200. OWNCLOUD_CODE=$(grep "OWNCLOUD_CODE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1201. fi
  1202. if grep -q "WIKI_DOMAIN_NAME" $CONFIGURATION_FILE; then
  1203. WIKI_DOMAIN_NAME=$(grep "WIKI_DOMAIN_NAME" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1204. fi
  1205. if grep -q "WIKI_CODE" $CONFIGURATION_FILE; then
  1206. WIKI_CODE=$(grep "WIKI_CODE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1207. fi
  1208. if grep -q "FULLBLOG_DOMAIN_NAME" $CONFIGURATION_FILE; then
  1209. FULLBLOG_DOMAIN_NAME=$(grep "FULLBLOG_DOMAIN_NAME" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1210. fi
  1211. if grep -q "FULLBLOG_CODE" $CONFIGURATION_FILE; then
  1212. FULLBLOG_CODE=$(grep "FULLBLOG_CODE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1213. fi
  1214. if grep -q "MY_BLOG_TITLE" $CONFIGURATION_FILE; then
  1215. MY_BLOG_TITLE=$(grep "MY_BLOG_TITLE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1216. fi
  1217. if grep -q "MY_BLOG_SUBTITLE" $CONFIGURATION_FILE; then
  1218. MY_BLOG_SUBTITLE=$(grep "MY_BLOG_SUBTITLE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1219. fi
  1220. if grep -q "GPG_ENCRYPT_STORED_EMAIL" $CONFIGURATION_FILE; then
  1221. GPG_ENCRYPT_STORED_EMAIL=$(grep "GPG_ENCRYPT_STORED_EMAIL" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1222. fi
  1223. if grep -q "MY_GPG_PUBLIC_KEY" $CONFIGURATION_FILE; then
  1224. MY_GPG_PUBLIC_KEY=$(grep "MY_GPG_PUBLIC_KEY" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1225. fi
  1226. if grep -q "MY_GPG_PRIVATE_KEY" $CONFIGURATION_FILE; then
  1227. MY_GPG_PRIVATE_KEY=$(grep "MY_GPG_PRIVATE_KEY" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1228. fi
  1229. if grep -q "MY_GPG_PUBLIC_KEY_ID" $CONFIGURATION_FILE; then
  1230. MY_GPG_PUBLIC_KEY_ID=$(grep "MY_GPG_PUBLIC_KEY_ID" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1231. fi
  1232. if grep -q "USB_DRIVE" $CONFIGURATION_FILE; then
  1233. USB_DRIVE=$(grep "USB_DRIVE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1234. fi
  1235. if grep -q "MAX_PHP_MEMORY" $CONFIGURATION_FILE; then
  1236. MAX_PHP_MEMORY=$(grep "MAX_PHP_MEMORY" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1237. fi
  1238. if grep -q "TLS_TIME_SOURCE1" $CONFIGURATION_FILE; then
  1239. TLS_TIME_SOURCE1=$(grep "TLS_TIME_SOURCE1" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1240. fi
  1241. if grep -q "TLS_TIME_SOURCE2" $CONFIGURATION_FILE; then
  1242. TLS_TIME_SOURCE2=$(grep "TLS_TIME_SOURCE2" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1243. fi
  1244. fi
  1245. echo "System type: $SYSTEM_TYPE"
  1246. }
  1247. function set_default_onion_domains {
  1248. # If sites are only visible via Tor then for installation
  1249. # purposes assign them some default domain names
  1250. if [[ $ONION_ONLY == "no" ]]; then
  1251. return
  1252. fi
  1253. if [ $OWNCLOUD_DOMAIN_NAME ]; then
  1254. OWNCLOUD_DOMAIN_NAME='owncloud.local'
  1255. fi
  1256. if [ $MICROBLOG_DOMAIN_NAME ]; then
  1257. MICROBLOG_DOMAIN_NAME='microblog.local'
  1258. fi
  1259. if [ $FULLBLOG_DOMAIN_NAME ]; then
  1260. FULLBLOG_DOMAIN_NAME='blog.local'
  1261. fi
  1262. if [ $GIT_DOMAIN_NAME ]; then
  1263. GIT_DOMAIN_NAME='git.local'
  1264. fi
  1265. if [ $WIKI_DOMAIN_NAME ]; then
  1266. WIKI_DOMAIN_NAME='wiki.local'
  1267. fi
  1268. if [ $DEFAULT_DOMAIN_NAME ]; then
  1269. DEFAULT_DOMAIN_NAME="${PROJECT_NAME}.local"
  1270. fi
  1271. }
  1272. function wait_for_onion_service {
  1273. onion_service_name="$1"
  1274. sleep_ctr=0
  1275. while [ ! -f /var/lib/tor/hidden_service_${onion_service_name}/hostname ]; do
  1276. sleep 1
  1277. sleep_ctr=$((sleep_ctr + 1))
  1278. if [ $sleep_ctr -gt 10 ]; then
  1279. break
  1280. fi
  1281. done
  1282. if [ ! -f /var/lib/tor/hidden_service_${onion_service_name}/hostname ]; then
  1283. # restart and try a second time
  1284. systemctl restart tor
  1285. sleep_ctr=0
  1286. while [ ! -f /var/lib/tor/hidden_service_${onion_service_name}/hostname ]; do
  1287. sleep 1
  1288. sleep_ctr=$((sleep_ctr + 1))
  1289. if [ $sleep_ctr -gt 10 ]; then
  1290. break
  1291. fi
  1292. done
  1293. fi
  1294. }
  1295. function add_onion_service {
  1296. onion_service_name="$1"
  1297. onion_service_port_from=$2
  1298. onion_service_port_to=$3
  1299. if [ -f /var/lib/tor/hidden_service_${onion_service_name}/hostname ]; then
  1300. echo $(cat /var/lib/tor/hidden_service_${onion_service_name}/hostname)
  1301. return
  1302. fi
  1303. if [ ! -d /var/lib/tor ]; then
  1304. echo $"No Tor installation found. ${onion_service_name} onion site cannot be configured."
  1305. exit 877367
  1306. fi
  1307. if ! grep -q "hidden_service_${onion_service_name}" /etc/tor/torrc; then
  1308. echo "HiddenServiceDir /var/lib/tor/hidden_service_${onion_service_name}/" >> /etc/tor/torrc
  1309. echo "HiddenServicePort ${onion_service_port_from} 127.0.0.1:${onion_service_port_to}" >> /etc/tor/torrc
  1310. fi
  1311. systemctl restart tor
  1312. wait_for_onion_service ${onion_service_name}
  1313. if [ ! -f /var/lib/tor/hidden_service_${onion_service_name}/hostname ]; then
  1314. echo $"${onion_service_name} onion site hostname not found"
  1315. exit 76362
  1316. fi
  1317. echo $(cat /var/lib/tor/hidden_service_${onion_service_name}/hostname)
  1318. }
  1319. function create_avahi_onion_domains {
  1320. if [[ $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  1321. return
  1322. fi
  1323. if [ ! -d /etc/avahi/services ]; then
  1324. return
  1325. fi
  1326. if [ $OWNCLOUD_DOMAIN_NAME ]; then
  1327. echo '<?xml version="1.0" standalone="no"?><!--*-nxml-*-->' > /etc/avahi/services/owncloud.service
  1328. echo '<!DOCTYPE service-group SYSTEM "avahi-service.dtd">' >> /etc/avahi/services/owncloud.service
  1329. echo '<service-group>' >> /etc/avahi/services/owncloud.service
  1330. echo ' <name replace-wildcards="yes">%h HTTP</name>' >> /etc/avahi/services/owncloud.service
  1331. echo ' <service>' >> /etc/avahi/services/owncloud.service
  1332. echo ' <type>_http._tcp</type>' >> /etc/avahi/services/owncloud.service
  1333. echo " <port>$OWNCLOUD_ONION_PORT</port>" >> /etc/avahi/services/owncloud.service
  1334. echo ' </service>' >> /etc/avahi/services/owncloud.service
  1335. echo '</service-group>' >> /etc/avahi/services/owncloud.service
  1336. fi
  1337. if [ $MICROBLOG_DOMAIN_NAME ]; then
  1338. echo '<?xml version="1.0" standalone="no"?><!--*-nxml-*-->' > /etc/avahi/services/microblog.service
  1339. echo '<!DOCTYPE service-group SYSTEM "avahi-service.dtd">' >> /etc/avahi/services/microblog.service
  1340. echo '<service-group>' >> /etc/avahi/services/microblog.service
  1341. echo ' <name replace-wildcards="yes">%h HTTP</name>' >> /etc/avahi/services/microblog.service
  1342. echo ' <service>' >> /etc/avahi/services/microblog.service
  1343. echo ' <type>_http._tcp</type>' >> /etc/avahi/services/microblog.service
  1344. echo " <port>$MICROBLOG_ONION_PORT</port>" >> /etc/avahi/services/microblog.service
  1345. echo ' </service>' >> /etc/avahi/services/microblog.service
  1346. echo '</service-group>' >> /etc/avahi/services/microblog.service
  1347. fi
  1348. if [ $FULLBLOG_DOMAIN_NAME ]; then
  1349. echo '<?xml version="1.0" standalone="no"?><!--*-nxml-*-->' > /etc/avahi/services/blog.service
  1350. echo '<!DOCTYPE service-group SYSTEM "avahi-service.dtd">' >> /etc/avahi/services/blog.service
  1351. echo '<service-group>' >> /etc/avahi/services/blog.service
  1352. echo ' <name replace-wildcards="yes">%h HTTP</name>' >> /etc/avahi/services/blog.service
  1353. echo ' <service>' >> /etc/avahi/services/blog.service
  1354. echo ' <type>_http._tcp</type>' >> /etc/avahi/services/blog.service
  1355. echo " <port>$BLOG_ONION_PORT</port>" >> /etc/avahi/services/blog.service
  1356. echo ' </service>' >> /etc/avahi/services/blog.service
  1357. echo '</service-group>' >> /etc/avahi/services/blog.service
  1358. fi
  1359. if [ $GIT_DOMAIN_NAME ]; then
  1360. echo '<?xml version="1.0" standalone="no"?><!--*-nxml-*-->' > /etc/avahi/services/git.service
  1361. echo '<!DOCTYPE service-group SYSTEM "avahi-service.dtd">' >> /etc/avahi/services/git.service
  1362. echo '<service-group>' >> /etc/avahi/services/git.service
  1363. echo ' <name replace-wildcards="yes">%h HTTP</name>' >> /etc/avahi/services/git.service
  1364. echo ' <service>' >> /etc/avahi/services/git.service
  1365. echo ' <type>_http._tcp</type>' >> /etc/avahi/services/git.service
  1366. echo " <port>$GIT_ONION_PORT</port>" >> /etc/avahi/services/git.service
  1367. echo ' </service>' >> /etc/avahi/services/git.service
  1368. echo '</service-group>' >> /etc/avahi/services/git.service
  1369. fi
  1370. if [ $WIKI_DOMAIN_NAME ]; then
  1371. echo '<?xml version="1.0" standalone="no"?><!--*-nxml-*-->' > /etc/avahi/services/wiki.service
  1372. echo '<!DOCTYPE service-group SYSTEM "avahi-service.dtd">' >> /etc/avahi/services/wiki.service
  1373. echo '<service-group>' >> /etc/avahi/services/wiki.service
  1374. echo ' <name replace-wildcards="yes">%h HTTP</name>' >> /etc/avahi/services/wiki.service
  1375. echo ' <service>' >> /etc/avahi/services/wiki.service
  1376. echo ' <type>_http._tcp</type>' >> /etc/avahi/services/wiki.service
  1377. echo " <port>$WIKI_ONION_PORT</port>" >> /etc/avahi/services/wiki.service
  1378. echo ' </service>' >> /etc/avahi/services/wiki.service
  1379. echo '</service-group>' >> /etc/avahi/services/wiki.service
  1380. fi
  1381. }
  1382. # check an individual domain name
  1383. function test_domain_name {
  1384. if [ $1 ]; then
  1385. TEST_DOMAIN_NAME=$1
  1386. validate_domain_name
  1387. if [[ $TEST_DOMAIN_NAME != $1 ]]; then
  1388. echo $TEST_DOMAIN_NAME
  1389. exit 8528
  1390. fi
  1391. fi
  1392. }
  1393. # check that domain names are sensible
  1394. function check_domains {
  1395. if [ $WIKI_DOMAIN_NAME ]; then
  1396. test_domain_name "$WIKI_DOMAIN_NAME"
  1397. if [[ "$test_domain_name" == "$OWNCLOUD_DOMAIN_NAME" ]]; then
  1398. echo $'Wiki domain name is the same as Owncloud domain name. They must be different'
  1399. exit 73863
  1400. fi
  1401. if [[ "$test_domain_name" == "$FULLBLOG_DOMAIN_NAME" ]]; then
  1402. echo $'Wiki domain name is the same as blog domain name. They must be different'
  1403. exit 97326
  1404. fi
  1405. if [[ "$test_domain_name" == "$MICROBLOG_DOMAIN_NAME" ]]; then
  1406. echo $'Wiki domain name is the same as microblog domain name. They must be different'
  1407. exit 36827
  1408. fi
  1409. if [[ "$test_domain_name" == "$HUBZILLA_DOMAIN_NAME" ]]; then
  1410. echo $'Wiki domain name is the same as hubzilla domain name. They must be different'
  1411. exit 65848
  1412. fi
  1413. if [ $GIT_DOMAIN_NAME ]; then
  1414. if [[ "$test_domain_name" == "$GIT_DOMAIN_NAME" ]]; then
  1415. echo $'Wiki domain name is the same as Gogs domain name. They must be different'
  1416. exit 73529
  1417. fi
  1418. fi
  1419. fi
  1420. if [ $OWNCLOUD_DOMAIN_NAME ]; then
  1421. test_domain_name "$OWNCLOUD_DOMAIN_NAME"
  1422. if [[ "$test_domain_name" == "$WIKI_DOMAIN_NAME" ]]; then
  1423. echo $'Owncloud domain name is the same as wiki domain name. They must be different'
  1424. exit 37994
  1425. fi
  1426. if [[ "$test_domain_name" == "$FULLBLOG_DOMAIN_NAME" ]]; then
  1427. echo $'Owncloud domain name is the same as blog domain name. They must be different'
  1428. exit 37936
  1429. fi
  1430. if [[ "$test_domain_name" == "$MICROBLOG_DOMAIN_NAME" ]]; then
  1431. echo $'Owncloud domain name is the same as microblog domain name. They must be different'
  1432. exit 36896
  1433. fi
  1434. if [[ "$test_domain_name" == "$HUBZILLA_DOMAIN_NAME" ]]; then
  1435. echo $'Owncloud domain name is the same as hubzilla domain name. They must be different'
  1436. exit 68365
  1437. fi
  1438. if [ $GIT_DOMAIN_NAME ]; then
  1439. if [[ "$test_domain_name" == "$GIT_DOMAIN_NAME" ]]; then
  1440. echo $'Owncloud domain name is the same as Gogs domain name. They must be different'
  1441. exit 27692
  1442. fi
  1443. fi
  1444. fi
  1445. if [ $FULLBLOG_DOMAIN_NAME ]; then
  1446. test_domain_name "$FULLBLOG_DOMAIN_NAME"
  1447. if [[ "$test_domain_name" == "$WIKI_DOMAIN_NAME" ]]; then
  1448. echo $'Blog domain name is the same as wiki domain name. They must be different'
  1449. exit 62348
  1450. fi
  1451. if [[ "$test_domain_name" == "$OWNCLOUD_DOMAIN_NAME" ]]; then
  1452. echo $'Blog domain name is the same as Owncloud domain name. They must be different'
  1453. exit 84682
  1454. fi
  1455. if [[ "$test_domain_name" == "$MICROBLOG_DOMAIN_NAME" ]]; then
  1456. echo $'Blog domain name is the same as microblog domain name. They must be different'
  1457. exit 38236
  1458. fi
  1459. if [[ "$test_domain_name" == "$HUBZILLA_DOMAIN_NAME" ]]; then
  1460. echo $'Blog domain name is the same as hubzilla domain name. They must be different'
  1461. exit 35483
  1462. fi
  1463. if [ $GIT_DOMAIN_NAME ]; then
  1464. if [[ "$test_domain_name" == "$GIT_DOMAIN_NAME" ]]; then
  1465. echo $'Blog domain name is the same as Gogs domain name. They must be different'
  1466. exit 84695
  1467. fi
  1468. fi
  1469. fi
  1470. if [ $MICROBLOG_DOMAIN_NAME ]; then
  1471. test_domain_name "$MICROBLOG_DOMAIN_NAME"
  1472. if [[ "$test_domain_name" == "$WIKI_DOMAIN_NAME" ]]; then
  1473. echo $'Microblog domain name is the same as wiki domain name. They must be different'
  1474. exit 73924
  1475. fi
  1476. if [[ "$test_domain_name" == "$OWNCLOUD_DOMAIN_NAME" ]]; then
  1477. echo $'Microblog domain name is the same as Owncloud domain name. They must be different'
  1478. exit 73683
  1479. fi
  1480. if [[ "$test_domain_name" == "$FULLBLOG_DOMAIN_NAME" ]]; then
  1481. echo $'Microblog domain name is the same as blog domain name. They must be different'
  1482. exit 26832
  1483. fi
  1484. if [[ "$test_domain_name" == "$HUBZILLA_DOMAIN_NAME" ]]; then
  1485. echo $'Microblog domain name is the same as hubzilla domain name. They must be different'
  1486. exit 678382
  1487. fi
  1488. if [ $GIT_DOMAIN_NAME ]; then
  1489. if [[ "$test_domain_name" == "$GIT_DOMAIN_NAME" ]]; then
  1490. echo $'Microblog domain name is the same as Gogs domain name. They must be different'
  1491. exit 684325
  1492. fi
  1493. fi
  1494. fi
  1495. if [ $HUBZILLA_DOMAIN_NAME ]; then
  1496. test_domain_name "$HUBZILLA_DOMAIN_NAME"
  1497. if [[ "$test_domain_name" == "$WIKI_DOMAIN_NAME" ]]; then
  1498. echo $'Hubzilla domain name is the same as wiki domain name. They must be different'
  1499. exit 83682
  1500. fi
  1501. if [[ "$test_domain_name" == "$OWNCLOUD_DOMAIN_NAME" ]]; then
  1502. echo $'Hubzilla domain name is the same as Owncloud domain name. They must be different'
  1503. exit 65192
  1504. fi
  1505. if [[ "$test_domain_name" == "$FULLBLOG_DOMAIN_NAME" ]]; then
  1506. echo $'Hubzilla domain name is the same as blog domain name. They must be different'
  1507. exit 74817
  1508. fi
  1509. if [[ "$test_domain_name" == "$MICROBLOG_DOMAIN_NAME" ]]; then
  1510. echo $'Hubzilla domain name is the same as microblog domain name. They must be different'
  1511. exit 83683
  1512. fi
  1513. if [ $GIT_DOMAIN_NAME ]; then
  1514. if [[ "$test_domain_name" == "$GIT_DOMAIN_NAME" ]]; then
  1515. echo $'Hubzilla domain name is the same as Gogs domain name. They must be different'
  1516. exit 135523
  1517. fi
  1518. fi
  1519. fi
  1520. if [ $GIT_DOMAIN_NAME ]; then
  1521. test_domain_name "$GIT_DOMAIN_NAME"
  1522. if [[ "$test_domain_name" == "$WIKI_DOMAIN_NAME" ]]; then
  1523. echo $'Hubzilla domain name is the same as wiki domain name. They must be different'
  1524. exit 83682
  1525. fi
  1526. if [[ "$test_domain_name" == "$OWNCLOUD_DOMAIN_NAME" ]]; then
  1527. echo $'Hubzilla domain name is the same as Owncloud domain name. They must be different'
  1528. exit 65192
  1529. fi
  1530. if [[ "$test_domain_name" == "$FULLBLOG_DOMAIN_NAME" ]]; then
  1531. echo $'Hubzilla domain name is the same as blog domain name. They must be different'
  1532. exit 74817
  1533. fi
  1534. if [[ "$test_domain_name" == "$MICROBLOG_DOMAIN_NAME" ]]; then
  1535. echo $'Hubzilla domain name is the same as microblog domain name. They must be different'
  1536. exit 83683
  1537. fi
  1538. if [[ "$test_domain_name" == "$HUBZILLA_DOMAIN_NAME" ]]; then
  1539. echo $'Microblog domain name is the same as hubzilla domain name. They must be different'
  1540. exit 678382
  1541. fi
  1542. fi
  1543. }
  1544. # Checks whether certificates were generated for the given hostname
  1545. function check_certificates {
  1546. if [ ! $1 ]; then
  1547. return
  1548. fi
  1549. if [[ $LETSENCRYPT_ENABLED != "yes" ]]; then
  1550. if [ ! -f /etc/ssl/private/$1.key ]; then
  1551. echo $"Private certificate for $CHECK_HOSTNAME was not created"
  1552. exit 63959
  1553. fi
  1554. if [ ! -f /etc/ssl/certs/$1.crt ]; then
  1555. echo $"Public certificate for $CHECK_HOSTNAME was not created"
  1556. exit 7679
  1557. fi
  1558. else
  1559. if [ ! -f /etc/letsencrypt/live/${1}/privkey.pem ]; then
  1560. echo $"Private certificate for $CHECK_HOSTNAME was not created"
  1561. exit 6282
  1562. fi
  1563. if [ ! -f /etc/letsencrypt/live/${1}/fullchain.pem ]; then
  1564. echo $"Public certificate for $CHECK_HOSTNAME was not created"
  1565. exit 5328
  1566. fi
  1567. fi
  1568. if [ ! -f /etc/ssl/certs/$1.dhparam ]; then
  1569. echo $"Diffie–Hellman parameters for $CHECK_HOSTNAME were not created"
  1570. exit 5989
  1571. fi
  1572. }
  1573. function install_not_on_BBB {
  1574. if grep -Fxq "install_not_on_BBB" $COMPLETION_FILE; then
  1575. return
  1576. fi
  1577. if [[ INSTALLING_ON_BBB == "yes" ]]; then
  1578. return
  1579. fi
  1580. if [ ! $LOCAL_NETWORK_STATIC_IP_ADDRESS ]; then
  1581. return
  1582. fi
  1583. echo '# The loopback network interface' > /etc/network/interfaces
  1584. echo 'auto lo' >> /etc/network/interfaces
  1585. echo 'iface lo inet loopback' >> /etc/network/interfaces
  1586. echo '' >> /etc/network/interfaces
  1587. echo '# The primary network interface' >> /etc/network/interfaces
  1588. echo 'auto eth0' >> /etc/network/interfaces
  1589. echo 'iface eth0 inet static' >> /etc/network/interfaces
  1590. echo " address $LOCAL_NETWORK_STATIC_IP_ADDRESS" >> /etc/network/interfaces
  1591. echo ' netmask 255.255.255.0' >> /etc/network/interfaces
  1592. echo " gateway $ROUTER_IP_ADDRESS" >> /etc/network/interfaces
  1593. echo " dns-nameservers $NAMESERVER1 $NAMESERVER2" >> /etc/network/interfaces
  1594. echo '# Example to keep MAC address between reboots' >> /etc/network/interfaces
  1595. echo '#hwaddress ether DE:AD:BE:EF:CA:FE' >> /etc/network/interfaces
  1596. echo '' >> /etc/network/interfaces
  1597. echo '# The secondary network interface' >> /etc/network/interfaces
  1598. echo '#auto eth1' >> /etc/network/interfaces
  1599. echo '#iface eth1 inet dhcp' >> /etc/network/interfaces
  1600. echo '' >> /etc/network/interfaces
  1601. echo '# WiFi Example' >> /etc/network/interfaces
  1602. echo "#auto $WIFI_INTERFACE" >> /etc/network/interfaces
  1603. echo "#iface $WIFI_INTERFACE inet dhcp" >> /etc/network/interfaces
  1604. echo '# wpa-ssid "essid"' >> /etc/network/interfaces
  1605. echo '# wpa-psk "password"' >> /etc/network/interfaces
  1606. echo '' >> /etc/network/interfaces
  1607. echo '# Ethernet/RNDIS gadget (g_ether)' >> /etc/network/interfaces
  1608. echo '# ... or on host side, usbnet and random hwaddr' >> /etc/network/interfaces
  1609. echo '# Note on some boards, usb0 is automaticly setup with an init script' >> /etc/network/interfaces
  1610. echo '#iface usb0 inet static' >> /etc/network/interfaces
  1611. echo '# address 192.168.7.2' >> /etc/network/interfaces
  1612. echo '# netmask 255.255.255.0' >> /etc/network/interfaces
  1613. echo '# network 192.168.7.0' >> /etc/network/interfaces
  1614. echo '# gateway 192.168.7.1' >> /etc/network/interfaces
  1615. echo 'install_not_on_BBB' >> $COMPLETION_FILE
  1616. }
  1617. function mark_admin_user_account {
  1618. if ! grep -q "Admin user:" $COMPLETION_FILE; then
  1619. echo "Admin user:$MY_USERNAME" >> $COMPLETION_FILE
  1620. fi
  1621. }
  1622. function mark_blog_domain {
  1623. 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
  1624. return
  1625. fi
  1626. if ! grep -q "Blog domain:" $COMPLETION_FILE; then
  1627. echo "Blog domain:$FULLBLOG_DOMAIN_NAME" >> $COMPLETION_FILE
  1628. fi
  1629. }
  1630. function randomize_cron {
  1631. # The predictable default timing of Debian cron jobs might
  1632. # be exploitable knowledge. Avoid too much predictability
  1633. # by randomizing the times when cron jobs run
  1634. if grep -Fxq "randomize_cron" $COMPLETION_FILE; then
  1635. return
  1636. fi
  1637. # randomize the day on which the weekly cron job runs
  1638. randdow=$(($RANDOM%6+1))
  1639. sed -i "s|\* \* 7|* * $randdow|g" /etc/crontab
  1640. # randomize the time when the weekly cron job runs
  1641. randmin=$(($RANDOM%60))
  1642. randhr=$(($RANDOM%3+1))
  1643. sed -i "s|47 6|$randmin $randhr|g" /etc/crontab
  1644. # randomize the time when the daily cron job runs
  1645. randmin=$(($RANDOM%60))
  1646. randhr=$(($RANDOM%3+4))
  1647. sed -i "s|25 6\t\* \* \*|$randmin $randhr\t* * *|g" /etc/crontab
  1648. # randomize the time when the hourly cron job runs
  1649. randmin=$(($RANDOM%60))
  1650. sed -i "s|17 \*\t|$randmin *\t|g" /etc/crontab
  1651. # randomize monthly cron job time and day
  1652. randmin=$(($RANDOM%60))
  1653. randhr=$(($RANDOM%22+1))
  1654. randdom=$(($RANDOM%27+1))
  1655. sed -i "s|52 6\t|$randmin $randhr\t|g" /etc/crontab
  1656. sed -i "s|\t1 \* \*|\t$randdom * *|g" /etc/crontab
  1657. systemctl restart cron
  1658. echo 'randomize_cron' >> $COMPLETION_FILE
  1659. }
  1660. function get_cjdns_public_key {
  1661. if [ -f /home/$MY_USERNAME/README ]; then
  1662. if grep -q "cjdns public key" /home/$MY_USERNAME/README; then
  1663. if [ ! $CJDNS_PUBLIC_KEY ]; then
  1664. CJDNS_PUBLIC_KEY=$(cat /home/$MY_USERNAME/README | grep "cjdns public key" | awk -F ':' '{print $2}' | sed 's/^ *//')
  1665. fi
  1666. fi
  1667. fi
  1668. }
  1669. function get_cjdns_private_key {
  1670. if [ -f /home/$MY_USERNAME/README ]; then
  1671. if grep -q "cjdns private key" /home/$MY_USERNAME/README; then
  1672. if [ ! $CJDNS_PRIVATE_KEY ]; then
  1673. CJDNS_PRIVATE_KEY=$(cat /home/$MY_USERNAME/README | grep "cjdns private key" | awk -F ':' '{print $2}' | sed 's/^ *//')
  1674. fi
  1675. fi
  1676. fi
  1677. }
  1678. function get_cjdns_ipv6_address {
  1679. if [ -f /home/$MY_USERNAME/README ]; then
  1680. if grep -q "cjdns IPv6 address" /home/$MY_USERNAME/README; then
  1681. if [ ! $CJDNS_IPV6 ]; then
  1682. CJDNS_IPV6=$(cat /home/$MY_USERNAME/README | grep "cjdns IPv6 address" | awk -F ':' '{print $2}' | sed 's/^ *//')
  1683. fi
  1684. fi
  1685. fi
  1686. }
  1687. function get_cjdns_port {
  1688. if [ -f /home/$MY_USERNAME/README ]; then
  1689. if grep -q "cjdns port" /home/$MY_USERNAME/README; then
  1690. if [ ! $CJDNS_PORT ]; then
  1691. CJDNS_PORT=$(cat /home/$MY_USERNAME/README | grep "cjdns port" | awk -F ':' '{print $2}' | sed 's/^ *//')
  1692. fi
  1693. fi
  1694. fi
  1695. }
  1696. function get_cjdns_password {
  1697. if [ -f /home/$MY_USERNAME/README ]; then
  1698. if grep -q "cjdns password" /home/$MY_USERNAME/README; then
  1699. if [ ! $CJDNS_PASSWORD ]; then
  1700. CJDNS_PASSWORD=$(cat /home/$MY_USERNAME/README | grep "cjdns password" | awk -F ':' '{print $2}' | sed 's/^ *//')
  1701. fi
  1702. fi
  1703. fi
  1704. }
  1705. # script to automatically renew any Let's Encrypt certificates
  1706. function letsencrypt_renewals {
  1707. if [[ $ONION_ONLY != "no" ]]; then
  1708. return
  1709. fi
  1710. renewals_script=/etc/cron.monthly/letsencrypt
  1711. renewals_retry_script=/etc/cron.daily/letsencrypt
  1712. renewal_failure_msg=$'The certificate for $LETSENCRYPT_DOMAIN could not be renewed'
  1713. renewal_email_title=$'${PROJECT_NAME} Lets Encrypt certificate renewal'
  1714. # the main script tries to renew once per month
  1715. echo '#!/bin/bash' > $renewals_script
  1716. echo '' >> $renewals_script
  1717. echo "PROJECT_NAME='${PROJECT_NAME}'" >> $renewals_script
  1718. echo 'COMPLETION_FILE=$HOME/${PROJECT_NAME}-completed.txt' >> $renewals_script
  1719. echo '' >> $renewals_script
  1720. echo 'if [ -d /etc/letsencrypt ]; then' >> $renewals_script
  1721. echo ' if [ -f ~/letsencrypt_failed ]; then' >> $renewals_script
  1722. echo ' rm ~/letsencrypt_failed' >> $renewals_script
  1723. echo ' fi' >> $renewals_script
  1724. echo -n ' ADMIN_USERNAME=$(cat $COMPLETION_FILE | grep "Admin user" | ' >> $renewals_script
  1725. echo -n "awk -F ':' '{print " >> $renewals_script
  1726. echo -n '$2' >> $renewals_script
  1727. echo "}')" >> $renewals_script
  1728. echo ' ADMIN_EMAIL_ADDRESS=$ADMIN_USERNAME@$HOSTNAME' >> $renewals_script
  1729. echo ' for d in /etc/letsencrypt/live/*/ ; do' >> $renewals_script
  1730. echo -n ' LETSENCRYPT_DOMAIN=$(echo "$d" | ' >> $renewals_script
  1731. echo -n "awk -F '/' '{print " >> $renewals_script
  1732. echo -n '$5' >> $renewals_script
  1733. echo "}')" >> $renewals_script
  1734. echo ' if [ -f /etc/nginx/sites-available/$LETSENCRYPT_DOMAIN ]; then' >> $renewals_script
  1735. echo ' ${PROJECT_NAME}-renew-cert -h $LETSENCRYPT_DOMAIN -p letsencrypt' >> $renewals_script
  1736. echo ' if [ ! "$?" = "0" ]; then' >> $renewals_script
  1737. echo " echo \"${renewal_failure_msg}\" > ~/temp_renewletsencrypt.txt" >> $renewals_script
  1738. echo ' echo "" >> ~/temp_renewletsencrypt.txt' >> $renewals_script
  1739. echo ' ${PROJECT_NAME}-renew-cert -h $LETSENCRYPT_DOMAIN -p letsencrypt 2>> ~/temp_renewletsencrypt.txt' >> $renewals_script
  1740. echo -n " cat ~/temp_renewletsencrypt.txt | mail -s \"${renewal_email_title}\" " >> $renewals_script
  1741. echo '$ADMIN_EMAIL_ADDRESS' >> $renewals_script
  1742. echo ' rm ~/temp_renewletsencrypt.txt' >> $renewals_script
  1743. echo ' if [ ! -f ~/letsencrypt_failed ]; then' >> $renewals_script
  1744. echo ' touch ~/letsencrypt_failed' >> $renewals_script
  1745. echo ' fi' >> $renewals_script
  1746. echo ' fi' >> $renewals_script
  1747. echo ' fi' >> $renewals_script
  1748. echo ' done' >> $renewals_script
  1749. echo 'fi' >> $renewals_script
  1750. chmod +x $renewals_script
  1751. # a secondary script keeps trying to renew after a failure
  1752. echo '#!/bin/bash' > $renewals_retry_script
  1753. echo '' >> $renewals_retry_script
  1754. echo "PROJECT_NAME='${PROJECT_NAME}'" >> $renewals_retry_script
  1755. echo 'COMPLETION_FILE=$HOME/${PROJECT_NAME}-completed.txt' >> $renewals_retry_script
  1756. echo '' >> $renewals_retry_script
  1757. echo 'if [ -d /etc/letsencrypt ]; then' >> $renewals_retry_script
  1758. echo ' if [ -f ~/letsencrypt_failed ]; then' >> $renewals_retry_script
  1759. echo ' rm ~/letsencrypt_failed' >> $renewals_retry_script
  1760. echo -n ' ADMIN_USERNAME=$(cat $COMPLETION_FILE | grep "Admin user" | ' >> $renewals_retry_script
  1761. echo -n "awk -F ':' '{print " >> $renewals_retry_script
  1762. echo -n '$2' >> $renewals_retry_script
  1763. echo "}')" >> $renewals_retry_script
  1764. echo ' ADMIN_EMAIL_ADDRESS=$ADMIN_USERNAME@$HOSTNAME' >> $renewals_retry_script
  1765. echo ' for d in /etc/letsencrypt/live/*/ ; do' >> $renewals_retry_script
  1766. echo -n ' LETSENCRYPT_DOMAIN=$(echo "$d" | ' >> $renewals_retry_script
  1767. echo -n "awk -F '/' '{print " >> $renewals_retry_script
  1768. echo -n '$5' >> $renewals_retry_script
  1769. echo "}')" >> $renewals_retry_script
  1770. echo ' if [ -f /etc/nginx/sites-available/$LETSENCRYPT_DOMAIN ]; then' >> $renewals_retry_script
  1771. echo ' ${PROJECT_NAME}-renew-cert -h $LETSENCRYPT_DOMAIN -p letsencrypt' >> $renewals_retry_script
  1772. echo ' if [ ! "$?" = "0" ]; then' >> $renewals_retry_script
  1773. echo " echo \"${renewal_failure_msg}\" > ~/temp_renewletsencrypt.txt" >> $renewals_retry_script
  1774. echo ' echo "" >> ~/temp_renewletsencrypt.txt' >> $renewals_retry_script
  1775. echo ' ${PROJECT_NAME}-renew-cert -h $LETSENCRYPT_DOMAIN -p letsencrypt 2>> ~/temp_renewletsencrypt.txt' >> $renewals_retry_script
  1776. echo -n " cat ~/temp_renewletsencrypt.txt | mail -s \"${renewal_email_title}\" " >> $renewals_retry_script
  1777. echo '$ADMIN_EMAIL_ADDRESS' >> $renewals_retry_script
  1778. echo ' rm ~/temp_renewletsencrypt.txt' >> $renewals_retry_script
  1779. echo ' if [ ! -f ~/letsencrypt_failed ]; then' >> $renewals_retry_script
  1780. echo ' touch ~/letsencrypt_failed' >> $renewals_retry_script
  1781. echo ' fi' >> $renewals_retry_script
  1782. echo ' fi' >> $renewals_retry_script
  1783. echo ' fi' >> $renewals_retry_script
  1784. echo ' done' >> $renewals_retry_script
  1785. echo ' fi' >> $renewals_retry_script
  1786. echo 'fi' >> $renewals_retry_script
  1787. chmod +x $renewals_retry_script
  1788. }
  1789. function save_firewall_settings {
  1790. iptables-save > /etc/firewall.conf
  1791. ip6tables-save > /etc/firewall6.conf
  1792. printf '#!/bin/sh\n' > /etc/network/if-up.d/iptables
  1793. printf 'iptables-restore < /etc/firewall.conf\n' >> /etc/network/if-up.d/iptables
  1794. printf 'ip6tables-restore < /etc/firewall6.conf\n' >> /etc/network/if-up.d/iptables
  1795. chmod +x /etc/network/if-up.d/iptables
  1796. }
  1797. function enable_ipv6 {
  1798. # endure that ipv6 is enabled and can route
  1799. sed -i 's/net.ipv6.conf.all.disable_ipv6.*/net.ipv6.conf.all.disable_ipv6 = 0/g' /etc/sysctl.conf
  1800. #sed -i "s/net.ipv6.conf.all.accept_redirects.*/net.ipv6.conf.all.accept_redirects = 1/g" /etc/sysctl.conf
  1801. #sed -i "s/net.ipv6.conf.all.accept_source_route.*/net.ipv6.conf.all.accept_source_route = 1/g" /etc/sysctl.conf
  1802. sed -i "s/net.ipv6.conf.all.forwarding.*/net.ipv6.conf.all.forwarding=1/g" /etc/sysctl.conf
  1803. echo 1 > /proc/sys/net/ipv6/conf/all/forwarding
  1804. }
  1805. function mesh_cjdns {
  1806. if [[ $ENABLE_CJDNS != "yes" ]]; then
  1807. return
  1808. fi
  1809. # update to the next commit
  1810. if [ -d /etc/cjdns ]; then
  1811. if grep -q "cjdns commit" $COMPLETION_FILE; then
  1812. CURRENT_CJDNS_COMMIT=$(grep "cjdns commit" $COMPLETION_FILE | awk -F ':' '{print $2}')
  1813. if [[ "$CURRENT_CJDNS_COMMIT" != "$CJDNS_COMMIT" ]]; then
  1814. cd /etc/cjdns
  1815. git_pull $CJDNS_REPO $CJDNS_COMMIT
  1816. sed -i "s/cjdns commit.*/cjdns commit:$CJDNS_COMMIT/g" $COMPLETION_FILE
  1817. ./do
  1818. fi
  1819. fi
  1820. fi
  1821. if grep -Fxq "mesh_cjdns" $COMPLETION_FILE; then
  1822. return
  1823. fi
  1824. apt-get -y install nodejs git build-essential nmap
  1825. # if a README exists then obtain the cjdns parameters
  1826. get_cjdns_ipv6_address
  1827. get_cjdns_public_key
  1828. get_cjdns_private_key
  1829. get_cjdns_port
  1830. get_cjdns_password
  1831. # special compile settings for running ./do on the Beaglebone Black
  1832. if [[ $INSTALLING_ON_BBB == "yes" ]]; then
  1833. CFLAGS="-O2 -march=armv7-a -mtune=cortex-a8 -mfpu=neon -ftree-vectorize -ffast-math -mfloat-abi=hard -marm -Wno-error=maybe-uninitialized"
  1834. export LDFLAGS="$CFLAGS"
  1835. fi
  1836. if [ ! -d /etc/cjdns ]; then
  1837. git_clone $CJDNS_REPO /etc/cjdns
  1838. cd /etc/cjdns
  1839. git checkout $CJDNS_COMMIT -b $CJDNS_COMMIT
  1840. if ! grep -q "cjdns commit" $COMPLETION_FILE; then
  1841. echo "cjdns commit:$CJDNS_COMMIT" >> $COMPLETION_FILE
  1842. else
  1843. sed -i "s/cjdns commit.*/cjdns commit:$CJDNS_COMMIT/g" $COMPLETION_FILE
  1844. fi
  1845. ./do
  1846. if [ ! "$?" = "0" ]; then
  1847. exit 7439
  1848. fi
  1849. # create a configuration
  1850. if [ ! -f /etc/cjdns/cjdroute.conf ]; then
  1851. ./cjdroute --genconf > /etc/cjdns/cjdroute.conf
  1852. if [ ! "$?" = "0" ]; then
  1853. exit 5922
  1854. fi
  1855. fi
  1856. # create a user to run as
  1857. useradd cjdns
  1858. else
  1859. cd /etc/cjdns
  1860. git_pull $CJDNS_REPO
  1861. ./do
  1862. if [ ! "$?" = "0" ]; then
  1863. exit 9926
  1864. fi
  1865. fi
  1866. # set permissions
  1867. chown -R cjdns:cjdns /etc/cjdns
  1868. chmod 600 /etc/cjdns/cjdroute.conf
  1869. /sbin/ip tuntap add mode tun user cjdns dev cjdroute0
  1870. # insert values into the configuration file
  1871. if [ $CJDNS_PRIVATE_KEY ]; then
  1872. sed -i "s/\"privateKey\":.*/\"privateKey\": \"$CJDNS_PRIVATE_KEY\",/g" /etc/cjdns/cjdroute.conf
  1873. else
  1874. CJDNS_PRIVATE_KEY=$(cat /etc/cjdns/cjdroute.conf | grep '"privateKey"' | awk -F '"' '{print $4}' | sed -n 1p)
  1875. fi
  1876. if [ $CJDNS_PUBLIC_KEY ]; then
  1877. sed -i "s/\"publicKey\":.*/\"publicKey\": \"$CJDNS_PUBLIC_KEY\",/g" /etc/cjdns/cjdroute.conf
  1878. else
  1879. CJDNS_PUBLIC_KEY=$(cat /etc/cjdns/cjdroute.conf | grep '"publicKey"' | awk -F '"' '{print $4}' | sed -n 1p)
  1880. fi
  1881. if [ $CJDNS_IPV6 ]; then
  1882. sed -i "s/\"ipv6\":.*/\"ipv6\": \"$CJDNS_IPV6\",/g" /etc/cjdns/cjdroute.conf
  1883. else
  1884. CJDNS_IPV6=$(cat /etc/cjdns/cjdroute.conf | grep '"ipv6"' | awk -F '"' '{print $4}' | sed -n 1p)
  1885. fi
  1886. if [ $CJDNS_PASSWORD ]; then
  1887. sed -i "0,/{\"password\":.*/s//{\"password\": \"$CJDNS_PASSWORD\"}/g" /etc/cjdns/cjdroute.conf
  1888. else
  1889. CJDNS_PASSWORD=$(cat /etc/cjdns/cjdroute.conf | grep '"password"' | awk -F '"' '{print $4}' | sed -n 1p)
  1890. fi
  1891. if [ $CJDNS_PORT ]; then
  1892. sed -i "s/\"bind\": \"0.0.0.0:.*/\"bind\": \"0.0.0.0:$CJDNS_PORT\",/g" /etc/cjdns/cjdroute.conf
  1893. else
  1894. CJDNS_PORT=$(cat /etc/cjdns/cjdroute.conf | grep '"bind": "0.0.0.0:' | awk -F '"' '{print $4}' | awk -F ':' '{print $2}' | sed -n 1p)
  1895. fi
  1896. enable_ipv6
  1897. echo '#!/bin/sh -e' > /etc/init.d/cjdns
  1898. echo '### BEGIN INIT INFO' >> /etc/init.d/cjdns
  1899. echo '# hyperboria.sh - An init script (/etc/init.d/) for cjdns' >> /etc/init.d/cjdns
  1900. echo '# Provides: cjdroute' >> /etc/init.d/cjdns
  1901. echo '# Required-Start: $remote_fs $network' >> /etc/init.d/cjdns
  1902. echo '# Required-Stop: $remote_fs $network' >> /etc/init.d/cjdns
  1903. echo '# Default-Start: 2 3 4 5' >> /etc/init.d/cjdns
  1904. echo '# Default-Stop: 0 1 6' >> /etc/init.d/cjdns
  1905. echo '# Short-Description: Cjdns router' >> /etc/init.d/cjdns
  1906. echo '# Description: A routing engine designed for security, scalability, speed and ease of use.' >> /etc/init.d/cjdns
  1907. echo '# cjdns git repo: https://github.com/cjdelisle/cjdns/' >> /etc/init.d/cjdns
  1908. echo '### END INIT INFO' >> /etc/init.d/cjdns
  1909. echo '' >> /etc/init.d/cjdns
  1910. echo 'PROG="cjdroute"' >> /etc/init.d/cjdns
  1911. echo 'GIT_PATH="/etc/cjdns"' >> /etc/init.d/cjdns
  1912. echo 'PROG_PATH="/etc/cjdns"' >> /etc/init.d/cjdns
  1913. echo 'CJDNS_CONFIG="cjdroute.conf"' >> /etc/init.d/cjdns
  1914. echo 'CJDNS_USER="cjdns"' >> /etc/init.d/cjdns
  1915. echo "CJDNS_IP='$CJDNS_IPV6'" >> /etc/init.d/cjdns
  1916. echo '' >> /etc/init.d/cjdns
  1917. echo 'start() {' >> /etc/init.d/cjdns
  1918. echo ' # Start it up with the user cjdns' >> /etc/init.d/cjdns
  1919. echo ' if [ $(pgrep cjdroute | wc -l) != 0 ];' >> /etc/init.d/cjdns
  1920. echo ' then' >> /etc/init.d/cjdns
  1921. echo ' echo "cjdroute is already running. Doing nothing..."' >> /etc/init.d/cjdns
  1922. echo ' else' >> /etc/init.d/cjdns
  1923. echo ' echo " * Starting cjdroute"' >> /etc/init.d/cjdns
  1924. echo ' su -c "$PROG_PATH/$PROG < $PROG_PATH/$CJDNS_CONFIG" - $CJDNS_USER' >> /etc/init.d/cjdns
  1925. echo ' /sbin/ip addr add $CJDNS_IP/8 dev tun0' >> /etc/init.d/cjdns
  1926. echo ' /sbin/ip link set mtu 1312 dev tun0' >> /etc/init.d/cjdns
  1927. echo ' /sbin/ip link set tun0 up' >> /etc/init.d/cjdns
  1928. echo ' /sbin/ip tuntap add mode tun user cjdns dev tun0' >> /etc/init.d/cjdns
  1929. echo ' fi' >> /etc/init.d/cjdns
  1930. echo '}' >> /etc/init.d/cjdns
  1931. echo '' >> /etc/init.d/cjdns
  1932. echo 'stop() {' >> /etc/init.d/cjdns
  1933. echo '' >> /etc/init.d/cjdns
  1934. echo ' if [ $(pgrep cjdroute | wc -l) != 2 ];' >> /etc/init.d/cjdns
  1935. echo ' then' >> /etc/init.d/cjdns
  1936. echo ' echo "cjdns isnt running."' >> /etc/init.d/cjdns
  1937. echo ' else' >> /etc/init.d/cjdns
  1938. echo ' echo "Killing cjdroute"' >> /etc/init.d/cjdns
  1939. echo ' killall cjdroute' >> /etc/init.d/cjdns
  1940. echo ' fi' >> /etc/init.d/cjdns
  1941. echo '}' >> /etc/init.d/cjdns
  1942. echo '' >> /etc/init.d/cjdns
  1943. echo 'status() {' >> /etc/init.d/cjdns
  1944. echo ' if [ $(pgrep cjdroute | wc -l) != 0 ];' >> /etc/init.d/cjdns
  1945. echo ' then' >> /etc/init.d/cjdns
  1946. echo ' echo "Cjdns is running"' >> /etc/init.d/cjdns
  1947. echo ' else' >> /etc/init.d/cjdns
  1948. echo ' echo "Cjdns is not running"' >> /etc/init.d/cjdns
  1949. echo ' fi' >> /etc/init.d/cjdns
  1950. echo '}' >> /etc/init.d/cjdns
  1951. echo '' >> /etc/init.d/cjdns
  1952. echo ' update() {' >> /etc/init.d/cjdns
  1953. echo ' cd $GIT_PATH' >> /etc/init.d/cjdns
  1954. echo ' echo "Updating..."' >> /etc/init.d/cjdns
  1955. echo ' git pull' >> /etc/init.d/cjdns
  1956. echo ' ./do' >> /etc/init.d/cjdns
  1957. echo '}' >> /etc/init.d/cjdns
  1958. echo '' >> /etc/init.d/cjdns
  1959. echo '## Check to see if we are running as root first.' >> /etc/init.d/cjdns
  1960. echo 'if [ "$(id -u)" != "0" ]; then' >> /etc/init.d/cjdns
  1961. echo ' echo "This script must be run as root" 1>&2' >> /etc/init.d/cjdns
  1962. echo ' exit 1' >> /etc/init.d/cjdns
  1963. echo 'fi' >> /etc/init.d/cjdns
  1964. echo '' >> /etc/init.d/cjdns
  1965. echo 'case $1 in' >> /etc/init.d/cjdns
  1966. echo ' start)' >> /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 ' stop)' >> /etc/init.d/cjdns
  1971. echo ' stop' >> /etc/init.d/cjdns
  1972. echo ' exit 0' >> /etc/init.d/cjdns
  1973. echo ' ;;' >> /etc/init.d/cjdns
  1974. echo ' reload|restart|force-reload)' >> /etc/init.d/cjdns
  1975. echo ' stop' >> /etc/init.d/cjdns
  1976. echo ' sleep 1' >> /etc/init.d/cjdns
  1977. echo ' start' >> /etc/init.d/cjdns
  1978. echo ' exit 0' >> /etc/init.d/cjdns
  1979. echo ' ;;' >> /etc/init.d/cjdns
  1980. echo ' status)' >> /etc/init.d/cjdns
  1981. echo ' status' >> /etc/init.d/cjdns
  1982. echo ' exit 0' >> /etc/init.d/cjdns
  1983. echo ' ;;' >> /etc/init.d/cjdns
  1984. echo ' update|upgrade)' >> /etc/init.d/cjdns
  1985. echo ' update' >> /etc/init.d/cjdns
  1986. echo ' stop' >> /etc/init.d/cjdns
  1987. echo ' sleep 2' >> /etc/init.d/cjdns
  1988. echo ' start' >> /etc/init.d/cjdns
  1989. echo ' exit 0' >> /etc/init.d/cjdns
  1990. echo ' ;;' >> /etc/init.d/cjdns
  1991. echo ' **)' >> /etc/init.d/cjdns
  1992. echo ' echo "Usage: $0 (start|stop|restart|status|update)" 1>&2' >> /etc/init.d/cjdns
  1993. echo ' exit 1' >> /etc/init.d/cjdns
  1994. echo ' ;;' >> /etc/init.d/cjdns
  1995. echo 'esac' >> /etc/init.d/cjdns
  1996. chmod +x /etc/init.d/cjdns
  1997. update-rc.d cjdns defaults
  1998. service cjdns start
  1999. if [ ! "$?" = "0" ]; then
  2000. systemctl status cjdns.service
  2001. exit 8260
  2002. fi
  2003. apt-get -y install radvd
  2004. echo 'interface eth0' > /etc/radvd.conf
  2005. echo '{' >> /etc/radvd.conf
  2006. echo ' AdvSendAdvert on;' >> /etc/radvd.conf
  2007. echo ' prefix fdfc::1/64' >> /etc/radvd.conf
  2008. echo ' {' >> /etc/radvd.conf
  2009. echo ' AdvRouterAddr on;' >> /etc/radvd.conf
  2010. echo ' };' >> /etc/radvd.conf
  2011. echo '};' >> /etc/radvd.conf
  2012. systemctl restart radvd
  2013. if [ ! "$?" = "0" ]; then
  2014. systemctl status radvd.service
  2015. exit 4395
  2016. fi
  2017. if ! grep -q "# Mesh Networking (cjdns)" /etc/network/interfaces; then
  2018. echo '' >> /etc/network/interfaces
  2019. echo '# Mesh Networking (cjdns)' >> /etc/network/interfaces
  2020. echo 'iface eth0 inet6 static' >> /etc/network/interfaces
  2021. echo ' pre-up modprobe ipv6' >> /etc/network/interfaces
  2022. echo ' address fdfc:0000:0000:0000:0000:0000:0000:0001' >> /etc/network/interfaces
  2023. echo ' netmask 64' >> /etc/network/interfaces
  2024. service network-manager restart
  2025. if [ ! "$?" = "0" ]; then
  2026. systemctl status networking.service
  2027. exit 6949
  2028. fi
  2029. fi
  2030. ip6tables -A INPUT -p udp --dport $CJDNS_PORT -j ACCEPT
  2031. ip6tables -A INPUT -p tcp --dport $CJDNS_PORT -j ACCEPT
  2032. save_firewall_settings
  2033. if ! grep -q $"Mesh Networking (cjdns)" /home/$MY_USERNAME/README; then
  2034. CURRENT_IP_ADDRESS=$(ip addr show | grep "inet " | sed -n 2p | awk -F ' ' '{print $2}' | awk -F '/' '{print $1}')
  2035. echo '' >> /home/$MY_USERNAME/README
  2036. echo '' >> /home/$MY_USERNAME/README
  2037. echo $'Mesh Networking (cjdns)' >> /home/$MY_USERNAME/README
  2038. echo '=======================' >> /home/$MY_USERNAME/README
  2039. echo $"cjdns IPv6 address: $CJDNS_IPV6" >> /home/$MY_USERNAME/README
  2040. echo $"cjdns public key: $CJDNS_PUBLIC_KEY" >> /home/$MY_USERNAME/README
  2041. echo $"cjdns private key: $CJDNS_PRIVATE_KEY" >> /home/$MY_USERNAME/README
  2042. echo $"cjdns password: $CJDNS_PASSWORD" >> /home/$MY_USERNAME/README
  2043. echo $"cjdns port: $CJDNS_PORT" >> /home/$MY_USERNAME/README
  2044. echo '' >> /home/$MY_USERNAME/README
  2045. echo $"Forward port $CJDNS_PORT from your internet router to the ${PROJECT_NAME}" >> /home/$MY_USERNAME/README
  2046. echo '' >> /home/$MY_USERNAME/README
  2047. echo $'Below is an example of your connection credentials' >> /home/$MY_USERNAME/README
  2048. echo $'that you can give to other people so they can connect' >> /home/$MY_USERNAME/README
  2049. echo $'to you using your default password' >> /home/$MY_USERNAME/README
  2050. echo $'Adding a unique password for each user is advisable' >> /home/$MY_USERNAME/README
  2051. echo $'so that leaks can be isolated.' >> /home/$MY_USERNAME/README
  2052. echo '' >> /home/$MY_USERNAME/README
  2053. echo "\"$CURRENT_IP_ADDRESS:$CJDNS_PORT\":{\"password\":\"$CJDNS_PASSWORD\",\"publicKey\":\"$CJDNS_PUBLIC_KEY\"}" >> /home/$MY_USERNAME/README
  2054. echo '' >> /home/$MY_USERNAME/README
  2055. echo $'More is not better. 3-5 cjdns peers is good. 30 peers is bad.' >> /home/$MY_USERNAME/README
  2056. echo '' >> /home/$MY_USERNAME/README
  2057. echo $'NEVER USE A PUBLIC PEER. These degrade the network and make it centralized.' >> /home/$MY_USERNAME/README
  2058. echo $'Each node can handle many peers, but no node can handle the entire internet.' >> /home/$MY_USERNAME/README
  2059. echo $'As this network grows any public peer will simply become saturated and' >> /home/$MY_USERNAME/README
  2060. echo $'useless causing issues for the entire network.' >> /home/$MY_USERNAME/README
  2061. echo $'Please report anyone offering you a public peer as they are promoting shared' >> /home/$MY_USERNAME/README
  2062. echo $'passwords which could lead to people pretending to be you. A peering pass' >> /home/$MY_USERNAME/README
  2063. echo $'should not contain someone elses nickname or info but should contain yours' >> /home/$MY_USERNAME/README
  2064. echo $'to ensure it is not shared. It also helps when editing the conf to know who' >> /home/$MY_USERNAME/README
  2065. echo $'each password is for.' >> /home/$MY_USERNAME/README
  2066. echo '' >> /home/$MY_USERNAME/README
  2067. echo $'Possible cjdns destinations of interest:' >> /home/$MY_USERNAME/README
  2068. echo ' http://transitiontech.ca/faq' >> /home/$MY_USERNAME/README
  2069. echo ' http://cjdns.ca/hypeirc.txt' >> /home/$MY_USERNAME/README
  2070. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
  2071. chmod 600 /home/$MY_USERNAME/README
  2072. fi
  2073. echo 'mesh_cjdns' >> $COMPLETION_FILE
  2074. }
  2075. function create_mirrors {
  2076. if [ -d /home/trove ]; then
  2077. userdel -r trove
  2078. fi
  2079. if grep -Fxq "create_mirrors" $COMPLETION_FILE; then
  2080. return
  2081. fi
  2082. ${PROJECT_NAME}-mirrors
  2083. echo 'create_mirrors' >> $COMPLETION_FILE
  2084. }
  2085. function mesh_cjdns_tools {
  2086. if grep -Fxq "mesh_cjdns_tools" $COMPLETION_FILE; then
  2087. return
  2088. fi
  2089. if [[ $ENABLE_CJDNS != "yes" ]]; then
  2090. return
  2091. fi
  2092. if [ ! -d /etc/cjdns ]; then
  2093. mesh_cjdns
  2094. fi
  2095. apt-get -y install golang mercurial
  2096. if [ ! -f ~/.bashrc ]; then
  2097. touch ~/.bashrc
  2098. fi
  2099. export GOPATH=/home/git/go
  2100. if [ ! -d /home/git ]; then
  2101. # add a gogs user account
  2102. adduser --disabled-login --gecos 'Gogs' git
  2103. # install Go
  2104. if ! grep -q "export GOPATH=/home/git/go" ~/.bashrc; then
  2105. echo 'export GOPATH=/home/git/go' >> ~/.bashrc
  2106. echo 'systemctl set-environment GOPATH=/home/git/go' >> ~/.bashrc
  2107. fi
  2108. if [ ! -d $GOPATH ]; then
  2109. mkdir -p $GOPATH
  2110. fi
  2111. fi
  2112. if ! grep -q "export GOPATH=" ~/.bashrc; then
  2113. echo "export GOPATH=$GOPATH" >> ~/.bashrc
  2114. fi
  2115. expected_go_path='export PATH=$PATH:'${GOPATH}'/bin'
  2116. if ! grep -q "$expected_go_path" ~/.bashrc; then
  2117. export PATH=$PATH:${GOPATH}/bin
  2118. echo "$expected_go_path" >> ~/.bashrc
  2119. fi
  2120. export PATH=$PATH:$GOPATH/bin
  2121. CJDCMD_REPO2=$(echo "$CJDCMD_REPO" | sed 's|https://||g')
  2122. go get $CJDCMD_REPO2
  2123. if [ ! -f $GOPATH/bin/cjdcmd ]; then
  2124. echo $'cjdcmd was not compiled. Check your golang installation'
  2125. exit 7439
  2126. fi
  2127. cp $GOPATH/bin/cjdcmd /usr/bin
  2128. # initialise from the cjdns config
  2129. /usr/bin/cjdcmd cjdnsadmin -file /etc/cjdns/cjdroute.conf
  2130. echo 'mesh_cjdns_tools' >> $COMPLETION_FILE
  2131. }
  2132. function install_zeronet_blog {
  2133. if [[ $SYSTEM_TYPE != "$VARIANT_MESH" ]]; then
  2134. return
  2135. fi
  2136. if [ -d /opt/zeronet/ZeroBlog ]; then
  2137. if grep -q "ZeroNet Blog commit" $COMPLETION_FILE; then
  2138. CURRENT_ZERONET_BLOG_COMMIT=$(grep "ZeroNet Blog commit" $COMPLETION_FILE | awk -F ':' '{print $2}')
  2139. if [[ "$CURRENT_ZERONET_BLOG_COMMIT" != "$ZERONET_BLOG_COMMIT" ]]; then
  2140. cd /opt/zeronet/ZeroBlog
  2141. git_pull $ZERONET_BLOG_REPO $ZERONET_BLOG_COMMIT
  2142. sed -i "s/ZeroNet Blog commit.*/ZeroNet Blog commit:$ZERONET_BLOG_COMMIT/g" $COMPLETION_FILE
  2143. fi
  2144. else
  2145. echo "ZeroNet Blog commit:$ZERONET_BLOG_COMMIT" >> $COMPLETION_FILE
  2146. fi
  2147. fi
  2148. if grep -Fxq "install_zeronet_blog" $COMPLETION_FILE; then
  2149. return
  2150. fi
  2151. if [ ! -f /home/$MY_USERNAME/README ]; then
  2152. touch /home/$MY_USERNAME/README
  2153. fi
  2154. if grep -q "ZeroNet Blog address" /home/$MY_USERNAME/README; then
  2155. return
  2156. fi
  2157. if [ ! -d /etc/avahi ]; then
  2158. echo $'Avahi is not installed'
  2159. exit 736
  2160. fi
  2161. ZERONET_DEFAULT_BLOG_TITLE="${MY_USERNAME}'s Blog"
  2162. cd /opt/zeronet
  2163. python zeronet.py --batch siteCreate 2> /opt/zeronet/blog.txt
  2164. if [ ! -f /opt/zeronet/blog.txt ]; then
  2165. echo $'Unable to create blog'
  2166. exit 479
  2167. fi
  2168. blog_address=$(cat blog.txt | grep "Site address" | awk -F ':' '{print $2}')
  2169. blog_private_key=$(cat blog.txt | grep "Site private key" | awk -F ':' '{print $2}')
  2170. ZERONET_BLOG_ADDRESS=${blog_address//[[:blank:]]/}
  2171. ZERONET_BLOG_PRIVATE_KEY=${blog_private_key//[[:blank:]]/}
  2172. if [ ${#ZERONET_BLOG_ADDRESS} -lt 20 ]; then
  2173. echo $"Address: $ZERONET_BLOG_ADDRESS"
  2174. echo $"Public key: $ZERONET_BLOG_PRIVATE_KEY"
  2175. echo $'Unable to create zeronet blog address'
  2176. exit 7358
  2177. fi
  2178. if [ ${#ZERONET_BLOG_PRIVATE_KEY} -lt 20 ]; then
  2179. echo $"Address: $ZERONET_BLOG_ADDRESS"
  2180. echo $"Public key: $ZERONET_BLOG_PRIVATE_KEY"
  2181. echo $'Unable to create zeronet blog private key'
  2182. exit 1639
  2183. fi
  2184. if [ ! -d "/opt/zeronet/data/$ZERONET_BLOG_ADDRESS" ]; then
  2185. echo $"Unable to find site directory: /opt/zeronet/data/$ZERONET_BLOG_ADDRESS"
  2186. exit 7638
  2187. fi
  2188. git_clone $ZERONET_BLOG_REPO ZeroBlog
  2189. if [ ! -d /opt/zeronet/ZeroBlog ]; then
  2190. echo $'ZeroBlog repo could not be cloned'
  2191. exit 6739
  2192. fi
  2193. cd /opt/zeronet/ZeroBlog
  2194. git checkout $ZERONET_BLOG_COMMIT -b $ZERONET_BLOG_COMMIT
  2195. if ! grep -q "ZeroNet Blog commit" $COMPLETION_FILE; then
  2196. echo "ZeroNet Blog commit:$ZERONET_BLOG_COMMIT" >> $COMPLETION_FILE
  2197. else
  2198. sed -i "s/ZeroNet Blog commit.*/ZeroNet Blog commit:$ZERONET_BLOG_COMMIT/g" $COMPLETION_FILE
  2199. fi
  2200. echo $"ZeroNet Blog address: $ZERONET_BLOG_ADDRESS"
  2201. echo $"ZeroNet Blog private key: $ZERONET_BLOG_PRIVATE_KEY"
  2202. cp -r /opt/zeronet/ZeroBlog/* /opt/zeronet/data/$ZERONET_BLOG_ADDRESS
  2203. if [ ! -d /opt/zeronet/data/$ZERONET_BLOG_ADDRESS/data ]; then
  2204. mkdir /opt/zeronet/data/$ZERONET_BLOG_ADDRESS/data
  2205. fi
  2206. cp /opt/zeronet/data/$ZERONET_BLOG_ADDRESS/data-default/data.json /opt/zeronet/data/$ZERONET_BLOG_ADDRESS/data
  2207. sed -i "s/MyZeroBlog/$ZERONET_DEFAULT_BLOG_TITLE/g" /opt/zeronet/data/$ZERONET_BLOG_ADDRESS/data/data.json
  2208. sed -i "s/My ZeroBlog./$ZERONET_DEFAULT_BLOG_TAGLINE/g" /opt/zeronet/data/$ZERONET_BLOG_ADDRESS/data/data.json
  2209. sed -i "s/ZeroBlog Demo/$ZERONET_DEFAULT_BLOG_TITLE/g" /opt/zeronet/data/$ZERONET_BLOG_ADDRESS/index.html
  2210. sed -i "s|<h3 class=\"description\">.*|<h3 class=\"description\">$ZERONET_DEFAULT_BLOG_TAGLINE</h3>|g" /opt/zeronet/data/$ZERONET_BLOG_ADDRESS/index.html
  2211. sed -i "s/Blogging platform Demo/Blogging platform/g" /opt/zeronet/data/$ZERONET_BLOG_ADDRESS/content.json
  2212. python zeronet.py siteSign $ZERONET_BLOG_ADDRESS $ZERONET_BLOG_PRIVATE_KEY
  2213. # Add an avahi service
  2214. echo '<?xml version="1.0" standalone="no"?><!--*-nxml-*-->' > /tmp/zeronet-blog.service
  2215. echo '<!DOCTYPE service-group SYSTEM "avahi-service.dtd">' >> /tmp/zeronet-blog.service
  2216. echo '<service-group>' >> /tmp/zeronet-blog.service
  2217. echo ' <name replace-wildcards="yes">%h ZeroNet Blog</name>' >> /tmp/zeronet-blog.service
  2218. echo ' <service>' >> /tmp/zeronet-blog.service
  2219. echo ' <type>_zeronet._udp</type>' >> /tmp/zeronet-blog.service
  2220. echo " <port>$ZERONET_PORT</port>" >> /tmp/zeronet-blog.service
  2221. echo " <txt-record>$ZERONET_URL/$ZERONET_BLOG_ADDRESS</txt-record>" >> /tmp/zeronet-blog.service
  2222. echo ' </service>' >> /tmp/zeronet-blog.service
  2223. echo '</service-group>' >> /tmp/zeronet-blog.service
  2224. cp /tmp/zeronet-blog.service /etc/avahi/services/zeronet-blog.service
  2225. if [ ! -d /home/$MY_USERNAME/.config/zeronet ]; then
  2226. mkdir -p /home/$MY_USERNAME/.config/zeronet
  2227. chown -R $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.config
  2228. fi
  2229. echo "$ZERONET_URL/$ZERONET_BLOG_ADDRESS" > /home/$MY_USERNAME/.config/zeronet/myblog
  2230. if ! grep -q "ZeroNet Blog address" /home/$MY_USERNAME/README; then
  2231. echo '' >> /home/$MY_USERNAME/README
  2232. echo "ZeroNet Blog address: $ZERONET_BLOG_ADDRESS" >> /home/$MY_USERNAME/README
  2233. echo "ZeroNet Blog private key: $ZERONET_BLOG_PRIVATE_KEY" >> /home/$MY_USERNAME/README
  2234. fi
  2235. echo 'install_zeronet_blog' >> $COMPLETION_FILE
  2236. }
  2237. function install_zeronet_mail {
  2238. if [[ $SYSTEM_TYPE != "$VARIANT_MESH" ]]; then
  2239. return
  2240. fi
  2241. if [ -d /opt/zeronet/ZeroMail ]; then
  2242. if grep -q "ZeroNet Mail commit" $COMPLETION_FILE; then
  2243. CURRENT_ZERONET_MAIL_COMMIT=$(grep "ZeroNet Mail commit" $COMPLETION_FILE | awk -F ':' '{print $2}')
  2244. if [[ "$CURRENT_ZERONET_MAIL_COMMIT" != "$ZERONET_MAIL_COMMIT" ]]; then
  2245. cd /opt/zeronet/ZeroMail
  2246. git_pull $ZERONET_MAIL_REPO $ZERONET_MAIL_COMMIT
  2247. sed -i "s/ZeroNet Mail commit.*/ZeroNet Mail commit:$ZERONET_MAIL_COMMIT/g" $COMPLETION_FILE
  2248. fi
  2249. else
  2250. echo "ZeroNet Mail commit:$ZERONET_MAIL_COMMIT" >> $COMPLETION_FILE
  2251. fi
  2252. fi
  2253. if grep -Fxq "install_zeronet_mail" $COMPLETION_FILE; then
  2254. return
  2255. fi
  2256. if [ ! -f /home/$MY_USERNAME/README ]; then
  2257. touch /home/$MY_USERNAME/README
  2258. fi
  2259. if grep -q "ZeroNet Mail address" /home/$MY_USERNAME/README; then
  2260. return
  2261. fi
  2262. if [ ! -d /etc/avahi ]; then
  2263. echo 'Avahi is not installed'
  2264. exit 736
  2265. fi
  2266. ZERONET_DEFAULT_MAIL_TITLE="${MY_USERNAME}'s Mail"
  2267. cd /opt/zeronet
  2268. python zeronet.py --batch siteCreate 2> /opt/zeronet/mail.txt
  2269. if [ ! -f /opt/zeronet/mail.txt ]; then
  2270. echo $'Unable to create mail'
  2271. exit 479
  2272. fi
  2273. mail_address=$(cat mail.txt | grep "Site address" | awk -F ':' '{print $2}')
  2274. mail_private_key=$(cat mail.txt | grep "Site private key" | awk -F ':' '{print $2}')
  2275. ZERONET_MAIL_ADDRESS=${mail_address//[[:blank:]]/}
  2276. ZERONET_MAIL_PRIVATE_KEY=${mail_private_key//[[:blank:]]/}
  2277. if [ ${#ZERONET_MAIL_ADDRESS} -lt 20 ]; then
  2278. echo $"Address: $ZERONET_MAIL_ADDRESS"
  2279. echo $"Public key: $ZERONET_MAIL_PRIVATE_KEY"
  2280. echo $'Unable to create zeronet mail address'
  2281. exit 7358
  2282. fi
  2283. if [ ${#ZERONET_MAIL_PRIVATE_KEY} -lt 20 ]; then
  2284. echo $"Address: $ZERONET_MAIL_ADDRESS"
  2285. echo $"Public key: $ZERONET_MAIL_PRIVATE_KEY"
  2286. echo $'Unable to create zeronet mail private key'
  2287. exit 1639
  2288. fi
  2289. if [ ! -d "/opt/zeronet/data/$ZERONET_MAIL_ADDRESS" ]; then
  2290. echo $"Unable to find site directory: /opt/zeronet/data/$ZERONET_MAIL_ADDRESS"
  2291. exit 7638
  2292. fi
  2293. git_clone $ZERONET_MAIL_REPO ZeroMail
  2294. if [ ! -d /opt/zeronet/ZeroMail ]; then
  2295. echo $'ZeroMail repo could not be cloned'
  2296. exit 6739
  2297. fi
  2298. cd /opt/zeronet/ZeroMail
  2299. git checkout $ZERONET_MAIL_COMMIT -b $ZERONET_MAIL_COMMIT
  2300. if ! grep -q "ZeroNet Mail commit" $COMPLETION_FILE; then
  2301. echo "ZeroNet Mail commit:$ZERONET_MAIL_COMMIT" >> $COMPLETION_FILE
  2302. else
  2303. sed -i "s/ZeroNet Mail commit.*/ZeroNet Mail commit:$ZERONET_MAIL_COMMIT/g" $COMPLETION_FILE
  2304. fi
  2305. echo $"ZeroNet Mail address: $ZERONET_MAIL_ADDRESS"
  2306. echo $"ZeroNet Mail private key: $ZERONET_MAIL_PRIVATE_KEY"
  2307. cp -r /opt/zeronet/ZeroMail/* /opt/zeronet/data/$ZERONET_MAIL_ADDRESS
  2308. if [ ! -d /opt/zeronet/data/$ZERONET_MAIL_ADDRESS/data ]; then
  2309. mkdir /opt/zeronet/data/$ZERONET_MAIL_ADDRESS/data
  2310. fi
  2311. cp /opt/zeronet/data/$ZERONET_MAIL_ADDRESS/data-default/data.json /opt/zeronet/data/$ZERONET_MAIL_ADDRESS/data
  2312. sed -i "s/MyZeroMail/$ZERONET_DEFAULT_MAIL_TITLE/g" /opt/zeronet/data/$ZERONET_MAIL_ADDRESS/data/data.json
  2313. sed -i "s/My ZeroMail./$ZERONET_DEFAULT_MAIL_TAGLINE/g" /opt/zeronet/data/$ZERONET_MAIL_ADDRESS/data/data.json
  2314. sed -i "s/ZeroMail Demo/$ZERONET_DEFAULT_MAIL_TITLE/g" /opt/zeronet/data/$ZERONET_MAIL_ADDRESS/index.html
  2315. sed -i "s|<h3 class=\"description\">.*|<h3 class=\"description\">$ZERONET_DEFAULT_MAIL_TAGLINE</h3>|g" /opt/zeronet/data/$ZERONET_MAIL_ADDRESS/index.html
  2316. sed -i "s/Mailging platform Demo/Mailging platform/g" /opt/zeronet/data/$ZERONET_MAIL_ADDRESS/content.json
  2317. python zeronet.py siteSign $ZERONET_MAIL_ADDRESS $ZERONET_MAIL_PRIVATE_KEY
  2318. # Add an avahi service
  2319. echo '<?xml version="1.0" standalone="no"?><!--*-nxml-*-->' > /tmp/zeronet-mail.service
  2320. echo '<!DOCTYPE service-group SYSTEM "avahi-service.dtd">' >> /tmp/zeronet-mail.service
  2321. echo '<service-group>' >> /tmp/zeronet-mail.service
  2322. echo ' <name replace-wildcards="yes">%h ZeroNet Mail</name>' >> /tmp/zeronet-mail.service
  2323. echo ' <service>' >> /tmp/zeronet-mail.service
  2324. echo ' <type>_zeronet._udp</type>' >> /tmp/zeronet-mail.service
  2325. echo " <port>$ZERONET_PORT</port>" >> /tmp/zeronet-mail.service
  2326. echo " <txt-record>$ZERONET_URL/$ZERONET_MAIL_ADDRESS</txt-record>" >> /tmp/zeronet-mail.service
  2327. echo ' </service>' >> /tmp/zeronet-mail.service
  2328. echo '</service-group>' >> /tmp/zeronet-mail.service
  2329. cp /tmp/zeronet-mail.service /etc/avahi/services/zeronet-mail.service
  2330. if [ ! -d /home/$MY_USERNAME/.config/zeronet ]; then
  2331. mkdir -p /home/$MY_USERNAME/.config/zeronet
  2332. chown -R $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.config
  2333. fi
  2334. echo "$ZERONET_URL/$ZERONET_MAIL_ADDRESS" > /home/$MY_USERNAME/.config/zeronet/mymail
  2335. if ! grep -q $"ZeroNet Mail address" /home/$MY_USERNAME/README; then
  2336. echo '' >> /home/$MY_USERNAME/README
  2337. echo $"ZeroNet Mail address: $ZERONET_MAIL_ADDRESS" >> /home/$MY_USERNAME/README
  2338. echo $"ZeroNet Mail private key: $ZERONET_MAIL_PRIVATE_KEY" >> /home/$MY_USERNAME/README
  2339. fi
  2340. echo 'install_zeronet_mail' >> $COMPLETION_FILE
  2341. }
  2342. function install_zeronet_forum {
  2343. if [[ $SYSTEM_TYPE != "$VARIANT_MESH" ]]; then
  2344. return
  2345. fi
  2346. # update to the next commit
  2347. if [ -d /opt/zeronet/ZeroTalk ]; then
  2348. if grep -q "ZeroNet Forum commit" $COMPLETION_FILE; then
  2349. CURRENT_ZERONET_FORUM_COMMIT=$(grep "ZeroNet Forum commit" $COMPLETION_FILE | awk -F ':' '{print $2}')
  2350. if [[ "$CURRENT_ZERONET_FORUM_COMMIT" != "$ZERONET_FORUM_COMMIT" ]]; then
  2351. cd /opt/zeronet/ZeroTalk
  2352. git_pull $ZERONET_FORUM_REPO $ZERONET_FORUM_COMMIT
  2353. sed -i "s/ZeroNet Forum commit.*/ZeroNet Forum commit:$ZERONET_FORUM_COMMIT/g" $COMPLETION_FILE
  2354. fi
  2355. else
  2356. echo "ZeroNet Forum commit:$ZERONET_FORUM_COMMIT" >> $COMPLETION_FILE
  2357. fi
  2358. fi
  2359. if grep -Fxq "install_zeronet_forum" $COMPLETION_FILE; then
  2360. return
  2361. fi
  2362. if [ ! -f /home/$MY_USERNAME/README ]; then
  2363. touch /home/$MY_USERNAME/README
  2364. fi
  2365. if grep -q "ZeroNet Forum address" /home/$MY_USERNAME/README; then
  2366. return
  2367. fi
  2368. if [ ! -d /etc/avahi ]; then
  2369. echo $'Avahi is not installed'
  2370. exit 736
  2371. fi
  2372. ZERONET_DEFAULT_FORUM_TITLE=$"${MY_USERNAME}'s Forum"
  2373. cd /opt/zeronet
  2374. python zeronet.py --batch siteCreate 2> /opt/zeronet/forum.txt
  2375. if [ ! -f /opt/zeronet/forum.txt ]; then
  2376. echo $'Unable to create forum'
  2377. exit 479
  2378. fi
  2379. forum_address=$(cat forum.txt | grep "Site address" | awk -F ':' '{print $2}')
  2380. forum_private_key=$(cat forum.txt | grep "Site private key" | awk -F ':' '{print $2}')
  2381. ZERONET_FORUM_ADDRESS=${forum_address//[[:blank:]]/}
  2382. ZERONET_FORUM_PRIVATE_KEY=${forum_private_key//[[:blank:]]/}
  2383. if [ ${#ZERONET_FORUM_ADDRESS} -lt 20 ]; then
  2384. echo $"Address: $ZERONET_FORUM_ADDRESS"
  2385. echo $"Public key: $ZERONET_FORUM_PRIVATE_KEY"
  2386. echo $'Unable to create zeronet forum address'
  2387. exit 76352
  2388. fi
  2389. if [ ${#ZERONET_FORUM_PRIVATE_KEY} -lt 20 ]; then
  2390. echo $"Address: $ZERONET_FORUM_ADDRESS"
  2391. echo $"Public key: $ZERONET_FORUM_PRIVATE_KEY"
  2392. echo $'Unable to create zeronet forum private key'
  2393. exit 87356
  2394. fi
  2395. if [ ! -d "/opt/zeronet/data/$ZERONET_FORUM_ADDRESS" ]; then
  2396. echo $"Unable to find site directory: /opt/zeronet/data/$ZERONET_FORUM_ADDRESS"
  2397. exit 7638
  2398. fi
  2399. git_clone $ZERONET_FORUM_REPO ZeroTalk
  2400. if [ ! -d /opt/zeronet/ZeroTalk ]; then
  2401. echo $'ZeroTalk repo could not be cloned'
  2402. exit 6739
  2403. fi
  2404. git checkout $ZERONET_FORUM_COMMIT -b $ZERONET_FORUM_COMMIT
  2405. if ! grep -q "ZeroNet Forum commit" $COMPLETION_FILE; then
  2406. echo "ZeroNet Forum commit:$ZERONET_FORUM_COMMIT" >> $COMPLETION_FILE
  2407. else
  2408. sed -i "s/ZeroNet Forum commit.*/ZeroNet Forum commit:$ZERONET_FORUM_COMMIT/g" $COMPLETION_FILE
  2409. fi
  2410. echo $"Forum address: $ZERONET_FORUM_ADDRESS"
  2411. echo $"Forum private key: $ZERONET_FORUM_PRIVATE_KEY"
  2412. cp -r /opt/zeronet/ZeroTalk/* /opt/zeronet/data/$ZERONET_FORUM_ADDRESS
  2413. sed -i "s/ZeroBoard/$ZERONET_DEFAULT_FORUM_TITLE/g" /opt/zeronet/data/$ZERONET_FORUM_ADDRESS/index.html
  2414. sed -i "s/ZeroTalk/$ZERONET_DEFAULT_FORUM_TITLE/g" /opt/zeronet/data/$ZERONET_FORUM_ADDRESS/index.html
  2415. sed -i "s|Demo for dynamic, decentralized content publishing.|$ZERONET_DEFAULT_FORUM_TAGLINE|g" /opt/zeronet/data/$ZERONET_FORUM_ADDRESS/index.html
  2416. sed -i 's/Messaging Board Demo/Messaging Board/g' /opt/zeronet/data/$ZERONET_FORUM_ADDRESS/content.json
  2417. sed -i "s/ZeroBoard/$ZERONET_DEFAULT_FORUM_TITLE/g" /opt/zeronet/data/$ZERONET_FORUM_ADDRESS/content.json
  2418. python zeronet.py siteSign $ZERONET_FORUM_ADDRESS $ZERONET_FORUM_PRIVATE_KEY --inner_path data/users/content.json
  2419. # Add an avahi service
  2420. echo '<?xml version="1.0" standalone="no"?><!--*-nxml-*-->' > /tmp/zeronet-forum.service
  2421. echo '<!DOCTYPE service-group SYSTEM "avahi-service.dtd">' >> /tmp/zeronet-forum.service
  2422. echo '<service-group>' >> /tmp/zeronet-forum.service
  2423. echo ' <name replace-wildcards="yes">%h ZeroNet Forum</name>' >> /tmp/zeronet-forum.service
  2424. echo ' <service>' >> /tmp/zeronet-forum.service
  2425. echo ' <type>_zeronet._udp</type>' >> /tmp/zeronet-forum.service
  2426. echo " <port>$ZERONET_PORT</port>" >> /tmp/zeronet-forum.service
  2427. echo " <txt-record>$ZERONET_URL/$ZERONET_FORUM_ADDRESS</txt-record>" >> /tmp/zeronet-forum.service
  2428. echo ' </service>' >> /tmp/zeronet-forum.service
  2429. echo '</service-group>' >> /tmp/zeronet-forum.service
  2430. sudo cp /tmp/zeronet-forum.service /etc/avahi/services/zeronet-forum.service
  2431. if [ ! -d /home/$MY_USERNAME/.config/zeronet ]; then
  2432. mkdir -p /home/$MY_USERNAME/.config/zeronet
  2433. chown -R $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.config
  2434. fi
  2435. echo "$ZERONET_URL/$ZERONET_FORUM_ADDRESS" > /home/$MY_USERNAME/.config/zeronet/myforum
  2436. if ! grep -q $"ZeroNet Forum address" /home/$MY_USERNAME/README; then
  2437. echo '' >> /home/$MY_USERNAME/README
  2438. echo $"ZeroNet Forum address: $ZERONET_FORUM_ADDRESS" >> /home/$MY_USERNAME/README
  2439. echo $"ZeroNet Forum private key: $ZERONET_FORUM_PRIVATE_KEY" >> /home/$MY_USERNAME/README
  2440. fi
  2441. echo 'install_zeronet_forum' >> $COMPLETION_FILE
  2442. }
  2443. function install_zeronet {
  2444. if [[ $SYSTEM_TYPE != "$VARIANT_MESH" ]]; then
  2445. return
  2446. fi
  2447. # update to the next commit
  2448. if [ -d /opt/zeronet ]; then
  2449. if grep -q "ZeroNet commit" $COMPLETION_FILE; then
  2450. CURRENT_ZERONET_COMMIT=$(grep "ZeroNet commit" $COMPLETION_FILE | awk -F ':' '{print $2}')
  2451. if [[ "$CURRENT_ZERONET_COMMIT" != "$ZERONET_COMMIT" ]]; then
  2452. cd /opt/zeronet
  2453. git_pull $ZERONET_REPO $ZERONET_COMMIT
  2454. sed -i "s/ZeroNet commit.*/ZeroNet commit:$ZERONET_COMMIT/g" $COMPLETION_FILE
  2455. systemctl restart zeronet.service
  2456. fi
  2457. else
  2458. echo "ZeroNet commit:$ZERONET_COMMIT" >> $COMPLETION_FILE
  2459. fi
  2460. fi
  2461. if grep -Fxq "install_zeronet" $COMPLETION_FILE; then
  2462. return
  2463. fi
  2464. apt-get -y install python python-msgpack python-gevent
  2465. apt-get -y install python-pip bittornado
  2466. pip install msgpack-python --upgrade
  2467. useradd -d /opt/zeronet/ -s /bin/false zeronet
  2468. git_clone $ZERONET_REPO /opt/zeronet
  2469. if [ ! -d /opt/zeronet ]; then
  2470. exit 56823
  2471. fi
  2472. cd /opt/zeronet
  2473. git checkout $ZERONET_COMMIT -b $ZERONET_COMMIT
  2474. if ! grep -q "ZeroNet commit" $COMPLETION_FILE; then
  2475. echo "ZeroNet commit:$ZERONET_COMMIT" >> $COMPLETION_FILE
  2476. else
  2477. sed -i "s/ZeroNet commit.*/ZeroNet commit:$ZERONET_COMMIT/g" $COMPLETION_FILE
  2478. fi
  2479. sudo chown -R zeronet:zeronet /opt/zeronet
  2480. #git checkout bashrc/bootstrap-file
  2481. # Hack to ensure that the file access port is opened
  2482. # This is because zeronet normally relies on an internet site
  2483. # to do this, but on a purely local mesh the internet isn't available
  2484. 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
  2485. echo '[Unit]' > /etc/systemd/system/zeronet.service
  2486. echo 'Description=Zeronet Server' >> /etc/systemd/system/zeronet.service
  2487. echo 'After=syslog.target' >> /etc/systemd/system/zeronet.service
  2488. echo 'After=network.target' >> /etc/systemd/system/zeronet.service
  2489. echo '[Service]' >> /etc/systemd/system/zeronet.service
  2490. echo 'Type=simple' >> /etc/systemd/system/zeronet.service
  2491. echo 'User=zeronet' >> /etc/systemd/system/zeronet.service
  2492. echo 'Group=zeronet' >> /etc/systemd/system/zeronet.service
  2493. echo 'WorkingDirectory=/opt/zeronet' >> /etc/systemd/system/zeronet.service
  2494. echo "ExecStart=/usr/bin/python zeronet.py --ip_external ${DEFAULT_DOMAIN_NAME}.local --trackers_file /opt/zeronet/bootstrap" >> /etc/systemd/system/zeronet.service
  2495. echo '' >> /etc/systemd/system/zeronet.service
  2496. echo 'TimeoutSec=300' >> /etc/systemd/system/zeronet.service
  2497. echo '' >> /etc/systemd/system/zeronet.service
  2498. echo '[Install]' >> /etc/systemd/system/zeronet.service
  2499. echo 'WantedBy=multi-user.target' >> /etc/systemd/system/zeronet.service
  2500. echo '[Unit]' > /etc/systemd/system/tracker.service
  2501. echo 'Description=Torrent Tracker' >> /etc/systemd/system/tracker.service
  2502. echo 'After=syslog.target' >> /etc/systemd/system/tracker.service
  2503. echo 'After=network.target' >> /etc/systemd/system/tracker.service
  2504. echo '[Service]' >> /etc/systemd/system/tracker.service
  2505. echo 'Type=simple' >> /etc/systemd/system/tracker.service
  2506. echo 'User=tracker' >> /etc/systemd/system/tracker.service
  2507. echo 'Group=tracker' >> /etc/systemd/system/tracker.service
  2508. echo 'WorkingDirectory=/opt/tracker' >> /etc/systemd/system/tracker.service
  2509. 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
  2510. echo '' >> /etc/systemd/system/tracker.service
  2511. echo 'TimeoutSec=300' >> /etc/systemd/system/tracker.service
  2512. echo '' >> /etc/systemd/system/tracker.service
  2513. echo '[Install]' >> /etc/systemd/system/tracker.service
  2514. echo 'WantedBy=multi-user.target' >> /etc/systemd/system/tracker.service
  2515. useradd -d /opt/tracker/ -s /bin/false tracker
  2516. if [ ! -d /opt/tracker ]; then
  2517. mkdir /opt/tracker
  2518. fi
  2519. chown -R tracker:tracker /opt/tracker
  2520. # publish regularly
  2521. if ! grep -q "zeronetavahi" /etc/crontab; then
  2522. echo "* * * * * root zeronetavahi > /dev/null" >> /etc/crontab
  2523. fi
  2524. systemctl enable tracker.service
  2525. systemctl enable zeronet.service
  2526. systemctl daemon-reload
  2527. systemctl start tracker.service
  2528. systemctl start zeronet.service
  2529. echo 'mesh_zeronet' >> $COMPLETION_FILE
  2530. }
  2531. function install_vpn_tunnel {
  2532. if ! grep -q "repo.universe-factory.net" /etc/apt/sources.list; then
  2533. echo 'deb http://repo.universe-factory.net/debian/ sid main' >> /etc/apt/sources.list
  2534. gpg --keyserver pgpkeys.mit.edu --recv-key 16EF3F64CB201D9C
  2535. if [ ! "$?" = "0" ]; then
  2536. exit 76272
  2537. fi
  2538. gpg -a --export 16EF3F64CB201D9C | sudo apt-key add -
  2539. apt-get update
  2540. apt-get -y install fastd
  2541. if [ ! "$?" = "0" ]; then
  2542. exit 52026
  2543. fi
  2544. fi
  2545. }
  2546. # ath9k_htc driver
  2547. function install_atheros_wifi {
  2548. if grep -Fxq "install_atheros_wifi" $COMPLETION_FILE; then
  2549. return
  2550. fi
  2551. if [ $INSTALLING_ON_BBB != "yes" ]; then
  2552. return
  2553. fi
  2554. if [[ $ENABLE_BABEL != "yes" && $ENABLE_BATMAN != "yes" && $ENABLE_CJDNS != "yes" ]]; then
  2555. return
  2556. fi
  2557. if [ -d $INSTALL_DIR/open-ath9k-htc-firmware ]; then
  2558. return
  2559. fi
  2560. # have drivers already been installed ?
  2561. if [ -f /lib/firmware/htc_9271.fw ]; then
  2562. return
  2563. fi
  2564. apt-get -y install build-essential cmake git m4 texinfo
  2565. if [ ! -d $INSTALL_DIR ]; then
  2566. mkdir -p $INSTALL_DIR
  2567. fi
  2568. cd $INSTALL_DIR
  2569. if [ ! -d $INSTALL_DIR/open-ath9k-htc-firmware ]; then
  2570. git_clone $ATHEROS_WIFI_REPO $INSTALL_DIR/open-ath9k-htc-firmware
  2571. if [ ! "$?" = "0" ]; then
  2572. rm -rf $INSTALL_DIR/open-ath9k-htc-firmware
  2573. exit 74283
  2574. fi
  2575. fi
  2576. cd $INSTALL_DIR/open-ath9k-htc-firmware
  2577. git checkout 1.4.0
  2578. make toolchain
  2579. if [ ! "$?" = "0" ]; then
  2580. rm -rf $INSTALL_DIR/open-ath9k-htc-firmware
  2581. exit 24820
  2582. fi
  2583. make firmware
  2584. if [ ! "$?" = "0" ]; then
  2585. rm -rf $INSTALL_DIR/open-ath9k-htc-firmware
  2586. exit 63412
  2587. fi
  2588. cp target_firmware/*.fw /lib/firmware/
  2589. if [ ! "$?" = "0" ]; then
  2590. exit 74681
  2591. fi
  2592. echo 'install_atheros_wifi' >> $COMPLETION_FILE
  2593. }
  2594. function configure_avahi {
  2595. if grep -Fxq "configure_avahi" $COMPLETION_FILE; then
  2596. return
  2597. fi
  2598. # only enable avahi if we're doing mesh networking
  2599. if [[ $ENABLE_BABEL != "yes" && $ENABLE_BATMAN != "yes" && $ENABLE_CJDNS != "yes" ]]; then
  2600. return
  2601. fi
  2602. apt-get -y install avahi-utils avahi-autoipd avahi-dnsconfd
  2603. if [ $DEFAULT_DOMAIN_NAME ]; then
  2604. sed -i "s|#host-name=.*|host-name=$DEFAULT_DOMAIN_NAME|g" /etc/avahi/avahi-daemon.conf
  2605. else
  2606. decarray=( 1 2 3 4 5 6 7 8 9 0 )
  2607. 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]}
  2608. sed -i "s|#host-name=.*|host-name=P$PEER_ID|g" /etc/avahi/avahi-daemon.conf
  2609. fi
  2610. if [ ! -d /etc/avahi/services ]; then
  2611. mkdir -p /etc/avahi/services
  2612. fi
  2613. # remove an avahi service which isn't used
  2614. if [ -f /etc/avahi/services/udisks.service ]; then
  2615. rm /etc/avahi/services/udisks.service
  2616. fi
  2617. # Add an ssh service
  2618. echo '<?xml version="1.0" standalone="no"?><!--*-nxml-*-->' > /etc/avahi/services/ssh.service
  2619. echo '<!DOCTYPE service-group SYSTEM "avahi-service.dtd">' >> /etc/avahi/services/ssh.service
  2620. echo '<service-group>' >> /etc/avahi/services/ssh.service
  2621. echo ' <name replace-wildcards="yes">%h SSH</name>' >> /etc/avahi/services/ssh.service
  2622. echo ' <service>' >> /etc/avahi/services/ssh.service
  2623. echo ' <type>_ssh._tcp</type>' >> /etc/avahi/services/ssh.service
  2624. echo " <port>$SSH_PORT</port>" >> /etc/avahi/services/ssh.service
  2625. echo ' </service>' >> /etc/avahi/services/ssh.service
  2626. echo '</service-group>' >> /etc/avahi/services/ssh.service
  2627. # keep the daemon running
  2628. echo '' >> /usr/bin/$WATCHDOG_SCRIPT_NAME
  2629. echo '# keep avahi daemon running' >> /usr/bin/$WATCHDOG_SCRIPT_NAME
  2630. echo 'AVAHI_RUNNING=$(pgrep avahi-daemon > /dev/null && echo Running)' >> /usr/bin/$WATCHDOG_SCRIPT_NAME
  2631. echo 'if [ ! $AVAHI_RUNNING ]; then' >> /usr/bin/$WATCHDOG_SCRIPT_NAME
  2632. echo ' systemctl start avahi-daemon' >> /usr/bin/$WATCHDOG_SCRIPT_NAME
  2633. echo ' echo -n $CURRENT_DATE >> $LOGFILE' >> /usr/bin/$WATCHDOG_SCRIPT_NAME
  2634. echo ' echo " Avahi daemon restarted" >> $LOGFILE' >> /usr/bin/$WATCHDOG_SCRIPT_NAME
  2635. echo 'fi' >> /usr/bin/$WATCHDOG_SCRIPT_NAME
  2636. systemctl restart avahi-daemon
  2637. echo 'configure_avahi' >> $COMPLETION_FILE
  2638. }
  2639. function mesh_babel {
  2640. if grep -Fxq "mesh_babel" $COMPLETION_FILE; then
  2641. return
  2642. fi
  2643. if [[ $ENABLE_BABEL != "yes" ]]; then
  2644. return
  2645. fi
  2646. apt-get -y install babeld
  2647. babel_script=/var/lib/babel
  2648. echo '#!/bin/bash' > $babel_script
  2649. echo '' >> $babel_script
  2650. echo 'if [[ $1 == "ls" || $1 == "list" ]]; then' >> $babel_script
  2651. echo ' avahi-browse -atl' >> $babel_script
  2652. echo ' exit 0' >> $babel_script
  2653. echo 'fi' >> $babel_script
  2654. echo '' >> $babel_script
  2655. echo 'if [[ $1 == "start" ]]; then' >> $babel_script
  2656. echo ' sed -i "s|#host-name=.*|host-name=$(hostname)|g" /etc/avahi/avahi-daemon.conf' >> $babel_script
  2657. echo ' sed -i "s|host-name=.*|host-name=$(hostname)|g" /etc/avahi/avahi-daemon.conf' >> $babel_script
  2658. echo ' sed -i "s|use-ipv4=.*|use-ipv4=yes|g" /etc/avahi/avahi-daemon.conf' >> $babel_script
  2659. echo ' sed -i "s|use-ipv6=.*|use-ipv6=no|g" /etc/avahi/avahi-daemon.conf' >> $babel_script
  2660. echo ' sed -i "s|hosts:.*|hosts: files mdns4_minimal dns mdns4 mdns|g" /etc/nsswitch.conf' >> $babel_script
  2661. echo ' systemctl restart avahi-daemon' >> $babel_script
  2662. echo 'fi' >> $babel_script
  2663. echo '' >> $babel_script
  2664. echo "IFACE=$WIFI_INTERFACE" >> $babel_script
  2665. echo 'if [[ $IFACE == "wlan0" ]]; then' >> $babel_script
  2666. echo ' if grep -q "wlan1" /proc/net/dev; then' >> $babel_script
  2667. echo ' IFACE=wlan1' >> $babel_script
  2668. echo ' fi' >> $babel_script
  2669. echo 'fi' >> $babel_script
  2670. echo 'if [[ $IFACE == "wlan0" ]]; then' >> $babel_script
  2671. echo ' if grep -q "wlan2" /proc/net/dev; then' >> $babel_script
  2672. echo ' IFACE=wlan2' >> $babel_script
  2673. echo ' fi' >> $babel_script
  2674. echo 'fi' >> $babel_script
  2675. echo 'if [[ $IFACE == "wlan0" ]]; then' >> $babel_script
  2676. echo ' if grep -q "wlan3" /proc/net/dev; then' >> $babel_script
  2677. echo ' IFACE=wlan3' >> $babel_script
  2678. echo ' fi' >> $babel_script
  2679. echo 'fi' >> $babel_script
  2680. echo '' >> $babel_script
  2681. echo 'if [[ ! grep -q "$IFACE" /proc/net/dev || $1 == "stop" ]]; then' >> $babel_script
  2682. echo ' if ! grep -q "$IFACE" /proc/net/dev; then' >> $babel_script
  2683. echo ' echo "Interface $IFACE was not found"' >> $babel_script
  2684. echo ' else' >> $babel_script
  2685. echo ' echo "Stopping"' >> $babel_script
  2686. echo ' fi' >> $babel_script
  2687. echo ' ifconfig $IFACE down' >> $babel_script
  2688. echo ' pkill babeld' >> $babel_script
  2689. echo ' systemctl restart network-manager' >> $babel_script
  2690. echo ' exit 1' >> $babel_script
  2691. echo 'fi' >> $babel_script
  2692. echo '' >> $babel_script
  2693. echo 'systemctl stop network-manager' >> $babel_script
  2694. echo 'ifconfig $IFACE down' >> $babel_script
  2695. echo -n 'iwconfig $IFACE mode ad-hoc channel ' >> $babel_script
  2696. echo "$WIFI_CHANNEL essid \"$ESSID\"" >> $babel_script
  2697. echo 'ifconfig $IFACE up' >> $babel_script
  2698. echo -n 'ifconfig $IFACE:avahi ' >> $babel_script
  2699. echo -n "$LOCAL_NETWORK_STATIC_IP_ADDRESS netmask " >> $babel_script
  2700. echo '255.255.255.0 broadcast 192.168.13.255' >> $babel_script
  2701. echo -n 'babeld -D $IFACE:avahi -p ' >> $babel_script
  2702. echo -n "$BABEL_PORT -d 5 " >> $babel_script
  2703. echo '$IFACE' >> $babel_script
  2704. echo 'exit 0' >> $babel_script
  2705. chmod +x $babel_script
  2706. echo '[Unit]' > /etc/systemd/system/babel.service
  2707. echo 'Description=Babel Mesh' >> /etc/systemd/system/babel.service
  2708. echo '' >> /etc/systemd/system/babel.service
  2709. echo '[Service]' >> /etc/systemd/system/babel.service
  2710. echo 'Type=oneshot' >> /etc/systemd/system/babel.service
  2711. echo "ExecStart=$babel_script start" >> /etc/systemd/system/babel.service
  2712. echo "ExecStop=$babel_script stop" >> /etc/systemd/system/babel.service
  2713. echo 'RemainAfterExit=yes' >> /etc/systemd/system/babel.service
  2714. echo '' >> /etc/systemd/system/babel.service
  2715. echo '# Allow time for the server to start/stop' >> /etc/systemd/system/babel.service
  2716. echo 'TimeoutSec=300' >> /etc/systemd/system/babel.service
  2717. echo '' >> /etc/systemd/system/babel.service
  2718. echo '[Install]' >> /etc/systemd/system/babel.service
  2719. echo 'WantedBy=multi-user.target' >> /etc/systemd/system/babel.service
  2720. systemctl enable babel
  2721. echo 'mesh_babel' >> $COMPLETION_FILE
  2722. }
  2723. function mesh_batman_bridge {
  2724. # https://sudoroom.org/wiki/Mesh/Relay_setup
  2725. # also see http://www.netlore.co.uk/airmesh/
  2726. # https://www.youtube.com/watch?v=CLKHWfQlFqQ
  2727. # http://pastebin.com/4U9vdFFm
  2728. # http://pastebin.com/eeTmL5XL
  2729. if grep -Fxq "mesh_batman_bridge" $COMPLETION_FILE; then
  2730. return
  2731. fi
  2732. if [[ $ENABLE_BATMAN != "yes" ]]; then
  2733. return
  2734. fi
  2735. apt-get -y install iproute bridge-utils libnetfilter-conntrack3 batctl
  2736. apt-get -y install python-dev libevent-dev ebtables python-pip git
  2737. apt-get -y install wireless-tools rfkill
  2738. #install_vpn_tunnel
  2739. modprobe batman-adv
  2740. [ $? -ne 0 ] && echo "B.A.T.M.A.N module not available" && exit 76482
  2741. if ! grep -q "batman_adv" /etc/modules; then
  2742. echo 'batman_adv' >> /etc/modules
  2743. fi
  2744. batman_script=/var/lib/batman
  2745. echo '#!/bin/bash' > $batman_script
  2746. echo '' >> $batman_script
  2747. echo 'if [[ $1 == "start" ]]; then' >> $batman_script
  2748. echo ' # install avahi' >> $batman_script
  2749. echo ' sed -i "s|#host-name=.*|host-name=$(hostname)|g" /etc/avahi/avahi-daemon.conf' >> $batman_script
  2750. echo ' sed -i "s|host-name=.*|host-name=$(hostname)|g" /etc/avahi/avahi-daemon.conf' >> $batman_script
  2751. echo ' sed -i "s|use-ipv4=.*|use-ipv4=yes|g" /etc/avahi/avahi-daemon.conf' >> $batman_script
  2752. echo ' sed -i "s|use-ipv6=.*|use-ipv6=no|g" /etc/avahi/avahi-daemon.conf' >> $batman_script
  2753. echo ' sed -i "s|#disallow-other-stacks=.*|disallow-other-stacks=yes|g" /etc/avahi/avahi-daemon.conf' >> $batman_script
  2754. echo ' sed -i "s|hosts:.*|hosts: files mdns4_minimal dns mdns4 mdns|g" /etc/nsswitch.conf' >> $batman_script
  2755. echo 'fi' >> $batman_script
  2756. echo '' >> $batman_script
  2757. echo '# Mesh definition' >> $batman_script
  2758. echo "ESSID=$ESSID" >> $batman_script
  2759. echo "CELLID=$BATMAN_CELLID" >> $batman_script
  2760. echo "CHANNEL=$WIFI_CHANNEL" >> $batman_script
  2761. echo '' >> $batman_script
  2762. echo '# Ethernet bridge definition (bridged to bat0)' >> $batman_script
  2763. echo 'BRIDGE=br-mesh' >> $batman_script
  2764. echo "IFACE=$WIFI_INTERFACE" >> $batman_script
  2765. echo 'EIFACE=eth0' >> $batman_script
  2766. echo '' >> $batman_script
  2767. echo 'if [[ $IFACE == "wlan0" ]]; then' >> $batman_script
  2768. echo ' if grep -q "wlan1" /proc/net/dev; then' >> $batman_script
  2769. echo ' IFACE=wlan1' >> $batman_script
  2770. echo ' fi' >> $batman_script
  2771. echo 'fi' >> $batman_script
  2772. echo 'if [[ $IFACE == "wlan0" ]]; then' >> $batman_script
  2773. echo ' if grep -q "wlan2" /proc/net/dev; then' >> $batman_script
  2774. echo ' IFACE=wlan2' >> $batman_script
  2775. echo ' fi' >> $batman_script
  2776. echo 'fi' >> $batman_script
  2777. echo 'if [[ $IFACE == "wlan0" ]]; then' >> $batman_script
  2778. echo ' if grep -q "wlan3" /proc/net/dev; then' >> $batman_script
  2779. echo ' IFACE=wlan3' >> $batman_script
  2780. echo ' fi' >> $batman_script
  2781. echo 'fi' >> $batman_script
  2782. echo '' >> $batman_script
  2783. echo 'if [ -e /etc/default/batctl ]; then' >> $batman_script
  2784. echo ' . /etc/default/batctl' >> $batman_script
  2785. echo 'fi' >> $batman_script
  2786. echo '' >> $batman_script
  2787. echo 'start() {' >> $batman_script
  2788. echo ' if [ -z "$IFACE" ] ; then' >> $batman_script
  2789. echo ' echo "error: unable to find wifi interface, not enabling batman-adv mesh"' >> $batman_script
  2790. echo ' return' >> $batman_script
  2791. echo ' fi' >> $batman_script
  2792. echo ' echo "info: enabling batman-adv mesh network $ESSID on $IFACE"' >> $batman_script
  2793. echo ' systemctl stop network-manager' >> $batman_script
  2794. echo ' sleep 5' >> $batman_script
  2795. echo '' >> $batman_script
  2796. echo " # remove an avahi service which isn't used" >> $batman_script
  2797. echo ' if [ -f /etc/avahi/services/udisks.service ]; then' >> $batman_script
  2798. echo ' sudo rm /etc/avahi/services/udisks.service' >> $batman_script
  2799. echo ' fi' >> $batman_script
  2800. echo '' >> $batman_script
  2801. echo ' # Might have to re-enable wifi' >> $batman_script
  2802. echo ' rfkill unblock $(rfkill list|awk -F: "/phy/ {print $1}") || true' >> $batman_script
  2803. echo '' >> $batman_script
  2804. echo ' ifconfig $IFACE down' >> $batman_script
  2805. echo ' ifconfig $IFACE mtu 1532' >> $batman_script
  2806. echo ' iwconfig $IFACE enc off' >> $batman_script
  2807. echo ' iwconfig $IFACE mode ad-hoc essid $ESSID channel $CHANNEL' >> $batman_script
  2808. echo ' sleep 1' >> $batman_script
  2809. echo ' iwconfig $IFACE ap $CELLID' >> $batman_script
  2810. echo '' >> $batman_script
  2811. echo ' modprobe batman-adv' >> $batman_script
  2812. echo ' batctl if add $IFACE' >> $batman_script
  2813. echo ' ifconfig $IFACE up' >> $batman_script
  2814. echo ' avahi-autoipd --force-bind --daemonize --wait $BRIDGE' >> $batman_script
  2815. echo ' avahi-autoipd --force-bind --daemonize --wait $IFACE' >> $batman_script
  2816. echo ' ifconfig bat0 up promisc' >> $batman_script
  2817. echo '' >> $batman_script
  2818. echo ' #Use persistent HWAddr' >> $batman_script
  2819. echo ' ether_new=$(ifconfig eth0 | grep HWaddr | sed -e "s/.*HWaddr //")' >> $batman_script
  2820. echo ' if [ ! -f /var/lib/mesh-node/bat0 ]; then' >> $batman_script
  2821. echo ' mkdir /var/lib/mesh-node' >> $batman_script
  2822. echo ' echo "${ether_new}" > /var/lib/mesh-node/bat0' >> $batman_script
  2823. echo ' else' >> $batman_script
  2824. echo ' ether=$(cat /var/lib/mesh-node/bat0)' >> $batman_script
  2825. echo ' ifconfig bat0 hw ether ${ether}' >> $batman_script
  2826. echo ' fi' >> $batman_script
  2827. echo '' >> $batman_script
  2828. echo ' if [ "$EIFACE" ] ; then' >> $batman_script
  2829. echo ' brctl addbr $BRIDGE' >> $batman_script
  2830. echo ' brctl addif $BRIDGE bat0' >> $batman_script
  2831. echo ' brctl addif $BRIDGE $EIFACE' >> $batman_script
  2832. echo ' ifconfig bat0 0.0.0.0' >> $batman_script
  2833. echo ' ifconfig $EIFACE 0.0.0.0' >> $batman_script
  2834. echo ' ifconfig $EIFACE up promisc' >> $batman_script
  2835. echo ' ifconfig $BRIDGE up' >> $batman_script
  2836. echo ' fi' >> $batman_script
  2837. echo '' >> $batman_script
  2838. echo ' iptables -A INPUT -p tcp --dport 548 -j ACCEPT' >> $batman_script
  2839. echo ' iptables -A INPUT -p udp --dport 548 -j ACCEPT' >> $batman_script
  2840. echo ' iptables -A INPUT -p tcp --dport 5353 -j ACCEPT' >> $batman_script
  2841. echo ' iptables -A INPUT -p udp --dport 5353 -j ACCEPT' >> $batman_script
  2842. echo ' iptables -A INPUT -p tcp --dport 5354 -j ACCEPT' >> $batman_script
  2843. echo ' iptables -A INPUT -p udp --dport 5354 -j ACCEPT' >> $batman_script
  2844. echo " iptables -A INPUT -p tcp --dport $ZERONET_PORT -j ACCEPT" >> $batman_script
  2845. echo " iptables -A INPUT -p udp --dport $ZERONET_PORT -j ACCEPT" >> $batman_script
  2846. echo " iptables -A INPUT -p tcp --dport $IPFS_PORT -j ACCEPT" >> $batman_script
  2847. echo '' >> $batman_script
  2848. echo ' systemctl restart avahi-daemon' >> $batman_script
  2849. echo '}' >> $batman_script
  2850. echo '' >> $batman_script
  2851. echo 'stop() {' >> $batman_script
  2852. echo ' if [ -z "$IFACE" ]; then' >> $batman_script
  2853. echo ' echo "error: unable to find wifi interface, not enabling batman-adv mesh"' >> $batman_script
  2854. echo ' return' >> $batman_script
  2855. echo ' fi' >> $batman_script
  2856. echo ' if [ "$EIFACE" ]; then' >> $batman_script
  2857. echo ' brctl delif $BRIDGE bat0' >> $batman_script
  2858. echo ' brctl delif $BRIDGE $EIFACE' >> $batman_script
  2859. echo ' ifconfig $BRIDGE down || true' >> $batman_script
  2860. echo ' brctl delbr $BRIDGE' >> $batman_script
  2861. echo ' ifconfig $EIFACE down -promisc' >> $batman_script
  2862. echo ' fi' >> $batman_script
  2863. echo '' >> $batman_script
  2864. echo ' avahi-autoipd -k $BRIDGE' >> $batman_script
  2865. echo ' avahi-autoipd -k $IFACE' >> $batman_script
  2866. echo ' ifconfig bat0 down -promisc' >> $batman_script
  2867. echo '' >> $batman_script
  2868. echo ' batctl if del $IFACE' >> $batman_script
  2869. echo ' rmmod batman-adv' >> $batman_script
  2870. echo ' ifconfig $IFACE mtu 1500' >> $batman_script
  2871. echo ' ifconfig $IFACE down' >> $batman_script
  2872. echo ' iwconfig $IFACE mode managed' >> $batman_script
  2873. echo '' >> $batman_script
  2874. echo ' iptables -D INPUT -p tcp --dport 548 -j ACCEPT' >> $batman_script
  2875. echo ' iptables -D INPUT -p udp --dport 548 -j ACCEPT' >> $batman_script
  2876. echo ' iptables -D INPUT -p tcp --dport 5353 -j ACCEPT' >> $batman_script
  2877. echo ' iptables -D INPUT -p udp --dport 5353 -j ACCEPT' >> $batman_script
  2878. echo ' iptables -D INPUT -p tcp --dport 5354 -j ACCEPT' >> $batman_script
  2879. echo ' iptables -D INPUT -p udp --dport 5354 -j ACCEPT' >> $batman_script
  2880. echo " iptables -D INPUT -p tcp --dport $ZERONET_PORT -j ACCEPT" >> $batman_script
  2881. echo " iptables -D INPUT -p udp --dport $ZERONET_PORT -j ACCEPT" >> $batman_script
  2882. echo " iptables -D INPUT -p tcp --dport $IPFS_PORT -j ACCEPT" >> $batman_script
  2883. echo '' >> $batman_script
  2884. echo ' systemctl restart network-manager' >> $batman_script
  2885. echo '}' >> $batman_script
  2886. echo '' >> $batman_script
  2887. echo 'if ! grep -q "$IFACE" /proc/net/dev; then' >> $batman_script
  2888. echo ' echo "Interface $IFACE was not found"' >> $batman_script
  2889. echo ' stop' >> $batman_script
  2890. echo ' exit 1' >> $batman_script
  2891. echo 'fi' >> $batman_script
  2892. echo '' >> $batman_script
  2893. echo 'case "$1" in' >> $batman_script
  2894. echo ' start|stop)' >> $batman_script
  2895. echo ' $1' >> $batman_script
  2896. echo ' ;;' >> $batman_script
  2897. echo ' restart)' >> $batman_script
  2898. echo ' stop' >> $batman_script
  2899. echo ' sleep 10' >> $batman_script
  2900. echo ' start' >> $batman_script
  2901. echo ' ;;' >> $batman_script
  2902. echo ' status)' >> $batman_script
  2903. echo ' batctl o' >> $batman_script
  2904. echo ' ;;' >> $batman_script
  2905. echo ' ping)' >> $batman_script
  2906. echo ' batctl ping $2' >> $batman_script
  2907. echo ' ;;' >> $batman_script
  2908. echo ' ls|list)' >> $batman_script
  2909. echo ' avahi-browse -atl' >> $batman_script
  2910. echo ' ;;' >> $batman_script
  2911. echo ' *)' >> $batman_script
  2912. echo ' echo "error: invalid parameter $1"' >> $batman_script
  2913. echo ' echo "usage: $0 {start|stop|restart|status|ping|ls|list}"' >> $batman_script
  2914. echo ' exit 2' >> $batman_script
  2915. echo ' ;;' >> $batman_script
  2916. echo 'esac' >> $batman_script
  2917. echo 'exit 0' >> $batman_script
  2918. chmod +x $batman_script
  2919. echo '[Unit]' > /etc/systemd/system/batman.service
  2920. echo 'Description=B.A.T.M.A.N. Advanced' >> /etc/systemd/system/batman.service
  2921. echo '' >> /etc/systemd/system/batman.service
  2922. echo '[Service]' >> /etc/systemd/system/batman.service
  2923. echo 'Type=oneshot' >> /etc/systemd/system/batman.service
  2924. echo "ExecStart=$batman_script start" >> /etc/systemd/system/batman.service
  2925. echo "ExecStop=$batman_script stop" >> /etc/systemd/system/batman.service
  2926. echo 'RemainAfterExit=yes' >> /etc/systemd/system/batman.service
  2927. echo '' >> /etc/systemd/system/batman.service
  2928. echo '# Allow time for the server to start/stop' >> /etc/systemd/system/batman.service
  2929. echo 'TimeoutSec=300' >> /etc/systemd/system/batman.service
  2930. echo '' >> /etc/systemd/system/batman.service
  2931. echo '[Install]' >> /etc/systemd/system/batman.service
  2932. echo 'WantedBy=multi-user.target' >> /etc/systemd/system/batman.service
  2933. systemctl enable batman
  2934. if ! grep -q "Mesh Networking (B.A.T.M.A.N)" /home/$MY_USERNAME/README; then
  2935. echo '' >> /home/$MY_USERNAME/README
  2936. echo '' >> /home/$MY_USERNAME/README
  2937. echo 'Mesh Networking (B.A.T.M.A.N)' >> /home/$MY_USERNAME/README
  2938. echo '=============================' >> /home/$MY_USERNAME/README
  2939. echo "Mesh ESSID: $ESSID" >> /home/$MY_USERNAME/README
  2940. echo "Mesh cell ID: $BATMAN_CELLID" >> /home/$MY_USERNAME/README
  2941. echo "Mesh wifi channel: $WIFI_CHANNEL" >> /home/$MY_USERNAME/README
  2942. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
  2943. chmod 600 /home/$MY_USERNAME/README
  2944. fi
  2945. echo 'mesh_batman_bridge' >> $COMPLETION_FILE
  2946. }
  2947. function remove_instructions_from_motd {
  2948. sed -i '/## /d' /etc/motd
  2949. }
  2950. function check_hwrng {
  2951. if [[ $HWRNG_TYPE == "beaglebone" ]]; then
  2952. # If hardware random number generation was enabled then make sure that the device exists.
  2953. # if /dev/hwrng is not found then any subsequent cryptographic key generation would
  2954. # suffer from low entropy and might be insecure
  2955. if [ ! -e /dev/hwrng ]; then
  2956. ls /dev/hw*
  2957. echo $'The hardware random number generator is enabled but could not be detected on'
  2958. echo $'/dev/hwrng. There may be a problem with the installation or the Beaglebone hardware.'
  2959. exit 75
  2960. fi
  2961. fi
  2962. # If a OneRNG device was installed then verify its firmware
  2963. #check_onerng_verification
  2964. }
  2965. function get_mariadb_password {
  2966. if [ -f /home/$MY_USERNAME/README ]; then
  2967. if grep -q "MariaDB password" /home/$MY_USERNAME/README; then
  2968. if [ -f $DATABASE_PASSWORD_FILE ]; then
  2969. MARIADB_PASSWORD=$(cat $DATABASE_PASSWORD_FILE)
  2970. else
  2971. MARIADB_PASSWORD=$(cat /home/$MY_USERNAME/README | grep "MariaDB password" | awk -F ':' '{print $2}' | sed 's/^ *//')
  2972. echo "$MARIADB_PASSWORD" > $DATABASE_PASSWORD_FILE
  2973. chmod 600 $DATABASE_PASSWORD_FILE
  2974. fi
  2975. fi
  2976. fi
  2977. }
  2978. function get_mariadb_gnusocial_admin_password {
  2979. if [ -f /home/$MY_USERNAME/README ]; then
  2980. if grep -q "MariaDB gnusocial admin password" /home/$MY_USERNAME/README; then
  2981. MICROBLOG_ADMIN_PASSWORD=$(cat /home/$MY_USERNAME/README | grep "MariaDB gnusocial admin password" | awk -F ':' '{print $2}' | sed 's/^ *//')
  2982. fi
  2983. if grep -q "Microblog administrator password" /home/$MY_USERNAME/README; then
  2984. MICROBLOG_ADMIN_PASSWORD=$(cat /home/$MY_USERNAME/README | grep "Microblog administrator password" | awk -F ':' '{print $2}' | sed 's/^ *//')
  2985. fi
  2986. fi
  2987. }
  2988. function get_mariadb_git_admin_password {
  2989. if [ -f /home/$MY_USERNAME/README ]; then
  2990. if grep -q "Gogs admin user password" /home/$MY_USERNAME/README; then
  2991. GIT_ADMIN_PASSWORD=$(cat /home/$MY_USERNAME/README | grep "Gogs admin user password" | awk -F ':' '{print $2}' | sed 's/^ *//')
  2992. fi
  2993. fi
  2994. }
  2995. function get_mariadb_hubzilla_admin_password {
  2996. if [ -f /home/$MY_USERNAME/README ]; then
  2997. if grep -q "MariaDB Hubzilla admin password" /home/$MY_USERNAME/README; then
  2998. HUBZILLA_ADMIN_PASSWORD=$(cat /home/$MY_USERNAME/README | grep "MariaDB Hubzilla admin password" | awk -F ':' '{print $2}' | sed 's/^ *//')
  2999. fi
  3000. fi
  3001. }
  3002. function get_mariadb_owncloud_admin_password {
  3003. if [ -f /home/$MY_USERNAME/README ]; then
  3004. if grep -q "Owncloud database password" /home/$MY_USERNAME/README; then
  3005. OWNCLOUD_ADMIN_PASSWORD=$(cat /home/$MY_USERNAME/README | grep "Owncloud database password" | awk -F ':' '{print $2}' | sed 's/^ *//')
  3006. fi
  3007. fi
  3008. }
  3009. function create_freedns_updater {
  3010. if [[ $ONION_ONLY != "no" ]]; then
  3011. return
  3012. fi
  3013. # currently inadyn doesn't work as expected with freeDNS, so this is a workaround
  3014. if grep -Fxq "create_freedns_updater" $COMPLETION_FILE; then
  3015. return
  3016. fi
  3017. if [[ $DDNS_PROVIDER != "default@freedns.afraid.org" ]]; then
  3018. return
  3019. fi
  3020. if [[ $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  3021. return
  3022. fi
  3023. FREEDNS_WGET='wget -q --read-timeout=0.0 --waitretry=5 --tries=4 https://freedns.afraid.org/dynamic/update.php?'
  3024. echo '#!/bin/bash' > /usr/bin/dynamicdns
  3025. echo 'cd /tmp' >> /usr/bin/dynamicdns
  3026. if [ $DEFAULT_DOMAIN_CODE ]; then
  3027. echo "# $DEFAULT_DOMAIN_NAME" >> /usr/bin/dynamicdns
  3028. echo "$FREEDNS_WGET$DEFAULT_DOMAIN_CODE=" >> /usr/bin/dynamicdns
  3029. fi
  3030. if [ $WIKI_CODE ]; then
  3031. if [[ $WIKI_CODE != "$DEFAULT_DOMAIN_CODE" ]]; then
  3032. echo "# $WIKI_DOMAIN_NAME" >> /usr/bin/dynamicdns
  3033. echo "$FREEDNS_WGET$WIKI_CODE=" >> /usr/bin/dynamicdns
  3034. fi
  3035. fi
  3036. if [ $FULLBLOG_CODE ]; then
  3037. if [[ $FULLBLOG_CODE != "$DEFAULT_DOMAIN_CODE" ]]; then
  3038. echo "# $FULLBLOG_DOMAIN_NAME" >> /usr/bin/dynamicdns
  3039. echo "$FREEDNS_WGET$FULLBLOG_CODE=" >> /usr/bin/dynamicdns
  3040. fi
  3041. fi
  3042. if [ $HUBZILLA_CODE ]; then
  3043. if [[ $HUBZILLA_CODE != "$DEFAULT_DOMAIN_CODE" ]]; then
  3044. echo "# $HUBZILLA_DOMAIN_NAME" >> /usr/bin/dynamicdns
  3045. echo "$FREEDNS_WGET$HUBZILLA_CODE=" >> /usr/bin/dynamicdns
  3046. fi
  3047. fi
  3048. if [ $OWNCLOUD_CODE ]; then
  3049. if [[ $OWNCLOUD_CODE != "$DEFAULT_DOMAIN_CODE" ]]; then
  3050. echo "# $OWNCLOUD_DOMAIN_NAME" >> /usr/bin/dynamicdns
  3051. echo "$FREEDNS_WGET$OWNCLOUD_CODE=" >> /usr/bin/dynamicdns
  3052. fi
  3053. fi
  3054. if [ $MICROBLOG_CODE ]; then
  3055. if [[ $MICROBLOG_CODE != "$DEFAULT_DOMAIN_CODE" ]]; then
  3056. echo "# $MICROBLOG_DOMAIN_NAME" >> /usr/bin/dynamicdns
  3057. echo "$FREEDNS_WGET$MICROBLOG_CODE=" >> /usr/bin/dynamicdns
  3058. fi
  3059. fi
  3060. if [ $GIT_CODE ]; then
  3061. if [[ $GIT_CODE != "$DEFAULT_DOMAIN_CODE" ]]; then
  3062. echo "# $GIT_DOMAIN_NAME" >> /usr/bin/dynamicdns
  3063. echo "$FREEDNS_WGET$GIT_CODE=" >> /usr/bin/dynamicdns
  3064. fi
  3065. fi
  3066. if [ $MEDIAGOBLIN_CODE ]; then
  3067. if [[ $MEDIAGOBLIN_CODE != "$DEFAULT_DOMAIN_CODE" ]]; then
  3068. echo "# $MEDIAGOBLIN_DOMAIN_NAME" >> /usr/bin/dynamicdns
  3069. echo "$FREEDNS_WGET$MEDIAGOBLIN_CODE=" >> /usr/bin/dynamicdns
  3070. fi
  3071. fi
  3072. echo 'exit 0' >> /usr/bin/dynamicdns
  3073. chmod 600 /usr/bin/dynamicdns
  3074. chmod +x /usr/bin/dynamicdns
  3075. if ! grep -q "/usr/bin/dynamicdns" /etc/crontab; then
  3076. echo '*/3 * * * * root /usr/bin/dynamicdns' >> /etc/crontab
  3077. systemctl restart cron
  3078. fi
  3079. echo 'create_freedns_updater' >> $COMPLETION_FILE
  3080. }
  3081. function backup_to_friends_servers {
  3082. # update crontab
  3083. echo '#!/bin/bash' > /etc/cron.daily/backuptofriends
  3084. echo "if [ -f /usr/local/bin/${PROJECT_NAME}-backup-remote ]; then" >> /etc/cron.daily/backuptofriends
  3085. echo " /usr/local/bin/${PROJECT_NAME}-backup-remote" >> /etc/cron.daily/backuptofriends
  3086. echo 'else' >> /etc/cron.daily/backuptofriends
  3087. echo " /usr/bin/${PROJECT_NAME}-backup-remote" >> /etc/cron.daily/backuptofriends
  3088. echo 'fi' >> /etc/cron.daily/backuptofriends
  3089. chmod +x /etc/cron.daily/backuptofriends
  3090. }
  3091. function remove_default_user {
  3092. # make sure you don't use the default user account
  3093. if [[ $MY_USERNAME == "debian" ]]; then
  3094. echo 'Do not use the default debian user account. Create a different user with: adduser [username]'
  3095. exit 68
  3096. fi
  3097. # remove the default debian user to prevent it from becoming an attack vector
  3098. if [ -d /home/debian ]; then
  3099. userdel -r debian
  3100. echo 'Default debian user account removed'
  3101. fi
  3102. }
  3103. function enforce_good_passwords {
  3104. # because humans are generally bad at choosing passwords
  3105. if grep -Fxq "enforce_good_passwords" $COMPLETION_FILE; then
  3106. return
  3107. fi
  3108. apt-get -y install libpam-cracklib
  3109. 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
  3110. echo 'enforce_good_passwords' >> $COMPLETION_FILE
  3111. }
  3112. function change_login_message {
  3113. if grep -Fxq "change_login_message" $COMPLETION_FILE; then
  3114. return
  3115. fi
  3116. # remove automatic motd creator if it exists
  3117. if [ -f /etc/init.d/motd ]; then
  3118. rm -f /etc/init.d/motd
  3119. fi
  3120. echo '' > /etc/motd
  3121. echo ".---. . . " >> /etc/motd
  3122. echo "| | | " >> /etc/motd
  3123. echo "|--- .--. .-. .-. .-.| .-. .--.--. |.-. .-. .--. .-. " >> /etc/motd
  3124. echo "| | (.-' (.-' ( | ( )| | | | )( )| | (.-' " >> /etc/motd
  3125. echo "' ' --' --' -' - -' ' ' -' -' -' ' - --'" >> /etc/motd
  3126. if [[ $SYSTEM_TYPE == "$VARIANT_MAILBOX" ]]; then
  3127. echo $' M A I L B O X E D I T I O N' >> /etc/motd
  3128. fi
  3129. if [[ $SYSTEM_TYPE == "$VARIANT_SOCIAL" ]]; then
  3130. echo $' S O C I A L E D I T I O N' >> /etc/motd
  3131. fi
  3132. if [[ $SYSTEM_TYPE == "$VARIANT_CHAT" ]]; then
  3133. echo $' C H A T E D I T I O N' >> /etc/motd
  3134. fi
  3135. if [[ $SYSTEM_TYPE == "$VARIANT_CLOUD" ]]; then
  3136. echo $' C L O U D E D I T I O N' >> /etc/motd
  3137. fi
  3138. if [[ $SYSTEM_TYPE == "$VARIANT_WRITER" ]]; then
  3139. echo $' W R I T E R E D I T I O N ' >> /etc/motd
  3140. fi
  3141. if [[ $SYSTEM_TYPE == "$VARIANT_MEDIA" ]]; then
  3142. echo $' M E D I A E D I T I O N' >> /etc/motd
  3143. fi
  3144. if [[ $SYSTEM_TYPE == "$VARIANT_DEVELOPER" ]]; then
  3145. echo $' D E V E L O P E R E D I T I O N' >> /etc/motd
  3146. fi
  3147. echo '' >> /etc/motd
  3148. if [[ $SYSTEM_TYPE != "$VARIANT_MESH" ]]; then
  3149. echo $' Freedom in the Cloud' >> /etc/motd
  3150. else
  3151. echo $' Freedom in the Mesh' >> /etc/motd
  3152. fi
  3153. echo '' >> /etc/motd
  3154. echo 'change_login_message' >> $COMPLETION_FILE
  3155. }
  3156. function search_for_attached_usb_drive {
  3157. # If a USB drive is attached then search for email,
  3158. # gpg, ssh keys and emacs configuration
  3159. if grep -Fxq "search_for_attached_usb_drive" $COMPLETION_FILE; then
  3160. return
  3161. fi
  3162. if [ -b $USB_DRIVE ]; then
  3163. if [ ! -d $USB_MOUNT ]; then
  3164. echo $'Mounting USB drive'
  3165. mkdir $USB_MOUNT
  3166. mount $USB_DRIVE $USB_MOUNT
  3167. fi
  3168. 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
  3169. if [ -d $USB_MOUNT/Maildir ]; then
  3170. echo $'Maildir found on USB drive'
  3171. IMPORT_MAILDIR=$USB_MOUNT/Maildir
  3172. fi
  3173. if [ -d $USB_MOUNT/.gnupg ]; then
  3174. echo $'Importing GPG keyring'
  3175. cp -r $USB_MOUNT/.gnupg /home/$MY_USERNAME
  3176. chown -R $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.gnupg
  3177. GPG_KEYS_IMPORTED="yes"
  3178. if [ ! -f /home/$MY_USERNAME/.gnupg/secring.gpg ]; then
  3179. echo $'GPG files did not copy'
  3180. exit 73529
  3181. fi
  3182. fi
  3183. if [ -f $USB_MOUNT/.procmailrc ]; then
  3184. echo $'Importing procmail settings'
  3185. cp $USB_MOUNT/.procmailrc /home/$MY_USERNAME
  3186. chown -R $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.procmailrc
  3187. fi
  3188. if [ -f $USB_MOUNT/private_key.gpg ]; then
  3189. echo $'GPG private key found on USB drive'
  3190. MY_GPG_PRIVATE_KEY=$USB_MOUNT/private_key.gpg
  3191. fi
  3192. if [ -f $USB_MOUNT/public_key.gpg ]; then
  3193. echo $'GPG public key found on USB drive'
  3194. MY_GPG_PUBLIC_KEY=$USB_MOUNT/public_key.gpg
  3195. fi
  3196. fi
  3197. if [ -d $USB_MOUNT/prosody ]; then
  3198. if [ ! -d $XMPP_DIRECTORY ]; then
  3199. mkdir $XMPP_DIRECTORY
  3200. fi
  3201. cp -r $USB_MOUNT/prosody/* $XMPP_DIRECTORY
  3202. chown -R prosody:prosody $XMPP_DIRECTORY
  3203. fi
  3204. if [ -d $USB_MOUNT/.ssh ]; then
  3205. echo $'Importing ssh keys'
  3206. cp -r $USB_MOUNT/.ssh /home/$MY_USERNAME
  3207. chown -R $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.ssh
  3208. # for security delete the ssh keys from the usb drive
  3209. if [ ! -f /home/$MY_USERNAME/.ssh/id_rsa ]; then
  3210. echo $'ssh files did not copy'
  3211. exit 8
  3212. fi
  3213. fi
  3214. if [ -f $USB_MOUNT/.emacs ]; then
  3215. echo $'Importing .emacs file'
  3216. cp -f $USB_MOUNT/.emacs /home/$MY_USERNAME/.emacs
  3217. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.emacs
  3218. fi
  3219. if [ -d $USB_MOUNT/.emacs.d ]; then
  3220. echo $'Importing .emacs.d directory'
  3221. cp -r $USB_MOUNT/.emacs.d /home/$MY_USERNAME
  3222. chown -R $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.emacs.d
  3223. fi
  3224. if [ -d $USB_MOUNT/ssl ]; then
  3225. echo $'Importing SSL certificates'
  3226. cp -r $USB_MOUNT/ssl/* /etc/ssl
  3227. chmod 640 /etc/ssl/certs/*
  3228. chmod 400 /etc/ssl/private/*
  3229. # change ownership of some certificates
  3230. if [ -d /etc/prosody ]; then
  3231. chown prosody:prosody /etc/ssl/private/xmpp.*
  3232. chown prosody:prosody /etc/ssl/certs/xmpp.*
  3233. fi
  3234. if [ -d /etc/dovecot ]; then
  3235. chown root:dovecot /etc/ssl/certs/dovecot.*
  3236. chown root:dovecot /etc/ssl/private/dovecot.*
  3237. fi
  3238. if [ -f /etc/ssl/private/exim.key ]; then
  3239. cp /etc/ssl/private/exim.key /etc/exim4
  3240. cp /etc/ssl/certs/exim.crt /etc/exim4
  3241. cp /etc/ssl/certs/exim.dhparam /etc/exim4
  3242. chown root:Debian-exim /etc/exim4/exim.key /etc/exim4/exim.crt /etc/exim4/exim.dhparam
  3243. chmod 640 /etc/exim4/exim.key /etc/exim4/exim.crt /etc/exim4/exim.dhparam
  3244. fi
  3245. fi
  3246. if [ -d $USB_MOUNT/personal ]; then
  3247. echo $'Importing personal directory'
  3248. cp -r $USB_MOUNT/personal /home/$MY_USERNAME
  3249. chown -R $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/personal
  3250. fi
  3251. else
  3252. if [ -d $USB_MOUNT ]; then
  3253. umount $USB_MOUNT
  3254. rm -rf $USB_MOUNT
  3255. fi
  3256. echo $'No USB drive attached'
  3257. fi
  3258. echo 'search_for_attached_usb_drive' >> $COMPLETION_FILE
  3259. }
  3260. function remove_proprietary_repos {
  3261. if grep -Fxq "remove_proprietary_repos" $COMPLETION_FILE; then
  3262. return
  3263. fi
  3264. sed -i 's/ non-free//g' /etc/apt/sources.list
  3265. echo 'remove_proprietary_repos' >> $COMPLETION_FILE
  3266. }
  3267. function change_debian_repos {
  3268. if grep -Fxq "change_debian_repos" $COMPLETION_FILE; then
  3269. return
  3270. fi
  3271. if [[ $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  3272. return
  3273. fi
  3274. rm -rf /var/lib/apt/lists/*
  3275. apt-get clean
  3276. sed -i "s/ftp.us.debian.org/$DEBIAN_REPO/g" /etc/apt/sources.list
  3277. # ensure that there is a security repo
  3278. if ! grep -q "security" /etc/apt/sources.list; then
  3279. echo "deb http://security.debian.org/ $DEBIAN_VERSION/updates main contrib" >> /etc/apt/sources.list
  3280. echo "#deb-src http://security.debian.org/ $DEBIAN_VERSION/updates main contrib" >> /etc/apt/sources.list
  3281. fi
  3282. apt-get update
  3283. apt-get -y install apt-transport-https
  3284. echo 'change_debian_repos' >> $COMPLETION_FILE
  3285. }
  3286. function initial_setup {
  3287. if grep -Fxq "initial_setup" $COMPLETION_FILE; then
  3288. return
  3289. fi
  3290. apt-get -y remove --purge apache*
  3291. apt-get -y dist-upgrade
  3292. apt-get -y install ca-certificates emacs24 cpulimit
  3293. apt-get -y install cryptsetup libgfshare-bin obnam sshpass wget
  3294. apt-get -y install avahi-daemon avahi-utils avahi-discover
  3295. apt-get -y install connect-proxy
  3296. if [ ! -d $INSTALL_DIR ]; then
  3297. mkdir -p $INSTALL_DIR
  3298. fi
  3299. echo 'initial_setup' >> $COMPLETION_FILE
  3300. }
  3301. function allow_ssh_to_onion_address {
  3302. if [ ! -d /home/$MY_USERNAME/.ssh ]; then
  3303. mkdir /home/$MY_USERNAME/.ssh
  3304. fi
  3305. if [ ! -d /etc/tor ]; then
  3306. echo $'Tor not found when updating ssh'
  3307. exit 528257
  3308. fi
  3309. if ! grep -q "onion" /home/$MY_USERNAME/.ssh/config; then
  3310. echo 'Host *.onion' >> /home/$MY_USERNAME/.ssh/config
  3311. echo 'ProxyCommand connect -R remote -5 -S 127.0.0.1:9050 %h %p' >> /home/$MY_USERNAME/.ssh/config
  3312. fi
  3313. }
  3314. function install_tor {
  3315. if [[ $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  3316. return
  3317. fi
  3318. if grep -Fxq "install_tor" $COMPLETION_FILE; then
  3319. return
  3320. fi
  3321. apt-get -y install tor
  3322. echo 'install_tor' >> $COMPLETION_FILE
  3323. }
  3324. function enable_ssh_via_onion {
  3325. if [[ $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  3326. return
  3327. fi
  3328. if grep -Fxq "enable_ssh_via_onion" $COMPLETION_FILE; then
  3329. return
  3330. fi
  3331. apt-get -y install tor connect-proxy
  3332. if ! grep -q 'Host *.onion' /home/$MY_USERNAME/.ssh/config; then
  3333. if [ ! -d /home/$MY_USERNAME/.ssh ]; then
  3334. mkdir /home/$MY_USERNAME/.ssh
  3335. fi
  3336. echo 'Host *.onion' >> /home/$MY_USERNAME/.ssh/config
  3337. echo 'ProxyCommand connect -R remote -5 -S 127.0.0.1:9050 %h %p' >> /home/$MY_USERNAME/.ssh/config
  3338. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.ssh
  3339. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.ssh/config
  3340. fi
  3341. if ! grep -q 'Host *.onion' /root/.ssh/config; then
  3342. if [ ! -d /root/.ssh ]; then
  3343. mkdir /root/.ssh
  3344. fi
  3345. echo 'Host *.onion' >> /root/.ssh/config
  3346. echo 'ProxyCommand connect -R remote -5 -S 127.0.0.1:9050 %h %p' >> /root/.ssh/config
  3347. fi
  3348. echo 'enable_ssh_via_onion' >> $COMPLETION_FILE
  3349. }
  3350. function install_editor {
  3351. if grep -Fxq "install_editor" $COMPLETION_FILE; then
  3352. return
  3353. fi
  3354. update-alternatives --set editor /usr/bin/emacs24
  3355. # A minimal emacs configuration
  3356. #echo -n "(add-to-list 'load-path " > /home/$MY_USERNAME/.emacs
  3357. #echo '"~/.emacs.d/")' >> /home/$MY_USERNAME/.emacs
  3358. #echo '' >> /home/$MY_USERNAME/.emacs
  3359. echo $';; ===== Remove trailing whitepace ======================================' >> /home/$MY_USERNAME/.emacs
  3360. echo '' >> /home/$MY_USERNAME/.emacs
  3361. echo ";;(add-hook 'before-save-hook 'delete-trailing-whitespace)" >> /home/$MY_USERNAME/.emacs
  3362. echo '' >> /home/$MY_USERNAME/.emacs
  3363. echo ';; Goto a line number with CTRL-l' >> /home/$MY_USERNAME/.emacs
  3364. echo -n '(global-set-key "\C-l" ' >> /home/$MY_USERNAME/.emacs
  3365. echo "'goto-line)" >> /home/$MY_USERNAME/.emacs
  3366. echo '' >> /home/$MY_USERNAME/.emacs
  3367. echo $';; ===== Show line numbers ==============================================' >> /home/$MY_USERNAME/.emacs
  3368. echo '' >> /home/$MY_USERNAME/.emacs
  3369. echo "(add-hook 'find-file-hook (lambda () (linum-mode 1)))" >> /home/$MY_USERNAME/.emacs
  3370. echo '' >> /home/$MY_USERNAME/.emacs
  3371. echo $';; ===== Enable line wrapping in org-mode ===============================' >> /home/$MY_USERNAME/.emacs
  3372. echo '' >> /home/$MY_USERNAME/.emacs
  3373. echo " (add-hook 'org-mode-hook" >> /home/$MY_USERNAME/.emacs
  3374. echo " '(lambda ()" >> /home/$MY_USERNAME/.emacs
  3375. echo " (visual-line-mode 1)))" >> /home/$MY_USERNAME/.emacs
  3376. echo '' >> /home/$MY_USERNAME/.emacs
  3377. echo $';; ===== Enable shift select in org mode ================================' >> /home/$MY_USERNAME/.emacs
  3378. echo '' >> /home/$MY_USERNAME/.emacs
  3379. echo '(setq org-support-shift-select t)' >> /home/$MY_USERNAME/.emacs
  3380. echo '' >> /home/$MY_USERNAME/.emacs
  3381. echo $';; ===== Set standard indent to 4 rather that 4 =========================' >> /home/$MY_USERNAME/.emacs
  3382. echo '' >> /home/$MY_USERNAME/.emacs
  3383. echo '(setq standard-indent 4)' >> /home/$MY_USERNAME/.emacs
  3384. echo '(setq-default tab-width 4)' >> /home/$MY_USERNAME/.emacs
  3385. echo '(setq c-basic-offset 4)' >> /home/$MY_USERNAME/.emacs
  3386. echo '' >> /home/$MY_USERNAME/.emacs
  3387. echo $';; ===== Support Wheel Mouse Scrolling ==================================' >> /home/$MY_USERNAME/.emacs
  3388. echo '' >> /home/$MY_USERNAME/.emacs
  3389. echo '(mouse-wheel-mode t)' >> /home/$MY_USERNAME/.emacs
  3390. echo '' >> /home/$MY_USERNAME/.emacs
  3391. echo $';; ===== Place Backup Files in Specific Directory =======================' >> /home/$MY_USERNAME/.emacs
  3392. echo '' >> /home/$MY_USERNAME/.emacs
  3393. echo '(setq make-backup-files t)' >> /home/$MY_USERNAME/.emacs
  3394. echo '(setq version-control t)' >> /home/$MY_USERNAME/.emacs
  3395. echo '(setq backup-directory-alist (quote ((".*" . "~/.emacs_backups/"))))' >> /home/$MY_USERNAME/.emacs
  3396. echo '' >> /home/$MY_USERNAME/.emacs
  3397. echo $';; ===== Make Text mode the default mode for new buffers ================' >> /home/$MY_USERNAME/.emacs
  3398. echo '' >> /home/$MY_USERNAME/.emacs
  3399. echo "(setq default-major-mode 'text-mode)" >> /home/$MY_USERNAME/.emacs
  3400. echo '' >> /home/$MY_USERNAME/.emacs
  3401. echo $';; ===== Line length ====================================================' >> /home/$MY_USERNAME/.emacs
  3402. echo '' >> /home/$MY_USERNAME/.emacs
  3403. echo '(setq-default fill-column 72)' >> /home/$MY_USERNAME/.emacs
  3404. echo '' >> /home/$MY_USERNAME/.emacs
  3405. echo $';; ===== Enable Line and Column Numbering ===============================' >> /home/$MY_USERNAME/.emacs
  3406. echo '' >> /home/$MY_USERNAME/.emacs
  3407. echo '(line-number-mode 1)' >> /home/$MY_USERNAME/.emacs
  3408. echo '(column-number-mode 1)' >> /home/$MY_USERNAME/.emacs
  3409. echo '' >> /home/$MY_USERNAME/.emacs
  3410. echo $';; ===== Turn on Auto Fill mode automatically in all modes ==============' >> /home/$MY_USERNAME/.emacs
  3411. echo '' >> /home/$MY_USERNAME/.emacs
  3412. echo ';; Auto-fill-mode the the automatic wrapping of lines and insertion of' >> /home/$MY_USERNAME/.emacs
  3413. echo ';; newlines when the cursor goes over the column limit.' >> /home/$MY_USERNAME/.emacs
  3414. echo '' >> /home/$MY_USERNAME/.emacs
  3415. echo ';; This should actually turn on auto-fill-mode by default in all major' >> /home/$MY_USERNAME/.emacs
  3416. echo ';; modes. The other way to do this is to turn on the fill for specific modes' >> /home/$MY_USERNAME/.emacs
  3417. echo ';; via hooks.' >> /home/$MY_USERNAME/.emacs
  3418. echo '' >> /home/$MY_USERNAME/.emacs
  3419. echo '(setq auto-fill-mode 1)' >> /home/$MY_USERNAME/.emacs
  3420. echo '' >> /home/$MY_USERNAME/.emacs
  3421. echo $';; ===== Enable GPG encryption =========================================' >> /home/$MY_USERNAME/.emacs
  3422. echo '' >> /home/$MY_USERNAME/.emacs
  3423. echo "(require 'epa)" >> /home/$MY_USERNAME/.emacs
  3424. echo '(epa-file-enable)' >> /home/$MY_USERNAME/.emacs
  3425. cp /home/$MY_USERNAME/.emacs /root/.emacs
  3426. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.emacs
  3427. echo 'install_editor' >> $COMPLETION_FILE
  3428. }
  3429. function enable_backports {
  3430. if grep -Fxq "enable_backports" $COMPLETION_FILE; then
  3431. return
  3432. fi
  3433. if ! grep -Fxq "deb http://$DEBIAN_REPO/debian $DEBIAN_VERSION-backports main" /etc/apt/sources.list; then
  3434. echo "deb http://$DEBIAN_REPO/debian $DEBIAN_VERSION-backports main" >> /etc/apt/sources.list
  3435. fi
  3436. echo 'enable_backports' >> $COMPLETION_FILE
  3437. }
  3438. function enable_zram {
  3439. if grep -Fxq "enable_zram" $COMPLETION_FILE; then
  3440. return
  3441. fi
  3442. if [[ $INSTALLED_WITHIN_DOCKER == "yes" || $INSTALLING_ON_BBB != "yes" ]]; then
  3443. ${PROJECT_NAME}-zram off
  3444. return
  3445. fi
  3446. ${PROJECT_NAME}-zram on
  3447. echo 'enable_zram' >> $COMPLETION_FILE
  3448. }
  3449. function check_onerng_verification {
  3450. if grep -Fxq "check_onerng_verification" $COMPLETION_FILE; then
  3451. return
  3452. fi
  3453. if [[ $HWRNG_TYPE != "onerng" ]]; then
  3454. return
  3455. fi
  3456. echo $'Checking OneRNG firmware verification'
  3457. last_onerng_validation=$(cat /var/log/syslog.1 | grep "OneRNG: firmware verification" | awk '/./{line=$0} END{print line}')
  3458. if [[ $last_onerng_validation != *"passed OK"* ]]; then
  3459. last_onerng_validation=$(cat /var/log/syslog | grep "OneRNG: firmware verification" | awk '/./{line=$0} END{print line}')
  3460. if [[ $last_onerng_validation != *"passed OK"* ]]; then
  3461. echo $last_onerng_validation
  3462. echo $'OneRNG firmware verification failed'
  3463. exit 735026
  3464. fi
  3465. fi
  3466. echo $'OneRNG firmware verification passed'
  3467. # if haveged was previously installed then remove it
  3468. apt-get -y remove haveged
  3469. echo 'check_onerng_verification' >> $COMPLETION_FILE
  3470. }
  3471. function install_onerng {
  3472. apt-get -y install rng-tools at python-gnupg
  3473. # Move to the installation directory
  3474. if [ ! -d $INSTALL_DIR ]; then
  3475. mkdir $INSTALL_DIR
  3476. fi
  3477. cd $INSTALL_DIR
  3478. # Download the package
  3479. if [ ! -f $ONERNG_PACKAGE ]; then
  3480. wget $ONERNG_PACKAGE_DOWNLOAD
  3481. mv "$ONERNG_PACKAGE?raw=true" $ONERNG_PACKAGE
  3482. fi
  3483. if [ ! -f $ONERNG_PACKAGE ]; then
  3484. echo $"OneRNG package could not be downloaded"
  3485. exit 59249
  3486. fi
  3487. # Check the hash
  3488. hash=$(sha256sum $ONERNG_PACKAGE | awk -F ' ' '{print $1}')
  3489. if [[ $hash != $ONERNG_PACKAGE_HASH ]]; then
  3490. echo $"OneRNG package: $ONERNG_PACKAGE"
  3491. echo $"Hash does not match. This could indicate that the package has been tampered with."
  3492. echo $"OneRNG expected package hash: $ONERNG_PACKAGE_HASH"
  3493. echo $"OneRNG actual hash: $hash"
  3494. exit 25934
  3495. fi
  3496. # install the package
  3497. dpkg -i $ONERNG_PACKAGE
  3498. # Check that the install worked
  3499. if [ ! -f /etc/onerng.conf ]; then
  3500. echo $'OneRNG configuration file not found. The package may not have installed successfully.'
  3501. exit 42904
  3502. fi
  3503. dialog --title $"OneRNG Device" \
  3504. --msgbox $"Please plug in the OneRNG device" 6 40
  3505. # check rng-tools configuration
  3506. if ! grep -q "/dev/$ONERNG_DEVICE" /etc/default/rng-tools; then
  3507. echo "HRNGDEVICE=/dev/$ONERNG_DEVICE" >> /etc/default/rng-tools
  3508. fi
  3509. systemctl restart rng-tools
  3510. }
  3511. function random_number_generator {
  3512. if grep -Fxq "random_number_generator" $COMPLETION_FILE; then
  3513. return
  3514. fi
  3515. if [[ $INSTALLED_WITHIN_DOCKER == "yes" ]]; then
  3516. # it is assumed that docker uses the random number
  3517. # generator of the host system
  3518. return
  3519. fi
  3520. # if the hrng type has not been set but /dev/hwrng is detected
  3521. if [[ $HWRNG_TYPE != "beaglebone" ]]; then
  3522. if [ -e /dev/hwrng ]; then
  3523. HWRNG_TYPE="beaglebone"
  3524. fi
  3525. fi
  3526. case $HWRNG_TYPE in
  3527. beaglebone)
  3528. apt-get -y install rng-tools
  3529. sed -i 's|#HRNGDEVICE=/dev/hwrng|HRNGDEVICE=/dev/hwrng|g' /etc/default/rng-tools
  3530. ;;
  3531. onerng)
  3532. install_onerng
  3533. ;;
  3534. *)
  3535. apt-get -y install haveged
  3536. ;;
  3537. esac
  3538. echo 'random_number_generator' >> $COMPLETION_FILE
  3539. }
  3540. function configure_ssh {
  3541. if grep -Fxq "configure_ssh" $COMPLETION_FILE; then
  3542. return
  3543. fi
  3544. sed -i "s/Port .*/Port $SSH_PORT/g" /etc/ssh/sshd_config
  3545. sed -i 's/PermitRootLogin.*/PermitRootLogin no/g' /etc/ssh/sshd_config
  3546. sed -i 's/X11Forwarding.*/X11Forwarding no/g' /etc/ssh/sshd_config
  3547. sed -i 's/ServerKeyBits.*/ServerKeyBits 4096/g' /etc/ssh/sshd_config
  3548. sed -i 's/TCPKeepAlive.*/TCPKeepAlive no/g' /etc/ssh/sshd_config
  3549. sed -i 's|HostKey /etc/ssh/ssh_host_dsa_key|#HostKey /etc/ssh/ssh_host_dsa_key|g' /etc/ssh/sshd_config
  3550. sed -i 's|HostKey /etc/ssh/ssh_host_ecdsa_key|#HostKey /etc/ssh/ssh_host_ecdsa_key|g' /etc/ssh/sshd_config
  3551. if ! grep -q 'DebianBanner' /etc/ssh/sshd_config; then
  3552. echo 'DebianBanner no' >> /etc/ssh/sshd_config
  3553. else
  3554. sed -i 's|DebianBanner.*|DebianBanner no|g' /etc/ssh/sshd_config
  3555. fi
  3556. if grep -q 'ClientAliveInterval' /etc/ssh/sshd_config; then
  3557. sed -i 's/ClientAliveInterval.*/ClientAliveInterval 60/g' /etc/ssh/sshd_config
  3558. else
  3559. echo 'ClientAliveInterval 60' >> /etc/ssh/sshd_config
  3560. fi
  3561. if grep -q 'ClientAliveCountMax' /etc/ssh/sshd_config; then
  3562. sed -i 's/ClientAliveCountMax.*/ClientAliveCountMax 3/g' /etc/ssh/sshd_config
  3563. else
  3564. echo 'ClientAliveCountMax 3' >> /etc/ssh/sshd_config
  3565. fi
  3566. if grep -q 'Ciphers' /etc/ssh/sshd_config; then
  3567. sed -i "s|Ciphers.*|Ciphers $SSH_CIPHERS|g" /etc/ssh/sshd_config
  3568. else
  3569. echo "Ciphers $SSH_CIPHERS" >> /etc/ssh/sshd_config
  3570. fi
  3571. if grep -q 'MACs' /etc/ssh/sshd_config; then
  3572. sed -i "s|MACs.*|MACs $SSH_MACS|g" /etc/ssh/sshd_config
  3573. else
  3574. echo "MACs $SSH_MACS" >> /etc/ssh/sshd_config
  3575. fi
  3576. if grep -q 'KexAlgorithms' /etc/ssh/sshd_config; then
  3577. sed -i "s|KexAlgorithms.*|KexAlgorithms $SSH_KEX|g" /etc/ssh/sshd_config
  3578. else
  3579. echo "KexAlgorithms $SSH_KEX" >> /etc/ssh/sshd_config
  3580. fi
  3581. apt-get -y install fail2ban
  3582. echo 'configure_ssh' >> $COMPLETION_FILE
  3583. }
  3584. function configure_ssh_onion {
  3585. if grep -Fxq "configure_ssh_onion" $COMPLETION_FILE; then
  3586. return
  3587. fi
  3588. if [[ $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  3589. return
  3590. fi
  3591. SSH_ONION_HOSTNAME=$(add_onion_service ssh ${SSH_PORT} ${SSH_PORT})
  3592. if ! grep -q "ssh onion domain" $COMPLETION_FILE; then
  3593. echo "ssh onion domain:${SSH_ONION_HOSTNAME}" >> $COMPLETION_FILE
  3594. else
  3595. sed -i "s|ssh onion domain.*|ssh onion domain:${SSH_ONION_HOSTNAME}|g" $COMPLETION_FILE
  3596. fi
  3597. echo 'configure_ssh_onion' >> $COMPLETION_FILE
  3598. }
  3599. # see https://stribika.github.io/2015/01/04/secure-secure-shell.html
  3600. function ssh_remove_small_moduli {
  3601. awk '$5 > 2000' /etc/ssh/moduli > ~/moduli
  3602. mv ~/moduli /etc/ssh/moduli
  3603. }
  3604. function configure_ssh_client {
  3605. if grep -Fxq "configure_ssh_client" $COMPLETION_FILE; then
  3606. return
  3607. fi
  3608. #sed -i 's/# PasswordAuthentication.*/ PasswordAuthentication no/g' /etc/ssh/ssh_config
  3609. #sed -i 's/# ChallengeResponseAuthentication.*/ ChallengeResponseAuthentication no/g' /etc/ssh/ssh_config
  3610. sed -i "s/# HostKeyAlgorithms.*/ HostKeyAlgorithms $SSH_HOST_KEY_ALGORITHMS/g" /etc/ssh/ssh_config
  3611. sed -i "s/# Ciphers.*/ Ciphers $SSH_CIPHERS/g" /etc/ssh/ssh_config
  3612. sed -i "s/# MACs.*/ MACs $SSH_MACS/g" /etc/ssh/ssh_config
  3613. if ! grep -q "HostKeyAlgorithms" /etc/ssh/ssh_config; then
  3614. echo " HostKeyAlgorithms $SSH_HOST_KEY_ALGORITHMS" >> /etc/ssh/ssh_config
  3615. fi
  3616. sed -i "s/Ciphers.*/Ciphers $SSH_CIPHERS/g" /etc/ssh/ssh_config
  3617. if ! grep -q "Ciphers " /etc/ssh/ssh_config; then
  3618. echo " Ciphers $SSH_CIPHERS" >> /etc/ssh/ssh_config
  3619. fi
  3620. sed -i "s/MACs.*/MACs $SSH_MACS/g" /etc/ssh/ssh_config
  3621. if ! grep -q "MACs " /etc/ssh/ssh_config; then
  3622. echo " MACs $SSH_MACS" >> /etc/ssh/ssh_config
  3623. fi
  3624. # Create ssh keys
  3625. if [ ! -f ~/.ssh/id_ed25519 ]; then
  3626. ssh-keygen -t ed25519 -o -a 100
  3627. fi
  3628. if [ ! -f ~/.ssh/id_rsa ]; then
  3629. ssh-keygen -t rsa -b 4096 -o -a 100
  3630. fi
  3631. ssh_remove_small_moduli
  3632. echo 'configure_ssh_client' >> $COMPLETION_FILE
  3633. }
  3634. function regenerate_ssh_keys {
  3635. if grep -Fxq "regenerate_ssh_keys" $COMPLETION_FILE; then
  3636. return
  3637. fi
  3638. rm -f /etc/ssh/ssh_host_*
  3639. dpkg-reconfigure openssh-server
  3640. ssh_remove_small_moduli
  3641. systemctl restart ssh
  3642. echo 'regenerate_ssh_keys' >> $COMPLETION_FILE
  3643. }
  3644. function configure_dns {
  3645. if grep -Fxq "configure_dns" $COMPLETION_FILE; then
  3646. return
  3647. fi
  3648. echo 'domain localdomain' > /etc/resolv.conf
  3649. echo 'search localdomain' >> /etc/resolv.conf
  3650. echo "nameserver $NAMESERVER1" >> /etc/resolv.conf
  3651. echo "nameserver $NAMESERVER2" >> /etc/resolv.conf
  3652. echo 'configure_dns' >> $COMPLETION_FILE
  3653. }
  3654. function set_hostname {
  3655. DEFAULT_DOMAIN_NAME="$1"
  3656. echo "$DEFAULT_DOMAIN_NAME" > /etc/hostname
  3657. hostname $DEFAULT_DOMAIN_NAME
  3658. if grep -q "127.0.1.1" /etc/hosts; then
  3659. sed -i "s/127.0.1.1.*/127.0.1.1 $DEFAULT_DOMAIN_NAME/g" /etc/hosts
  3660. else
  3661. echo "127.0.1.1 $DEFAULT_DOMAIN_NAME" >> /etc/hosts
  3662. fi
  3663. }
  3664. function set_your_domain_name {
  3665. if grep -Fxq "set_your_domain_name" $COMPLETION_FILE; then
  3666. return
  3667. fi
  3668. set_hostname $DEFAULT_DOMAIN_NAME
  3669. echo 'set_your_domain_name' >> $COMPLETION_FILE
  3670. }
  3671. function time_synchronisation {
  3672. # mesh peers typically don't sync over the internet
  3673. if [[ $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  3674. return
  3675. fi
  3676. if [ -f /usr/local/bin/${PROJECT_NAME}-update-date ]; then
  3677. cp /usr/local/bin/${PROJECT_NAME}-update-date /usr/bin/updatedate
  3678. else
  3679. cp /usr/bin/${PROJECT_NAME}-update-date /usr/bin/updatedate
  3680. fi
  3681. chmod +x /usr/bin/updatedate
  3682. if grep -Fxq "time_synchronisation" $COMPLETION_FILE; then
  3683. return
  3684. fi
  3685. apt-get -y install tlsdate
  3686. apt-get -y remove ntpdate
  3687. echo '*/15 * * * * root /usr/bin/updatedate' >> /etc/crontab
  3688. systemctl restart cron
  3689. echo 'time_synchronisation' >> $COMPLETION_FILE
  3690. }
  3691. function configure_firewall {
  3692. if grep -Fxq "configure_firewall" $COMPLETION_FILE; then
  3693. return
  3694. fi
  3695. if [[ $INSTALLED_WITHIN_DOCKER == "yes" ]]; then
  3696. # docker does its own firewalling
  3697. return
  3698. fi
  3699. iptables -P INPUT ACCEPT
  3700. ip6tables -P INPUT ACCEPT
  3701. iptables -F
  3702. ip6tables -F
  3703. iptables -t nat -F
  3704. ip6tables -t nat -F
  3705. iptables -X
  3706. ip6tables -X
  3707. iptables -P INPUT DROP
  3708. ip6tables -P INPUT DROP
  3709. iptables -A INPUT -i lo -j ACCEPT
  3710. iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
  3711. # Make sure incoming tcp connections are SYN packets
  3712. iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
  3713. # Drop packets with incoming fragments
  3714. iptables -A INPUT -f -j DROP
  3715. # Drop bogons
  3716. iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
  3717. iptables -A INPUT -p tcp --tcp-flags ALL FIN,PSH,URG -j DROP
  3718. iptables -A INPUT -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP
  3719. # Incoming malformed NULL packets:
  3720. iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
  3721. echo 'configure_firewall' >> $COMPLETION_FILE
  3722. }
  3723. function configure_firewall_ping {
  3724. if grep -Fxq "configure_firewall_ping" $COMPLETION_FILE; then
  3725. return
  3726. fi
  3727. # Only allow ping for mesh installs
  3728. if [[ $SYSTEM_TYPE != "$VARIANT_MESH" ]]; then
  3729. return
  3730. fi
  3731. iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
  3732. iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT
  3733. save_firewall_settings
  3734. echo 'configure_firewall_ping' >> $COMPLETION_FILE
  3735. }
  3736. function configure_firewall_for_voip {
  3737. 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
  3738. return
  3739. fi
  3740. if grep -Fxq "configure_firewall_for_voip" $COMPLETION_FILE; then
  3741. return
  3742. fi
  3743. if [[ $ONION_ONLY != "no" ]]; then
  3744. return
  3745. fi
  3746. iptables -A INPUT -p udp --dport $VOIP_PORT -j ACCEPT
  3747. iptables -A INPUT -p tcp --dport $VOIP_PORT -j ACCEPT
  3748. save_firewall_settings
  3749. echo 'configure_firewall_for_voip' >> $COMPLETION_FILE
  3750. }
  3751. function configure_firewall_for_sip {
  3752. 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
  3753. return
  3754. fi
  3755. if grep -Fxq "configure_firewall_for_sip" $COMPLETION_FILE; then
  3756. return
  3757. fi
  3758. if [[ $ONION_ONLY != "no" ]]; then
  3759. return
  3760. fi
  3761. iptables -A INPUT -p udp --dport $SIP_PORT -j ACCEPT
  3762. iptables -A INPUT -p tcp --dport $SIP_PORT -j ACCEPT
  3763. save_firewall_settings
  3764. echo 'configure_firewall_for_sip' >> $COMPLETION_FILE
  3765. }
  3766. function configure_firewall_for_ipfs {
  3767. if [[ $SYSTEM_TYPE == "$VARIANT_MAILBOX" || $SYSTEM_TYPE == "$VARIANT_CHAT" ]]; then
  3768. return
  3769. fi
  3770. if grep -Fxq "configure_firewall_for_ipfs" $COMPLETION_FILE; then
  3771. return
  3772. fi
  3773. if [[ $ONION_ONLY != "no" ]]; then
  3774. return
  3775. fi
  3776. iptables -A INPUT -p tcp --dport $IPFS_PORT -j ACCEPT
  3777. save_firewall_settings
  3778. echo 'configure_firewall_for_ipfs' >> $COMPLETION_FILE
  3779. }
  3780. function configure_firewall_for_avahi {
  3781. if grep -Fxq "configure_firewall_for_avahi" $COMPLETION_FILE; then
  3782. return
  3783. fi
  3784. iptables -A INPUT -p tcp --dport 548 -j ACCEPT
  3785. iptables -A INPUT -p udp --dport 548 -j ACCEPT
  3786. iptables -A INPUT -p tcp --dport 5353 -j ACCEPT
  3787. iptables -A INPUT -p udp --dport 5353 -j ACCEPT
  3788. iptables -A INPUT -p tcp --dport 5354 -j ACCEPT
  3789. iptables -A INPUT -p udp --dport 5354 -j ACCEPT
  3790. save_firewall_settings
  3791. echo 'configure_firewall_for_avahi' >> $COMPLETION_FILE
  3792. }
  3793. function configure_firewall_for_cjdns {
  3794. if grep -Fxq "configure_firewall_for_cjdns" $COMPLETION_FILE; then
  3795. return
  3796. fi
  3797. if [[ $ENABLE_CJDNS != "yes" ]]; then
  3798. return
  3799. fi
  3800. ip6tables -t nat -A POSTROUTING -o tun0 -j MASQUERADE
  3801. ip6tables -A FORWARD -i tun0 -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
  3802. save_firewall_settings
  3803. echo 'configure_firewall_for_cjdns' >> $COMPLETION_FILE
  3804. }
  3805. function configure_firewall_for_batman {
  3806. if grep -Fxq "configure_firewall_for_batman" $COMPLETION_FILE; then
  3807. return
  3808. fi
  3809. if [[ $ENABLE_BATMAN != "yes" ]]; then
  3810. return
  3811. fi
  3812. save_firewall_settings
  3813. echo 'configure_firewall_for_batman' >> $COMPLETION_FILE
  3814. }
  3815. function configure_firewall_for_babel {
  3816. if grep -Fxq "configure_firewall_for_babel" $COMPLETION_FILE; then
  3817. return
  3818. fi
  3819. if [[ $ENABLE_BABEL != "yes" ]]; then
  3820. return
  3821. fi
  3822. iptables -A INPUT -i $WIFI_INTERFACE -p udp --dport $BABEL_PORT -j ACCEPT
  3823. save_firewall_settings
  3824. echo 'configure_firewall_for_babel' >> $COMPLETION_FILE
  3825. }
  3826. function configure_firewall_for_zeronet {
  3827. if grep -Fxq "configure_firewall_for_zeronet" $COMPLETION_FILE; then
  3828. return
  3829. fi
  3830. if [[ $SYSTEM_TYPE != "$VARIANT_MESH" ]]; then
  3831. return
  3832. fi
  3833. iptables -A INPUT -i $WIFI_INTERFACE -p udp --dport $ZERONET_PORT -j ACCEPT
  3834. iptables -A INPUT -i $WIFI_INTERFACE -p tcp --dport $ZERONET_PORT -j ACCEPT
  3835. iptables -A INPUT -i $WIFI_INTERFACE -p udp --dport $TRACKER_PORT -j ACCEPT
  3836. iptables -A INPUT -i $WIFI_INTERFACE -p tcp --dport $TRACKER_PORT -j ACCEPT
  3837. iptables -A INPUT -i $WIFI_INTERFACE -p udp --dport 1900 -j ACCEPT
  3838. save_firewall_settings
  3839. echo 'configure_firewall_for_zeronet' >> $COMPLETION_FILE
  3840. }
  3841. function configure_firewall_for_dlna {
  3842. if grep -Fxq "configure_firewall_for_dlna" $COMPLETION_FILE; then
  3843. return
  3844. fi
  3845. if [[ $INSTALLED_WITHIN_DOCKER == "yes" ]]; then
  3846. # docker does its own firewalling
  3847. return
  3848. fi
  3849. if [[ $SYSTEM_TYPE == "$VARIANT_CLOUD" || $SYSTEM_TYPE == "$VARIANT_MAILBOX" || $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_WRITER" || $SYSTEM_TYPE == "$VARIANT_SOCIAL" ]]; then
  3850. return
  3851. fi
  3852. iptables -A INPUT -p udp --dport 1900 -j ACCEPT
  3853. iptables -A INPUT -p tcp --dport 8200 -j ACCEPT
  3854. save_firewall_settings
  3855. echo 'configure_firewall_for_dlna' >> $COMPLETION_FILE
  3856. }
  3857. function configure_firewall_for_dns {
  3858. if grep -Fxq "configure_firewall_for_dns" $COMPLETION_FILE; then
  3859. return
  3860. fi
  3861. if [[ $INSTALLED_WITHIN_DOCKER == "yes" ]]; then
  3862. # docker does its own firewalling
  3863. return
  3864. fi
  3865. iptables -A INPUT -p udp -m udp --dport 1024:65535 --sport 53 -j ACCEPT
  3866. save_firewall_settings
  3867. echo 'configure_firewall_for_dns' >> $COMPLETION_FILE
  3868. }
  3869. function configure_firewall_for_xmpp {
  3870. if [ ! -d /etc/prosody ]; then
  3871. return
  3872. fi
  3873. if grep -Fxq "configure_firewall_for_xmpp" $COMPLETION_FILE; then
  3874. return
  3875. fi
  3876. if [[ $INSTALLED_WITHIN_DOCKER == "yes" ]]; then
  3877. # docker does its own firewalling
  3878. return
  3879. fi
  3880. if [[ $ONION_ONLY != "no" ]]; then
  3881. return
  3882. fi
  3883. iptables -A INPUT -p tcp --dport 5222:5223 -j ACCEPT
  3884. iptables -A INPUT -p tcp --dport 5269 -j ACCEPT
  3885. iptables -A INPUT -p tcp --dport 5280:5281 -j ACCEPT
  3886. save_firewall_settings
  3887. echo 'configure_firewall_for_xmpp' >> $COMPLETION_FILE
  3888. }
  3889. function configure_firewall_for_irc {
  3890. if [ ! -d /etc/ngircd ]; then
  3891. return
  3892. fi
  3893. if grep -Fxq "configure_firewall_for_irc" $COMPLETION_FILE; then
  3894. return
  3895. fi
  3896. if [[ $INSTALLED_WITHIN_DOCKER == "yes" ]]; then
  3897. # docker does its own firewalling
  3898. return
  3899. fi
  3900. if [[ $ONION_ONLY != "no" ]]; then
  3901. return
  3902. fi
  3903. iptables -A INPUT -p tcp --dport $IRC_PORT -j ACCEPT
  3904. iptables -I INPUT -p tcp --dport 1024:65535 --sport $IRC_PORT -j ACCEPT
  3905. save_firewall_settings
  3906. echo 'configure_firewall_for_irc' >> $COMPLETION_FILE
  3907. }
  3908. function configure_firewall_for_ftp {
  3909. if grep -Fxq "configure_firewall_for_ftp" $COMPLETION_FILE; then
  3910. return
  3911. fi
  3912. if [[ $INSTALLED_WITHIN_DOCKER == "yes" ]]; then
  3913. # docker does its own firewalling
  3914. return
  3915. fi
  3916. if [[ $ONION_ONLY != "no" ]]; then
  3917. return
  3918. fi
  3919. iptables -I INPUT -p tcp --dport 1024:65535 --sport 20:21 -j ACCEPT
  3920. save_firewall_settings
  3921. echo 'configure_firewall_for_ftp' >> $COMPLETION_FILE
  3922. }
  3923. function configure_firewall_for_web_access {
  3924. if grep -Fxq "configure_firewall_for_web_access" $COMPLETION_FILE; then
  3925. return
  3926. fi
  3927. if [[ $INSTALLED_WITHIN_DOCKER == "yes" ]]; then
  3928. # docker does its own firewalling
  3929. return
  3930. fi
  3931. if [[ $ONION_ONLY != "no" ]]; then
  3932. return
  3933. fi
  3934. iptables -A INPUT -p tcp --dport 32768:61000 --sport 80 -j ACCEPT
  3935. iptables -A INPUT -p tcp --dport 32768:61000 --sport 443 -j ACCEPT
  3936. save_firewall_settings
  3937. echo 'configure_firewall_for_web_access' >> $COMPLETION_FILE
  3938. }
  3939. function configure_firewall_for_web_server {
  3940. if grep -Fxq "configure_firewall_for_web_server" $COMPLETION_FILE; then
  3941. return
  3942. fi
  3943. if [[ $INSTALLED_WITHIN_DOCKER == "yes" ]]; then
  3944. # docker does its own firewalling
  3945. return
  3946. fi
  3947. if [[ $ONION_ONLY != "no" ]]; then
  3948. return
  3949. fi
  3950. iptables -A INPUT -p tcp --dport 80 -j ACCEPT
  3951. iptables -A INPUT -p tcp --dport 443 -j ACCEPT
  3952. save_firewall_settings
  3953. echo 'configure_firewall_for_web_server' >> $COMPLETION_FILE
  3954. }
  3955. function configure_firewall_for_tox {
  3956. if grep -Fxq "configure_firewall_for_tox" $COMPLETION_FILE; then
  3957. return
  3958. fi
  3959. if [[ $INSTALLED_WITHIN_DOCKER == "yes" ]]; then
  3960. # docker does its own firewalling
  3961. return
  3962. fi
  3963. if [[ $ONION_ONLY != "no" ]]; then
  3964. return
  3965. fi
  3966. iptables -A INPUT -p tcp --dport $TOX_PORT -j ACCEPT
  3967. save_firewall_settings
  3968. echo 'configure_firewall_for_tox' >> $COMPLETION_FILE
  3969. }
  3970. function configure_firewall_for_ssh {
  3971. if grep -Fxq "configure_firewall_for_ssh" $COMPLETION_FILE; then
  3972. return
  3973. fi
  3974. if [[ $INSTALLED_WITHIN_DOCKER == "yes" ]]; then
  3975. # docker does its own firewalling
  3976. return
  3977. fi
  3978. iptables -A INPUT -p tcp --dport 22 -j ACCEPT
  3979. iptables -A INPUT -p tcp --dport $SSH_PORT -j ACCEPT
  3980. save_firewall_settings
  3981. echo 'configure_firewall_for_ssh' >> $COMPLETION_FILE
  3982. }
  3983. function configure_firewall_for_git {
  3984. if grep -Fxq "configure_firewall_for_git" $COMPLETION_FILE; then
  3985. return
  3986. fi
  3987. if [[ $INSTALLED_WITHIN_DOCKER == "yes" ]]; then
  3988. # docker does its own firewalling
  3989. return
  3990. fi
  3991. if [[ $ONION_ONLY != "no" ]]; then
  3992. return
  3993. fi
  3994. iptables -A INPUT -p tcp --dport 9418 -j ACCEPT
  3995. save_firewall_settings
  3996. echo 'configure_firewall_for_git' >> $COMPLETION_FILE
  3997. }
  3998. function configure_firewall_for_email {
  3999. 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
  4000. return
  4001. fi
  4002. if grep -Fxq "configure_firewall_for_email" $COMPLETION_FILE; then
  4003. return
  4004. fi
  4005. if [[ $INSTALLED_WITHIN_DOCKER == "yes" ]]; then
  4006. # docker does its own firewalling
  4007. return
  4008. fi
  4009. if [[ $ONION_ONLY != "no" ]]; then
  4010. return
  4011. fi
  4012. iptables -A INPUT -p tcp --dport 25 -j ACCEPT
  4013. iptables -A INPUT -p tcp --dport 587 -j ACCEPT
  4014. iptables -A INPUT -p tcp --dport 465 -j ACCEPT
  4015. iptables -A INPUT -p tcp --dport 993 -j ACCEPT
  4016. save_firewall_settings
  4017. echo 'configure_firewall_for_email' >> $COMPLETION_FILE
  4018. }
  4019. function configure_internet_protocol {
  4020. if grep -Fxq "configure_internet_protocol" $COMPLETION_FILE; then
  4021. return
  4022. fi
  4023. if [[ $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  4024. return
  4025. fi
  4026. sed -i "s/#net.ipv4.tcp_syncookies=1/net.ipv4.tcp_syncookies=1/g" /etc/sysctl.conf
  4027. sed -i "s/#net.ipv4.conf.all.accept_redirects = 0/net.ipv4.conf.all.accept_redirects = 0/g" /etc/sysctl.conf
  4028. sed -i "s/#net.ipv6.conf.all.accept_redirects = 0/net.ipv6.conf.all.accept_redirects = 0/g" /etc/sysctl.conf
  4029. sed -i "s/#net.ipv4.conf.all.send_redirects = 0/net.ipv4.conf.all.send_redirects = 0/g" /etc/sysctl.conf
  4030. sed -i "s/#net.ipv4.conf.all.accept_source_route = 0/net.ipv4.conf.all.accept_source_route = 0/g" /etc/sysctl.conf
  4031. sed -i "s/#net.ipv6.conf.all.accept_source_route = 0/net.ipv6.conf.all.accept_source_route = 0/g" /etc/sysctl.conf
  4032. sed -i "s/#net.ipv4.conf.default.rp_filter=1/net.ipv4.conf.default.rp_filter=1/g" /etc/sysctl.conf
  4033. sed -i "s/#net.ipv4.conf.all.rp_filter=1/net.ipv4.conf.all.rp_filter=1/g" /etc/sysctl.conf
  4034. sed -i "s/#net.ipv4.ip_forward=1/net.ipv4.ip_forward=0/g" /etc/sysctl.conf
  4035. sed -i "s/#net.ipv6.conf.all.forwarding=1/net.ipv6.conf.all.forwarding=0/g" /etc/sysctl.conf
  4036. if ! grep -q "ignore pings" /etc/sysctl.conf; then
  4037. echo '# ignore pings' >> /etc/sysctl.conf
  4038. echo 'net.ipv4.icmp_echo_ignore_all = 1' >> /etc/sysctl.conf
  4039. echo 'net.ipv6.icmp_echo_ignore_all = 1' >> /etc/sysctl.conf
  4040. fi
  4041. if ! grep -q "disable ipv6" /etc/sysctl.conf; then
  4042. echo '# disable ipv6' >> /etc/sysctl.conf
  4043. echo 'net.ipv6.conf.all.disable_ipv6 = 1' >> /etc/sysctl.conf
  4044. fi
  4045. if ! grep -q "net.ipv4.tcp_synack_retries" /etc/sysctl.conf; then
  4046. echo 'net.ipv4.tcp_synack_retries = 2' >> /etc/sysctl.conf
  4047. echo 'net.ipv4.tcp_syn_retries = 1' >> /etc/sysctl.conf
  4048. fi
  4049. if ! grep -q "keepalive" /etc/sysctl.conf; then
  4050. echo '# keepalive' >> /etc/sysctl.conf
  4051. echo 'net.ipv4.tcp_keepalive_probes = 9' >> /etc/sysctl.conf
  4052. echo 'net.ipv4.tcp_keepalive_intvl = 75' >> /etc/sysctl.conf
  4053. echo 'net.ipv4.tcp_keepalive_time = 7200' >> /etc/sysctl.conf
  4054. fi
  4055. echo 'configure_internet_protocol' >> $COMPLETION_FILE
  4056. }
  4057. function configure_email {
  4058. if [[ $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  4059. return
  4060. fi
  4061. if grep -Fxq "configure_email" $COMPLETION_FILE; then
  4062. return
  4063. fi
  4064. apt-get -y remove postfix
  4065. apt-get -y install exim4 sasl2-bin swaks libnet-ssleay-perl procmail xinetd
  4066. if [ ! -d /etc/exim4 ]; then
  4067. echo $"ERROR: Exim does not appear to have installed. $CHECK_MESSAGE"
  4068. exit 48
  4069. fi
  4070. onion_service_name='email'
  4071. if [ ! -d /var/lib/tor ]; then
  4072. echo $"No Tor installation found. ${onion_service_name} onion site cannot be configured."
  4073. exit 877367
  4074. fi
  4075. if ! grep -q "hidden_service_${onion_service_name}" /etc/tor/torrc; then
  4076. echo "HiddenServiceDir /var/lib/tor/hidden_service_${onion_service_name}/" >> /etc/tor/torrc
  4077. echo 'HiddenServicePort 25 127.0.0.1:25' >> /etc/tor/torrc
  4078. echo 'HiddenServicePort 587 127.0.0.1:587' >> /etc/tor/torrc
  4079. echo 'HiddenServicePort 465 127.0.0.1:465' >> /etc/tor/torrc
  4080. echo 'HiddenServicePort 993 127.0.0.1:993' >> /etc/tor/torrc
  4081. echo $"Added onion site for ${onion_service_name}"
  4082. fi
  4083. systemctl restart tor
  4084. wait_for_onion_service ${onion_service_name}
  4085. if [ ! -f /var/lib/tor/hidden_service_${onion_service_name}/hostname ]; then
  4086. echo $"${onion_service_name} onion site hostname not found"
  4087. exit 76362
  4088. fi
  4089. EMAIL_ONION_HOSTNAME=$(cat /var/lib/tor/hidden_service_${onion_service_name}/hostname)
  4090. if [[ $ONION_ONLY != "no" ]]; then
  4091. set_hostname ${EMAIL_ONION_HOSTNAME}
  4092. MY_EMAIL_ADDRESS=${MY_USERNAME}@${DEFAULT_DOMAIN_NAME}
  4093. fi
  4094. if ! grep -q "Email onion domain" $COMPLETION_FILE; then
  4095. echo "Email onion domain:${EMAIL_ONION_HOSTNAME}" >> $COMPLETION_FILE
  4096. else
  4097. sed -i "s|Email onion domain.*|Email onion domain:${EMAIL_ONION_HOSTNAME}|g" $COMPLETION_FILE
  4098. fi
  4099. # see https://github.com/petterreinholdtsen/exim4-smtorp
  4100. echo '# tor stuff first' > /etc/exim4/conf.d/router/100_exim4-smtorp
  4101. echo '#' >> /etc/exim4/conf.d/router/100_exim4-smtorp
  4102. echo '# if were submitting mail *from* a .tor/.onion address,' >> /etc/exim4/conf.d/router/100_exim4-smtorp
  4103. echo '# make sure any header lines that may give us away is' >> /etc/exim4/conf.d/router/100_exim4-smtorp
  4104. echo '# stripped out, and add a new, cryptic Message-ID.' >> /etc/exim4/conf.d/router/100_exim4-smtorp
  4105. echo '# In address_data we store the name we should HELO as.' >> /etc/exim4/conf.d/router/100_exim4-smtorp
  4106. echo 'tor_to_any:' >> /etc/exim4/conf.d/router/100_exim4-smtorp
  4107. echo ' debug_print = "R: manualroute from .onion to $local_part@$domain"' >> /etc/exim4/conf.d/router/100_exim4-smtorp
  4108. echo ' driver = manualroute' >> /etc/exim4/conf.d/router/100_exim4-smtorp
  4109. echo ' domains = ! +local_domains' >> /etc/exim4/conf.d/router/100_exim4-smtorp
  4110. echo ' condition = ${if match {$sender_address_domain}{\N.*\.(onion|tor)$\N}}' >> /etc/exim4/conf.d/router/100_exim4-smtorp
  4111. echo ' address_data = $sender_address_domain' >> /etc/exim4/conf.d/router/100_exim4-smtorp
  4112. echo ' transport = remote_smtp_onion' >> /etc/exim4/conf.d/router/100_exim4-smtorp
  4113. echo ' self = send' >> /etc/exim4/conf.d/router/100_exim4-smtorp
  4114. echo ' route_list = * localhost' >> /etc/exim4/conf.d/router/100_exim4-smtorp
  4115. echo ' headers_remove = Received:Message-ID:X-Mailer:User-Agent' >> /etc/exim4/conf.d/router/100_exim4-smtorp
  4116. echo ' headers_add = Message-ID: <${lc:${sha1:$message_id}}@$sender_address_domain>' >> /etc/exim4/conf.d/router/100_exim4-smtorp
  4117. echo '' >> /etc/exim4/conf.d/router/100_exim4-smtorp
  4118. echo '# this catches the case where were submitting mail' >> /etc/exim4/conf.d/router/100_exim4-smtorp
  4119. echo '# from a regular email address where we dont need to' >> /etc/exim4/conf.d/router/100_exim4-smtorp
  4120. echo '# rewrite any headers' >> /etc/exim4/conf.d/router/100_exim4-smtorp
  4121. echo 'any_to_tor:' >> /etc/exim4/conf.d/router/100_exim4-smtorp
  4122. echo ' debug_print = "R: manualroute for $local_part@$domain"' >> /etc/exim4/conf.d/router/100_exim4-smtorp
  4123. echo ' driver = manualroute' >> /etc/exim4/conf.d/router/100_exim4-smtorp
  4124. echo ' domains = ! +local_domains' >> /etc/exim4/conf.d/router/100_exim4-smtorp
  4125. echo ' transport = remote_smtp_onion' >> /etc/exim4/conf.d/router/100_exim4-smtorp
  4126. echo ' self = send' >> /etc/exim4/conf.d/router/100_exim4-smtorp
  4127. echo ' route_list = *.onion localhost ; *.tor localhost' >> /etc/exim4/conf.d/router/100_exim4-smtorp
  4128. echo ' address_data = $smtp_active_hostname' >> /etc/exim4/conf.d/router/100_exim4-smtorp
  4129. echo 'remote_smtp_onion:' > /etc/exim4/conf.d/transport/100_exim4-smtorp
  4130. echo ' debug_print = "T: remote_smtp_onion for $local_part@$original_domain"' >> /etc/exim4/conf.d/transport/100_exim4-smtorp
  4131. echo ' driver = smtp' >> /etc/exim4/conf.d/transport/100_exim4-smtorp
  4132. echo '' >> /etc/exim4/conf.d/transport/100_exim4-smtorp
  4133. echo ' # set helo_data to where we want to connect to,' >> /etc/exim4/conf.d/transport/100_exim4-smtorp
  4134. echo ' # for the proxy program tor-smtp' >> /etc/exim4/conf.d/transport/100_exim4-smtorp
  4135. echo ' helo_data = "$address_data $original_domain"' >> /etc/exim4/conf.d/transport/100_exim4-smtorp
  4136. echo '' >> /etc/exim4/conf.d/transport/100_exim4-smtorp
  4137. echo ' # wherever we configured our script at' >> /etc/exim4/conf.d/transport/100_exim4-smtorp
  4138. echo ' port = 12668' >> /etc/exim4/conf.d/transport/100_exim4-smtorp
  4139. echo '' >> /etc/exim4/conf.d/transport/100_exim4-smtorp
  4140. echo ' # cannot use TLS otherwise it will EHLO again!!' >> /etc/exim4/conf.d/transport/100_exim4-smtorp
  4141. echo ' hosts_avoid_tls = *' >> /etc/exim4/conf.d/transport/100_exim4-smtorp
  4142. if [ ! -d $INSTALL_DIR ]; then
  4143. mkdir -p $INSTALL_DIR
  4144. fi
  4145. cd $INSTALL_DIR
  4146. git_clone $EXIM_ONION_REPO $INSTALL_DIR/exim4-smtorp
  4147. cd $INSTALL_DIR/exim4-smtorp/tor-smtp
  4148. make
  4149. if [ ! -f $INSTALL_DIR/exim4-smtorp/tor-smtp/tor-smtp ]; then
  4150. echo $'Unable to make tor smtp transport'
  4151. exit 52629
  4152. fi
  4153. if [ ! -d /usr/lib/exim4-smtorp ]; then
  4154. mkdir /usr/lib/exim4-smtorp
  4155. fi
  4156. cp $INSTALL_DIR/exim4-smtorp/tor-smtp/tor-smtp /usr/lib/exim4-smtorp/tor-smtp
  4157. if [ ! -f /usr/lib/exim4-smtorp/tor-smtp ]; then
  4158. echo $'Unable to copy tor-smtp'
  4159. exit 83503
  4160. fi
  4161. cp $INSTALL_DIR/exim4-smtorp/xinetd /etc/xinetd.d/tor-smtp
  4162. if [ ! -f /etc/xinetd.d/tor-smtp ]; then
  4163. echo $'Unable to copy to xinetd.d'
  4164. exit 835954
  4165. fi
  4166. systemctl restart xinetd
  4167. # configure for Maildir format
  4168. sed -i 's/MAIL_DIR/#MAIL_DIR/g' /etc/login.defs
  4169. sed -i 's|#MAIL_FILE.*|MAIL_FILE Maildir/|g' /etc/login.defs
  4170. if ! grep -q "export MAIL" /etc/profile; then
  4171. echo 'export MAIL=~/Maildir' >> /etc/profile
  4172. fi
  4173. sed -i 's|pam_mail.so standard|pam_mail.so dir=~/Maildir standard|g' /etc/pam.d/login
  4174. sed -i 's|pam_mail.so standard noenv|pam_mail.so dir=~/Maildir standard|g' /etc/pam.d/sshd
  4175. sed -i 's|pam_mail.so nopen|pam_mail.so dir=~/Maildir nopen|g' /etc/pam.d/su
  4176. echo 'dc_eximconfig_configtype="internet"' > /etc/exim4/update-exim4.conf.conf
  4177. if [[ $ONION_ONLY == "no" ]]; then
  4178. # both ICANN and onion domains
  4179. echo "dc_other_hostnames='${DEFAULT_DOMAIN_NAME};${EMAIL_ONION_HOSTNAME}'" >> /etc/exim4/update-exim4.conf.conf
  4180. else
  4181. echo "dc_other_hostnames='${EMAIL_ONION_HOSTNAME}'" >> /etc/exim4/update-exim4.conf.conf
  4182. fi
  4183. echo "dc_local_interfaces=''" >> /etc/exim4/update-exim4.conf.conf
  4184. echo "dc_readhost=''" >> /etc/exim4/update-exim4.conf.conf
  4185. echo "dc_relay_domains=''" >> /etc/exim4/update-exim4.conf.conf
  4186. echo "dc_minimaldns='false'" >> /etc/exim4/update-exim4.conf.conf
  4187. RELAY_NETS='192.168.1.0/24'
  4188. if [ $LOCAL_NETWORK_STATIC_IP_ADDRESS ]; then
  4189. RELAY_NETS=$(echo $LOCAL_NETWORK_STATIC_IP_ADDRESS | awk -F '.' '{print $1 "." $2 "." $3 ".0/24"}')
  4190. fi
  4191. echo "dc_relay_nets='$RELAY_NETS'" >> /etc/exim4/update-exim4.conf.conf
  4192. echo "dc_smarthost=''" >> /etc/exim4/update-exim4.conf.conf
  4193. echo "CFILEMODE='644'" >> /etc/exim4/update-exim4.conf.conf
  4194. echo "dc_use_split_config='false'" >> /etc/exim4/update-exim4.conf.conf
  4195. echo "dc_hide_mailname=''" >> /etc/exim4/update-exim4.conf.conf
  4196. echo "dc_mailname_in_oh='true'" >> /etc/exim4/update-exim4.conf.conf
  4197. echo "dc_localdelivery='maildir_home'" >> /etc/exim4/update-exim4.conf.conf
  4198. update-exim4.conf
  4199. sed -i "s/START=no/START=yes/g" /etc/default/saslauthd
  4200. systemctl start saslauthd
  4201. # make a tls certificate for email
  4202. if [ ! -f /etc/ssl/certs/exim.dhparam ]; then
  4203. ${PROJECT_NAME}-addcert -h exim --dhkey $DH_KEYLENGTH
  4204. check_certificates exim
  4205. fi
  4206. cp /etc/ssl/private/exim.key /etc/exim4
  4207. cp /etc/ssl/certs/exim.crt /etc/exim4
  4208. cp /etc/ssl/certs/exim.dhparam /etc/exim4
  4209. chown root:Debian-exim /etc/exim4/exim.key /etc/exim4/exim.crt /etc/exim4/exim.dhparam
  4210. chmod 640 /etc/exim4/exim.key /etc/exim4/exim.crt /etc/exim4/exim.dhparam
  4211. sed -i '/login_saslauthd_server/,/.endif/ s/# *//' /etc/exim4/exim4.conf.template
  4212. sed -i "/.ifdef MAIN_HARDCODE_PRIMARY_HOSTNAME/i\MAIN_HARDCODE_PRIMARY_HOSTNAME = $DEFAULT_DOMAIN_NAME\nMAIN_TLS_ENABLE = true" /etc/exim4/exim4.conf.template
  4213. sed -i "s|SMTPLISTENEROPTIONS=''|SMTPLISTENEROPTIONS='-oX 465:25:587 -oP /var/run/exim4/exim.pid'|g" /etc/default/exim4
  4214. if ! grep -q "tls_on_connect_ports=465" /etc/exim4/exim4.conf.template; then
  4215. sed -i '/SSL configuration for exim/i\tls_on_connect_ports=465' /etc/exim4/exim4.conf.template
  4216. fi
  4217. adduser $MY_USERNAME sasl
  4218. addgroup Debian-exim sasl
  4219. systemctl restart exim4
  4220. if [ ! -d /etc/skel/Maildir ]; then
  4221. mkdir -m 700 /etc/skel/.mutt
  4222. mkdir -m 700 /etc/skel/Maildir
  4223. mkdir -m 700 /etc/skel/Maildir/new
  4224. mkdir -m 700 /etc/skel/Maildir/cur
  4225. mkdir -m 700 /etc/skel/Maildir/Sent
  4226. mkdir -m 700 /etc/skel/Maildir/Sent/tmp
  4227. mkdir -m 700 /etc/skel/Maildir/Sent/cur
  4228. mkdir -m 700 /etc/skel/Maildir/Sent/new
  4229. mkdir -m 700 /etc/skel/Maildir/.learn-spam
  4230. mkdir -m 700 /etc/skel/Maildir/.learn-spam/cur
  4231. mkdir -m 700 /etc/skel/Maildir/.learn-spam/new
  4232. mkdir -m 700 /etc/skel/Maildir/.learn-spam/tmp
  4233. mkdir -m 700 /etc/skel/Maildir/.learn-ham
  4234. mkdir -m 700 /etc/skel/Maildir/.learn-ham/cur
  4235. mkdir -m 700 /etc/skel/Maildir/.learn-ham/new
  4236. mkdir -m 700 /etc/skel/Maildir/.learn-ham/tmp
  4237. ln -s /etc/skel/Maildir/.learn-spam /etc/skel/Maildir/spam
  4238. ln -s /etc/skel/Maildir/.learn-ham /etc/skel/Maildir/ham
  4239. fi
  4240. if [ ! -d /home/$MY_USERNAME/Maildir ]; then
  4241. mkdir -m 700 /home/$MY_USERNAME/.mutt
  4242. mkdir -m 700 /home/$MY_USERNAME/Maildir
  4243. mkdir -m 700 /home/$MY_USERNAME/Maildir/cur
  4244. mkdir -m 700 /home/$MY_USERNAME/Maildir/tmp
  4245. mkdir -m 700 /home/$MY_USERNAME/Maildir/new
  4246. mkdir -m 700 /home/$MY_USERNAME/Maildir/Sent
  4247. mkdir -m 700 /home/$MY_USERNAME/Maildir/Sent/cur
  4248. mkdir -m 700 /home/$MY_USERNAME/Maildir/Sent/tmp
  4249. mkdir -m 700 /home/$MY_USERNAME/Maildir/Sent/new
  4250. mkdir -m 700 /home/$MY_USERNAME/Maildir/.learn-spam
  4251. mkdir -m 700 /home/$MY_USERNAME/Maildir/.learn-spam/cur
  4252. mkdir -m 700 /home/$MY_USERNAME/Maildir/.learn-spam/new
  4253. mkdir -m 700 /home/$MY_USERNAME/Maildir/.learn-spam/tmp
  4254. mkdir -m 700 /home/$MY_USERNAME/Maildir/.learn-ham
  4255. mkdir -m 700 /home/$MY_USERNAME/Maildir/.learn-ham/cur
  4256. mkdir -m 700 /home/$MY_USERNAME/Maildir/.learn-ham/new
  4257. mkdir -m 700 /home/$MY_USERNAME/Maildir/.learn-ham/tmp
  4258. ln -s /home/$MY_USERNAME/Maildir/.learn-spam /home/$MY_USERNAME/Maildir/spam
  4259. ln -s /home/$MY_USERNAME/Maildir/.learn-ham /home/$MY_USERNAME/Maildir/ham
  4260. chown -R $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/Maildir
  4261. fi
  4262. echo 'configure_email' >> $COMPLETION_FILE
  4263. }
  4264. function create_procmail {
  4265. if [[ $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_NONMAILBOX" || $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  4266. return
  4267. fi
  4268. if grep -Fxq "create_procmail" $COMPLETION_FILE; then
  4269. return
  4270. fi
  4271. if [ ! -f /home/$MY_USERNAME/.procmailrc ]; then
  4272. echo 'MAILDIR=$HOME/Maildir' > /home/$MY_USERNAME/.procmailrc
  4273. echo 'DEFAULT=$MAILDIR/' >> /home/$MY_USERNAME/.procmailrc
  4274. echo 'LOGFILE=$HOME/log/procmail.log' >> /home/$MY_USERNAME/.procmailrc
  4275. echo 'LOGABSTRACT=all' >> /home/$MY_USERNAME/.procmailrc
  4276. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.procmailrc
  4277. fi
  4278. if [ ! -f /etc/skel/.procmailrc ]; then
  4279. cp /home/$MY_USERNAME/.procmailrc /etc/skel/.procmailrc
  4280. chown root:root /etc/skel/.procmailrc
  4281. fi
  4282. echo 'create_procmail' >> $COMPLETION_FILE
  4283. }
  4284. function spam_filtering {
  4285. if [[ $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_NONMAILBOX" || $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  4286. return
  4287. fi
  4288. if grep -Fxq "spam_filtering" $COMPLETION_FILE; then
  4289. return
  4290. fi
  4291. apt-get -y install exim4-daemon-heavy
  4292. apt-get -y install spamassassin
  4293. if [ ! -f /etc/default/spamassassin ]; then
  4294. echo 'Spamassassin was not installed'
  4295. exit 72570
  4296. fi
  4297. sa-update -v
  4298. sed -i 's/ENABLED=0/ENABLED=1/g' /etc/default/spamassassin
  4299. sed -i 's/# spamd_address = 127.0.0.1 783/spamd_address = 127.0.0.1 783/g' /etc/exim4/exim4.conf.template
  4300. # This configuration is based on https://wiki.debian.org/DebianSpamAssassin
  4301. sed -i 's/local_parts = postmaster/local_parts = postmaster:abuse/g' /etc/exim4/conf.d/acl/30_exim4-config_check_rcpt
  4302. sed -i '/domains = +local_domains : +relay_to_domains/a\ set acl_m0 = rfcnames' /etc/exim4/conf.d/acl/30_exim4-config_check_rcpt
  4303. sed -i 's/accept/accept condition = ${if eq{$acl_m0}{rfcnames} {1}{0}}/g' /etc/exim4/conf.d/acl/40_exim4-config_check_data
  4304. echo 'warn message = X-Spam-Score: $spam_score ($spam_bar)' >> /etc/exim4/conf.d/acl/40_exim4-config_check_data
  4305. echo ' spam = nobody:true' >> /etc/exim4/conf.d/acl/40_exim4-config_check_data
  4306. echo 'warn message = X-Spam-Flag: YES' >> /etc/exim4/conf.d/acl/40_exim4-config_check_data
  4307. echo ' spam = nobody' >> /etc/exim4/conf.d/acl/40_exim4-config_check_data
  4308. echo 'warn message = X-Spam-Report: $spam_report' >> /etc/exim4/conf.d/acl/40_exim4-config_check_data
  4309. echo ' spam = nobody' >> /etc/exim4/conf.d/acl/40_exim4-config_check_data
  4310. echo '# reject spam at high scores (> 12)' >> /etc/exim4/conf.d/acl/40_exim4-config_check_data
  4311. echo 'deny message = This message scored $spam_score spam points.' >> /etc/exim4/conf.d/acl/40_exim4-config_check_data
  4312. echo ' spam = nobody:true' >> /etc/exim4/conf.d/acl/40_exim4-config_check_data
  4313. echo ' condition = ${if >{$spam_score_int}{120}{1}{0}}' >> /etc/exim4/conf.d/acl/40_exim4-config_check_data
  4314. # procmail configuration
  4315. echo '# get spamassassin to check emails' >> /home/$MY_USERNAME/.procmailrc
  4316. echo ':0fw: .spamassassin.lock' >> /home/$MY_USERNAME/.procmailrc
  4317. echo ' * < 256000' >> /home/$MY_USERNAME/.procmailrc
  4318. echo '| spamc' >> /home/$MY_USERNAME/.procmailrc
  4319. echo '# strong spam are discarded' >> /home/$MY_USERNAME/.procmailrc
  4320. echo ':0' >> /home/$MY_USERNAME/.procmailrc
  4321. echo ' * ^X-Spam-Level: \*\*\*\*\*\*' >> /home/$MY_USERNAME/.procmailrc
  4322. echo '/dev/null' >> /home/$MY_USERNAME/.procmailrc
  4323. echo '# weak spam are kept just in case - clear this out every now and then' >> /home/$MY_USERNAME/.procmailrc
  4324. echo ':0' >> /home/$MY_USERNAME/.procmailrc
  4325. echo ' * ^X-Spam-Level: \*\*\*\*\*' >> /home/$MY_USERNAME/.procmailrc
  4326. echo 'maybe-spam/' >> /home/$MY_USERNAME/.procmailrc
  4327. echo '# otherwise, marginal spam goes here for revision' >> /home/$MY_USERNAME/.procmailrc
  4328. echo ':0' >> /home/$MY_USERNAME/.procmailrc
  4329. echo ' * ^X-Spam-Level: \*\*' >> /home/$MY_USERNAME/.procmailrc
  4330. echo 'spam/' >> /home/$MY_USERNAME/.procmailrc
  4331. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.procmailrc
  4332. echo '# get spamassassin to check emails' >> /etc/skel/.procmailrc
  4333. echo ':0fw: .spamassassin.lock' >> /etc/skel/.procmailrc
  4334. echo ' * < 256000' >> /etc/skel/.procmailrc
  4335. echo '| spamc' >> /etc/skel/.procmailrc
  4336. echo '# strong spam are discarded' >> /etc/skel/.procmailrc
  4337. echo ':0' >> /etc/skel/.procmailrc
  4338. echo ' * ^X-Spam-Level: \*\*\*\*\*\*' >> /etc/skel/.procmailrc
  4339. echo '/dev/null' >> /etc/skel/.procmailrc
  4340. echo '# weak spam are kept just in case - clear this out every now and then' >> /etc/skel/.procmailrc
  4341. echo ':0' >> /etc/skel/.procmailrc
  4342. echo ' * ^X-Spam-Level: \*\*\*\*\*' >> /etc/skel/.procmailrc
  4343. echo 'maybe-spam/' >> /etc/skel/.procmailrc
  4344. echo '# otherwise, marginal spam goes here for revision' >> /etc/skel/.procmailrc
  4345. echo ':0' >> /etc/skel/.procmailrc
  4346. echo ' * ^X-Spam-Level: \*\*' >> /etc/skel/.procmailrc
  4347. echo 'spam/' >> /etc/skel/.procmailrc
  4348. # filtering scripts
  4349. echo '#!/bin/bash' > /usr/bin/filterspam
  4350. echo 'for d in /home/*/ ; do' >> /usr/bin/filterspam
  4351. echo ' USERNAME=$(echo "$d" | awk -F '"'"'/'"'"' '"'"'{print $3}'"'"')' >> /usr/bin/filterspam
  4352. echo ' if [[ $USERNAME != "git" && $USERNAME != "mirrors" ]]; then' >> /usr/bin/filterspam
  4353. echo ' MAILDIR=/home/$USERNAME/Maildir/.learn-spam' >> /usr/bin/filterspam
  4354. echo ' if [ ! -d "$MAILDIR" ]; then' >> /usr/bin/filterspam
  4355. echo ' exit' >> /usr/bin/filterspam
  4356. echo ' fi' >> /usr/bin/filterspam
  4357. echo ' for f in `ls $MAILDIR/cur`' >> /usr/bin/filterspam
  4358. echo ' do' >> /usr/bin/filterspam
  4359. echo ' spamc -L spam < "$MAILDIR/cur/$f" > /dev/null' >> /usr/bin/filterspam
  4360. echo ' rm "$MAILDIR/cur/$f"' >> /usr/bin/filterspam
  4361. echo ' done' >> /usr/bin/filterspam
  4362. echo ' for f in `ls $MAILDIR/new`' >> /usr/bin/filterspam
  4363. echo ' do' >> /usr/bin/filterspam
  4364. echo ' spamc -L spam < "$MAILDIR/new/$f" > /dev/null' >> /usr/bin/filterspam
  4365. echo ' rm "$MAILDIR/new/$f"' >> /usr/bin/filterspam
  4366. echo ' done' >> /usr/bin/filterspam
  4367. echo ' fi' >> /usr/bin/filterspam
  4368. echo 'done' >> /usr/bin/filterspam
  4369. echo 'exit 0' >> /usr/bin/filterspam
  4370. echo '#!/bin/bash' > /usr/bin/filterham
  4371. echo 'for d in /home/*/ ; do' >> /usr/bin/filterham
  4372. echo ' USERNAME=$(echo "$d" | awk -F '"'"'/'"'"' '"'"'{print $3}'"'"')' >> /usr/bin/filterham
  4373. echo ' if [[ $USERNAME != "git" && $USERNAME != "mirrors" ]]; then' >> /usr/bin/filterham
  4374. echo ' MAILDIR=/home/$USERNAME/Maildir/.learn-ham' >> /usr/bin/filterham
  4375. echo ' if [ ! -d "$MAILDIR" ]; then' >> /usr/bin/filterham
  4376. echo ' exit' >> /usr/bin/filterham
  4377. echo ' fi' >> /usr/bin/filterham
  4378. echo ' for f in `ls $MAILDIR/cur`' >> /usr/bin/filterham
  4379. echo ' do' >> /usr/bin/filterham
  4380. echo ' spamc -L ham < "$MAILDIR/cur/$f" > /dev/null' >> /usr/bin/filterham
  4381. echo ' rm "$MAILDIR/cur/$f"' >> /usr/bin/filterham
  4382. echo ' done' >> /usr/bin/filterham
  4383. echo ' for f in `ls $MAILDIR/new`' >> /usr/bin/filterham
  4384. echo ' do' >> /usr/bin/filterham
  4385. echo ' spamc -L ham < "$MAILDIR/new/$f" > /dev/null' >> /usr/bin/filterham
  4386. echo ' rm "$MAILDIR/new/$f"' >> /usr/bin/filterham
  4387. echo ' done' >> /usr/bin/filterham
  4388. echo ' fi' >> /usr/bin/filterham
  4389. echo 'done' >> /usr/bin/filterham
  4390. echo 'exit 0' >> /usr/bin/filterham
  4391. if ! grep -q "filterspam" /etc/crontab; then
  4392. echo "*/3 * * * * root /usr/bin/timeout 120 /usr/bin/filterspam" >> /etc/crontab
  4393. fi
  4394. if ! grep -q "filterham" /etc/crontab; then
  4395. echo "*/3 * * * * root /usr/bin/timeout 120 /usr/bin/filterham" >> /etc/crontab
  4396. fi
  4397. chmod 655 /usr/bin/filterspam /usr/bin/filterham
  4398. sed -i 's/# use_bayes 1/use_bayes 1/g' /etc/mail/spamassassin/local.cf
  4399. sed -i 's/# bayes_auto_learn 1/bayes_auto_learn 1/g' /etc/mail/spamassassin/local.cf
  4400. # user preferences
  4401. if [ ! -d /home/$MY_USERNAME/.spamassassin ]; then
  4402. mkdir /home/$MY_USERNAME/.spamassassin
  4403. echo $'# How many points before a mail is considered spam.' > /home/$MY_USERNAME/.spamassassin/user_prefs
  4404. echo '# required_score 5' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  4405. echo '' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  4406. echo $'# Whitelist and blacklist addresses are now file-glob-style patterns, so' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  4407. echo $'# "friend@somewhere.com", "*@isp.com", or "*.domain.net" will all work.' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  4408. echo '# whitelist_from someone@somewhere.com' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  4409. echo '' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  4410. echo $'# Add your own customised scores for some tests below. The default scores are' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  4411. echo $'# read from the installed spamassassin rules files, but you can override them' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  4412. echo $'# here. To see the list of tests and their default scores, go to' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  4413. echo '# http://spamassassin.apache.org/tests.html .' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  4414. echo '#' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  4415. echo '# score SYMBOLIC_TEST_NAME n.nn' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  4416. echo '' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  4417. echo $'# Speakers of Asian languages, like Chinese, Japanese and Korean, will almost' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  4418. echo $'# definitely want to uncomment the following lines. They will switch off some' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  4419. echo $'# rules that detect 8-bit characters, which commonly trigger on mails using CJK' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  4420. echo $'# character sets, or that assume a western-style charset is in use. ' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  4421. echo '# ' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  4422. echo '# score HTML_COMMENT_8BITS 0' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  4423. echo '# score UPPERCASE_25_50 0' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  4424. echo '# score UPPERCASE_50_75 0' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  4425. echo '# score UPPERCASE_75_100 0' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  4426. echo '# score OBSCURED_EMAIL 0' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  4427. echo '' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  4428. echo $'# Speakers of any language that uses non-English, accented characters may wish' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  4429. echo $'# to uncomment the following lines. They turn off rules that fire on' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  4430. echo $'# misformatted messages generated by common mail apps in contravention of the' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  4431. echo $'# email RFCs.' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  4432. echo '' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  4433. echo '# score SUBJ_ILLEGAL_CHARS 0' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  4434. fi
  4435. # this must be accessible by root
  4436. chown -R $MY_USERNAME:root /home/$MY_USERNAME/.spamassassin
  4437. systemctl restart spamassassin
  4438. systemctl restart exim4
  4439. systemctl restart cron
  4440. echo 'spam_filtering' >> $COMPLETION_FILE
  4441. }
  4442. function configure_imap {
  4443. if [[ $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_NONMAILBOX" || $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  4444. return
  4445. fi
  4446. if grep -Fxq "configure_imap" $COMPLETION_FILE; then
  4447. return
  4448. fi
  4449. dpkg -P dovecot-imapd
  4450. dpkg -P dovecot-core
  4451. apt-get -y install dovecot-imapd
  4452. if [ ! -d /etc/dovecot ]; then
  4453. echo $"ERROR: Dovecot does not appear to have installed. $CHECK_MESSAGE"
  4454. exit 48
  4455. fi
  4456. if [ ! -f /etc/ssl/certs/dovecot.dhparam ]; then
  4457. ${PROJECT_NAME}-addcert -h dovecot --dhkey $DH_KEYLENGTH
  4458. check_certificates dovecot
  4459. fi
  4460. chown root:dovecot /etc/ssl/certs/dovecot.*
  4461. chown root:dovecot /etc/ssl/private/dovecot.*
  4462. if [ ! -f /etc/dovecot/conf.d/10-ssl.conf ]; then
  4463. echo $'Unable to find /etc/dovecot/conf.d/10-ssl.conf'
  4464. exit 83629
  4465. fi
  4466. sed -i 's|#ssl =.*|ssl = required|g' /etc/dovecot/conf.d/10-ssl.conf
  4467. sed -i 's|ssl = no|ssl = required|g' /etc/dovecot/conf.d/10-ssl.conf
  4468. sed -i 's|ssl = yes|ssl = required|g' /etc/dovecot/conf.d/10-ssl.conf
  4469. sed -i 's|#ssl_cert =.*|ssl_cert = </etc/ssl/certs/dovecot.crt|g' /etc/dovecot/conf.d/10-ssl.conf
  4470. sed -i 's|ssl_cert =.*|ssl_cert = </etc/ssl/certs/dovecot.crt|g' /etc/dovecot/conf.d/10-ssl.conf
  4471. sed -i 's|#ssl_key =.*|ssl_key = </etc/ssl/private/dovecot.key|g' /etc/dovecot/conf.d/10-ssl.conf
  4472. sed -i 's|ssl_key =.*|ssl_key = </etc/ssl/private/dovecot.key|g' /etc/dovecot/conf.d/10-ssl.conf
  4473. sed -i 's|#ssl_dh_parameters_length.*|ssl_dh_parameters_length = 2048|g' /etc/dovecot/conf.d/10-ssl.conf
  4474. sed -i 's/#ssl_prefer_server_ciphers.*/ssl_prefer_server_ciphers = yes/g' /etc/dovecot/conf.d/10-ssl.conf
  4475. sed -i "s|#ssl_protocols =.*|ssl_protocols = '$SSL_PROTOCOLS'|g" /etc/dovecot/conf.d/10-ssl.conf
  4476. sed -i "s|ssl_protocols =.*|ssl_protocols = '$SSL_PROTOCOLS'|g" /etc/dovecot/conf.d/10-ssl.conf
  4477. echo "ssl_cipher_list = '$SSL_CIPHERS'" >> /etc/dovecot/conf.d/10-ssl.conf
  4478. if [ ! -f /etc/dovecot/conf.d/10-master.conf ]; then
  4479. echo $'Unable to find /etc/dovecot/conf.d/10-master.conf'
  4480. exit 49259
  4481. fi
  4482. sed -i 's/#process_limit =.*/process_limit = 100/g' /etc/dovecot/conf.d/10-master.conf
  4483. sed -i 's/#default_client_limit.*/default_client_limit = 100/g' /etc/dovecot/conf.d/10-master.conf
  4484. sed -i 's|#default_process_limit =.*|default_process_limit = 100|g' /etc/dovecot/conf.d/10-master.conf
  4485. if [ ! -f /etc/dovecot/conf.d/10-logging.conf ]; then
  4486. echo $'Unable to find /etc/dovecot/conf.d/10-logging.conf'
  4487. exit 48936
  4488. fi
  4489. sed -i 's/#auth_verbose.*/auth_verbose = yes/g' /etc/dovecot/conf.d/10-logging.conf
  4490. if [ ! -f /etc/dovecot/dovecot.conf ]; then
  4491. echo $'Unable to find /etc/dovecot/dovecot.conf'
  4492. exit 43890
  4493. fi
  4494. sed -i 's/#listen =.*/listen = */g' /etc/dovecot/dovecot.conf
  4495. if [ ! -f /etc/dovecot/conf.d/10-auth.conf ]; then
  4496. echo $'Unable to find /etc/dovecot/conf.d/10-auth.conf'
  4497. exit 843256
  4498. fi
  4499. sed -i 's/#disable_plaintext_auth =.*/disable_plaintext_auth = no/g' /etc/dovecot/conf.d/10-auth.conf
  4500. sed -i 's/auth_mechanisms =.*/auth_mechanisms = plain login/g' /etc/dovecot/conf.d/10-auth.conf
  4501. if [ ! -f /etc/dovecot/conf.d/10-mail.conf ]; then
  4502. echo $'Unable to find /etc/dovecot/conf.d/10-mail.conf'
  4503. exit 42036
  4504. fi
  4505. sed -i 's|mail_location =.*|mail_location = maildir:~/Maildir:LAYOUT=fs|g' /etc/dovecot/conf.d/10-mail.conf
  4506. # This long notify interval makes the system more suited for use with
  4507. # battery powered mobile devices
  4508. sed -i 's|#imap_idle_notify_interval =.*|imap_idle_notify_interval = 29|g' /etc/dovecot/conf.d/20-imap.conf
  4509. if [ -f /var/lib/dovecot/ssl-parameters.dat ]; then
  4510. rm /var/lib/dovecot/ssl-parameters.dat
  4511. fi
  4512. systemctl restart dovecot
  4513. echo 'configure_imap' >> $COMPLETION_FILE
  4514. }
  4515. function configure_imap_client_certs {
  4516. if [[ $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_NONMAILBOX" || $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  4517. return
  4518. fi
  4519. if grep -Fxq "configure_imap_client_certs" $COMPLETION_FILE; then
  4520. return
  4521. fi
  4522. # http://strange.systems/certificate-based-auth-with-dovecot-sendmail/
  4523. sed -i 's|#default_process_limit =.*|default_process_limit = 100|g' /etc/dovecot/conf.d/10-master.conf
  4524. sed -i 's/disable_plaintext_auth =.*/disable_plaintext_auth = yes/g' /etc/dovecot/conf.d/10-auth.conf
  4525. sed -i 's|#auth_ssl_require_client_cert =.*|auth_ssl_require_client_cert = yes|g' /etc/dovecot/conf.d/10-auth.conf
  4526. sed -i 's|#auth_ssl_username_from_cert =.*|auth_ssl_username_from_cert = yes|g' /etc/dovecot/conf.d/10-auth.conf
  4527. sed -i "s|#ssl_ca =.*|ssl_ca = /etc/ssl/certs/ca-$DEFAULT_DOMAIN_NAME.crt|g" /etc/dovecot/conf.d/10-ssl.conf
  4528. sed -i 's|#ssl_cert_username_field =.*|ssl_cert_username_field = commonName|g' /etc/dovecot/conf.d/10-ssl.conf
  4529. sed -i 's|#ssl_verify_client_cert =.*|ssl_verify_client_cert = yes|g' /etc/dovecot/conf.d/10-ssl.conf
  4530. if ! grep -q "passdb {" /etc/dovecot/conf.d/10-auth.conf; then
  4531. echo '' >> /etc/dovecot/conf.d/10-auth.conf
  4532. echo 'passdb {' >> /etc/dovecot/conf.d/10-auth.conf
  4533. echo ' driver = passwd-file' >> /etc/dovecot/conf.d/10-auth.conf
  4534. echo ' args = /etc/dovecot/passwd-file' >> /etc/dovecot/conf.d/10-auth.conf
  4535. echo ' deny = no' >> /etc/dovecot/conf.d/10-auth.conf
  4536. echo ' master = no' >> /etc/dovecot/conf.d/10-auth.conf
  4537. echo ' pass = no' >> /etc/dovecot/conf.d/10-auth.conf
  4538. echo '}' >> /etc/dovecot/conf.d/10-auth.conf
  4539. fi
  4540. if [[ $ONION_ONLY == "no" ]]; then
  4541. # make a CA cert
  4542. if [ ! -f /etc/ssl/private/ca-$DEFAULT_DOMAIN_NAME.key ]; then
  4543. if [[ $LETSENCRYPT_ENABLED != "yes" ]]; then
  4544. ${PROJECT_NAME}-addcert -h $DEFAULT_DOMAIN_NAME --ca "" --dhkey $DH_KEYLENGTH
  4545. else
  4546. ${PROJECT_NAME}-addcert -e $DEFAULT_DOMAIN_NAME -s $LETSENCRYPT_SERVER --ca "" --dhkey $DH_KEYLENGTH --email $MY_EMAIL_ADDRESS
  4547. fi
  4548. fi
  4549. fi
  4550. # CA configuration
  4551. echo '[ ca ]' > /etc/ssl/dovecot-ca.cnf
  4552. echo "default_ca = dovecot-ca" >> /etc/ssl/dovecot-ca.cnf
  4553. echo '' >> /etc/ssl/dovecot-ca.cnf
  4554. echo '[ crl_ext ]' >> /etc/ssl/dovecot-ca.cnf
  4555. echo 'authorityKeyIdentifier=keyid:always' >> /etc/ssl/dovecot-ca.cnf
  4556. echo '' >> /etc/ssl/dovecot-ca.cnf
  4557. echo '[ dovecot-ca ]' >> /etc/ssl/dovecot-ca.cnf
  4558. echo 'new_certs_dir = .' >> /etc/ssl/dovecot-ca.cnf
  4559. echo 'unique_subject = no' >> /etc/ssl/dovecot-ca.cnf
  4560. echo "certificate = /etc/ssl/certs/ca-$DEFAULT_DOMAIN_NAME.crt" >> /etc/ssl/dovecot-ca.cnf
  4561. echo 'database = ssldb' >> /etc/ssl/dovecot-ca.cnf
  4562. echo "private_key = /etc/ssl/private/ca-$DEFAULT_DOMAIN_NAME.key" >> /etc/ssl/dovecot-ca.cnf
  4563. echo 'serial = sslserial' >> /etc/ssl/dovecot-ca.cnf
  4564. echo 'default_days = 3650' >> /etc/ssl/dovecot-ca.cnf
  4565. echo 'default_md = sha256' >> /etc/ssl/dovecot-ca.cnf
  4566. echo 'default_bits = 4096' >> /etc/ssl/dovecot-ca.cnf
  4567. echo 'policy = dovecot-ca_policy' >> /etc/ssl/dovecot-ca.cnf
  4568. echo 'x509_extensions = dovecot-ca_extensions' >> /etc/ssl/dovecot-ca.cnf
  4569. echo '' >> /etc/ssl/dovecot-ca.cnf
  4570. echo '[ dovecot-ca_policy ]' >> /etc/ssl/dovecot-ca.cnf
  4571. echo 'commonName = supplied' >> /etc/ssl/dovecot-ca.cnf
  4572. echo 'stateOrProvinceName = supplied' >> /etc/ssl/dovecot-ca.cnf
  4573. echo 'countryName = supplied' >> /etc/ssl/dovecot-ca.cnf
  4574. echo 'emailAddress = optional' >> /etc/ssl/dovecot-ca.cnf
  4575. echo 'organizationName = supplied' >> /etc/ssl/dovecot-ca.cnf
  4576. echo 'organizationalUnitName = optional' >> /etc/ssl/dovecot-ca.cnf
  4577. echo '' >> /etc/ssl/dovecot-ca.cnf
  4578. echo '[ dovecot-ca_extensions ]' >> /etc/ssl/dovecot-ca.cnf
  4579. echo 'basicConstraints = CA:false' >> /etc/ssl/dovecot-ca.cnf
  4580. echo 'subjectKeyIdentifier = hash' >> /etc/ssl/dovecot-ca.cnf
  4581. echo 'authorityKeyIdentifier = keyid:always' >> /etc/ssl/dovecot-ca.cnf
  4582. echo 'keyUsage = digitalSignature,keyEncipherment' >> /etc/ssl/dovecot-ca.cnf
  4583. echo 'extendedKeyUsage = clientAuth' >> /etc/ssl/dovecot-ca.cnf
  4584. if [ -f /etc/ssl/ssldb ]; then
  4585. rm /etc/ssl/ssldb
  4586. fi
  4587. if [ -f /etc/ssl/sslserial ]; then
  4588. rm /etc/ssl/sslserial
  4589. fi
  4590. touch /etc/ssl/ssldb
  4591. echo 0001 > /etc/ssl/sslserial
  4592. #${PROJECT_NAME}-clientcert -u $MY_USERNAME
  4593. systemctl restart dovecot
  4594. echo 'configure_imap_client_certs' >> $COMPLETION_FILE
  4595. }
  4596. function create_gpg_subkey {
  4597. if [[ $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_NONMAILBOX" || $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  4598. return
  4599. fi
  4600. if grep -Fxq "create_gpg_subkey" $COMPLETION_FILE; then
  4601. return
  4602. fi
  4603. apt-get -y install gnupg
  4604. GPG_KEY_USAGE=$1
  4605. if [[ $GPG_KEY_USAGE != "sign" && $GPG_KEY_USAGE != "auth" && $GPG_KEY_USAGE != "encrypt" ]]; then
  4606. echo $"Unknown subkey usage: $GPG_KEY_USAGE"
  4607. echo $'Available types: sign|auth|encrypt'
  4608. exit 14783
  4609. fi
  4610. KEYGRIP=$(gpg --fingerprint --fingerprint $MY_EMAIL_ADDRESS | grep fingerprint | tail -1 | cut -d= -f2 | sed -e 's/ //g')
  4611. # Generate a GPG subkey
  4612. # Here a 2048bit length is used to be compatible with yubikey
  4613. echo 'Key-Type: 1' > /home/$MY_USERNAME/gpg-genkey.conf
  4614. echo "Key-Grip: $KEYGRIP" > /home/$MY_USERNAME/gpg-genkey.conf
  4615. echo 'Subkey-Type: 1' >> /home/$MY_USERNAME/gpg-genkey.conf
  4616. echo 'Subkey-Length: 2048' >> /home/$MY_USERNAME/gpg-genkey.conf
  4617. echo "subkey-Usage: $GPG_KEY_USAGE" > /home/$MY_USERNAME/gpg-genkey.conf
  4618. echo "Name-Real: $MY_NAME" >> /home/$MY_USERNAME/gpg-genkey.conf
  4619. echo "Name-Email: $MY_EMAIL_ADDRESS" >> /home/$MY_USERNAME/gpg-genkey.conf
  4620. echo "Name-Comment: $GPG_KEY_USAGE" >> /home/$MY_USERNAME/gpg-genkey.conf
  4621. echo 'Expire-Date: 0' >> /home/$MY_USERNAME/gpg-genkey.conf
  4622. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/gpg-genkey.conf
  4623. su -c "gpg --batch --gen-key /home/$MY_USERNAME/gpg-genkey.conf" - $MY_USERNAME
  4624. shred -zu /home/$MY_USERNAME/gpg-genkey.conf
  4625. MY_GPG_SUBKEY_ID=$(su -c "gpg --list-keys $MY_EMAIL_ADDRESS | grep 'pub '" - $MY_USERNAME | awk -F ' ' '{print $2}' | awk -F '/' '{print $2}')
  4626. echo 'create_gpg_subkey' >> $COMPLETION_FILE
  4627. }
  4628. function gpg_key_exists {
  4629. key_owner_username=$1
  4630. key_search_text=$2
  4631. if [[ $key_owner_username != "root" ]]; then
  4632. KEY_EXISTS=$(su -c "gpg --list-keys \"${key_search_text}\"" - $key_owner_username)
  4633. else
  4634. KEY_EXISTS=$(gpg --list-keys "${key_search_text}")
  4635. fi
  4636. if [ ! "$KEY_EXISTS" ]; then
  4637. echo "no"
  4638. return
  4639. fi
  4640. if [ "$KEY_EXISTS" == *"error"* ]; then
  4641. echo "no"
  4642. return
  4643. fi
  4644. echo "yes"
  4645. }
  4646. function gpg_pubkey_from_email {
  4647. key_owner_username=$1
  4648. key_email_address=$2
  4649. key_id=
  4650. if [[ $key_owner_username != "root" ]]; then
  4651. key_id=$(su -c "gpg --list-keys $key_email_address | grep 'pub '" - $key_owner_username | awk -F ' ' '{print $2}' | awk -F '/' '{print $2}')
  4652. else
  4653. key_id=$(gpg --list-keys $key_email_address | grep 'pub ' | awk -F ' ' '{print $2}' | awk -F '/' '{print $2}')
  4654. fi
  4655. echo $key_id
  4656. }
  4657. function configure_gpg {
  4658. if [[ $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_NONMAILBOX" || $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  4659. return
  4660. fi
  4661. if grep -Fxq "configure_gpg" $COMPLETION_FILE; then
  4662. return
  4663. fi
  4664. apt-get -y install gnupg
  4665. gpg_dir=/home/$MY_USERNAME/.gnupg
  4666. # if gpg keys directory was previously imported from usb
  4667. if [[ $GPG_KEYS_IMPORTED == "yes" && -d $gpg_dir ]]; then
  4668. echo $'GPG keys were imported'
  4669. sed -i "s|keyserver hkp://keys.gnupg.net|keyserver $GPG_KEYSERVER|g" $gpg_dir/gpg.conf
  4670. MY_GPG_PUBLIC_KEY_ID=$(gpg_pubkey_from_email "$MY_USERNAME" "$MY_EMAIL_ADDRESS")
  4671. if [ ${#MY_GPG_PUBLIC_KEY_ID} -lt 4 ]; then
  4672. echo $'GPG public key ID could not be obtained'
  4673. fi
  4674. chown -R $MY_USERNAME:$MY_USERNAME $gpg_dir
  4675. chmod 700 $gpg_dir
  4676. chmod 600 $gpg_dir/*
  4677. echo 'configure_gpg' >> $COMPLETION_FILE
  4678. return
  4679. fi
  4680. if [ ! -d $gpg_dir ]; then
  4681. mkdir $gpg_dir
  4682. echo "keyserver $GPG_KEYSERVER" >> $gpg_dir/gpg.conf
  4683. echo 'keyserver-options auto-key-retrieve' >> $gpg_dir/gpg.conf
  4684. fi
  4685. sed -i "s|keyserver hkp://keys.gnupg.net|keyserver $GPG_KEYSERVER|g" $gpg_dir/gpg.conf
  4686. if ! grep -q "# default preferences" $gpg_dir/gpg.conf; then
  4687. echo '' >> $gpg_dir/gpg.conf
  4688. echo '# default preferences' >> $gpg_dir/gpg.conf
  4689. echo 'personal-digest-preferences SHA256' >> $gpg_dir/gpg.conf
  4690. echo 'cert-digest-algo SHA256' >> $gpg_dir/gpg.conf
  4691. echo 'default-preference-list SHA512 SHA384 SHA256 SHA224 AES256 AES192 AES CAST5 ZLIB BZIP2 ZIP Uncompressed' >> $gpg_dir/gpg.conf
  4692. fi
  4693. chown -R $MY_USERNAME:$MY_USERNAME $gpg_dir
  4694. chmod 700 $gpg_dir
  4695. chmod 600 $gpg_dir/*
  4696. if [[ $MY_GPG_PUBLIC_KEY && $MY_GPG_PRIVATE_KEY ]]; then
  4697. echo $'Importing GPG keys from file'
  4698. echo $"Public key: $MY_GPG_PUBLIC_KEY"
  4699. echo $"Private key: $MY_GPG_PRIVATE_KEY"
  4700. # use your existing GPG keys which were exported
  4701. if [ ! -f $MY_GPG_PUBLIC_KEY ]; then
  4702. echo $"GPG public key file $MY_GPG_PUBLIC_KEY was not found"
  4703. exit 2483
  4704. fi
  4705. if [ ! -f $MY_GPG_PRIVATE_KEY ]; then
  4706. echo $"GPG private key file $MY_GPG_PRIVATE_KEY was not found"
  4707. exit 5383
  4708. fi
  4709. su -c "gpg --import $MY_GPG_PUBLIC_KEY" - $MY_USERNAME
  4710. su -c "gpg --allow-secret-key-import --import $MY_GPG_PRIVATE_KEY" - $MY_USERNAME
  4711. KEY_EXISTS=$(gpg_key_exists "$MY_USERNAME" "$MY_EMAIL_ADDRESS")
  4712. if [[ $KEY_EXISTS == "no" ]]; then
  4713. echo $"The GPG key for $MY_EMAIL_ADDRESS could not be imported"
  4714. exit 13821
  4715. fi
  4716. # for security ensure that the private key file doesn't linger around
  4717. shred -zu $MY_GPG_PRIVATE_KEY
  4718. MY_GPG_PUBLIC_KEY_ID=$(gpg_pubkey_from_email "$MY_USERNAME" "$MY_EMAIL_ADDRESS")
  4719. if [ ${#MY_GPG_PUBLIC_KEY_ID} -lt 4 ]; then
  4720. echo $'GPG public key ID could not be obtained'
  4721. fi
  4722. else
  4723. # Generate a GPG key
  4724. echo 'Key-Type: 1' > /home/$MY_USERNAME/gpg-genkey.conf
  4725. echo 'Key-Length: 4096' >> /home/$MY_USERNAME/gpg-genkey.conf
  4726. echo 'Subkey-Type: 1' >> /home/$MY_USERNAME/gpg-genkey.conf
  4727. echo 'Subkey-Length: 4096' >> /home/$MY_USERNAME/gpg-genkey.conf
  4728. echo "Name-Real: $MY_NAME" >> /home/$MY_USERNAME/gpg-genkey.conf
  4729. echo "Name-Email: $MY_EMAIL_ADDRESS" >> /home/$MY_USERNAME/gpg-genkey.conf
  4730. echo 'Expire-Date: 0' >> /home/$MY_USERNAME/gpg-genkey.conf
  4731. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/gpg-genkey.conf
  4732. echo $'Generating a new GPG key'
  4733. su -c "gpg --batch --gen-key /home/$MY_USERNAME/gpg-genkey.conf" - $MY_USERNAME
  4734. KEY_EXISTS=$(gpg_key_exists "$MY_USERNAME" "$MY_EMAIL_ADDRESS")
  4735. if [[ $KEY_EXISTS == "no" ]]; then
  4736. echo $"A GPG key for $MY_EMAIL_ADDRESS could not be created"
  4737. exit 6362
  4738. fi
  4739. shred -zu /home/$MY_USERNAME/gpg-genkey.conf
  4740. MY_GPG_PUBLIC_KEY_ID=$(gpg_pubkey_from_email "$MY_USERNAME" "$MY_EMAIL_ADDRESS")
  4741. if [ ${#MY_GPG_PUBLIC_KEY_ID} -lt 4 ]; then
  4742. echo $'GPG public key ID could not be obtained'
  4743. fi
  4744. MY_GPG_PUBLIC_KEY=/tmp/public_key.gpg
  4745. su -c "gpg --output $MY_GPG_PUBLIC_KEY --armor --export $MY_GPG_PUBLIC_KEY_ID" - $MY_USERNAME
  4746. if grep -q "configure_email" $COMPLETION_FILE; then
  4747. if ! grep -q $"Change your GPG password" /home/$MY_USERNAME/README; then
  4748. echo '' >> /home/$MY_USERNAME/README
  4749. echo '' >> /home/$MY_USERNAME/README
  4750. echo $'Change your GPG password' >> /home/$MY_USERNAME/README
  4751. echo '========================' >> /home/$MY_USERNAME/README
  4752. echo $"It's very important to add a password to your GPG key so that" >> /home/$MY_USERNAME/README
  4753. echo $"if anyone does get access to your email they still won't be able" >> /home/$MY_USERNAME/README
  4754. echo $'to read them without knowning the GPG password.' >> /home/$MY_USERNAME/README
  4755. echo $'You can change the it with:' >> /home/$MY_USERNAME/README
  4756. echo '' >> /home/$MY_USERNAME/README
  4757. echo " gpg --edit-key $MY_GPG_PUBLIC_KEY_ID" >> /home/$MY_USERNAME/README
  4758. echo ' passwd' >> /home/$MY_USERNAME/README
  4759. echo ' save' >> /home/$MY_USERNAME/README
  4760. echo ' quit' >> /home/$MY_USERNAME/README
  4761. fi
  4762. if ! grep -q $"Publish your GPG public key" /home/$MY_USERNAME/README; then
  4763. echo '' >> /home/$MY_USERNAME/README
  4764. echo '' >> /home/$MY_USERNAME/README
  4765. echo $'Publish your GPG public key' >> /home/$MY_USERNAME/README
  4766. echo '===========================' >> /home/$MY_USERNAME/README
  4767. echo $'So that others can send emails to you securely you should' >> /home/$MY_USERNAME/README
  4768. echo $'publish your GPG public key with the command:' >> /home/$MY_USERNAME/README
  4769. echo '' >> /home/$MY_USERNAME/README
  4770. echo " gpg --send-keys $MY_GPG_PUBLIC_KEY_ID" >> /home/$MY_USERNAME/README
  4771. fi
  4772. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
  4773. chmod 600 /home/$MY_USERNAME/README
  4774. fi
  4775. fi
  4776. echo 'configure_gpg' >> $COMPLETION_FILE
  4777. }
  4778. function configure_backup_key {
  4779. if grep -Fxq "configure_backup_key" $COMPLETION_FILE; then
  4780. return
  4781. fi
  4782. apt-get -y install gnupg
  4783. BACKUP_KEY_EXISTS=$(gpg_key_exists "root" "$MY_NAME (backup key)")
  4784. if [[ $BACKUP_KEY_EXISTS == "yes" ]]; then
  4785. return
  4786. fi
  4787. # Generate a GPG key for backups
  4788. BACKUP_KEY_EXISTS=$(gpg_key_exists "$MY_USERNAME" "$MY_NAME (backup key)")
  4789. if [[ $BACKUP_KEY_EXISTS == "no" ]]; then
  4790. echo 'Key-Type: 1' > /home/$MY_USERNAME/gpg-genkey.conf
  4791. echo 'Key-Length: 4096' >> /home/$MY_USERNAME/gpg-genkey.conf
  4792. echo 'Subkey-Type: 1' >> /home/$MY_USERNAME/gpg-genkey.conf
  4793. echo 'Subkey-Length: 4096' >> /home/$MY_USERNAME/gpg-genkey.conf
  4794. echo "Name-Real: $MY_NAME" >> /home/$MY_USERNAME/gpg-genkey.conf
  4795. echo "Name-Email: $MY_EMAIL_ADDRESS" >> /home/$MY_USERNAME/gpg-genkey.conf
  4796. echo "Name-Comment: backup key" >> /home/$MY_USERNAME/gpg-genkey.conf
  4797. echo 'Expire-Date: 0' >> /home/$MY_USERNAME/gpg-genkey.conf
  4798. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/gpg-genkey.conf
  4799. echo $'Backup key does not exist. Creating it.'
  4800. su -c "gpg --batch --gen-key /home/$MY_USERNAME/gpg-genkey.conf" - $MY_USERNAME
  4801. shred -zu /home/$MY_USERNAME/gpg-genkey.conf
  4802. echo $'Checking that the Backup key was created'
  4803. BACKUP_KEY_EXISTS=$(gpg_key_exists "$MY_USERNAME" "$MY_NAME (backup key)")
  4804. if [[ $BACKUP_KEY_EXISTS == "no" ]]; then
  4805. echo $'Backup key could not be created'
  4806. exit 43382
  4807. fi
  4808. fi
  4809. 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}')
  4810. echo "Backup key: $MY_BACKUP_KEY_ID"
  4811. MY_BACKUP_KEY=/home/$MY_USERNAME/backup_key
  4812. su -c "gpg --output ${MY_BACKUP_KEY}_public.asc --armor --export $MY_BACKUP_KEY_ID" - $MY_USERNAME
  4813. su -c "gpg --output ${MY_BACKUP_KEY}_private.asc --armor --export-secret-key $MY_BACKUP_KEY_ID" - $MY_USERNAME
  4814. if [ ! -f ${MY_BACKUP_KEY}_public.asc ]; then
  4815. echo 'Public backup key could not be exported'
  4816. exit 36829
  4817. fi
  4818. if [ ! -f ${MY_BACKUP_KEY}_private.asc ]; then
  4819. echo 'Private backup key could not be exported'
  4820. exit 29235
  4821. fi
  4822. # import backup key to root user
  4823. gpg --import --import ${MY_BACKUP_KEY}_public.asc
  4824. gpg --allow-secret-key-import --import ${MY_BACKUP_KEY}_private.asc
  4825. shred -zu ${MY_BACKUP_KEY}_public.asc
  4826. shred -zu ${MY_BACKUP_KEY}_private.asc
  4827. echo 'configure_backup_key' >> $COMPLETION_FILE
  4828. }
  4829. function encrypt_incoming_email {
  4830. # encrypts incoming mail using your GPG public key
  4831. # so even if an attacker gains access to the data at rest they still need
  4832. # to know your GPG key password to be able to read anything
  4833. if [[ $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_NONMAILBOX" || $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  4834. return
  4835. fi
  4836. # update to the next commit
  4837. if [ -f /usr/bin/gpgit.pl ]; then
  4838. if grep -q "gpgit commit" $COMPLETION_FILE; then
  4839. CURRENT_GPGIT_COMMIT=$(grep "gpgit commit" $COMPLETION_FILE | awk -F ':' '{print $2}')
  4840. if [[ "$CURRENT_GPGIT_COMMIT" != "$GPGIT_COMMIT" ]]; then
  4841. cd $INSTALL_DIR/gpgit
  4842. git_pull $GPGIT_REPO $GPGIT_COMMIT
  4843. sed -i "s/gpgit commit.*/gpgit commit:$GPGIT_COMMIT/g" $COMPLETION_FILE
  4844. cp gpgit.pl /usr/bin/gpgit.pl
  4845. fi
  4846. else
  4847. echo "gpgit commit:$GPGIT_COMMIT" >> $COMPLETION_FILE
  4848. fi
  4849. fi
  4850. if grep -Fxq "encrypt_incoming_email" $COMPLETION_FILE; then
  4851. return
  4852. fi
  4853. if [[ $GPG_ENCRYPT_STORED_EMAIL != "yes" ]]; then
  4854. return
  4855. fi
  4856. if [ ! -f /usr/bin/gpgit.pl ]; then
  4857. apt-get -y install git libmail-gnupg-perl
  4858. cd $INSTALL_DIR
  4859. git_clone $GPGIT_REPO $INSTALL_DIR/gpgit
  4860. cd $INSTALL_DIR/gpgit
  4861. git checkout $GPGIT_COMMIT -b $GPGIT_COMMIT
  4862. if ! grep -q "gpgit commit" $COMPLETION_FILE; then
  4863. echo "gpgit commit:$GPGIT_COMMIT" >> $COMPLETION_FILE
  4864. else
  4865. sed -i "s/gpgit commit.*/gpgit commit:$GPGIT_COMMIT/g" $COMPLETION_FILE
  4866. fi
  4867. cp gpgit.pl /usr/bin
  4868. fi
  4869. # add a procmail rule
  4870. if ! grep -q "/usr/bin/gpgit.pl" /home/$MY_USERNAME/.procmailrc; then
  4871. echo '' >> /home/$MY_USERNAME/.procmailrc
  4872. echo ':0 f' >> /home/$MY_USERNAME/.procmailrc
  4873. echo "| /usr/bin/gpgit.pl --encrypt-mode prefer-inline --inline-flatten $MY_EMAIL_ADDRESS" >> /home/$MY_USERNAME/.procmailrc
  4874. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.procmailrc
  4875. echo '' >> /etc/skel/.procmailrc
  4876. echo ':0 f' >> /etc/skel/.procmailrc
  4877. echo -n '| /usr/bin/gpgit.pl --encrypt-mode prefer-inline --inline-flatten $USER@' >> /etc/skel/.procmailrc
  4878. echo "$DEFAULT_DOMAIN_NAME" >> /etc/skel/.procmailrc
  4879. fi
  4880. echo 'encrypt_incoming_email' >> $COMPLETION_FILE
  4881. }
  4882. function encrypt_outgoing_email {
  4883. # encrypts outgoing mail using your GPG public key
  4884. # so even if an attacker gains access to the data at rest they still need
  4885. # to know your GPG key password to be able to read sent mail
  4886. if [[ $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_NONMAILBOX" || $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  4887. return
  4888. fi
  4889. if grep -Fxq "encrypt_outgoing_email" $COMPLETION_FILE; then
  4890. return
  4891. fi
  4892. if [[ $GPG_ENCRYPT_STORED_EMAIL != "yes" ]]; then
  4893. return
  4894. fi
  4895. if [ ! -d /home/$MY_USERNAME/.gnupg ]; then
  4896. return
  4897. fi
  4898. if [ ! -f /home/$MY_USERNAME/.muttrc ]; then
  4899. return
  4900. fi
  4901. # obtain your public key ID
  4902. if [ ! $MY_GPG_PUBLIC_KEY_ID ]; then
  4903. MY_GPG_PUBLIC_KEY_ID=$(gpg_pubkey_from_email "$MY_USERNAME" "$MY_EMAIL_ADDRESS")
  4904. if [ ! "$MY_GPG_PUBLIC_KEY_ID" ]; then
  4905. return
  4906. fi
  4907. if [ ${#MY_GPG_PUBLIC_KEY_ID} -lt 4 ]; then
  4908. return
  4909. fi
  4910. fi
  4911. if ! grep -q "pgp_encrypt_only_command" /home/$MY_USERNAME/.muttrc; then
  4912. echo '' >> /home/$MY_USERNAME/.muttrc
  4913. echo $'# Encrypt items in the Sent folder' >> /home/$MY_USERNAME/.muttrc
  4914. 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
  4915. else
  4916. 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
  4917. fi
  4918. if ! grep -q "pgp_encrypt_sign_command" /home/$MY_USERNAME/.muttrc; then
  4919. 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
  4920. else
  4921. 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
  4922. fi
  4923. echo 'encrypt_outgoing_email' >> $COMPLETION_FILE
  4924. }
  4925. function encrypt_all_email {
  4926. if [[ $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_NONMAILBOX" || $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  4927. return
  4928. fi
  4929. if [[ $GPG_ENCRYPT_STORED_EMAIL != "yes" ]]; then
  4930. return
  4931. fi
  4932. if [ -f /usr/local/bin/${PROJECT_NAME}-encrypt-mail ]; then
  4933. cp /usr/local/bin/${PROJECT_NAME}-encrypt-mail /usr/bin/encmaildir
  4934. else
  4935. cp /usr/bin/${PROJECT_NAME}-encrypt-mail /usr/bin/encmaildir
  4936. fi
  4937. chmod +x /usr/bin/encmaildir
  4938. if grep -Fxq "encrypt_all_email" $COMPLETION_FILE; then
  4939. return
  4940. fi
  4941. if [ ! /home/$MY_USERNAME/README ]; then
  4942. touch /home/$MY_USERNAME/README
  4943. fi
  4944. if ! grep -q $"If you have imported legacy email which is not encrypted" /home/$MY_USERNAME/README; then
  4945. echo '' >> /home/$MY_USERNAME/README
  4946. echo '' >> /home/$MY_USERNAME/README
  4947. echo $'Encrypting legacy email' >> /home/$MY_USERNAME/README
  4948. echo '=======================' >> /home/$MY_USERNAME/README
  4949. echo $'If you have imported legacy email which is not encrypted' >> /home/$MY_USERNAME/README
  4950. echo $'then it can be encrypted with the command:' >> /home/$MY_USERNAME/README
  4951. echo '' >> /home/$MY_USERNAME/README
  4952. echo ' encmaildir' >> /home/$MY_USERNAME/README
  4953. echo '' >> /home/$MY_USERNAME/README
  4954. echo $'But be warned that depending upon how much email you have' >> /home/$MY_USERNAME/README
  4955. echo $'this could take a seriously LONG time on the Beaglebone' >> /home/$MY_USERNAME/README
  4956. echo $'and may be better done on a faster machine.' >> /home/$MY_USERNAME/README
  4957. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
  4958. chmod 600 /home/$MY_USERNAME/README
  4959. fi
  4960. echo 'encrypt_all_email' >> $COMPLETION_FILE
  4961. }
  4962. function email_client {
  4963. if [[ $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_NONMAILBOX" || $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  4964. return
  4965. fi
  4966. if grep -Fxq "email_client" $COMPLETION_FILE; then
  4967. return
  4968. fi
  4969. apt-get -y install mutt-patched lynx abook
  4970. if [ ! -f /etc/Muttrc ]; then
  4971. echo $"ERROR: Mutt does not appear to have installed. $CHECK_MESSAGE"
  4972. exit 49
  4973. fi
  4974. if [ ! -d /home/$MY_USERNAME/.mutt ]; then
  4975. mkdir /home/$MY_USERNAME/.mutt
  4976. fi
  4977. echo "text/html; lynx -dump -width=78 -nolist %s | sed ‘s/^ //’; copiousoutput; needsterminal; nametemplate=%s.html" > /home/$MY_USERNAME/.mutt/mailcap
  4978. cp /home/$MY_USERNAME/.mutt/mailcap /etc/skel/.mutt
  4979. chown -R $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.mutt
  4980. chown -R root:root /etc/skel/.mutt
  4981. echo 'set mbox_type=Maildir' >> /etc/Muttrc
  4982. echo 'set folder="~/Maildir"' >> /etc/Muttrc
  4983. echo 'set mask="!^\\.[^.]"' >> /etc/Muttrc
  4984. echo 'set mbox="~/Maildir"' >> /etc/Muttrc
  4985. echo 'set record="+Sent"' >> /etc/Muttrc
  4986. echo 'set postponed="+Drafts"' >> /etc/Muttrc
  4987. echo 'set trash="+Trash"' >> /etc/Muttrc
  4988. echo 'set spoolfile="~/Maildir"' >> /etc/Muttrc
  4989. echo 'auto_view text/x-vcard text/html text/enriched' >> /etc/Muttrc
  4990. echo 'set editor="emacs -q --load ~/.emacs-mutt"' >> /etc/Muttrc
  4991. echo 'set header_cache="+.cache"' >> /etc/Muttrc
  4992. echo '' >> /etc/Muttrc
  4993. echo 'macro index S "<tag-prefix><decode-save>=.learn-spam<enter>" "move to learn-spam"' >> /etc/Muttrc
  4994. echo 'macro pager S "<decode-save>=.learn-spam<enter>" "move to learn-spam"' >> /etc/Muttrc
  4995. echo 'macro index H "<tag-prefix><decode-copy>=.learn-ham<enter>" "copy to learn-ham"' >> /etc/Muttrc
  4996. echo 'macro pager H "<decode-copy>=.learn-ham<enter>" "copy to learn-ham"' >> /etc/Muttrc
  4997. echo '' >> /etc/Muttrc
  4998. echo '# set up the sidebar' >> /etc/Muttrc
  4999. echo 'set sidebar_width=22' >> /etc/Muttrc
  5000. echo 'set sidebar_visible=yes' >> /etc/Muttrc
  5001. echo "set sidebar_delim='|'" >> /etc/Muttrc
  5002. echo 'set sidebar_sort=yes' >> /etc/Muttrc
  5003. echo '' >> /etc/Muttrc
  5004. echo 'set rfc2047_parameters' >> /etc/Muttrc
  5005. echo '' >> /etc/Muttrc
  5006. echo '# Show inbox and sent items' >> /etc/Muttrc
  5007. echo 'mailboxes = =Sent =maybe-spam =spam' >> /etc/Muttrc
  5008. echo '' >> /etc/Muttrc
  5009. echo '# Alter these colours as needed for maximum bling' >> /etc/Muttrc
  5010. echo 'color sidebar_new yellow default' >> /etc/Muttrc
  5011. echo 'color normal white default' >> /etc/Muttrc
  5012. echo 'color hdrdefault brightcyan default' >> /etc/Muttrc
  5013. echo 'color signature green default' >> /etc/Muttrc
  5014. echo 'color attachment brightyellow default' >> /etc/Muttrc
  5015. echo 'color quoted green default' >> /etc/Muttrc
  5016. echo 'color quoted1 white default' >> /etc/Muttrc
  5017. echo 'color tilde blue default' >> /etc/Muttrc
  5018. echo '' >> /etc/Muttrc
  5019. echo '# ctrl-n, ctrl-p to select next, prev folder' >> /etc/Muttrc
  5020. echo '# ctrl-o to open selected folder' >> /etc/Muttrc
  5021. echo 'bind index \Cp sidebar-prev' >> /etc/Muttrc
  5022. echo 'bind index \Cn sidebar-next' >> /etc/Muttrc
  5023. echo 'bind index \Co sidebar-open' >> /etc/Muttrc
  5024. echo 'bind pager \Cp sidebar-prev' >> /etc/Muttrc
  5025. echo 'bind pager \Cn sidebar-next' >> /etc/Muttrc
  5026. echo 'bind pager \Co sidebar-open' >> /etc/Muttrc
  5027. echo '' >> /etc/Muttrc
  5028. echo '# ctrl-b toggles sidebar visibility' >> /etc/Muttrc
  5029. echo "macro index,pager \Cb '<enter-command>toggle sidebar_visible<enter><redraw-screen>' 'toggle sidebar'" >> /etc/Muttrc
  5030. echo '' >> /etc/Muttrc
  5031. echo '# esc-m Mark new messages as read' >> /etc/Muttrc
  5032. echo 'macro index <esc>m "T~N<enter>;WNT~O<enter>;WO\CT~T<enter>" "mark all messages read"' >> /etc/Muttrc
  5033. echo '' >> /etc/Muttrc
  5034. echo '# Collapsing threads' >> /etc/Muttrc
  5035. echo 'macro index [ "<collapse-thread>" "collapse/uncollapse thread"' >> /etc/Muttrc
  5036. echo 'macro index ] "<collapse-all>" "collapse/uncollapse all threads"' >> /etc/Muttrc
  5037. echo '' >> /etc/Muttrc
  5038. echo '# threads containing new messages' >> /etc/Muttrc
  5039. echo 'uncolor index "~(~N)"' >> /etc/Muttrc
  5040. echo 'color index brightblue default "~(~N)"' >> /etc/Muttrc
  5041. echo '' >> /etc/Muttrc
  5042. echo '# new messages themselves' >> /etc/Muttrc
  5043. echo 'uncolor index "~N"' >> /etc/Muttrc
  5044. echo 'color index brightyellow default "~N"' >> /etc/Muttrc
  5045. echo '' >> /etc/Muttrc
  5046. echo '# GPG/PGP integration' >> /etc/Muttrc
  5047. echo '# this set the number of seconds to keep in memory the passphrase used to encrypt/sign' >> /etc/Muttrc
  5048. echo 'set pgp_timeout=1800' >> /etc/Muttrc
  5049. echo '' >> /etc/Muttrc
  5050. echo '# automatically sign and encrypt with PGP/MIME' >> /etc/Muttrc
  5051. echo 'set pgp_autosign # autosign all outgoing mails' >> /etc/Muttrc
  5052. echo 'set pgp_autoencrypt # Try to encrypt automatically' >> /etc/Muttrc
  5053. echo 'set pgp_replyencrypt # autocrypt replies to crypted' >> /etc/Muttrc
  5054. echo 'set pgp_replysign # autosign replies to signed' >> /etc/Muttrc
  5055. echo 'set pgp_auto_decode=yes # decode attachments' >> /etc/Muttrc
  5056. echo 'set fcc_clear=no # Keep encrypted copy of sent encrypted mail' >> /etc/Muttrc
  5057. echo 'unset smime_is_default' >> /etc/Muttrc
  5058. echo '' >> /etc/Muttrc
  5059. echo 'set alias_file=~/.mutt-alias' >> /etc/Muttrc
  5060. echo 'source ~/.mutt-alias' >> /etc/Muttrc
  5061. echo 'set query_command= "abook --mutt-query \"%s\""' >> /etc/Muttrc
  5062. echo 'macro index,pager A "<pipe-message>abook --add-email-quiet<return>" "add the sender address to abook"' >> /etc/Muttrc
  5063. # create an Emacs configuration specifically for use with Mutt, which
  5064. # has word wrap and spell checking on by default
  5065. echo "(add-hook 'before-save-hook 'delete-trailing-whitespace)" > /home/$MY_USERNAME/.emacs-mutt
  5066. echo '(setq org-support-shift-select t)' >> /home/$MY_USERNAME/.emacs-mutt
  5067. echo '(setq standard-indent 4)' >> /home/$MY_USERNAME/.emacs-mutt
  5068. echo '(setq-default tab-width 4)' >> /home/$MY_USERNAME/.emacs-mutt
  5069. echo '(setq c-basic-offset 4)' >> /home/$MY_USERNAME/.emacs-mutt
  5070. echo '(mouse-wheel-mode t)' >> /home/$MY_USERNAME/.emacs-mutt
  5071. echo '(setq make-backup-files t)' >> /home/$MY_USERNAME/.emacs-mutt
  5072. echo '(setq version-control t)' >> /home/$MY_USERNAME/.emacs-mutt
  5073. echo '(setq backup-directory-alist (quote ((".*" . "~/.emacs_backups/"))))' >> /home/$MY_USERNAME/.emacs-mutt
  5074. echo "(setq default-major-mode 'text-mode)" >> /home/$MY_USERNAME/.emacs-mutt
  5075. echo "(dolist (hook '(text-mode-hook))" >> /home/$MY_USERNAME/.emacs-mutt
  5076. echo ' (add-hook hook (lambda () (flyspell-mode 1))))' >> /home/$MY_USERNAME/.emacs-mutt
  5077. echo '(setq-default fill-column 72)' >> /home/$MY_USERNAME/.emacs-mutt
  5078. echo '(setq auto-fill-mode 0)' >> /home/$MY_USERNAME/.emacs-mutt
  5079. echo "(add-hook 'text-mode-hook 'turn-on-auto-fill)" >> /home/$MY_USERNAME/.emacs-mutt
  5080. echo "(setq-default auto-fill-function 'do-auto-fill)" >> /home/$MY_USERNAME/.emacs-mutt
  5081. # add the emacs mutt configuration to the user profile skeleton
  5082. if [ ! -f /etc/skel/.emacs-mutt ]; then
  5083. cp /home/$MY_USERNAME/.emacs-mutt /etc/skel/.emacs-mutt
  5084. chown root:root /etc/skel/.emacs-mutt
  5085. fi
  5086. cp -f /etc/Muttrc /home/$MY_USERNAME/.muttrc
  5087. cp -f /etc/Muttrc /etc/skel/.muttrc
  5088. touch /home/$MY_USERNAME/.mutt-alias
  5089. cp /home/$MY_USERNAME/.mutt-alias /etc/skel/.mutt-alias
  5090. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.emacs-mutt
  5091. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.muttrc
  5092. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.mutt-alias
  5093. # default user on generic images
  5094. if [ -d /home/${GENERIC_IMAGE_USERNAME} ]; then
  5095. cp -f /etc/Muttrc /home/${GENERIC_IMAGE_USERNAME}/.muttrc
  5096. chown ${GENERIC_IMAGE_USERNAME}:${GENERIC_IMAGE_USERNAME} /home/${GENERIC_IMAGE_USERNAME}/.muttrc
  5097. touch /home/${GENERIC_IMAGE_USERNAME}/.mutt-alias
  5098. chown ${GENERIC_IMAGE_USERNAME}:${GENERIC_IMAGE_USERNAME} /home/${GENERIC_IMAGE_USERNAME}/.mutt-alias
  5099. cp /etc/skel/.emacs-mutt /home/${GENERIC_IMAGE_USERNAME}/.emacs-mutt
  5100. chown ${GENERIC_IMAGE_USERNAME}:${GENERIC_IMAGE_USERNAME} /home/${GENERIC_IMAGE_USERNAME}/.emacs-mutt
  5101. fi
  5102. echo 'email_client' >> $COMPLETION_FILE
  5103. }
  5104. function email_archiving {
  5105. if [[ $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_NONMAILBOX" || $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  5106. return
  5107. fi
  5108. # ensure that the mail archive script is up to date
  5109. if [ -f /usr/local/bin/${PROJECT_NAME}-archive-mail ]; then
  5110. cp /usr/local/bin/${PROJECT_NAME}-archive-mail /etc/cron.daily/archivemail
  5111. else
  5112. if [ -f /usr/bin/${PROJECT_NAME}-archive-mail ]; then
  5113. cp /usr/bin/${PROJECT_NAME}-archive-mail /etc/cron.daily/archivemail
  5114. else
  5115. echo "/usr/bin/${PROJECT_NAME}-archive-email was not found. ${PROJECT_NAME} might not have fully installed."
  5116. exit 62379
  5117. fi
  5118. fi
  5119. chmod +x /etc/cron.daily/archivemail
  5120. # update to the next commit
  5121. if [ -d $INSTALL_DIR/cleanup-maildir ]; then
  5122. if grep -q "cleanup-maildir commit" $COMPLETION_FILE; then
  5123. CURRENT_CLEANUP_MAILDIR_COMMIT=$(grep "cleanup-maildir commit" $COMPLETION_FILE | awk -F ':' '{print $2}')
  5124. if [[ "$CURRENT_CLEANUP_MAILDIR_COMMIT" != "$CLEANUP_MAILDIR_COMMIT" ]]; then
  5125. cd $INSTALL_DIR/cleanup-maildir
  5126. git_pull $CLEANUP_MAILDIR_REPO $CLEANUP_MAILDIR_COMMIT
  5127. sed -i "s/cleanup-maildir commit.*/cleanup-maildir commit:$CLEANUP_MAILDIR_COMMIT/g" $COMPLETION_FILE
  5128. cp $INSTALL_DIR/cleanup-maildir/cleanup-maildir /usr/bin
  5129. fi
  5130. else
  5131. echo "cleanup-maildir commit:$CLEANUP_MAILDIR_COMMIT" >> $COMPLETION_FILE
  5132. fi
  5133. fi
  5134. if grep -Fxq "email_archiving" $COMPLETION_FILE; then
  5135. return
  5136. fi
  5137. if [ ! -d $INSTALL_DIR ]; then
  5138. mkdir $INSTALL_DIR
  5139. fi
  5140. cd $INSTALL_DIR
  5141. git_clone $CLEANUP_MAILDIR_REPO $INSTALL_DIR/cleanup-maildir
  5142. cd $INSTALL_DIR/cleanup-maildir
  5143. git checkout $CLEANUP_MAILDIR_COMMIT -b $CLEANUP_MAILDIR_COMMIT
  5144. if ! grep -q "cleanup-maildir commit" $COMPLETION_FILE; then
  5145. echo "cleanup-maildir commit:$CLEANUP_MAILDIR_COMMIT" >> $COMPLETION_FILE
  5146. else
  5147. sed -i "s/cleanup-maildir commit.*/cleanup-maildir commit:$CLEANUP_MAILDIR_COMMIT/g" $COMPLETION_FILE
  5148. fi
  5149. cp $INSTALL_DIR/cleanup-maildir/cleanup-maildir /usr/bin
  5150. echo 'email_archiving' >> $COMPLETION_FILE
  5151. }
  5152. # Ensure that the from field is correct when sending email from Mutt
  5153. function email_from_address {
  5154. if grep -Fxq "email_from_address" $COMPLETION_FILE; then
  5155. return
  5156. fi
  5157. if [ ! -f /home/$MY_USERNAME/.muttrc ]; then
  5158. return
  5159. fi
  5160. if grep -q "set from=" /home/$MY_USERNAME/.muttrc; then
  5161. sed -i "s|set from=.*|set from='$MY_NAME <$MY_EMAIL_ADDRESS>'|g" /home/$MY_USERNAME/.muttrc
  5162. else
  5163. echo "set from='$MY_NAME <$MY_EMAIL_ADDRESS>'" >> /home/$MY_USERNAME/.muttrc
  5164. fi
  5165. echo 'email_from_address' >> $COMPLETION_FILE
  5166. }
  5167. function create_public_mailing_list {
  5168. if [[ $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_NONMAILBOX" || $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  5169. return
  5170. fi
  5171. if grep -Fxq "create_public_mailing_list" $COMPLETION_FILE; then
  5172. return
  5173. fi
  5174. if [ ! $PUBLIC_MAILING_LIST ]; then
  5175. return
  5176. fi
  5177. # does the mailing list have a separate domain name?
  5178. if [ ! $PUBLIC_MAILING_LIST_DOMAIN_NAME ]; then
  5179. PUBLIC_MAILING_LIST_DOMAIN_NAME=$DEFAULT_DOMAIN_NAME
  5180. fi
  5181. PUBLIC_MAILING_LIST_USER="mlmmj"
  5182. apt-get -y install mlmmj
  5183. adduser --system $PUBLIC_MAILING_LIST_USER
  5184. addgroup $PUBLIC_MAILING_LIST_USER
  5185. adduser $PUBLIC_MAILING_LIST_USER $PUBLIC_MAILING_LIST_USER
  5186. echo ''
  5187. echo $"Creating the $PUBLIC_MAILING_LIST mailing list"
  5188. echo ''
  5189. # create the list
  5190. mlmmj-make-ml -a -L "$PUBLIC_MAILING_LIST" -c $PUBLIC_MAILING_LIST_USER
  5191. echo 'SYSTEM_ALIASES_PIPE_TRANSPORT = address_pipe' > /etc/exim4/conf.d/main/000_localmacros
  5192. echo "SYSTEM_ALIASES_USER = $PUBLIC_MAILING_LIST_USER" >> /etc/exim4/conf.d/main/000_localmacros
  5193. echo "SYSTEM_ALIASES_GROUP = $PUBLIC_MAILING_LIST_USER" >> /etc/exim4/conf.d/main/000_localmacros
  5194. # router
  5195. echo 'mlmmj_router:' > /etc/exim4/conf.d/router/750_exim4-config_mlmmj
  5196. echo ' debug_print = "R: mlmmj_router for $local_part@$domain"' >> /etc/exim4/conf.d/router/750_exim4-config_mlmmj
  5197. echo ' driver = accept' >> /etc/exim4/conf.d/router/750_exim4-config_mlmmj
  5198. echo ' domains = +mlmmj_domains' >> /etc/exim4/conf.d/router/750_exim4-config_mlmmj
  5199. echo ' #require_files = MLMMJ_HOME/${lc::$local_part}' >> /etc/exim4/conf.d/router/750_exim4-config_mlmmj
  5200. 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
  5201. echo ' # Exim will then spawn a new process running under the UID of "mlmmj".' >> /etc/exim4/conf.d/router/750_exim4-config_mlmmj
  5202. echo ' require_files = mlmmj:MLMMJ_HOME/${lc::$local_part}' >> /etc/exim4/conf.d/router/750_exim4-config_mlmmj
  5203. echo ' local_part_suffix = +*' >> /etc/exim4/conf.d/router/750_exim4-config_mlmmj
  5204. echo ' local_part_suffix_optional' >> /etc/exim4/conf.d/router/750_exim4-config_mlmmj
  5205. echo ' headers_remove = Delivered-To' >> /etc/exim4/conf.d/router/750_exim4-config_mlmmj
  5206. echo ' headers_add = Delivered-To: $local_part$local_part_suffix@$domain' >> /etc/exim4/conf.d/router/750_exim4-config_mlmmj
  5207. echo ' transport = mlmmj_transport' >> /etc/exim4/conf.d/router/750_exim4-config_mlmmj
  5208. # transport
  5209. echo 'mlmmj_transport:' > /etc/exim4/conf.d/transport/40_exim4-config_mlmmj
  5210. echo ' debug_print = "T: mlmmj_transport for $local_part@$domain"' >> /etc/exim4/conf.d/transport/40_exim4-config_mlmmj
  5211. echo ' driver = pipe' >> /etc/exim4/conf.d/transport/40_exim4-config_mlmmj
  5212. echo ' return_path_add' >> /etc/exim4/conf.d/transport/40_exim4-config_mlmmj
  5213. echo ' user = mlmmj' >> /etc/exim4/conf.d/transport/40_exim4-config_mlmmj
  5214. echo ' group = mlmmj' >> /etc/exim4/conf.d/transport/40_exim4-config_mlmmj
  5215. echo ' home_directory = MLMMJ_HOME' >> /etc/exim4/conf.d/transport/40_exim4-config_mlmmj
  5216. echo ' current_directory = MLMMJ_HOME' >> /etc/exim4/conf.d/transport/40_exim4-config_mlmmj
  5217. echo ' command = /usr/bin/mlmmj-receive -F -L MLMMJ_HOME/${lc:$local_part}' >> /etc/exim4/conf.d/transport/40_exim4-config_mlmmj
  5218. if ! grep -q "MLMMJ_HOME=/var/spool/mlmmj" /etc/exim4/conf.d/main/01_exim4-config_listmacrosdefs; then
  5219. sed -i '/MAIN CONFIGURATION SETTINGS/a\MLMMJ_HOME=/var/spool/mlmmj' /etc/exim4/conf.d/main/01_exim4-config_listmacrosdefs
  5220. fi
  5221. if ! grep -q "domainlist mlmmj_domains =" /etc/exim4/conf.d/main/01_exim4-config_listmacrosdefs; then
  5222. sed -i "/MLMMJ_HOME/a\domainlist mlmmj_domains = $PUBLIC_MAILING_LIST_DOMAIN_NAME" /etc/exim4/conf.d/main/01_exim4-config_listmacrosdefs
  5223. fi
  5224. if ! grep -q "delay_warning_condition =" /etc/exim4/conf.d/main/01_exim4-config_listmacrosdefs; then
  5225. 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
  5226. fi
  5227. if ! grep -q ": +mlmmj_domains" /etc/exim4/conf.d/main/01_exim4-config_listmacrosdefs; then
  5228. 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
  5229. fi
  5230. if ! grep -q "! +mlmmj_domains" /etc/exim4/conf.d/router/200_exim4-config_primary; then
  5231. sed -i 's/domains = ! +local_domains/domains = ! +mlmmj_domains : ! +local_domains/g' /etc/exim4/conf.d/router/200_exim4-config_primary
  5232. fi
  5233. newaliases
  5234. update-exim4.conf.template -r
  5235. update-exim4.conf
  5236. systemctl restart exim4
  5237. if ! grep -q $"$PUBLIC_MAILING_LIST mailing list" /home/$MY_USERNAME/README; then
  5238. echo '' >> /home/$MY_USERNAME/README
  5239. echo '' >> /home/$MY_USERNAME/README
  5240. echo $"$PUBLIC_MAILING_LIST mailing list" >> /home/$MY_USERNAME/README
  5241. echo '=================================' >> /home/$MY_USERNAME/README
  5242. echo $"To subscribe to the $PUBLIC_MAILING_LIST mailing list send a" >> /home/$MY_USERNAME/README
  5243. echo $"cleartext email to $PUBLIC_MAILING_LIST+subscribe@$DEFAULT_DOMAIN_NAME" >> /home/$MY_USERNAME/README
  5244. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
  5245. chmod 600 /home/$MY_USERNAME/README
  5246. fi
  5247. ${PROJECT_NAME}-addlist -u $MY_USERNAME -l "$PUBLIC_MAILING_LIST" -s "$PUBLIC_MAILING_LIST"
  5248. echo 'create_public_mailing_list' >> $COMPLETION_FILE
  5249. }
  5250. function create_private_mailing_list {
  5251. if [[ $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_NONMAILBOX" || $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  5252. return
  5253. fi
  5254. # This installation doesn't work, results in ruby errors
  5255. # There is currently no schleuder package for Debian jessie
  5256. if grep -Fxq "create_private_mailing_list" $COMPLETION_FILE; then
  5257. return
  5258. fi
  5259. if [ ! $PRIVATE_MAILING_LIST ]; then
  5260. return
  5261. fi
  5262. if [[ $PRIVATE_MAILING_LIST == $MY_USERNAME ]]; then
  5263. echo $'The name of the private mailing list should not be the same as your username'
  5264. exit 10
  5265. fi
  5266. if [ ! $MY_GPG_PUBLIC_KEY ]; then
  5267. echo $'To create a private mailing list you need to specify a file'
  5268. echo $'containing your exported GPG key within MY_GPG_PUBLIC_KEY at'
  5269. echo $'the top of the script'
  5270. exit 11
  5271. fi
  5272. apt-get -y install ruby ruby-dev ruby-gpgme libgpgme11-dev libmagic-dev
  5273. gem install schleuder
  5274. schleuder-fix-gem-dependencies
  5275. schleuder-init-setup --gem
  5276. # NOTE: this is version number sensitive and so might need changing
  5277. ln -s /var/lib/gems/2.1.0/gems/schleuder-2.2.4 /var/lib/schleuder
  5278. sed -i 's/#smtp_port: 25/smtp_port: 465/g' /etc/schleuder/schleuder.conf
  5279. sed -i 's/#superadminaddr: root@localhost/superadminaddr: root@localhost' /etc/schleuder/schleuder.conf
  5280. 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
  5281. ${PROJECT_NAME}-addemail -u $MY_USERNAME -e $PRIVATE_MAILING_LIST@$DEFAULT_DOMAIN_NAME -l $PRIVATE_MAILING_LIST
  5282. echo 'schleuder:' > /etc/exim4/conf.d/router/550_exim4-config_schleuder
  5283. echo ' debug_print = "R: schleuder for $local_part@$domain"' >> /etc/exim4/conf.d/router/550_exim4-config_schleuder
  5284. echo ' driver = accept' >> /etc/exim4/conf.d/router/550_exim4-config_schleuder
  5285. echo ' local_part_suffix_optional' >> /etc/exim4/conf.d/router/550_exim4-config_schleuder
  5286. echo ' local_part_suffix = +* : -bounce : -sendkey' >> /etc/exim4/conf.d/router/550_exim4-config_schleuder
  5287. echo ' domains = +local_domains' >> /etc/exim4/conf.d/router/550_exim4-config_schleuder
  5288. echo ' user = schleuder' >> /etc/exim4/conf.d/router/550_exim4-config_schleuder
  5289. echo ' group = schleuder' >> /etc/exim4/conf.d/router/550_exim4-config_schleuder
  5290. echo ' require_files = schleuder:+/var/lib/schleuder/$domain/${local_part}' >> /etc/exim4/conf.d/router/550_exim4-config_schleuder
  5291. echo ' transport = schleuder_transport' >> /etc/exim4/conf.d/router/550_exim4-config_schleuder
  5292. echo 'schleuder_transport:' > /etc/exim4/conf.d/transport/30_exim4-config_schleuder
  5293. echo ' debug_print = "T: schleuder_transport for $local_part@$domain"' >> /etc/exim4/conf.d/transport/30_exim4-config_schleuder
  5294. echo ' driver = pipe' >> /etc/exim4/conf.d/transport/30_exim4-config_schleuder
  5295. echo ' home_directory = "/var/lib/schleuder/$domain/$local_part"' >> /etc/exim4/conf.d/transport/30_exim4-config_schleuder
  5296. echo ' command = "/usr/bin/schleuder $local_part@$domain"' >> /etc/exim4/conf.d/transport/30_exim4-config_schleuder
  5297. chown -R schleuder:schleuder /var/lib/schleuder
  5298. update-exim4.conf.template -r
  5299. update-exim4.conf
  5300. systemctl restart exim4
  5301. useradd -d /var/schleuderlists -s /bin/false schleuder
  5302. adduser Debian-exim schleuder
  5303. usermod -a -G mail schleuder
  5304. #exim -d -bt $PRIVATE_MAILING_LIST@$DEFAULT_DOMAIN_NAME
  5305. echo 'create_private_mailing_list' >> $COMPLETION_FILE
  5306. }
  5307. function split_gpg_key_into_fragments {
  5308. # split the gpg key into fragments if social key management is enabled
  5309. if [[ $ENABLE_SOCIAL_KEY_MANAGEMENT == "yes" ]]; then
  5310. echo 'Splitting GPG key. You may need to enter your passphrase.'
  5311. ${PROJECT_NAME}-splitkey -u $MY_USERNAME -e $MY_EMAIL_ADDRESS --fullname "$MY_NAME"
  5312. if [ ! -d /home/$MY_USERNAME/.gnupg_fragments ]; then
  5313. echo 'Yhe GPG key could not be split'
  5314. exit 86548
  5315. fi
  5316. fi
  5317. }
  5318. function import_email {
  5319. if [[ $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_NONMAILBOX" || $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  5320. return
  5321. fi
  5322. EMAIL_COMPLETE_MSG=$"
  5323. *** ${PROJECT_NAME} mailbox installation is complete ***
  5324. Now on your internet router forward ports
  5325. 25, 587, 465, 993 and 2222 to the ${PROJECT_NAME}
  5326. "
  5327. if grep -Fxq "import_email" $COMPLETION_FILE; then
  5328. if [[ $SYSTEM_TYPE == "$VARIANT_MAILBOX" ]]; then
  5329. backup_to_friends_servers
  5330. intrusion_detection
  5331. split_gpg_key_into_fragments
  5332. clear
  5333. echo ''
  5334. echo "$EMAIL_COMPLETE_MSG"
  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. return
  5343. fi
  5344. if [ $IMPORT_MAILDIR ]; then
  5345. if [ -d $IMPORT_MAILDIR ]; then
  5346. echo $'Transfering email files'
  5347. cp -r $IMPORT_MAILDIR /home/$MY_USERNAME
  5348. chown -R $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/Maildir
  5349. else
  5350. echo $"Email import directory $IMPORT_MAILDIR not found"
  5351. exit 9
  5352. fi
  5353. fi
  5354. echo 'import_email' >> $COMPLETION_FILE
  5355. if [[ $SYSTEM_TYPE == "$VARIANT_MAILBOX" ]]; then
  5356. backup_to_friends_servers
  5357. intrusion_detection
  5358. split_gpg_key_into_fragments
  5359. # unmount any attached usb drive
  5360. clear
  5361. echo ''
  5362. echo "$EMAIL_COMPLETE_MSG"
  5363. echo ''
  5364. if [ -d $USB_MOUNT ]; then
  5365. umount $USB_MOUNT
  5366. rm -rf $USB_MOUNT
  5367. echo $' You can now remove the USB drive'
  5368. fi
  5369. exit 0
  5370. fi
  5371. }
  5372. function install_web_server {
  5373. if [[ $SYSTEM_TYPE == "$VARIANT_CHAT" ]]; then
  5374. return
  5375. fi
  5376. # update to the next commit
  5377. if [ -d $INSTALL_DIR/nginx_ensite ]; then
  5378. if grep -q "Nginx-ensite commit" $COMPLETION_FILE; then
  5379. CURRENT_NGINX_ENSITE_COMMIT=$(grep "Nginx-ensite commit" $COMPLETION_FILE | awk -F ':' '{print $2}')
  5380. if [[ "$CURRENT_NGINX_ENSITE_COMMIT" != "$NGINX_ENSITE_COMMIT" ]]; then
  5381. $INSTALL_DIR/nginx_ensite
  5382. git_pull $NGINX_ENSITE_REPO $NGINX_ENSITE_COMMIT
  5383. sed -i "s/Nginx-ensite commit.*/Nginx-ensite commit:$NGINX_ENSITE_COMMIT/g" $COMPLETION_FILE
  5384. make install
  5385. fi
  5386. else
  5387. echo "Nginx-ensite commit:$NGINX_ENSITE_COMMIT" >> $COMPLETION_FILE
  5388. fi
  5389. fi
  5390. if grep -Fxq "install_web_server" $COMPLETION_FILE; then
  5391. return
  5392. fi
  5393. # remove apache
  5394. apt-get -y remove --purge apache2
  5395. if [ -d /etc/apache2 ]; then
  5396. rm -rf /etc/apache2
  5397. fi
  5398. # install nginx
  5399. apt-get -y install nginx php5-fpm git
  5400. # limit the number of php processes
  5401. sed -i 's/; process.max =.*/process.max = 32/g' /etc/php5/fpm/php-fpm.conf
  5402. sed -i 's/;process_control_timeout =.*/process_control_timeout = 300/g' /etc/php5/fpm/php-fpm.conf
  5403. if ! grep -q "pm.max_children" /etc/php5/fpm/php-fpm.conf; then
  5404. echo 'pm.max_children = 10' >> /etc/php5/fpm/php-fpm.conf
  5405. echo 'pm.start_servers = 2' >> /etc/php5/fpm/php-fpm.conf
  5406. echo 'pm.min_spare_servers = 2' >> /etc/php5/fpm/php-fpm.conf
  5407. echo 'pm.max_spare_servers = 5' >> /etc/php5/fpm/php-fpm.conf
  5408. echo 'pm.max_requests = 50' >> /etc/php5/fpm/php-fpm.conf
  5409. fi
  5410. if [ ! -d /etc/nginx ]; then
  5411. echo $"ERROR: nginx does not appear to have installed. $CHECK_MESSAGE"
  5412. exit 51
  5413. fi
  5414. # Nginx settings
  5415. echo 'user www-data;' > /etc/nginx/nginx.conf
  5416. #echo "worker_processes; $CPU_CORES" >> /etc/nginx/nginx.conf
  5417. echo 'pid /run/nginx.pid;' >> /etc/nginx/nginx.conf
  5418. echo '' >> /etc/nginx/nginx.conf
  5419. echo 'events {' >> /etc/nginx/nginx.conf
  5420. echo ' worker_connections 50;' >> /etc/nginx/nginx.conf
  5421. echo ' # multi_accept on;' >> /etc/nginx/nginx.conf
  5422. echo '}' >> /etc/nginx/nginx.conf
  5423. echo '' >> /etc/nginx/nginx.conf
  5424. echo 'http {' >> /etc/nginx/nginx.conf
  5425. echo ' # limit the number of connections per single IP' >> /etc/nginx/nginx.conf
  5426. echo ' limit_conn_zone $binary_remote_addr zone=conn_limit_per_ip:10m;' >> /etc/nginx/nginx.conf
  5427. echo '' >> /etc/nginx/nginx.conf
  5428. echo ' # limit the number of requests for a given session' >> /etc/nginx/nginx.conf
  5429. echo ' # Note that the Owncloud web interface seems to require a rate of around 140r/s' >> /etc/nginx/nginx.conf
  5430. echo ' limit_req_zone $binary_remote_addr zone=req_limit_per_ip:10m rate=140r/s;' >> /etc/nginx/nginx.conf
  5431. echo '' >> /etc/nginx/nginx.conf
  5432. 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
  5433. echo ' client_body_buffer_size 128k;' >> /etc/nginx/nginx.conf
  5434. echo '' >> /etc/nginx/nginx.conf
  5435. echo ' # headerbuffer size for the request header from client, its set for testing purpose' >> /etc/nginx/nginx.conf
  5436. echo ' client_header_buffer_size 3m;' >> /etc/nginx/nginx.conf
  5437. echo '' >> /etc/nginx/nginx.conf
  5438. echo ' # maximum number and size of buffers for large headers to read from client request' >> /etc/nginx/nginx.conf
  5439. echo ' large_client_header_buffers 4 256k;' >> /etc/nginx/nginx.conf
  5440. echo '' >> /etc/nginx/nginx.conf
  5441. echo ' # read timeout for the request body from client, its set for testing purpose' >> /etc/nginx/nginx.conf
  5442. echo ' client_body_timeout 3m;' >> /etc/nginx/nginx.conf
  5443. echo '' >> /etc/nginx/nginx.conf
  5444. echo ' # how long to wait for the client to send a request header, its set for testing purpose' >> /etc/nginx/nginx.conf
  5445. echo ' client_header_timeout 3m;' >> /etc/nginx/nginx.conf
  5446. echo '' >> /etc/nginx/nginx.conf
  5447. echo ' ##' >> /etc/nginx/nginx.conf
  5448. echo ' # Basic Settings' >> /etc/nginx/nginx.conf
  5449. echo ' ##' >> /etc/nginx/nginx.conf
  5450. echo '' >> /etc/nginx/nginx.conf
  5451. echo ' sendfile on;' >> /etc/nginx/nginx.conf
  5452. echo ' tcp_nopush on;' >> /etc/nginx/nginx.conf
  5453. echo ' tcp_nodelay on;' >> /etc/nginx/nginx.conf
  5454. echo ' keepalive_timeout 65;' >> /etc/nginx/nginx.conf
  5455. echo ' types_hash_max_size 2048;' >> /etc/nginx/nginx.conf
  5456. echo ' server_tokens off;' >> /etc/nginx/nginx.conf
  5457. echo '' >> /etc/nginx/nginx.conf
  5458. echo ' # server_names_hash_bucket_size 64;' >> /etc/nginx/nginx.conf
  5459. echo ' # server_name_in_redirect off;' >> /etc/nginx/nginx.conf
  5460. echo '' >> /etc/nginx/nginx.conf
  5461. echo ' include /etc/nginx/mime.types;' >> /etc/nginx/nginx.conf
  5462. echo ' default_type application/octet-stream;' >> /etc/nginx/nginx.conf
  5463. echo '' >> /etc/nginx/nginx.conf
  5464. echo ' ##' >> /etc/nginx/nginx.conf
  5465. echo ' # Logging Settings' >> /etc/nginx/nginx.conf
  5466. echo ' ##' >> /etc/nginx/nginx.conf
  5467. echo '' >> /etc/nginx/nginx.conf
  5468. echo ' access_log /var/log/nginx/access.log;' >> /etc/nginx/nginx.conf
  5469. echo ' error_log /var/log/nginx/error.log;' >> /etc/nginx/nginx.conf
  5470. echo '' >> /etc/nginx/nginx.conf
  5471. echo ' ###' >> /etc/nginx/nginx.conf
  5472. echo ' # Gzip Settings' >> /etc/nginx/nginx.conf
  5473. echo ' ##' >> /etc/nginx/nginx.conf
  5474. echo ' gzip on;' >> /etc/nginx/nginx.conf
  5475. echo ' gzip_disable "msie6";' >> /etc/nginx/nginx.conf
  5476. echo '' >> /etc/nginx/nginx.conf
  5477. echo ' # gzip_vary on;' >> /etc/nginx/nginx.conf
  5478. echo ' # gzip_proxied any;' >> /etc/nginx/nginx.conf
  5479. echo ' # gzip_comp_level 6;' >> /etc/nginx/nginx.conf
  5480. echo ' # gzip_buffers 16 8k;' >> /etc/nginx/nginx.conf
  5481. echo ' # gzip_http_version 1.1;' >> /etc/nginx/nginx.conf
  5482. echo ' # gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;' >> /etc/nginx/nginx.conf
  5483. echo '' >> /etc/nginx/nginx.conf
  5484. echo ' ##' >> /etc/nginx/nginx.conf
  5485. echo ' # Virtual Host Configs' >> /etc/nginx/nginx.conf
  5486. echo ' ##' >> /etc/nginx/nginx.conf
  5487. echo '' >> /etc/nginx/nginx.conf
  5488. echo ' include /etc/nginx/conf.d/*.conf;' >> /etc/nginx/nginx.conf
  5489. echo ' include /etc/nginx/sites-enabled/*;' >> /etc/nginx/nginx.conf
  5490. echo '}' >> /etc/nginx/nginx.conf
  5491. # install a script to easily enable and disable nginx virtual hosts
  5492. if [ ! -d $INSTALL_DIR ]; then
  5493. mkdir $INSTALL_DIR
  5494. fi
  5495. cd $INSTALL_DIR
  5496. git_clone $NGINX_ENSITE_REPO $INSTALL_DIR/nginx_ensite
  5497. cd $INSTALL_DIR/nginx_ensite
  5498. git checkout $NGINX_ENSITE_COMMIT -b $NGINX_ENSITE_COMMIT
  5499. if ! grep -q "Nginx-ensite commit" $COMPLETION_FILE; then
  5500. echo "Nginx-ensite commit:$NGINX_ENSITE_COMMIT" >> $COMPLETION_FILE
  5501. else
  5502. sed -i "s/Nginx-ensite commit.*/Nginx-ensite commit:$NGINX_ENSITE_COMMIT/g" $COMPLETION_FILE
  5503. fi
  5504. make install
  5505. nginx_dissite default
  5506. echo 'install_web_server' >> $COMPLETION_FILE
  5507. }
  5508. function configure_php {
  5509. sed -i "s/memory_limit = 128M/memory_limit = ${MAX_PHP_MEMORY}M/g" /etc/php5/fpm/php.ini
  5510. sed -i 's/;cgi.fix_pathinfo=1/cgi.fix_pathinfo=0/g' /etc/php5/fpm/php.ini
  5511. sed -i "s/memory_limit = -1/memory_limit = ${MAX_PHP_MEMORY}M/g" /etc/php5/cli/php.ini
  5512. sed -i "s/upload_max_filesize = 2M/upload_max_filesize = 50M/g" /etc/php5/fpm/php.ini
  5513. sed -i "s/post_max_size = 8M/post_max_size = 50M/g" /etc/php5/fpm/php.ini
  5514. }
  5515. function install_mariadb {
  5516. if grep -Fxq "install_mariadb" $COMPLETION_FILE; then
  5517. return
  5518. fi
  5519. apt-get -y install python-software-properties debconf-utils
  5520. apt-get -y install software-properties-common
  5521. apt-get -y update
  5522. get_mariadb_password
  5523. if [ ! $MARIADB_PASSWORD ]; then
  5524. if [ -f $IMAGE_PASSWORD_FILE ]; then
  5525. MARIADB_PASSWORD="$(printf `cat $IMAGE_PASSWORD_FILE`)"
  5526. else
  5527. MARIADB_PASSWORD="$(openssl rand -base64 32)"
  5528. fi
  5529. echo "$MARIADB_PASSWORD" > $DATABASE_PASSWORD_FILE
  5530. chmod 600 $DATABASE_PASSWORD_FILE
  5531. echo '' >> /home/$MY_USERNAME/README
  5532. echo '' >> /home/$MY_USERNAME/README
  5533. echo 'MariaDB / MySql' >> /home/$MY_USERNAME/README
  5534. echo '===============' >> /home/$MY_USERNAME/README
  5535. echo $"Your MariaDB password is: $MARIADB_PASSWORD" >> /home/$MY_USERNAME/README
  5536. echo '' >> /home/$MY_USERNAME/README
  5537. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
  5538. chmod 600 /home/$MY_USERNAME/README
  5539. fi
  5540. debconf-set-selections <<< "mariadb-server mariadb-server/root_password password $MARIADB_PASSWORD"
  5541. debconf-set-selections <<< "mariadb-server mariadb-server/root_password_again password $MARIADB_PASSWORD"
  5542. apt-get -y install mariadb-server
  5543. apt-get -y remove --purge apache*
  5544. if [ -d /etc/apache2 ]; then
  5545. rm -rf /etc/apache2
  5546. echo $'Removed Apache installation after MariaDB install'
  5547. fi
  5548. if [ ! -d /etc/mysql ]; then
  5549. echo $"ERROR: mariadb-server does not appear to have installed. $CHECK_MESSAGE"
  5550. exit 54
  5551. fi
  5552. mysqladmin -u root password "$MARIADB_PASSWORD"
  5553. echo 'install_mariadb' >> $COMPLETION_FILE
  5554. }
  5555. function backup_databases_script_header {
  5556. if [ ! -f /usr/bin/backupdatabases ]; then
  5557. # daily
  5558. echo '#!/bin/sh' > /usr/bin/backupdatabases
  5559. echo '' >> /usr/bin/backupdatabases
  5560. echo "EMAIL='$MY_EMAIL_ADDRESS'" >> /usr/bin/backupdatabases
  5561. echo '' >> /usr/bin/backupdatabases
  5562. echo -n 'MYSQL_PASSWORD=$(cat ' >> /usr/bin/backupdatabases
  5563. echo "$DATABASE_PASSWORD_FILE)" >> /usr/bin/backupdatabases
  5564. echo 'umask 0077' >> /usr/bin/backupdatabases
  5565. echo '' >> /usr/bin/backupdatabases
  5566. echo '# exit if we are backing up to friends servers' >> /usr/bin/backupdatabases
  5567. echo "if [ -f $FRIENDS_SERVERS_LIST ]; then" >> /usr/bin/backupdatabases
  5568. echo ' exit 1' >> /usr/bin/backupdatabases
  5569. echo 'fi' >> /usr/bin/backupdatabases
  5570. chmod 600 /usr/bin/backupdatabases
  5571. chmod +x /usr/bin/backupdatabases
  5572. echo '#!/bin/sh' > /etc/cron.daily/backupdatabasesdaily
  5573. echo '/usr/bin/backupdatabases' >> /etc/cron.daily/backupdatabasesdaily
  5574. chmod 600 /etc/cron.daily/backupdatabasesdaily
  5575. chmod +x /etc/cron.daily/backupdatabasesdaily
  5576. # weekly
  5577. echo '#!/bin/sh' > /etc/cron.weekly/backupdatabasesweekly
  5578. echo '' >> /etc/cron.weekly/backupdatabasesweekly
  5579. echo 'umask 0077' >> /etc/cron.weekly/backupdatabasesweekly
  5580. chmod 600 /etc/cron.weekly/backupdatabasesweekly
  5581. chmod +x /etc/cron.weekly/backupdatabasesweekly
  5582. # monthly
  5583. echo '#!/bin/sh' > /etc/cron.monthly/backupdatabasesmonthly
  5584. echo '' >> /etc/cron.monthly/backupdatabasesmonthly
  5585. echo 'umask 0077' >> /etc/cron.monthly/backupdatabasesmonthly
  5586. chmod 600 /etc/cron.monthly/backupdatabasesmonthly
  5587. chmod +x /etc/cron.monthly/backupdatabasesmonthly
  5588. fi
  5589. }
  5590. function repair_databases_script {
  5591. if [ -f /etc/cron.hourly/repair ]; then
  5592. sed -i "s|/usr/bin/repairdatabase|${PROJECT_NAME}-repair-database|g" /etc/cron.hourly/repair
  5593. fi
  5594. if grep -Fxq "repair_databases_script" $COMPLETION_FILE; then
  5595. return
  5596. fi
  5597. if [ ! -f $DATABASE_PASSWORD_FILE ]; then
  5598. return
  5599. fi
  5600. echo '#!/bin/bash' > /etc/cron.hourly/repair
  5601. echo '' >> /etc/cron.hourly/repair
  5602. chmod 600 /etc/cron.hourly/repair
  5603. chmod +x /etc/cron.hourly/repair
  5604. echo 'repair_databases_script' >> $COMPLETION_FILE
  5605. }
  5606. function install_owncloud_music_app {
  5607. 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
  5608. return
  5609. fi
  5610. if ! grep -Fxq "install_owncloud" $COMPLETION_FILE; then
  5611. echo $'Tried to install the Owncloud music app, but Owncloud installation was not found'
  5612. exit 9823
  5613. fi
  5614. # update to the next commit
  5615. if [ -d /usr/share/owncloud/apps/music ]; then
  5616. if grep -q "Owncloud music app commit" $COMPLETION_FILE; then
  5617. CURRENT_OWNCLOUD_MUSIC_APP_COMMIT=$(grep "Owncloud music app commit" $COMPLETION_FILE | awk -F ':' '{print $2}')
  5618. if [[ "$OWNCLOUD_MUSIC_APP_COMMIT" != "$OWNCLOUD_MUSIC_APP_COMMIT" ]]; then
  5619. cd /usr/share/owncloud/apps/music
  5620. git_pull $OWNCLOUD_MUSIC_APP_REPO $OWNCLOUD_MUSIC_APP_COMMIT
  5621. sed -i "s/Owncloud music app commit.*/Owncloud music app commit:$OWNCLOUD_MUSIC_APP_COMMIT/g" $COMPLETION_FILE
  5622. fi
  5623. else
  5624. echo "Owncloud music app commit:$OWNCLOUD_MUSIC_APP_COMMIT" >> $COMPLETION_FILE
  5625. fi
  5626. fi
  5627. if grep -Fxq "install_owncloud_music_app" $COMPLETION_FILE; then
  5628. return
  5629. fi
  5630. cd /usr/share/owncloud/apps
  5631. git_clone $OWNCLOUD_MUSIC_APP_REPO Music
  5632. cd /usr/share/owncloud/apps/Music
  5633. git checkout $OWNCLOUD_MUSIC_APP_COMMIT -b $OWNCLOUD_MUSIC_APP_COMMIT
  5634. if ! grep -q "Owncloud music app commit" $COMPLETION_FILE; then
  5635. echo "Owncloud music app commit:$OWNCLOUD_MUSIC_APP_COMMIT" >> $COMPLETION_FILE
  5636. else
  5637. sed -i "s/Owncloud music app commit.*/Owncloud music app commit:$OWNCLOUD_MUSIC_APP_COMMIT/g" $COMPLETION_FILE
  5638. fi
  5639. if grep -q $"Music player in Owncloud" /home/$MY_USERNAME/README; then
  5640. echo '' >> /home/$MY_USERNAME/README
  5641. echo '' >> /home/$MY_USERNAME/README
  5642. echo $'Music player in Owncloud' >> /home/$MY_USERNAME/README
  5643. echo '========================' >> /home/$MY_USERNAME/README
  5644. echo $'To enable the music app within ouwncloud log in to the Owncloud' >> /home/$MY_USERNAME/README
  5645. echo $'administrator account then go to Apps on the left hand dropdown' >> /home/$MY_USERNAME/README
  5646. echo $'menu and enable the music app. You can then log out and log back' >> /home/$MY_USERNAME/README
  5647. echo $'in as your Owncloud user and select music from the left hand' >> /home/$MY_USERNAME/README
  5648. echo $'dropdown menu.' >> /home/$MY_USERNAME/README
  5649. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
  5650. chmod 600 /home/$MY_USERNAME/README
  5651. fi
  5652. echo 'install_owncloud_music_app' >> $COMPLETION_FILE
  5653. }
  5654. function add_ddns_domain {
  5655. if [[ $ONION_ONLY != "no" ]]; then
  5656. return
  5657. fi
  5658. if [ ! $CURRENT_DDNS_DOMAIN ]; then
  5659. echo $'ddns domain not specified'
  5660. exit 5638
  5661. fi
  5662. if [ ! -f /etc/inadyn.conf ]; then
  5663. echo $'Unable to find inadyn configuration file /etc/inadyn.conf'
  5664. exit 5745
  5665. fi
  5666. if ! grep -q "$DDNS_PROVIDER" /etc/inadyn.conf; then
  5667. echo '' >> /etc/inadyn.conf
  5668. echo "system $DDNS_PROVIDER" >> /etc/inadyn.conf
  5669. echo ' ssl' >> /etc/inadyn.conf
  5670. echo " checkip-url $GET_IP_ADDRESS_URL /" >> /etc/inadyn.conf
  5671. if [ $DDNS_USERNAME ]; then
  5672. echo " username $DDNS_USERNAME" >> /etc/inadyn.conf
  5673. fi
  5674. if [ $DDNS_PASSWORD ]; then
  5675. echo " password $DDNS_PASSWORD" >> /etc/inadyn.conf
  5676. fi
  5677. fi
  5678. if ! grep -q "$CURRENT_DDNS_DOMAIN" /etc/inadyn.conf; then
  5679. echo " alias $CURRENT_DDNS_DOMAIN" >> /etc/inadyn.conf
  5680. fi
  5681. chmod 600 /etc/inadyn.conf
  5682. systemctl restart inadyn
  5683. systemctl daemon-reload
  5684. # clear the arguments
  5685. CURRENT_DDNS_DOMAIN=
  5686. }
  5687. function configure_owncloud_onion_site {
  5688. if [ ! $OWNCLOUD_DOMAIN_NAME ]; then
  5689. return
  5690. fi
  5691. if [ ! -f /etc/owncloud/config.php ]; then
  5692. return
  5693. fi
  5694. if [ ! -f /var/lib/tor/hidden_service_owncloud/hostname ]; then
  5695. return
  5696. fi
  5697. OWNCLOUD_ONION_HOSTNAME=$(cat /var/lib/tor/hidden_service_owncloud/hostname)
  5698. if ! grep -q "${OWNCLOUD_ONION_HOSTNAME}" /etc/owncloud/config.php; then
  5699. sed -i "s|0 => '${OWNCLOUD_DOMAIN_NAME}',|0 => '${OWNCLOUD_DOMAIN_NAME}',
  5700. 1 => '${OWNCLOUD_ONION_HOSTNAME}',|g" /etc/owncloud/config.php
  5701. sed -i "s|'writable' => false,|'writable' => false,
  5702. ),
  5703. 1 =>
  5704. array (
  5705. 'path' => '/usr/share/owncloud/apps',
  5706. 'url' => '/apps',
  5707. 'writable' => false,|g" /etc/owncloud/config.php
  5708. echo $'Owncloud configured for onion site'
  5709. fi
  5710. }
  5711. function install_owncloud {
  5712. 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
  5713. return
  5714. fi
  5715. OWNCLOUD_COMPLETION_MSG1=$" *** ${PROJECT_NAME} $SYSTEM_TYPE is now installed ***"
  5716. OWNCLOUD_COMPLETION_MSG2=$"Open $OWNCLOUD_DOMAIN_NAME in a web browser to complete the setup"
  5717. if grep -Fxq "install_owncloud" $COMPLETION_FILE; then
  5718. if [[ $SYSTEM_TYPE == "$VARIANT_CLOUD" ]]; then
  5719. install_owncloud_music_app
  5720. backup_to_friends_servers
  5721. intrusion_detection
  5722. split_gpg_key_into_fragments
  5723. # unmount any attached usb drive
  5724. if [ -d $USB_MOUNT ]; then
  5725. umount $USB_MOUNT
  5726. rm -rf $USB_MOUNT
  5727. fi
  5728. echo ''
  5729. echo "$OWNCLOUD_COMPLETION_MSG1"
  5730. echo "$OWNCLOUD_COMPLETION_MSG2"
  5731. exit 0
  5732. fi
  5733. return
  5734. fi
  5735. # if this is exclusively a cloud setup
  5736. if [[ $SYSTEM_TYPE == "$VARIANT_CLOUD" ]]; then
  5737. if [ ! $DEFAULT_DOMAIN_NAME ]; then
  5738. echo $'No default domain name when installing cloud variant'
  5739. exit 5380
  5740. fi
  5741. fi
  5742. if [ ! $OWNCLOUD_DOMAIN_NAME ]; then
  5743. echo $'No Owncloud domain name was specified'
  5744. exit 3095
  5745. fi
  5746. if [[ $SYSTEM_TYPE != "$VARIANT_CLOUD" ]]; then
  5747. if [[ $SYSTEM_TYPE != "$VARIANT_FULL" ]]; then
  5748. echo $"Owncloud install did not recognise the system type $SYSTEM_TYPE"
  5749. exit 6746
  5750. fi
  5751. fi
  5752. apt-get -y install fonts-linuxlibertine fonts-sil-gentium-basic fonts-way-microhei
  5753. apt-get -y install libjs-twitter-bootstrap
  5754. apt-get -y install owncloud
  5755. apt-get -y remove --purge apache*
  5756. if [ -d /etc/apache2 ]; then
  5757. rm -rf /etc/apache2
  5758. echo $'Removed Apache installation after Owncloud install'
  5759. fi
  5760. install_mariadb
  5761. get_mariadb_password
  5762. get_mariadb_owncloud_admin_password
  5763. if [ ! $OWNCLOUD_ADMIN_PASSWORD ]; then
  5764. if [ -f $IMAGE_PASSWORD_FILE ]; then
  5765. OWNCLOUD_ADMIN_PASSWORD="$(printf `cat $IMAGE_PASSWORD_FILE`)"
  5766. else
  5767. OWNCLOUD_ADMIN_PASSWORD="$(openssl rand -base64 32)"
  5768. fi
  5769. fi
  5770. if ! grep -q "Owncloud database user" /home/$MY_USERNAME/README; then
  5771. echo '' >> /home/$MY_USERNAME/README
  5772. echo '' >> /home/$MY_USERNAME/README
  5773. echo 'Owncloud' >> /home/$MY_USERNAME/README
  5774. echo '========' >> /home/$MY_USERNAME/README
  5775. echo $'Owncloud database user: owncloudadmin' >> /home/$MY_USERNAME/README
  5776. echo $"Owncloud database password: $OWNCLOUD_ADMIN_PASSWORD" >> /home/$MY_USERNAME/README
  5777. echo $'Owncloud database name: owncloud' >> /home/$MY_USERNAME/README
  5778. echo '' >> /home/$MY_USERNAME/README
  5779. echo $'After creating an administrator account then create a user account via' >> /home/$MY_USERNAME/README
  5780. echo $"the Users dropdown menu entry. The username should be '$MY_USERNAME'." >> /home/$MY_USERNAME/README
  5781. echo '' >> /home/$MY_USERNAME/README
  5782. echo $'On mobile devices you can download the Owncloud client via F-Droid.' >> /home/$MY_USERNAME/README
  5783. echo '' >> /home/$MY_USERNAME/README
  5784. echo $'To synchronise calendar entries with Android "install CalDAV Sync Adapter"' >> /home/$MY_USERNAME/README
  5785. echo $'using F-Droid then go to settings/accounts and add a CalDav account with' >> /home/$MY_USERNAME/README
  5786. echo $"the URL https://$OWNCLOUD_DOMAIN_NAME/remote.php/caldav/principals/$MY_USERNAME" >> /home/$MY_USERNAME/README
  5787. echo $'and the username and password shown above.' >> /home/$MY_USERNAME/README
  5788. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
  5789. chmod 600 /home/$MY_USERNAME/README
  5790. fi
  5791. create_database owncloud "$OWNCLOUD_ADMIN_PASSWORD"
  5792. if [ ! -d /var/www/$OWNCLOUD_DOMAIN_NAME ]; then
  5793. mkdir /var/www/$OWNCLOUD_DOMAIN_NAME
  5794. fi
  5795. if [ -d /var/www/$OWNCLOUD_DOMAIN_NAME/htdocs ]; then
  5796. rm -rf /var/www/$OWNCLOUD_DOMAIN_NAME/htdocs
  5797. fi
  5798. ln -s /usr/share/owncloud /var/www/$OWNCLOUD_DOMAIN_NAME/htdocs
  5799. if [[ $ONION_ONLY == "no" ]]; then
  5800. echo 'server {' > /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5801. echo ' listen 80;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5802. echo " server_name $OWNCLOUD_DOMAIN_NAME;" >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5803. echo ' access_log off;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5804. echo " error_log /var/log/nginx/${OWNCLOUD_DOMAIN_NAME}_error.log $WEBSERVER_LOG_LEVEL;" >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5805. echo ' limit_conn conn_limit_per_ip 10;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5806. echo ' limit_req zone=req_limit_per_ip burst=10 nodelay;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5807. echo ' rewrite ^ https://$server_name$request_uri? permanent;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5808. echo '}' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5809. echo '' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5810. echo 'server {' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5811. echo ' listen 443 ssl;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5812. echo " root /var/www/$OWNCLOUD_DOMAIN_NAME/htdocs;" >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5813. echo " server_name $OWNCLOUD_DOMAIN_NAME;" >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5814. echo ' access_log off;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5815. echo " error_log /var/log/nginx/${OWNCLOUD_DOMAIN_NAME}_error.log $WEBSERVER_LOG_LEVEL;" >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5816. echo '' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5817. echo ' limit_conn conn_limit_per_ip 10;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5818. echo ' limit_req zone=req_limit_per_ip burst=10 nodelay;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5819. echo '' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5820. echo ' ssl on;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5821. echo " ssl_certificate /etc/ssl/certs/$OWNCLOUD_DOMAIN_NAME.crt;" >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5822. echo " ssl_certificate_key /etc/ssl/private/$OWNCLOUD_DOMAIN_NAME.key;" >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5823. echo " ssl_dhparam /etc/ssl/certs/$OWNCLOUD_DOMAIN_NAME.dhparam;" >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5824. echo '' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5825. echo ' ssl_session_timeout 60m;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5826. echo ' ssl_prefer_server_ciphers on;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5827. echo " ssl_protocols $SSL_PROTOCOLS; # not possible to do exclusive" >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5828. echo " ssl_ciphers '$SSL_CIPHERS';" >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5829. echo ' add_header X-Frame-Options DENY;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5830. echo ' add_header X-Content-Type-Options nosniff;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5831. echo ' add_header Strict-Transport-Security max-age=15768000;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5832. echo ' # if you want to be able to access the site via HTTP' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5833. echo ' # then replace the above with the following:' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5834. echo ' # add_header Strict-Transport-Security "max-age=0;";' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5835. echo " # make sure webfinger and other well known services aren't blocked" >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5836. echo ' # by denying dot files and rewrite request to the front controller' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5837. echo ' location ^~ /.well-known/ {' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5838. echo ' allow all;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5839. echo ' }' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5840. echo '' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5841. echo ' client_max_body_size 10G; # set max upload size' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5842. echo ' client_body_buffer_size 128k;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5843. echo ' fastcgi_buffers 64 4K;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5844. echo '' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5845. echo ' rewrite ^/caldav(.*)$ /remote.php/caldav$1 redirect;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5846. echo ' rewrite ^/carddav(.*)$ /remote.php/carddav$1 redirect;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5847. echo ' rewrite ^/webdav(.*)$ /remote.php/webdav$1 redirect;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5848. echo '' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5849. echo ' index index.php;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5850. echo ' error_page 403 /core/templates/403.php;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5851. echo ' error_page 404 /core/templates/404.php;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5852. echo '' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5853. echo ' location = /robots.txt {' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5854. echo ' allow all;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5855. echo ' log_not_found off;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5856. echo ' access_log off;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5857. echo ' }' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5858. echo '' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5859. echo ' location ~ ^/(data|config|\.ht|db_structure\.xml|README) {' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5860. echo ' deny all;' >> /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. echo ' location / {' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5864. echo ' # The following 2 rules are only needed with webfinger' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5865. echo ' rewrite ^/.well-known/host-meta /public.php?service=host-meta last;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5866. echo ' rewrite ^/.well-known/host-meta.json /public.php?service=host-meta-json last;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5867. echo ' rewrite ^/.well-known/carddav /remote.php/carddav/ redirect;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5868. echo ' rewrite ^/.well-known/caldav /remote.php/caldav/ redirect;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5869. echo ' rewrite ^(/core/doc/[^\/]+/)$ $1/index.html;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5870. echo ' try_files $uri $uri/ index.php;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5871. echo ' }' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5872. echo '' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5873. echo ' location ~ ^(.+?\.php)(/.*)?$ {' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5874. echo ' try_files $1 =404;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5875. echo ' fastcgi_split_path_info ^(.+\.php)(/.+)$;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5876. echo ' fastcgi_pass unix:/var/run/php5-fpm.sock;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5877. echo ' fastcgi_index index.php;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5878. echo ' include fastcgi_params;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5879. echo ' fastcgi_param SCRIPT_FILENAME $document_root$1;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5880. echo ' fastcgi_param PATH_INFO $2;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5881. echo ' fastcgi_param HTTPS on;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5882. echo ' }' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5883. echo '' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5884. echo ' # Optional: set long EXPIRES header on static assets' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5885. echo ' location ~* ^.+\.(jpg|jpeg|gif|bmp|ico|png|css|js|swf)$ {' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5886. echo ' expires 30d;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5887. echo " # Optional: Don't log access to assets" >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5888. echo ' access_log off;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5889. echo ' }' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5890. echo '}' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5891. echo '' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5892. else
  5893. echo -n '' > /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5894. fi
  5895. echo 'server {' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5896. echo " listen 127.0.0.1:${OWNCLOUD_ONION_PORT} default_server;" >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5897. echo " root /var/www/$OWNCLOUD_DOMAIN_NAME/htdocs;" >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5898. echo " server_name $OWNCLOUD_DOMAIN_NAME;" >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5899. echo ' access_log off;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5900. echo " error_log /var/log/nginx/${OWNCLOUD_DOMAIN_NAME}_error.log $WEBSERVER_LOG_LEVEL;" >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5901. echo '' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5902. echo ' limit_conn conn_limit_per_ip 10;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5903. echo ' limit_req zone=req_limit_per_ip burst=10 nodelay;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5904. echo '' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5905. echo ' add_header X-Frame-Options DENY;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5906. echo ' add_header X-Content-Type-Options nosniff;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5907. echo ' add_header Strict-Transport-Security max-age=15768000;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5908. echo ' # if you want to be able to access the site via HTTP' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5909. echo ' # then replace the above with the following:' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5910. echo ' # add_header Strict-Transport-Security "max-age=0;";' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5911. echo " # make sure webfinger and other well known services aren't blocked" >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5912. echo ' # by denying dot files and rewrite request to the front controller' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5913. echo ' location ^~ /.well-known/ {' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5914. echo ' allow all;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5915. echo ' }' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5916. echo '' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5917. echo ' client_max_body_size 10G; # set max upload size' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5918. echo ' client_body_buffer_size 128k;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5919. echo ' fastcgi_buffers 64 4K;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5920. echo '' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5921. echo ' rewrite ^/caldav(.*)$ /remote.php/caldav$1 redirect;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5922. echo ' rewrite ^/carddav(.*)$ /remote.php/carddav$1 redirect;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5923. echo ' rewrite ^/webdav(.*)$ /remote.php/webdav$1 redirect;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5924. echo '' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5925. echo ' index index.php;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5926. echo ' error_page 403 /core/templates/403.php;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5927. echo ' error_page 404 /core/templates/404.php;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5928. echo '' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5929. echo ' location = /robots.txt {' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5930. echo ' allow all;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5931. echo ' log_not_found off;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5932. echo ' access_log off;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5933. echo ' }' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5934. echo '' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5935. echo ' location ~ ^/(data|config|\.ht|db_structure\.xml|README) {' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5936. echo ' deny all;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5937. echo ' }' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5938. echo '' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5939. echo ' location / {' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5940. echo ' # The following 2 rules are only needed with webfinger' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5941. echo ' rewrite ^/.well-known/host-meta /public.php?service=host-meta last;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5942. echo ' rewrite ^/.well-known/host-meta.json /public.php?service=host-meta-json last;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5943. echo ' rewrite ^/.well-known/carddav /remote.php/carddav/ redirect;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5944. echo ' rewrite ^/.well-known/caldav /remote.php/caldav/ redirect;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5945. echo ' rewrite ^(/core/doc/[^\/]+/)$ $1/index.html;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5946. echo ' try_files $uri $uri/ index.php;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5947. echo ' }' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5948. echo '' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5949. echo ' location ~ ^(.+?\.php)(/.*)?$ {' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5950. echo ' try_files $1 =404;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5951. echo ' fastcgi_split_path_info ^(.+\.php)(/.+)$;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5952. echo ' fastcgi_pass unix:/var/run/php5-fpm.sock;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5953. echo ' fastcgi_index index.php;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5954. echo ' include fastcgi_params;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5955. echo ' fastcgi_param SCRIPT_FILENAME $document_root$1;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5956. echo ' fastcgi_param PATH_INFO $2;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5957. echo ' fastcgi_param HTTPS off;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5958. echo ' }' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5959. echo '' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5960. echo ' # Optional: set long EXPIRES header on static assets' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5961. echo ' location ~* ^.+\.(jpg|jpeg|gif|bmp|ico|png|css|js|swf)$ {' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5962. echo ' expires 30d;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5963. echo " # Optional: Don't log access to assets" >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5964. echo ' access_log off;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5965. echo ' }' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5966. echo '}' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5967. configure_php
  5968. if [[ $ONION_ONLY == "no" ]]; then
  5969. if [ ! -f /etc/ssl/certs/$OWNCLOUD_DOMAIN_NAME.dhparam ]; then
  5970. if [[ $LETSENCRYPT_ENABLED != "yes" ]]; then
  5971. ${PROJECT_NAME}-addcert -h $OWNCLOUD_DOMAIN_NAME --dhkey $DH_KEYLENGTH
  5972. else
  5973. ${PROJECT_NAME}-addcert -e $OWNCLOUD_DOMAIN_NAME -s $LETSENCRYPT_SERVER --dhkey $DH_KEYLENGTH --email $MY_EMAIL_ADDRESS
  5974. fi
  5975. check_certificates $OWNCLOUD_DOMAIN_NAME
  5976. fi
  5977. fi
  5978. # Ensure that the database gets backed up locally, if remote
  5979. # backups are not being used
  5980. backup_databases_script_header
  5981. echo '' >> /usr/bin/backupdatabases
  5982. echo $'# Backup Owncloud database' >> /usr/bin/backupdatabases
  5983. echo 'TEMPFILE=/root/owncloud.sql' >> /usr/bin/backupdatabases
  5984. echo 'DAILYFILE=/var/backups/owncloud_daily.sql' >> /usr/bin/backupdatabases
  5985. echo 'mysqldump --password="$MYSQL_PASSWORD" owncloud > $TEMPFILE' >> /usr/bin/backupdatabases
  5986. echo 'FILESIZE=$(stat -c%s $TEMPFILE)' >> /usr/bin/backupdatabases
  5987. echo 'if [ "$FILESIZE" -eq "0" ]; then' >> /usr/bin/backupdatabases
  5988. echo ' if [ -f $DAILYFILE ]; then' >> /usr/bin/backupdatabases
  5989. echo ' cp $DAILYFILE $TEMPFILE' >> /usr/bin/backupdatabases
  5990. echo '' >> /usr/bin/backupdatabases
  5991. echo ' # try to restore yesterdays database' >> /usr/bin/backupdatabases
  5992. echo ' mysql -u root --password="$MYSQL_PASSWORD" owncloud -o < $DAILYFILE' >> /usr/bin/backupdatabases
  5993. echo '' >> /usr/bin/backupdatabases
  5994. echo ' # Send a warning email' >> /usr/bin/backupdatabases
  5995. 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
  5996. echo ' else' >> /usr/bin/backupdatabases
  5997. echo ' # Send a warning email' >> /usr/bin/backupdatabases
  5998. echo ' echo "Unable to create a backup of the Owncloud database." | mail -s "Owncloud backup" $EMAIL' >> /usr/bin/backupdatabases
  5999. echo ' fi' >> /usr/bin/backupdatabases
  6000. echo 'else' >> /usr/bin/backupdatabases
  6001. echo ' chmod 600 $TEMPFILE' >> /usr/bin/backupdatabases
  6002. echo ' mv $TEMPFILE $DAILYFILE' >> /usr/bin/backupdatabases
  6003. echo '' >> /usr/bin/backupdatabases
  6004. echo ' # Make the backup readable only by root' >> /usr/bin/backupdatabases
  6005. echo ' chmod 600 $DAILYFILE' >> /usr/bin/backupdatabases
  6006. echo 'fi' >> /usr/bin/backupdatabases
  6007. nginx_ensite $OWNCLOUD_DOMAIN_NAME
  6008. OWNCLOUD_ONION_HOSTNAME=$(add_onion_service owncloud 80 ${OWNCLOUD_ONION_PORT})
  6009. systemctl restart php5-fpm
  6010. systemctl restart nginx
  6011. if ! grep -q "Owncloud onion domain" /home/$MY_USERNAME/README; then
  6012. echo "Owncloud onion domain: ${OWNCLOUD_ONION_HOSTNAME}" >> /home/$MY_USERNAME/README
  6013. echo '' >> /home/$MY_USERNAME/README
  6014. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
  6015. chmod 600 /home/$MY_USERNAME/README
  6016. fi
  6017. echo "Owncloud onion domain:${OWNCLOUD_ONION_HOSTNAME}" >> $COMPLETION_FILE
  6018. # update the dynamic DNS
  6019. CURRENT_DDNS_DOMAIN=$OWNCLOUD_DOMAIN_NAME
  6020. add_ddns_domain
  6021. echo "Owncloud domain:$OWNCLOUD_DOMAIN_NAME" >> $COMPLETION_FILE
  6022. echo 'install_owncloud' >> $COMPLETION_FILE
  6023. if [[ $SYSTEM_TYPE == "$VARIANT_CLOUD" ]]; then
  6024. install_owncloud_music_app
  6025. backup_to_friends_servers
  6026. intrusion_detection
  6027. split_gpg_key_into_fragments
  6028. # unmount any attached usb drive
  6029. if [ -d $USB_MOUNT ]; then
  6030. umount $USB_MOUNT
  6031. rm -rf $USB_MOUNT
  6032. fi
  6033. echo ''
  6034. echo "$OWNCLOUD_COMPLETION_MSG1"
  6035. echo "$OWNCLOUD_COMPLETION_MSG2"
  6036. exit 0
  6037. fi
  6038. }
  6039. function install_gogs {
  6040. 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
  6041. return
  6042. fi
  6043. if [ ! $GIT_DOMAIN_NAME ]; then
  6044. return
  6045. fi
  6046. export GOPATH=/home/git/go
  6047. systemctl set-environment GOPATH=/home/git/go
  6048. # update to the next commit
  6049. if [ -d /var/www/$GIT_DOMAIN_NAME ]; then
  6050. if grep -q "Gogs commit" $COMPLETION_FILE; then
  6051. CURRENT_GOGS_COMMIT=$(grep "Gogs commit" $COMPLETION_FILE | awk -F ':' '{print $2}')
  6052. if [[ "$CURRENT_GOGS_COMMIT" != "$GOGS_COMMIT" ]]; then
  6053. cd $GOPATH/src/github.com/gogits/gogs
  6054. git_pull $GIT_DOMAIN_REPO $GOGS_COMMIT
  6055. sed -i "s/Gogs commit.*/Gogs commit:$GOGS_COMMIT/g" $COMPLETION_FILE
  6056. go get -u ./...
  6057. if [ ! "$?" = "0" ]; then
  6058. exit 52792
  6059. fi
  6060. go build
  6061. if [ ! "$?" = "0" ]; then
  6062. exit 36226
  6063. fi
  6064. systemctl restart gogs
  6065. fi
  6066. else
  6067. echo "Gogs commit:$GOGS_COMMIT" >> $COMPLETION_FILE
  6068. fi
  6069. fi
  6070. if grep -Fxq "install_gogs" $COMPLETION_FILE; then
  6071. return
  6072. fi
  6073. # http://gogs.io/docs/installation/install_from_source.md
  6074. # add a gogs user account
  6075. adduser --disabled-login --gecos 'Gogs' git
  6076. # install Go
  6077. apt-get -y install golang libpam0g-dev
  6078. if ! grep -q "export GOPATH=/home/git/go" ~/.bashrc; then
  6079. echo 'export GOPATH=/home/git/go' >> ~/.bashrc
  6080. echo 'systemctl set-environment GOPATH=/home/git/go' >> ~/.bashrc
  6081. fi
  6082. if [ ! -d $GOPATH ]; then
  6083. mkdir -p $GOPATH
  6084. fi
  6085. GO_PACKAGE_MANAGER_REPO2=$(echo "$GO_PACKAGE_MANAGER_REPO" | sed 's|https://||g')
  6086. go get -u $GO_PACKAGE_MANAGER_REPO2
  6087. if [ ! "$?" = "0" ]; then
  6088. exit 479832
  6089. fi
  6090. # clone the repo
  6091. if [ ! -d $GOPATH/src/github.com/gogits ]; then
  6092. mkdir -p $GOPATH/src/github.com/gogits
  6093. fi
  6094. git_clone $GIT_DOMAIN_REPO $GOPATH/src/github.com/gogits/gogs
  6095. if [ ! -d $GOPATH/src/github.com/gogits/gogs ]; then
  6096. echo $"Unable to clone repo $GOPATH/src/github.com/gogits/gogs"
  6097. exit 85482
  6098. fi
  6099. cd $GOPATH/src/github.com/gogits/gogs
  6100. git checkout $GOGS_COMMIT -b $GOGS_COMMIT
  6101. if ! grep -q "Gogs commit" $COMPLETION_FILE; then
  6102. echo "Gogs commit:$GOGS_COMMIT" >> $COMPLETION_FILE
  6103. else
  6104. sed -i "s/Gogs commit.*/Gogs commit:$GOGS_COMMIT/g" $COMPLETION_FILE
  6105. fi
  6106. # install
  6107. go get -u ./...
  6108. go build
  6109. if [ ! "$?" = "0" ]; then
  6110. exit 546750
  6111. fi
  6112. install_mariadb
  6113. get_mariadb_password
  6114. get_mariadb_git_admin_password
  6115. if [ ! $GIT_ADMIN_PASSWORD ]; then
  6116. if [ -f $IMAGE_PASSWORD_FILE ]; then
  6117. GIT_ADMIN_PASSWORD="$(printf `cat $IMAGE_PASSWORD_FILE`)"
  6118. else
  6119. GIT_ADMIN_PASSWORD="$(openssl rand -base64 32)"
  6120. fi
  6121. fi
  6122. if ! grep -q $"Gogs admin user password" /home/$MY_USERNAME/README; then
  6123. echo '' >> /home/$MY_USERNAME/README
  6124. echo '' >> /home/$MY_USERNAME/README
  6125. echo 'Gogs' >> /home/$MY_USERNAME/README
  6126. echo '====' >> /home/$MY_USERNAME/README
  6127. echo $'Database type: MySql' >> /home/$MY_USERNAME/README
  6128. echo $'Database host: 127.0.0.1:3306' >> /home/$MY_USERNAME/README
  6129. echo $'Database user: root' >> /home/$MY_USERNAME/README
  6130. echo $"Database password: $MARIADB_PASSWORD" >> /home/$MY_USERNAME/README
  6131. echo $'Database name: gogs' >> /home/$MY_USERNAME/README
  6132. echo $'Gogs admin user: gogsadmin' >> /home/$MY_USERNAME/README
  6133. echo $"Gogs admin user password: $GIT_ADMIN_PASSWORD" >> /home/$MY_USERNAME/README
  6134. echo $"Gogs admin user email: $MY_EMAIL_ADDRESS" >> /home/$MY_USERNAME/README
  6135. echo '' >> /home/$MY_USERNAME/README
  6136. echo $'Install Steps For First-time Run:' >> /home/$MY_USERNAME/README
  6137. echo $'Leave email service settings empty' >> /home/$MY_USERNAME/README
  6138. echo $'Check "Enable Register Confirmation"' >> /home/$MY_USERNAME/README
  6139. echo $'Check "Enable Mail Notification"' >> /home/$MY_USERNAME/README
  6140. echo '' >> /home/$MY_USERNAME/README
  6141. echo $'After the initial install edit /home/git/go/src/github.com/gogits/gogs/custom/conf/app.ini' >> /home/$MY_USERNAME/README
  6142. echo $'and within the [server] section set:' >> /home/$MY_USERNAME/README
  6143. echo " DOMAIN = $GIT_DOMAIN_NAME" >> /home/$MY_USERNAME/README
  6144. echo " ROOT_URL = http://$GIT_DOMAIN_NAME/" >> /home/$MY_USERNAME/README
  6145. echo " SSH_PORT = $SSH_PORT" >> /home/$MY_USERNAME/README
  6146. echo $'If you want to disable new account registrations then append the following:' >> /home/$MY_USERNAME/README
  6147. echo ' [service]' >> /home/$MY_USERNAME/README
  6148. echo ' DISABLE_REGISTRATION = true' >> /home/$MY_USERNAME/README
  6149. echo $'Then restart with:' >> /home/$MY_USERNAME/README
  6150. echo ' systemctl restart gogs' >> /home/$MY_USERNAME/README
  6151. echo '' >> /home/$MY_USERNAME/README
  6152. echo $"Note that there's a usability/security trade-off made here." >> /home/$MY_USERNAME/README
  6153. echo $"In order to allow git clone via http we don't redirect everything" >> /home/$MY_USERNAME/README
  6154. echo $'over https. Instead only critical things such as user login,' >> /home/$MY_USERNAME/README
  6155. echo $'settings and admin are encrypted.' >> /home/$MY_USERNAME/README
  6156. echo $'There are also potential security issues with cloning/pulling/pushing' >> /home/$MY_USERNAME/README
  6157. echo $'code over http, since a determined adversary could inject malware' >> /home/$MY_USERNAME/README
  6158. echo $'into the stream as it passes, so beware.' >> /home/$MY_USERNAME/README
  6159. echo $'If you have a bought domain and a non-self signed cert then you' >> /home/$MY_USERNAME/README
  6160. echo $"should change /etc/nginx/sites-available/$GIT_DOMAIN_NAME to redirect everything over https." >> /home/$MY_USERNAME/README
  6161. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
  6162. chmod 600 /home/$MY_USERNAME/README
  6163. fi
  6164. create_database gogs "$GOGS_ADMIN_PASSWORD"
  6165. chmod 600 /home/git/go/src/github.com/gogits/gogs/custom/conf/app.ini
  6166. chown -R git:git /home/git
  6167. cp $GOPATH/src/github.com/gogits/gogs/scripts/systemd/gogs.service /etc/systemd/system
  6168. sed -i 's|#After=mysqld.service|After=mysqld.service|g' /etc/systemd/system/gogs.service
  6169. sed -i "s|WorkingDirectory=.*|WorkingDirectory=$GOPATH/src/github.com/gogits/gogs|g" /etc/systemd/system/gogs.service
  6170. sed -i "s|ExecStart=.*|ExecStart=$GOPATH/src/github.com/gogits/gogs/gogs web|g" /etc/systemd/system/gogs.service
  6171. sed -i "s|Environment.*|Environment=\"USER=git\" \"HOME=/home/git\" \"GOPATH=/home/git/go\"|g" /etc/systemd/system/gogs.service
  6172. systemctl enable gogs
  6173. systemctl daemon-reload
  6174. systemctl restart gogs
  6175. if [ ! -d /var/www/$GIT_DOMAIN_NAME ]; then
  6176. mkdir /var/www/$GIT_DOMAIN_NAME
  6177. fi
  6178. if [ -d /var/www/$GIT_DOMAIN_NAME/htdocs ]; then
  6179. rm -rf /var/www/$GIT_DOMAIN_NAME/htdocs
  6180. fi
  6181. if [[ $ONION_ONLY == "no" ]]; then
  6182. echo 'server {' > /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6183. echo ' listen 80;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6184. echo " server_name $GIT_DOMAIN_NAME;" >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6185. echo ' access_log off;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6186. echo " error_log /var/log/nginx/${GIT_DOMAIN_NAME}_error.log $WEBSERVER_LOG_LEVEL;" >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6187. echo ' add_header X-Frame-Options DENY;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6188. echo ' add_header X-Content-Type-Options nosniff;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6189. echo ' limit_conn conn_limit_per_ip 10;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6190. echo ' limit_req zone=req_limit_per_ip burst=10 nodelay;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6191. echo ' location / {' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6192. echo ' proxy_pass http://localhost:3000;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6193. echo ' }' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6194. echo ' location ^~ /user/ {' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6195. echo ' rewrite ^ https://$server_name$request_uri?;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6196. echo ' }' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6197. echo ' location ^~ /admin/ {' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6198. echo ' rewrite ^ https://$server_name$request_uri?;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6199. echo ' }' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6200. echo '}' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6201. echo '' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6202. echo 'server {' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6203. echo ' listen 443 ssl;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6204. echo " root /var/www/$GIT_DOMAIN_NAME/htdocs;" >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6205. echo " server_name $GIT_DOMAIN_NAME;" >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6206. echo ' access_log off;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6207. echo " error_log /var/log/nginx/${GIT_DOMAIN_NAME}_error.log $WEBSERVER_LOG_LEVEL;" >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6208. echo '' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6209. echo ' limit_conn conn_limit_per_ip 10;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6210. echo ' limit_req zone=req_limit_per_ip burst=10 nodelay;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6211. echo '' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6212. echo ' ssl on;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6213. echo " ssl_certificate /etc/ssl/certs/$GIT_DOMAIN_NAME.crt;" >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6214. echo " ssl_certificate_key /etc/ssl/private/$GIT_DOMAIN_NAME.key;" >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6215. echo " ssl_dhparam /etc/ssl/certs/$GIT_DOMAIN_NAME.dhparam;" >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6216. echo '' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6217. echo ' ssl_session_timeout 60m;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6218. echo ' ssl_prefer_server_ciphers on;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6219. echo " ssl_protocols $SSL_PROTOCOLS; # not possible to do exclusive" >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6220. echo " ssl_ciphers '$SSL_CIPHERS';" >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6221. echo ' add_header X-Frame-Options DENY;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6222. echo ' add_header X-Content-Type-Options nosniff;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6223. echo ' add_header Strict-Transport-Security max-age=0;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6224. echo '' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6225. echo ' location / {' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6226. echo ' proxy_pass http://localhost:3000;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6227. echo ' }' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6228. echo '' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6229. echo ' client_max_body_size 10G; # set max upload size' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6230. echo ' client_body_buffer_size 128k;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6231. echo ' fastcgi_buffers 64 4K;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6232. echo '' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6233. echo ' error_page 403 /core/templates/403.php;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6234. echo ' error_page 404 /core/templates/404.php;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6235. echo '' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6236. echo ' location = /robots.txt {' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6237. echo ' allow all;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6238. echo ' log_not_found off;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6239. echo ' access_log off;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6240. echo ' }' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6241. echo '}' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6242. echo '' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6243. else
  6244. echo -n '' > /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6245. fi
  6246. echo 'server {' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6247. echo " listen 127.0.0.1:${GIT_ONION_PORT} default_server;" >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6248. echo " root /var/www/$GIT_DOMAIN_NAME/htdocs;" >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6249. echo " server_name $GIT_DOMAIN_NAME;" >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6250. echo ' access_log off;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6251. echo " error_log /var/log/nginx/${GIT_DOMAIN_NAME}_error.log $WEBSERVER_LOG_LEVEL;" >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6252. echo '' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6253. echo ' limit_conn conn_limit_per_ip 10;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6254. echo ' limit_req zone=req_limit_per_ip burst=10 nodelay;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6255. echo '' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6256. echo ' add_header X-Frame-Options DENY;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6257. echo ' add_header X-Content-Type-Options nosniff;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6258. echo ' add_header Strict-Transport-Security max-age=0;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6259. echo '' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6260. echo ' location / {' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6261. echo ' proxy_pass http://localhost:3000;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6262. echo ' }' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6263. echo '' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6264. echo ' client_max_body_size 10G; # set max upload size' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6265. echo ' client_body_buffer_size 128k;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6266. echo ' fastcgi_buffers 64 4K;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6267. echo '' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6268. echo ' error_page 403 /core/templates/403.php;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6269. echo ' error_page 404 /core/templates/404.php;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6270. echo '' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6271. echo ' location = /robots.txt {' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6272. echo ' allow all;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6273. echo ' log_not_found off;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6274. echo ' access_log off;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6275. echo ' }' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6276. echo '}' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6277. configure_php
  6278. if [[ $ONION_ONLY == "no" ]]; then
  6279. if [ ! -f /etc/ssl/certs/$GIT_DOMAIN_NAME.dhparam ]; then
  6280. if [[ $LETSENCRYPT_ENABLED != "yes" ]]; then
  6281. ${PROJECT_NAME}-addcert -h $GIT_DOMAIN_NAME --dhkey $DH_KEYLENGTH
  6282. else
  6283. ${PROJECT_NAME}-addcert -e $GIT_DOMAIN_NAME -s $LETSENCRYPT_SERVER --dhkey $DH_KEYLENGTH --email $MY_EMAIL_ADDRESS
  6284. fi
  6285. check_certificates $GIT_DOMAIN_NAME
  6286. fi
  6287. fi
  6288. nginx_ensite $GIT_DOMAIN_NAME
  6289. if [ ! -d /var/lib/tor ]; then
  6290. echo $'No Tor installation found. Gogs onion site cannot be configured.'
  6291. exit 877367
  6292. fi
  6293. if ! grep -q "hidden_service_gogs" /etc/tor/torrc; then
  6294. echo 'HiddenServiceDir /var/lib/tor/hidden_service_gogs/' >> /etc/tor/torrc
  6295. echo "HiddenServicePort 80 127.0.0.1:${GIT_ONION_PORT}" >> /etc/tor/torrc
  6296. echo "HiddenServicePort 9418 127.0.0.1:9418" >> /etc/tor/torrc
  6297. echo $'Added onion site for Gogs'
  6298. fi
  6299. systemctl restart tor
  6300. wait_for_onion_service 'gogs'
  6301. GIT_ONION_HOSTNAME=$(cat /var/lib/tor/hidden_service_gogs/hostname)
  6302. systemctl restart php5-fpm
  6303. systemctl restart nginx
  6304. if ! grep -q "Gogs onion domain" /home/$MY_USERNAME/README; then
  6305. echo "Gogs onion domain: ${GIT_ONION_HOSTNAME}" >> /home/$MY_USERNAME/README
  6306. echo '' >> /home/$MY_USERNAME/README
  6307. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
  6308. chmod 600 /home/$MY_USERNAME/README
  6309. fi
  6310. if ! grep -q "Gogs onion domain" $COMPLETION_FILE; then
  6311. echo "Gogs onion domain:${GIT_ONION_HOSTNAME}" >> $COMPLETION_FILE
  6312. fi
  6313. # update the dynamic DNS
  6314. CURRENT_DDNS_DOMAIN=$GIT_DOMAIN_NAME
  6315. add_ddns_domain
  6316. echo "Gogs domain:$GIT_DOMAIN_NAME" >> $COMPLETION_FILE
  6317. echo 'install_gogs' >> $COMPLETION_FILE
  6318. }
  6319. function tox_avahi {
  6320. if [[ $SYSTEM_TYPE != "$VARIANT_MESH" ]]; then
  6321. return
  6322. fi
  6323. if grep -Fxq "tox_avahi" $COMPLETION_FILE; then
  6324. return
  6325. fi
  6326. if [ ! -d /etc/avahi ]; then
  6327. echo $'tox_avahi: avahi is not installed'
  6328. exit 87359
  6329. fi
  6330. # install a command to obtain the Tox ID
  6331. cd $INSTALL_DIR
  6332. git_clone $TOXID_REPO $INSTALL_DIR/toxid
  6333. if [ ! -d $INSTALL_DIR/toxid ]; then
  6334. exit 63921
  6335. fi
  6336. cd $INSTALL_DIR/toxid
  6337. make
  6338. if [ ! "$?" = "0" ]; then
  6339. exit 58432
  6340. fi
  6341. make install
  6342. toxavahi
  6343. # publish regularly
  6344. if ! grep -q "toxavahi" /etc/crontab; then
  6345. echo "* * * * * root toxavahi > /dev/null" >> /etc/crontab
  6346. fi
  6347. systemctl restart avahi-daemon
  6348. echo 'tox_avahi' >> $COMPLETION_FILE
  6349. }
  6350. function install_tox_node {
  6351. 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
  6352. return
  6353. fi
  6354. # update to the next commit
  6355. if [ -d $INSTALL_DIR/toxcore ]; then
  6356. if grep -q "toxcore commit" $COMPLETION_FILE; then
  6357. CURRENT_TOX_COMMIT=$(grep "toxcore commit" $COMPLETION_FILE | awk -F ':' '{print $2}')
  6358. if [[ "$CURRENT_TOX_COMMIT" != "$TOX_COMMIT" ]]; then
  6359. cd $INSTALL_DIR/toxcore
  6360. git_pull $TOX_REPO $TOX_COMMIT
  6361. sed -i "s/toxcore commit.*/toxcore commit:$TOX_COMMIT/g" $COMPLETION_FILE
  6362. autoreconf -i
  6363. ./configure --enable-daemon
  6364. make
  6365. make install
  6366. systemctl restart tox-bootstrapd.service
  6367. fi
  6368. else
  6369. echo "toxcore commit:$TOX_COMMIT" >> $COMPLETION_FILE
  6370. fi
  6371. fi
  6372. if grep -Fxq "install_tox_node" $COMPLETION_FILE; then
  6373. return
  6374. fi
  6375. # toxcore
  6376. apt-get -y install build-essential libtool autotools-dev
  6377. apt-get -y install automake checkinstall check git yasm
  6378. apt-get -y install libsodium13 libsodium-dev libcap2-bin
  6379. apt-get -y install libconfig9 libconfig-dev
  6380. cd $INSTALL_DIR
  6381. git_clone $TOX_REPO $INSTALL_DIR/toxcore
  6382. cd $INSTALL_DIR/toxcore
  6383. git checkout $TOX_COMMIT -b $TOX_COMMIT
  6384. if ! grep -q "toxcore commit" $COMPLETION_FILE; then
  6385. echo "toxcore commit:$TOX_COMMIT" >> $COMPLETION_FILE
  6386. else
  6387. sed -i "s/toxcore commit.*/toxcore commit:$TOX_COMMIT/g" $COMPLETION_FILE
  6388. fi
  6389. autoreconf -i
  6390. ./configure --enable-daemon
  6391. if [ ! "$?" = "0" ]; then
  6392. exit 78467
  6393. fi
  6394. make
  6395. if [ ! "$?" = "0" ]; then
  6396. exit 84562
  6397. fi
  6398. make install
  6399. cp /usr/local/lib/libtoxcore* /usr/lib/
  6400. if [ ! -f /usr/local/bin/tox-bootstrapd ]; then
  6401. echo $"File not found /usr/local/bin/tox-bootstrapd"
  6402. exit 73862
  6403. fi
  6404. 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
  6405. chmod 700 /var/lib/tox-bootstrapd
  6406. if [ ! -f $INSTALL_DIR/toxcore/other/bootstrap_daemon/tox-bootstrapd.conf ]; then
  6407. echo $"File not found $INSTALL_DIR/toxcore/other/bootstrap_daemon/tox-bootstrapd.conf"
  6408. exit 476835
  6409. fi
  6410. # remove Maildir
  6411. if [ -d /var/lib/tox-bootstrapd/Maildir ]; then
  6412. rm -rf /var/lib/tox-bootstrapd/Maildir
  6413. fi
  6414. # create configuration file
  6415. echo "port = $TOX_PORT" > /etc/tox-bootstrapd.conf
  6416. echo 'keys_file_path = "/var/lib/tox-bootstrapd/keys"' >> /etc/tox-bootstrapd.conf
  6417. echo 'pid_file_path = "/var/run/tox-bootstrapd/tox-bootstrapd.pid"' >> /etc/tox-bootstrapd.conf
  6418. echo 'enable_ipv6 = true' >> /etc/tox-bootstrapd.conf
  6419. echo 'enable_ipv4_fallback = true' >> /etc/tox-bootstrapd.conf
  6420. echo 'enable_lan_discovery = true' >> /etc/tox-bootstrapd.conf
  6421. echo 'enable_tcp_relay = true' >> /etc/tox-bootstrapd.conf
  6422. echo "tcp_relay_ports = [443, 3389, $TOX_PORT]" >> /etc/tox-bootstrapd.conf
  6423. echo 'enable_motd = true' >> /etc/tox-bootstrapd.conf
  6424. echo 'motd = "tox-bootstrapd"' >> /etc/tox-bootstrapd.conf
  6425. if [ $TOX_NODES ]; then
  6426. echo 'bootstrap_nodes = (' >> /etc/tox-bootstrapd.conf
  6427. toxcount=0
  6428. while [ "x${TOX_NODES[toxcount]}" != "x" ]
  6429. do
  6430. toxval_ipv4=$(echo $TOX_NODES[toxcount] | awk -F ',' '{print $1}')
  6431. toxval_ipv6=$(echo $TOX_NODES[toxcount] | awk -F ',' '{print $2}')
  6432. toxval_port=$(echo $TOX_NODES[toxcount] | awk -F ',' '{print $3}')
  6433. toxval_pubkey=$(echo $TOX_NODES[toxcount] | awk -F ',' '{print $4}')
  6434. toxval_maintainer=$(echo $TOX_NODES[toxcount] | awk -F ',' '{print $5}')
  6435. echo "{ // $toxval_maintainer" >> /etc/tox-bootstrapd.conf
  6436. if [[ $toxval_ipv6 != 'NONE' ]]; then
  6437. echo " address = \"$toxval_ipv6\"" >> /etc/tox-bootstrapd.conf
  6438. else
  6439. echo " address = \"$toxval_ipv4\"" >> /etc/tox-bootstrapd.conf
  6440. fi
  6441. echo " port = $toxval_port" >> /etc/tox-bootstrapd.conf
  6442. echo " public_key = \"$toxval_pubkey\"" >> /etc/tox-bootstrapd.conf
  6443. toxcount=$(( $toxcount + 1 ))
  6444. if [ "x${TOX_NODES[toxcount]}" != "x" ]; then
  6445. echo "}," >> /etc/tox-bootstrapd.conf
  6446. else
  6447. echo "}" >> /etc/tox-bootstrapd.conf
  6448. fi
  6449. done
  6450. echo ')' >> /etc/tox-bootstrapd.conf
  6451. fi
  6452. if [ ! -f $INSTALL_DIR/toxcore/other/bootstrap_daemon/tox-bootstrapd.service ]; then
  6453. echo $"File not found $INSTALL_DIR/toxcore/other/bootstrap_daemon/tox-bootstrapd.service"
  6454. exit 7359
  6455. fi
  6456. cp $INSTALL_DIR/toxcore/other/bootstrap_daemon/tox-bootstrapd.service /etc/systemd/system/
  6457. enable_ipv6
  6458. systemctl daemon-reload
  6459. systemctl enable tox-bootstrapd.service
  6460. systemctl start tox-bootstrapd.service
  6461. if [ ! "$?" = "0" ]; then
  6462. systemctl status tox-bootstrapd.service
  6463. exit 5846
  6464. fi
  6465. TOX_ONION_HOSTNAME=$(add_onion_service tox ${TOX_PORT} ${TOX_PORT})
  6466. if ! grep -q "tox onion domain" $COMPLETION_FILE; then
  6467. echo "tox onion domain:${TOX_ONION_HOSTNAME}" >> $COMPLETION_FILE
  6468. else
  6469. sed -i "s|tox onion domain.*|tox onion domain:${TOX_ONION_HOSTNAME}|g" $COMPLETION_FILE
  6470. fi
  6471. systemctl restart tox-bootstrapd.service
  6472. TOX_PUBLIC_KEY=$(cat /var/log/syslog | grep tox | grep "Public Key" | awk -F ' ' '{print $8}' | tail -1)
  6473. if [ ${#TOX_PUBLIC_KEY} -lt 30 ]; then
  6474. echo $'Could not obtain the tox node public key'
  6475. exit 6529
  6476. fi
  6477. # save the public key for later reference
  6478. echo "$TOX_PUBLIC_KEY" > $TOX_BOOTSTRAP_ID_FILE
  6479. configure_firewall_for_tox
  6480. if ! grep -q $"Your Tox node public key is" /home/$MY_USERNAME/README; then
  6481. echo '' >> /home/$MY_USERNAME/README
  6482. echo '' >> /home/$MY_USERNAME/README
  6483. echo 'Tox' >> /home/$MY_USERNAME/README
  6484. echo '===' >> /home/$MY_USERNAME/README
  6485. echo $"tox onion domain: ${TOX_ONION_HOSTNAME}" >> /home/$MY_USERNAME/README
  6486. echo $"Your Tox node public key is: $TOX_PUBLIC_KEY" >> /home/$MY_USERNAME/README
  6487. echo $'In the Toxic client you can connect to it with:' >> /home/$MY_USERNAME/README
  6488. echo " /connect $DEFAULT_DOMAIN_NAME.local $TOX_PORT $TOX_PUBLIC_KEY" >> /home/$MY_USERNAME/README
  6489. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
  6490. chmod 600 /home/$MY_USERNAME/README
  6491. fi
  6492. echo 'install_tox_node' >> $COMPLETION_FILE
  6493. }
  6494. function install_tox_client {
  6495. 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
  6496. return
  6497. fi
  6498. # update to the next commit
  6499. if [ -d $INSTALL_DIR/toxic ]; then
  6500. if grep -q "Toxic commit" $COMPLETION_FILE; then
  6501. CURRENT_TOXIC_COMMIT=$(grep "Toxic commit" $COMPLETION_FILE | awk -F ':' '{print $2}')
  6502. if [[ "$CURRENT_TOXIC_COMMIT" != "$TOXIC_COMMIT" ]]; then
  6503. cd $INSTALL_DIR/toxic
  6504. git_pull $TOXIC_REPO $TOXIC_COMMIT
  6505. sed -i "s/Toxic commit.*/Toxic commit:$TOXIC_COMMIT/g" $COMPLETION_FILE
  6506. make
  6507. make install
  6508. fi
  6509. else
  6510. echo "Toxic commit:$TOXIC_COMMIT" >> $COMPLETION_FILE
  6511. fi
  6512. fi
  6513. if grep -Fxq "install_tox_client" $COMPLETION_FILE; then
  6514. return
  6515. fi
  6516. apt-get -y install libncursesw5-dev libconfig-dev libqrencode-dev libcurl4-openssl-dev
  6517. cd $INSTALL_DIR
  6518. git_clone $TOXIC_REPO $INSTALL_DIR/toxic
  6519. cd $INSTALL_DIR/toxic
  6520. git checkout $TOXIC_COMMIT -b $TOXIC_COMMIT
  6521. if ! grep -q "Toxic commit" $COMPLETION_FILE; then
  6522. echo "Toxic commit:$TOXIC_COMMIT" >> $COMPLETION_FILE
  6523. else
  6524. sed -i "s/Toxic commit.*/Toxic commit:$TOXIC_COMMIT/g" $COMPLETION_FILE
  6525. fi
  6526. make
  6527. if [ ! -f $INSTALL_DIR/toxic/build/toxic ]; then
  6528. exit 74872
  6529. fi
  6530. make install
  6531. su -c "echo 'n
  6532. /nick $MY_USERNAME
  6533. /exit
  6534. ' | /usr/bin/toxic -d" - $MY_USERNAME
  6535. echo 'install_tox_client' >> $COMPLETION_FILE
  6536. }
  6537. function install_xmpp {
  6538. 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
  6539. return
  6540. fi
  6541. if grep -Fxq "install_xmpp" $COMPLETION_FILE; then
  6542. return
  6543. fi
  6544. apt-get -y install lua-sec lua-bitop
  6545. apt-get -y install prosody prosody-modules mercurial
  6546. if [ ! -d /etc/prosody ]; then
  6547. echo $"ERROR: prosody does not appear to have installed. $CHECK_MESSAGE"
  6548. exit 52
  6549. fi
  6550. # obtain the prosody modules
  6551. cd $INSTALL_DIR
  6552. hg clone https://hg.prosody.im/prosody-modules/ prosody-modules
  6553. if [ ! -d $INSTALL_DIR/prosody-modules/mod_onions ]; then
  6554. echo $'mod_onions prosody module could not be found'
  6555. exit 73254
  6556. fi
  6557. # install the onions module
  6558. cp $INSTALL_DIR/prosody-modules/mod_onions/mod_onions.lua /usr/lib/prosody/modules/mod_onions.lua
  6559. if [ ! -f /usr/lib/prosody/modules/mod_onions.lua ]; then
  6560. echo $'mod_onions.lua could not be copied to the prosody modules directory'
  6561. exit 63952
  6562. fi
  6563. # create a certificate
  6564. if [ ! -f /etc/ssl/certs/xmpp.dhparam ]; then
  6565. ${PROJECT_NAME}-addcert -h xmpp --dhkey $DH_KEYLENGTH
  6566. check_certificates xmpp
  6567. fi
  6568. chown prosody:prosody /etc/ssl/private/xmpp.key
  6569. chown prosody:prosody /etc/ssl/certs/xmpp.*
  6570. cp -a /etc/prosody/conf.avail/example.com.cfg.lua /etc/prosody/conf.avail/xmpp.cfg.lua
  6571. sed -i 's|/etc/prosody/certs/example.com.key|/etc/ssl/private/xmpp.key|g' /etc/prosody/conf.avail/xmpp.cfg.lua
  6572. sed -i 's|/etc/prosody/certs/example.com.crt|/etc/ssl/certs/xmpp.crt|g' /etc/prosody/conf.avail/xmpp.cfg.lua
  6573. if ! grep -q "xmpp.dhparam" /etc/prosody/conf.avail/xmpp.cfg.lua; then
  6574. sed -i '/certificate =/a\ dhparam = "/etc/ssl/certs/xmpp.dhparam";' /etc/prosody/conf.avail/xmpp.cfg.lua
  6575. fi
  6576. if ! grep -q 'options = {"no_sslv2", "no_sslv3" }' /etc/prosody/conf.avail/xmpp.cfg.lua; then
  6577. sed -i '/certificate =/a\ options = {"no_sslv2", "no_sslv3" };' /etc/prosody/conf.avail/xmpp.cfg.lua
  6578. fi
  6579. if ! grep -q 'ciphers =' /etc/prosody/conf.avail/xmpp.cfg.lua; then
  6580. sed -i "/certificate =/a\ ciphers = $XMPP_CIPHERS;" /etc/prosody/conf.avail/xmpp.cfg.lua
  6581. fi
  6582. if ! grep -q 'depth = "1";' /etc/prosody/conf.avail/xmpp.cfg.lua; then
  6583. sed -i '/certificate =/a\ depth = "1";' /etc/prosody/conf.avail/xmpp.cfg.lua
  6584. fi
  6585. if ! grep -q 'curve =' /etc/prosody/conf.avail/xmpp.cfg.lua; then
  6586. sed -i "/certificate =/a\ curve = $XMPP_ECC_CURVE;" /etc/prosody/conf.avail/xmpp.cfg.lua
  6587. fi
  6588. sed -i "s/example.com/$DEFAULT_DOMAIN_NAME/g" /etc/prosody/conf.avail/xmpp.cfg.lua
  6589. sed -i 's/enabled = false -- Remove this line to enable this host//g' /etc/prosody/conf.avail/xmpp.cfg.lua
  6590. if ! grep -q "modules_enabled" /etc/prosody/conf.avail/xmpp.cfg.lua; then
  6591. echo '' >> /etc/prosody/conf.avail/xmpp.cfg.lua
  6592. echo 'modules_enabled = {' >> /etc/prosody/conf.avail/xmpp.cfg.lua
  6593. echo ' "bosh"; -- Enable mod_bosh' >> /etc/prosody/conf.avail/xmpp.cfg.lua
  6594. echo ' "tls"; -- Enable mod_tls' >> /etc/prosody/conf.avail/xmpp.cfg.lua
  6595. echo ' "saslauth"; -- Enable mod_saslauth' >> /etc/prosody/conf.avail/xmpp.cfg.lua
  6596. echo ' "onions"; -- Enable chat via onion service' >> /etc/prosody/conf.avail/xmpp.cfg.lua
  6597. echo '}' >> /etc/prosody/conf.avail/xmpp.cfg.lua
  6598. echo '' >> /etc/prosody/conf.avail/xmpp.cfg.lua
  6599. echo 'c2s_require_encryption = true' >> /etc/prosody/conf.avail/xmpp.cfg.lua
  6600. echo 's2s_require_encryption = true' >> /etc/prosody/conf.avail/xmpp.cfg.lua
  6601. echo 'allow_unencrypted_plain_auth = false' >> /etc/prosody/conf.avail/xmpp.cfg.lua
  6602. fi
  6603. ln -sf /etc/prosody/conf.avail/xmpp.cfg.lua /etc/prosody/conf.d/xmpp.cfg.lua
  6604. sed -i 's|/etc/prosody/certs/localhost.key|/etc/ssl/private/xmpp.key|g' /etc/prosody/prosody.cfg.lua
  6605. sed -i 's|/etc/prosody/certs/localhost.crt|/etc/ssl/certs/xmpp.crt|g' /etc/prosody/prosody.cfg.lua
  6606. if ! grep -q "xmpp.dhparam" /etc/prosody/prosody.cfg.lua; then
  6607. sed -i '/certificate =/a\ dhparam = "/etc/ssl/certs/xmpp.dhparam";' /etc/prosody/prosody.cfg.lua
  6608. fi
  6609. if ! grep -q 'options = {"no_sslv2", "no_sslv3" }' /etc/prosody/prosody.cfg.lua; then
  6610. sed -i '/certificate =/a\ options = {"no_sslv2", "no_sslv3" };' /etc/prosody/prosody.cfg.lua
  6611. fi
  6612. if ! grep -q 'ciphers =' /etc/prosody/prosody.cfg.lua; then
  6613. sed -i "/certificate =/a\ ciphers = $XMPP_CIPHERS;" /etc/prosody/prosody.cfg.lua
  6614. fi
  6615. if ! grep -q 'depth = "1";' /etc/prosody/prosody.cfg.lua; then
  6616. sed -i '/certificate =/a\ depth = "1";' /etc/prosody/prosody.cfg.lua
  6617. fi
  6618. if ! grep -q 'curve =' /etc/prosody/prosody.cfg.lua; then
  6619. sed -i "/certificate =/a\ curve = $XMPP_ECC_CURVE;" /etc/prosody/prosody.cfg.lua
  6620. fi
  6621. sed -i 's/c2s_require_encryption = false/c2s_require_encryption = true/g' /etc/prosody/prosody.cfg.lua
  6622. if ! grep -q "s2s_require_encryption" /etc/prosody/prosody.cfg.lua; then
  6623. sed -i '/c2s_require_encryption/a\s2s_require_encryption = true' /etc/prosody/prosody.cfg.lua
  6624. fi
  6625. if ! grep -q "allow_unencrypted_plain_auth" /etc/prosody/prosody.cfg.lua; then
  6626. echo 'allow_unencrypted_plain_auth = false' >> /etc/prosody/conf.avail/xmpp.cfg.lua
  6627. fi
  6628. sed -i 's/--"bosh";/"bosh";/g' /etc/prosody/prosody.cfg.lua
  6629. sed -i 's/authentication = "internal_plain"/authentication = "internal_hashed"/g' /etc/prosody/prosody.cfg.lua
  6630. sed -i 's/enabled = false -- Remove this line to enable this host//g' /etc/prosody/prosody.cfg.lua
  6631. sed -i 's|key = "/etc/prosody/certs/example.com.key"|key = "/etc/ssl/private/xmpp.key"|g' /etc/prosody/prosody.cfg.lua
  6632. sed -i 's|certificate = "/etc/prosody/certs/example.com.crt"|certificate = "/etc/ssl/certs/xmpp.crt"|g' /etc/prosody/prosody.cfg.lua
  6633. sed -i "s/example.com/$DEFAULT_DOMAIN_NAME/g" /etc/prosody/prosody.cfg.lua
  6634. systemctl restart prosody
  6635. touch /home/$MY_USERNAME/README
  6636. if [ ! -d /var/lib/tor ]; then
  6637. echo $'No Tor installation found. XMPP onion site cannot be configured.'
  6638. exit 877367
  6639. fi
  6640. if ! grep -q "hidden_service_xmpp" /etc/tor/torrc; then
  6641. echo 'HiddenServiceDir /var/lib/tor/hidden_service_xmpp/' >> /etc/tor/torrc
  6642. echo "HiddenServicePort 5222 127.0.0.1:5222" >> /etc/tor/torrc
  6643. echo "HiddenServicePort 5269 127.0.0.1:5269" >> /etc/tor/torrc
  6644. echo $'Added onion site for XMPP chat'
  6645. fi
  6646. systemctl restart tor
  6647. wait_for_onion_service 'xmpp'
  6648. if [ ! -f /var/lib/tor/hidden_service_xmpp/hostname ]; then
  6649. echo $'XMPP onion site hostname not found'
  6650. exit 65349
  6651. fi
  6652. XMPP_ONION_HOSTNAME=$(cat /var/lib/tor/hidden_service_xmpp/hostname)
  6653. if ! grep -q "${XMPP_ONION_HOSTNAME}" /etc/prosody/conf.avail/xmpp.cfg.lua; then
  6654. echo '' >> /etc/prosody/conf.avail/xmpp.cfg.lua
  6655. echo "VirtualHost \"${XMPP_ONION_HOSTNAME}\"" >> /etc/prosody/conf.avail/xmpp.cfg.lua
  6656. echo ' modules_enabled = { "onions" };' >> /etc/prosody/conf.avail/xmpp.cfg.lua
  6657. fi
  6658. if ! grep -q "XMPP onion domain" $COMPLETION_FILE; then
  6659. echo "XMPP onion domain:${XMPP_ONION_HOSTNAME}" >> $COMPLETION_FILE
  6660. else
  6661. sed -i "s|XMPP onion domain.*|XMPP onion domain:${XMPP_ONION_HOSTNAME}|g" $COMPLETION_FILE
  6662. fi
  6663. if ! grep -q "Your XMPP password is" /home/$MY_USERNAME/README; then
  6664. if [ -f $IMAGE_PASSWORD_FILE ]; then
  6665. XMPP_PASSWORD="$(printf `cat $IMAGE_PASSWORD_FILE`)"
  6666. else
  6667. XMPP_PASSWORD="$(openssl rand -base64 8)"
  6668. fi
  6669. prosodyctl register $MY_USERNAME $DEFAULT_DOMAIN_NAME $XMPP_PASSWORD
  6670. echo '' >> /home/$MY_USERNAME/README
  6671. echo '' >> /home/$MY_USERNAME/README
  6672. echo $'XMPP' >> /home/$MY_USERNAME/README
  6673. echo '====' >> /home/$MY_USERNAME/README
  6674. echo $"XMPP onion domain: ${XMPP_ONION_HOSTNAME}" >> /home/$MY_USERNAME/README
  6675. echo $"Your XMPP password is: $XMPP_PASSWORD" >> /home/$MY_USERNAME/README
  6676. echo $'You can change it with: ' >> /home/$MY_USERNAME/README
  6677. echo '' >> /home/$MY_USERNAME/README
  6678. echo " prosodyctl passwd $MY_EMAIL_ADDRESS" >> /home/$MY_USERNAME/README
  6679. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
  6680. chmod 600 /home/$MY_USERNAME/README
  6681. fi
  6682. echo 'install_xmpp' >> $COMPLETION_FILE
  6683. }
  6684. function install_watchdog_script {
  6685. if grep -Fxq "install_watchdog_script" $COMPLETION_FILE; then
  6686. return
  6687. fi
  6688. echo '#!/bin/bash' > /usr/bin/$WATCHDOG_SCRIPT_NAME
  6689. echo 'LOGFILE=/var/log/keepon.log' >> /usr/bin/$WATCHDOG_SCRIPT_NAME
  6690. echo 'CURRENT_DATE=$(date)' >> /usr/bin/$WATCHDOG_SCRIPT_NAME
  6691. # application specific stuff is added later
  6692. chmod +x /usr/bin/$WATCHDOG_SCRIPT_NAME
  6693. if ! grep -q "/usr/bin/$WATCHDOG_SCRIPT_NAME" /etc/crontab; then
  6694. echo "* * * * * root /usr/bin/$WATCHDOG_SCRIPT_NAME" >> /etc/crontab
  6695. fi
  6696. echo 'install_watchdog_script' >> $COMPLETION_FILE
  6697. }
  6698. function install_irc_server {
  6699. 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
  6700. return
  6701. fi
  6702. if grep -Fxq "install_irc_server" $COMPLETION_FILE; then
  6703. return
  6704. fi
  6705. apt-get -y install ngircd
  6706. # for mesh peers also install an irc client
  6707. if [[ $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  6708. apt-get -y install irssi
  6709. fi
  6710. if [ ! -d /etc/ngircd ]; then
  6711. echo $"ERROR: ngircd does not appear to have installed. $CHECK_MESSAGE"
  6712. exit 53
  6713. fi
  6714. if [ ! -f /etc/ssl/certs/ngircd.dhparam ]; then
  6715. ${PROJECT_NAME}-addcert -h ngircd --dhkey $DH_KEYLENGTH
  6716. check_certificates ngircd
  6717. fi
  6718. DEFAULTDOMAIN=$DEFAULT_DOMAIN_NAME
  6719. if [[ $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  6720. DEFAULTDOMAIN="${DEFAULT_DOMAIN_NAME}.local"
  6721. fi
  6722. echo '**************************************************' > /etc/ngircd/motd
  6723. echo $'* F R E E D O M B O N E I R C *' >> /etc/ngircd/motd
  6724. echo '* *' >> /etc/ngircd/motd
  6725. echo $'* Freedom in the Cloud *' >> /etc/ngircd/motd
  6726. echo '**************************************************' >> /etc/ngircd/motd
  6727. sed -i 's|MotdFile = /etc/ngircd/ngircd.motd|MotdFile = /etc/ngircd/motd|g' /etc/ngircd/ngircd.conf
  6728. sed -i "s/irc@irc.example.com/$MY_EMAIL_ADDRESS/g" /etc/ngircd/ngircd.conf
  6729. sed -i "s/irc.example.net/$DEFAULTDOMAIN/g" /etc/ngircd/ngircd.conf
  6730. sed -i "s|Yet another IRC Server running on Debian GNU/Linux|IRC Server of $DEFAULTDOMAIN|g" /etc/ngircd/ngircd.conf
  6731. sed -i 's/;Password = wealllikedebian/Password =/g' /etc/ngircd/ngircd.conf
  6732. sed -i 's|;CertFile = /etc/ssl/certs/server.crt|CertFile = /etc/ssl/certs/ngircd.crt|g' /etc/ngircd/ngircd.conf
  6733. sed -i 's|;DHFile = /etc/ngircd/dhparams.pem|DHFile = /etc/ssl/certs/ngircd.dhparam|g' /etc/ngircd/ngircd.conf
  6734. sed -i 's|;KeyFile = /etc/ssl/private/server.key|KeyFile = /etc/ssl/private/ngircd.key|g' /etc/ngircd/ngircd.conf
  6735. sed -i "s/;Ports =.*/Ports = $IRC_PORT, $IRC_ONION_PORT/g" /etc/ngircd/ngircd.conf
  6736. sed -i "s/;Name = #ngircd/Name = #${PROJECT_NAME}/g" /etc/ngircd/ngircd.conf
  6737. sed -i "s/;Topic = Our ngircd testing channel/Topic = ${PROJECT_NAME} chat channel/g" /etc/ngircd/ngircd.conf
  6738. sed -i 's/;MaxUsers = 23/MaxUsers = 23/g' /etc/ngircd/ngircd.conf
  6739. sed -i "s|;KeyFile = /etc/ngircd/#chan.key|KeyFile = /etc/ngircd/#${PROJECT_NAME}.key|g" /etc/ngircd/ngircd.conf
  6740. sed -i "s/;CloakHost = cloaked.host/CloakHost = ${PROJECT_NAME}/g" /etc/ngircd/ngircd.conf
  6741. IRC_SALT="$(openssl rand -base64 32)"
  6742. if [ -f $IMAGE_PASSWORD_FILE ]; then
  6743. IRC_OPERATOR_PASSWORD="$(printf `cat $IMAGE_PASSWORD_FILE`)"
  6744. else
  6745. IRC_OPERATOR_PASSWORD="$(openssl rand -base64 8)"
  6746. fi
  6747. sed -i "s|;CloakHostSalt = abcdefghijklmnopqrstuvwxyz|CloakHostSalt = $IRC_SALT|g" /etc/ngircd/ngircd.conf
  6748. sed -i 's/;ConnectIPv4 = yes/ConnectIPv4 = yes/g' /etc/ngircd/ngircd.conf
  6749. sed -i 's/;MorePrivacy = no/MorePrivacy = yes/g' /etc/ngircd/ngircd.conf
  6750. sed -i 's/;RequireAuthPing = no/RequireAuthPing = no/g' /etc/ngircd/ngircd.conf
  6751. sed -i "s/;Name = TheOper/Name = $MY_USERNAME/g" /etc/ngircd/ngircd.conf
  6752. sed -i "s/;Password = ThePwd/Password = $IRC_OPERATOR_PASSWORD/g" /etc/ngircd/ngircd.conf
  6753. if [ $IRC_PASSWORD ]; then
  6754. sed -i "0,/RE/s/Password =.*/Password = $IRC_PASSWORD/" /etc/ngircd/ngircd.conf
  6755. fi
  6756. # If we are on a mesh then DNS is not available
  6757. if [[ $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  6758. sed -i "s/;DNS =.*/DNS = no/g" /etc/ngircd/ngircd.conf
  6759. fi
  6760. mkdir /var/run/ircd
  6761. chown -R irc:irc /var/run/ircd
  6762. mkdir /var/run/ngircd
  6763. touch /var/run/ngircd/ngircd.pid
  6764. chown -R irc:irc /var/run/ngircd
  6765. IRC_ONION_HOSTNAME=$(add_onion_service irc ${IRC_PORT} ${IRC_PORT})
  6766. if ! grep -q $"IRC onion domain" $COMPLETION_FILE; then
  6767. echo "IRC onion domain:$IRC_ONION_HOSTNAME" >> $COMPLETION_FILE
  6768. fi
  6769. systemctl restart ngircd
  6770. # keep the daemon running
  6771. echo '' >> /usr/bin/$WATCHDOG_SCRIPT_NAME
  6772. echo '# keep irc daemon running' >> /usr/bin/$WATCHDOG_SCRIPT_NAME
  6773. echo 'IRC_RUNNING=$(pgrep ngircd > /dev/null && echo Running)' >> /usr/bin/$WATCHDOG_SCRIPT_NAME
  6774. echo 'if [ ! $IRC_RUNNING ]; then' >> /usr/bin/$WATCHDOG_SCRIPT_NAME
  6775. echo ' systemctl start ngircd' >> /usr/bin/$WATCHDOG_SCRIPT_NAME
  6776. echo ' echo -n $CURRENT_DATE >> $LOGFILE' >> /usr/bin/$WATCHDOG_SCRIPT_NAME
  6777. echo ' echo " IRC daemon restarted" >> $LOGFILE' >> /usr/bin/$WATCHDOG_SCRIPT_NAME
  6778. echo 'fi' >> /usr/bin/$WATCHDOG_SCRIPT_NAME
  6779. if ! grep -q $"IRC Server" /home/$MY_USERNAME/README; then
  6780. echo '' >> /home/$MY_USERNAME/README
  6781. echo '' >> /home/$MY_USERNAME/README
  6782. echo $'IRC Server' >> /home/$MY_USERNAME/README
  6783. echo '==========' >> /home/$MY_USERNAME/README
  6784. echo $'To connect to your IRC server in irssi:' >> /home/$MY_USERNAME/README
  6785. echo '' >> /home/$MY_USERNAME/README
  6786. echo " /server add -auto -ssl $DEFAULTDOMAIN $IRC_PORT" >> /home/$MY_USERNAME/README
  6787. echo " /connect $DEFAULT_DOMAIN_NAME" >> /home/$MY_USERNAME/README
  6788. echo " /join #${PROJECT_NAME}" >> /home/$MY_USERNAME/README
  6789. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
  6790. chmod 600 /home/$MY_USERNAME/README
  6791. fi
  6792. echo 'install_irc_server' >> $COMPLETION_FILE
  6793. }
  6794. function get_wiki_admin_password {
  6795. if [ -f /home/$MY_USERNAME/README ]; then
  6796. if grep -q "Wiki password" /home/$MY_USERNAME/README; then
  6797. WIKI_ADMIN_PASSWORD=$(cat /home/$MY_USERNAME/README | grep "Wiki password:" | awk -F ':' '{print $2}' | sed 's/^ *//')
  6798. fi
  6799. fi
  6800. }
  6801. function install_wiki {
  6802. 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
  6803. return
  6804. fi
  6805. if grep -Fxq "install_wiki" $COMPLETION_FILE; then
  6806. return
  6807. fi
  6808. if [ ! $WIKI_DOMAIN_NAME ]; then
  6809. return
  6810. fi
  6811. apt-get -y install dokuwiki
  6812. apt-get -y remove --purge apache*
  6813. if [ -d /etc/apache2 ]; then
  6814. rm -rf /etc/apache2
  6815. echo $'Removed Apache installation after Dokuwiki install'
  6816. fi
  6817. if [ ! -d /var/www/$WIKI_DOMAIN_NAME ]; then
  6818. mkdir /var/www/$WIKI_DOMAIN_NAME
  6819. fi
  6820. if [ -d /var/www/$WIKI_DOMAIN_NAME/htdocs ]; then
  6821. rm -rf /var/www/$WIKI_DOMAIN_NAME/htdocs
  6822. fi
  6823. ln -s /usr/share/dokuwiki /var/www/$WIKI_DOMAIN_NAME/htdocs
  6824. mkdir /var/lib/dokuwiki/custom
  6825. cp /etc/dokuwiki/local.php.dist /var/lib/dokuwiki/custom/local.php
  6826. ln -s /var/lib/dokuwiki/custom/local.php /etc/dokuwiki/local.php
  6827. chown www-data /var/lib/dokuwiki/custom
  6828. chown www-data /var/lib/dokuwiki/custom/local.php
  6829. chown -R www-data /etc/dokuwiki
  6830. chown -R www-data /usr/share/dokuwiki/lib/
  6831. chmod 600 /var/lib/dokuwiki/custom/local.php
  6832. chmod -R 755 /usr/share/dokuwiki/lib
  6833. sed -i 's|//$conf|$conf|g' /var/lib/dokuwiki/custom/local.php
  6834. sed -i "s|joe|$MY_USERNAME|g" /var/lib/dokuwiki/custom/local.php
  6835. sed -i "s|Debian DokuWiki|$WIKI_TITLE|g" /etc/dokuwiki/local.php
  6836. # set the admin user
  6837. sed -i "s/@admin/$MY_USERNAME/g" /etc/dokuwiki/local.php
  6838. # disallow registration of new users
  6839. if ! grep -q "disableactions" /etc/dokuwiki/local.php; then
  6840. echo "\$conf['disableactions'] = 'register';" >> /etc/dokuwiki/local.php
  6841. fi
  6842. if ! grep -q "disableactions" /var/lib/dokuwiki/custom/local.php; then
  6843. echo "\$conf['disableactions'] = 'register';" >> /var/lib/dokuwiki/custom/local.php
  6844. fi
  6845. if ! grep -q "authtype" /var/lib/dokuwiki/custom/local.php; then
  6846. echo "\$conf['authtype'] = 'authplain';" >> /var/lib/dokuwiki/custom/local.php
  6847. fi
  6848. if ! grep -q "authtype" /etc/dokuwiki/local.php; then
  6849. echo "\$conf['authtype'] = 'authplain';" >> /etc/dokuwiki/local.php
  6850. fi
  6851. get_wiki_admin_password
  6852. if [ ! $WIKI_ADMIN_PASSWORD ]; then
  6853. if [ -f $IMAGE_PASSWORD_FILE ]; then
  6854. WIKI_ADMIN_PASSWORD="$(printf `cat $IMAGE_PASSWORD_FILE`)"
  6855. else
  6856. WIKI_ADMIN_PASSWORD="$(openssl rand -base64 16)"
  6857. fi
  6858. fi
  6859. HASHED_WIKI_PASSWORD=$(echo -n "$WIKI_ADMIN_PASSWORD" | md5sum | awk -F ' ' '{print $1}')
  6860. echo -n "$MY_USERNAME:$HASHED_WIKI_PASSWORD:$MY_NAME:$MY_EMAIL:admin,user,upload" > /var/lib/dokuwiki/acl/users.auth.php
  6861. chmod 640 /var/lib/dokuwiki/acl/users.auth.php
  6862. if ! grep -q "video/ogg" /etc/dokuwiki/mime.conf; then
  6863. echo 'ogv video/ogg' >> /etc/dokuwiki/mime.conf
  6864. fi
  6865. if ! grep -q "video/mp4" /etc/dokuwiki/mime.conf; then
  6866. echo 'mp4 video/mp4' >> /etc/dokuwiki/mime.conf
  6867. fi
  6868. if ! grep -q "video/webm" /etc/dokuwiki/mime.conf; then
  6869. echo 'webm video/webm' >> /etc/dokuwiki/mime.conf
  6870. fi
  6871. if [[ $ONION_ONLY == "no" ]]; then
  6872. echo 'server {' > /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6873. echo ' listen 80;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6874. echo " root /var/www/$WIKI_DOMAIN_NAME/htdocs;" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6875. echo " server_name $WIKI_DOMAIN_NAME;" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6876. echo ' access_log off;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6877. echo " error_log /var/log/nginx/${WIKI_DOMAIN_NAME}_error.log $WEBSERVER_LOG_LEVEL;" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6878. echo ' index index.php;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6879. echo ' charset utf-8;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6880. echo ' client_max_body_size 20m;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6881. echo ' client_body_buffer_size 128k;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6882. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6883. echo ' add_header X-Frame-Options DENY;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6884. echo ' add_header X-Content-Type-Options nosniff;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6885. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6886. echo ' limit_conn conn_limit_per_ip 10;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6887. echo ' limit_req zone=req_limit_per_ip burst=10 nodelay;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6888. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6889. echo ' # rewrite to front controller as default rule' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6890. echo ' location / {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6891. echo ' rewrite ^/(.*) /index.php?q=$uri&$args last;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6892. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6893. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6894. echo " # make sure webfinger and other well known services aren't blocked" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6895. echo ' # by denying dot files and rewrite request to the front controller' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6896. echo ' location ^~ /.well-known/ {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6897. echo ' allow all;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6898. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6899. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6900. echo ' # statically serve these file types when possible' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6901. echo ' # otherwise fall back to front controller' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6902. echo ' # allow browser to cache them' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6903. echo ' # added .htm for advanced source code editor library' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6904. echo ' location ~* \.(jpg|jpeg|gif|png|ico|css|js|htm|html|ttf|woff|svg)$ {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6905. echo ' expires 30d;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6906. echo ' try_files $uri /index.php?q=$uri&$args;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6907. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6908. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6909. echo ' # block these file types' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6910. echo ' location ~* \.(tpl|md|tgz|log|out)$ {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6911. echo ' deny all;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6912. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6913. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6914. echo ' # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6915. echo ' # or a unix socket' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6916. echo ' location ~* \.php$ {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6917. echo ' # Zero-day exploit defense.' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6918. echo ' # http://forum.nginx.org/read.php?2,88845,page=3' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6919. echo " # Won't work properly (404 error) if the file is not stored on this" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6920. echo " # server, which is entirely possible with php-fpm/php-fcgi." >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6921. echo " # Comment the 'try_files' line out if you set up php-fpm/php-fcgi on" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6922. echo " # another machine. And then cross your fingers that you won't get hacked." >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6923. echo ' try_files $uri $uri/ /index.php;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6924. echo ' # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6925. echo ' fastcgi_split_path_info ^(.+\.php)(/.+)$;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6926. echo ' # With php5-cgi alone:' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6927. echo ' # fastcgi_pass 127.0.0.1:9000;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6928. echo ' # With php5-fpm:' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6929. echo ' fastcgi_pass unix:/var/run/php5-fpm.sock;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6930. echo ' include fastcgi_params;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6931. echo ' fastcgi_index index.php;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6932. echo ' fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6933. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6934. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6935. echo ' # deny access to all dot files' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6936. echo ' location ~ /\. {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6937. echo ' deny all;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6938. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6939. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6940. echo ' #deny access to store' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6941. echo ' location ~ /store {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6942. echo ' deny all;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6943. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6944. echo ' location ~ /(data|conf|bin|inc)/ {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6945. echo ' deny all;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6946. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6947. echo ' location ~ /\.ht {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6948. echo ' deny all;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6949. echo ' }' >> /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 'server {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6953. echo ' listen 443 ssl;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6954. echo " root /var/www/$WIKI_DOMAIN_NAME/htdocs;" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6955. echo " server_name $WIKI_DOMAIN_NAME;" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6956. echo ' access_log off;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6957. echo " error_log /var/log/nginx/${WIKI_DOMAIN_NAME}_error_ssl.log $WEBSERVER_LOG_LEVEL;" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6958. echo ' index index.php;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6959. echo ' charset utf-8;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6960. echo ' client_max_body_size 20m;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6961. echo ' client_body_buffer_size 128k;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6962. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6963. echo ' limit_conn conn_limit_per_ip 10;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6964. echo ' limit_req zone=req_limit_per_ip burst=10 nodelay;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6965. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6966. echo ' ssl on;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6967. echo " ssl_certificate /etc/ssl/certs/$WIKI_DOMAIN_NAME.crt;" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6968. echo " ssl_certificate_key /etc/ssl/private/$WIKI_DOMAIN_NAME.key;" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6969. echo " ssl_dhparam /etc/ssl/certs/$WIKI_DOMAIN_NAME.dhparam;" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6970. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6971. echo ' ssl_session_timeout 60m;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6972. echo ' ssl_prefer_server_ciphers on;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6973. echo ' ssl_session_cache builtin:1000 shared:SSL:10m;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6974. echo " ssl_protocols $SSL_PROTOCOLS; # not possible to do exclusive" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6975. echo " ssl_ciphers '$SSL_CIPHERS';" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6976. echo ' add_header X-Frame-Options DENY;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6977. echo ' add_header X-Content-Type-Options nosniff;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6978. echo ' add_header Strict-Transport-Security "max-age=0;";' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6979. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6980. echo ' # rewrite to front controller as default rule' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6981. echo ' location / {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6982. echo ' rewrite ^/(.*) /index.php?q=$uri&$args last;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6983. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6984. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6985. echo " # make sure webfinger and other well known services aren't blocked" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6986. echo ' # by denying dot files and rewrite request to the front controller' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6987. echo ' location ^~ /.well-known/ {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6988. echo ' allow all;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6989. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6990. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6991. echo ' # statically serve these file types when possible' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6992. echo ' # otherwise fall back to front controller' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6993. echo ' # allow browser to cache them' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6994. echo ' # added .htm for advanced source code editor library' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6995. echo ' location ~* \.(jpg|jpeg|gif|png|ico|css|js|htm|html|ttf|woff|svg)$ {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6996. echo ' expires 30d;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6997. echo ' try_files $uri /index.php?q=$uri&$args;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6998. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6999. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7000. echo ' # block these file types' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7001. echo ' location ~* \.(tpl|md|tgz|log|out)$ {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7002. echo ' deny all;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7003. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7004. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7005. echo ' # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7006. echo ' # or a unix socket' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7007. echo ' location ~* \.php$ {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7008. echo ' # Zero-day exploit defense.' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7009. echo ' # http://forum.nginx.org/read.php?2,88845,page=3' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7010. echo " # Won't work properly (404 error) if the file is not stored on this" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7011. echo " # server, which is entirely possible with php-fpm/php-fcgi." >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7012. echo " # Comment the 'try_files' line out if you set up php-fpm/php-fcgi on" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7013. echo " # another machine. And then cross your fingers that you won't get hacked." >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7014. echo ' try_files $uri $uri/ /index.php;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7015. echo ' # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7016. echo ' fastcgi_split_path_info ^(.+\.php)(/.+)$;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7017. echo ' # With php5-cgi alone:' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7018. echo ' # fastcgi_pass 127.0.0.1:9000;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7019. echo ' # With php5-fpm:' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7020. echo ' fastcgi_pass unix:/var/run/php5-fpm.sock;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7021. echo ' include fastcgi_params;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7022. echo ' fastcgi_index index.php;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7023. echo ' fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7024. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7025. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7026. echo ' # deny access to all dot files' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7027. echo ' location ~ /\. {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7028. echo ' deny all;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7029. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7030. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7031. echo ' #deny access to store' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7032. echo ' location ~ /store {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7033. echo ' deny all;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7034. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7035. echo ' location ~ /(data|conf|bin|inc)/ {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7036. echo ' deny all;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7037. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7038. echo ' location ~ /\.ht {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7039. echo ' deny 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 '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7043. else
  7044. echo -n '' > /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7045. fi
  7046. echo 'server {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7047. echo " listen 127.0.0.1:${WIKI_ONION_PORT} default_server;" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7048. echo " root /var/www/$WIKI_DOMAIN_NAME/htdocs;" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7049. echo " server_name $WIKI_DOMAIN_NAME;" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7050. echo ' access_log off;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7051. echo " error_log /var/log/nginx/${WIKI_DOMAIN_NAME}_error_ssl.log $WEBSERVER_LOG_LEVEL;" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7052. echo ' index index.php;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7053. echo ' charset utf-8;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7054. echo ' client_max_body_size 20m;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7055. echo ' client_body_buffer_size 128k;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7056. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7057. echo ' limit_conn conn_limit_per_ip 10;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7058. echo ' limit_req zone=req_limit_per_ip burst=10 nodelay;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7059. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7060. echo ' add_header X-Frame-Options DENY;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7061. echo ' add_header X-Content-Type-Options nosniff;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7062. echo ' add_header Strict-Transport-Security "max-age=0;";' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7063. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7064. echo ' # rewrite to front controller as default rule' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7065. echo ' location / {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7066. echo ' rewrite ^/(.*) /index.php?q=$uri&$args last;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7067. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7068. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7069. echo " # make sure webfinger and other well known services aren't blocked" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7070. echo ' # by denying dot files and rewrite request to the front controller' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7071. echo ' location ^~ /.well-known/ {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7072. echo ' allow all;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7073. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7074. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7075. echo ' # statically serve these file types when possible' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7076. echo ' # otherwise fall back to front controller' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7077. echo ' # allow browser to cache them' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7078. echo ' # added .htm for advanced source code editor library' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7079. echo ' location ~* \.(jpg|jpeg|gif|png|ico|css|js|htm|html|ttf|woff|svg)$ {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7080. echo ' expires 30d;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7081. echo ' try_files $uri /index.php?q=$uri&$args;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7082. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7083. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7084. echo ' # block these file types' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7085. echo ' location ~* \.(tpl|md|tgz|log|out)$ {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7086. echo ' deny all;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7087. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7088. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7089. echo ' # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7090. echo ' # or a unix socket' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7091. echo ' location ~* \.php$ {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7092. echo ' # Zero-day exploit defense.' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7093. echo ' # http://forum.nginx.org/read.php?2,88845,page=3' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7094. echo " # Won't work properly (404 error) if the file is not stored on this" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7095. echo " # server, which is entirely possible with php-fpm/php-fcgi." >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7096. echo " # Comment the 'try_files' line out if you set up php-fpm/php-fcgi on" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7097. echo " # another machine. And then cross your fingers that you won't get hacked." >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7098. echo ' try_files $uri $uri/ /index.php;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7099. echo ' # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7100. echo ' fastcgi_split_path_info ^(.+\.php)(/.+)$;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7101. echo ' # With php5-cgi alone:' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7102. echo ' # fastcgi_pass 127.0.0.1:9000;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7103. echo ' # With php5-fpm:' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7104. echo ' fastcgi_pass unix:/var/run/php5-fpm.sock;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7105. echo ' include fastcgi_params;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7106. echo ' fastcgi_index index.php;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7107. echo ' fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7108. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7109. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7110. echo ' # deny access to all dot files' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7111. echo ' location ~ /\. {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7112. echo ' deny all;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7113. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7114. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7115. echo ' #deny access to store' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7116. echo ' location ~ /store {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7117. echo ' deny all;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7118. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7119. echo ' location ~ /(data|conf|bin|inc)/ {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7120. echo ' deny all;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7121. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7122. echo ' location ~ /\.ht {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7123. echo ' deny all;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7124. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7125. echo '}' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7126. if [[ $ONION_ONLY == "no" ]]; then
  7127. if [ ! -f /etc/ssl/certs/$WIKI_DOMAIN_NAME.dhparam ]; then
  7128. if [[ $LETSENCRYPT_ENABLED != "yes" ]]; then
  7129. ${PROJECT_NAME}-addcert -h $WIKI_DOMAIN_NAME --dhkey $DH_KEYLENGTH
  7130. else
  7131. ${PROJECT_NAME}-addcert -e $WIKI_DOMAIN_NAME -s $LETSENCRYPT_SERVER --dhkey $DH_KEYLENGTH --email $MY_EMAIL_ADDRESS
  7132. fi
  7133. check_certificates $WIKI_DOMAIN_NAME
  7134. fi
  7135. fi
  7136. configure_php
  7137. nginx_ensite $WIKI_DOMAIN_NAME
  7138. WIKI_ONION_HOSTNAME=$(add_onion_service wiki 80 ${WIKI_ONION_PORT})
  7139. systemctl restart php5-fpm
  7140. systemctl restart nginx
  7141. echo "Wiki onion domain:${WIKI_ONION_HOSTNAME}" >> $COMPLETION_FILE
  7142. # update the dynamic DNS
  7143. CURRENT_DDNS_DOMAIN=$WIKI_DOMAIN_NAME
  7144. add_ddns_domain
  7145. # add some post-install instructions
  7146. if ! grep -q $"Wiki password" /home/$MY_USERNAME/README; then
  7147. echo '' >> /home/$MY_USERNAME/README
  7148. echo '' >> /home/$MY_USERNAME/README
  7149. echo $'Wiki' >> /home/$MY_USERNAME/README
  7150. echo '====' >> /home/$MY_USERNAME/README
  7151. echo $"Wiki onion domain: ${WIKI_ONION_HOSTNAME}" >> /home/$MY_USERNAME/README
  7152. echo $"Wiki username: $MY_USERNAME" >> /home/$MY_USERNAME/README
  7153. echo $"Wiki password: $WIKI_ADMIN_PASSWORD" >> /home/$MY_USERNAME/README
  7154. echo '' >> /home/$MY_USERNAME/README
  7155. echo $'Once you have set up the wiki then remove the install file:' >> /home/$MY_USERNAME/README
  7156. echo '' >> /home/$MY_USERNAME/README
  7157. echo " rm /var/www/$WIKI_DOMAIN_NAME/htdocs/install.php" >> /home/$MY_USERNAME/README
  7158. echo '' >> /home/$MY_USERNAME/README
  7159. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
  7160. chmod 600 /home/$MY_USERNAME/README
  7161. fi
  7162. echo "Wiki domain:$WIKI_DOMAIN_NAME" >> $COMPLETION_FILE
  7163. echo 'install_wiki' >> $COMPLETION_FILE
  7164. }
  7165. function get_blog_admin_password {
  7166. if [ -f /home/$MY_USERNAME/README ]; then
  7167. if grep -q "Your blog password is" /home/$MY_USERNAME/README; then
  7168. FULLBLOG_ADMIN_PASSWORD=$(cat /home/$MY_USERNAME/README | grep "Your blog password is" | awk -F ':' '{print $2}' | sed 's/^ *//')
  7169. fi
  7170. fi
  7171. }
  7172. function install_blog {
  7173. 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
  7174. return
  7175. fi
  7176. if [ ! $FULLBLOG_DOMAIN_NAME ]; then
  7177. echo $'The blog domain name was not specified'
  7178. exit 5062
  7179. fi
  7180. # update to the next commit
  7181. if [ -d /var/www/$FULLBLOG_DOMAIN_NAME/htdocs ]; then
  7182. if grep -q "Blog commit" $COMPLETION_FILE; then
  7183. CURRENT_FULLBLOG_COMMIT=$(grep "Blog commit" $COMPLETION_FILE | awk -F ':' '{print $2}')
  7184. if [[ "$CURRENT_FULLBLOG_COMMIT" != "$FULLBLOG_COMMIT" ]]; then
  7185. cd /var/www/$FULLBLOG_DOMAIN_NAME/htdocs
  7186. git_pull $FULLBLOG_REPO $FULLBLOG_COMMIT
  7187. sed -i "s/Blog commit.*/Blog commit:$FULLBLOG_COMMIT/g" $COMPLETION_FILE
  7188. chown -R www-data:www-data /var/www/$FULLBLOG_DOMAIN_NAME/htdocs
  7189. fi
  7190. else
  7191. echo "Blog commit:$FULLBLOG_COMMIT" >> $COMPLETION_FILE
  7192. fi
  7193. fi
  7194. if grep -Fxq "install_blog" $COMPLETION_FILE; then
  7195. return
  7196. fi
  7197. if [ ! -d /var/www/$FULLBLOG_DOMAIN_NAME ]; then
  7198. mkdir /var/www/$FULLBLOG_DOMAIN_NAME
  7199. fi
  7200. cd /var/www/$FULLBLOG_DOMAIN_NAME
  7201. git_clone $FULLBLOG_REPO htdocs
  7202. cd htdocs
  7203. git checkout $FULLBLOG_COMMIT -b $FULLBLOG_COMMIT
  7204. if ! grep -q "Blog commit" $COMPLETION_FILE; then
  7205. echo "Blog commit:$FULLBLOG_COMMIT" >> $COMPLETION_FILE
  7206. else
  7207. sed -i "s/Blog commit.*/Blog commit:$FULLBLOG_COMMIT/g" $COMPLETION_FILE
  7208. fi
  7209. cd /var/www/$FULLBLOG_DOMAIN_NAME
  7210. chown -R www-data:www-data /var/www/$FULLBLOG_DOMAIN_NAME/htdocs
  7211. if [[ $ONION_ONLY == "no" ]]; then
  7212. echo 'server {' > /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7213. echo ' listen 80;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7214. echo " root /var/www/$FULLBLOG_DOMAIN_NAME/htdocs;" >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7215. echo " server_name $FULLBLOG_DOMAIN_NAME;" >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7216. echo ' access_log off;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7217. echo " error_log /var/log/nginx/${FULLBLOG_DOMAIN_NAME}_error.log $WEBSERVER_LOG_LEVEL;" >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7218. echo ' index index.php;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7219. echo ' charset utf-8;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7220. echo ' client_max_body_size 20m;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7221. echo ' client_body_buffer_size 128k;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7222. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7223. echo ' limit_conn conn_limit_per_ip 10;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7224. echo ' limit_req zone=req_limit_per_ip burst=10 nodelay;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7225. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7226. echo ' add_header X-Frame-Options DENY;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7227. echo ' add_header X-Content-Type-Options nosniff;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7228. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7229. echo ' # Always redirect the login page to https' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7230. echo ' location /login {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7231. echo ' rewrite ^ https://$server_name$request_uri?;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7232. echo ' }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7233. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7234. echo ' # rewrite to front controller as default rule' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7235. echo ' location / {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7236. echo ' rewrite ^/(.*) /index.php?q=$uri&$args last;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7237. echo ' }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7238. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7239. echo " # make sure webfinger and other well known services aren't blocked" >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7240. echo ' # by denying dot files and rewrite request to the front controller' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7241. echo ' location ^~ /.well-known/ {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7242. echo ' allow all;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7243. echo ' }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7244. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7245. echo ' # statically serve these file types when possible' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7246. echo ' # otherwise fall back to front controller' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7247. echo ' # allow browser to cache them' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7248. echo ' # added .htm for advanced source code editor library' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7249. echo ' location ~* \.(jpg|jpeg|gif|png|ico|css|js|htm|html|ttf|woff|svg)$ {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7250. echo ' expires 30d;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7251. echo ' try_files $uri /index.php?q=$uri&$args;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7252. echo ' }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7253. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7254. echo ' # block these file types' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7255. echo ' location ~* \.(tpl|md|tgz|log|out)$ {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7256. echo ' deny all;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7257. echo ' }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7258. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7259. echo ' # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7260. echo ' # or a unix socket' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7261. echo ' location ~* \.php$ {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7262. echo ' # Zero-day exploit defense.' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7263. echo ' # http://forum.nginx.org/read.php?2,88845,page=3' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7264. echo " # Won't work properly (404 error) if the file is not stored on this" >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7265. echo " # server, which is entirely possible with php-fpm/php-fcgi." >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7266. echo " # Comment the 'try_files' line out if you set up php-fpm/php-fcgi on" >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7267. echo " # another machine. And then cross your fingers that you won't get hacked." >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7268. echo ' try_files $uri $uri/ /index.php;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7269. echo ' # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7270. echo ' fastcgi_split_path_info ^(.+\.php)(/.+)$;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7271. echo ' # With php5-cgi alone:' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7272. echo ' # fastcgi_pass 127.0.0.1:9000;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7273. echo ' # With php5-fpm:' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7274. echo ' fastcgi_pass unix:/var/run/php5-fpm.sock;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7275. echo ' include fastcgi_params;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7276. echo ' fastcgi_index index.php;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7277. echo ' fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7278. echo ' }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7279. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7280. echo ' # deny access to all dot files' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7281. echo ' location ~ /\. {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7282. echo ' deny all;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7283. echo ' }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7284. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7285. echo ' #deny access to store' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7286. echo ' location ~ /store {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7287. echo ' deny all;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7288. echo ' }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7289. echo ' location ~ /(data|conf|bin|inc)/ {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7290. echo ' deny all;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7291. echo ' }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7292. echo ' location ~ /\.ht {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7293. echo ' deny all;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7294. echo ' }' >> /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 'server {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7298. echo ' listen 443 ssl;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7299. echo " root /var/www/$FULLBLOG_DOMAIN_NAME/htdocs;" >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7300. echo " server_name $FULLBLOG_DOMAIN_NAME;" >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7301. echo ' access_log off;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7302. echo " error_log /var/log/nginx/${FULLBLOG_DOMAIN_NAME}_error_ssl.log $WEBSERVER_LOG_LEVEL;" >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7303. echo ' index index.php;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7304. echo ' charset utf-8;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7305. echo ' client_max_body_size 20m;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7306. echo ' client_body_buffer_size 128k;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7307. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7308. echo ' limit_conn conn_limit_per_ip 10;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7309. echo ' limit_req zone=req_limit_per_ip burst=10 nodelay;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7310. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7311. echo ' ssl on;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7312. echo " ssl_certificate /etc/ssl/certs/$FULLBLOG_DOMAIN_NAME.crt;" >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7313. echo " ssl_certificate_key /etc/ssl/private/$FULLBLOG_DOMAIN_NAME.key;" >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7314. echo " ssl_dhparam /etc/ssl/certs/$FULLBLOG_DOMAIN_NAME.dhparam;" >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7315. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7316. echo ' ssl_session_timeout 60m;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7317. echo ' ssl_prefer_server_ciphers on;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7318. echo ' ssl_session_cache builtin:1000 shared:SSL:10m;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7319. echo " ssl_protocols $SSL_PROTOCOLS; # not possible to do exclusive" >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7320. echo " ssl_ciphers '$SSL_CIPHERS';" >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7321. echo ' add_header X-Frame-Options DENY;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7322. echo ' add_header X-Content-Type-Options nosniff;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7323. echo ' add_header Strict-Transport-Security "max-age=0;";' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7324. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7325. echo ' # rewrite to front controller as default rule' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7326. echo ' location / {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7327. echo ' rewrite ^/(.*) /index.php?q=$uri&$args last;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7328. echo ' }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7329. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7330. echo " # make sure webfinger and other well known services aren't blocked" >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7331. echo ' # by denying dot files and rewrite request to the front controller' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7332. echo ' location ^~ /.well-known/ {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7333. echo ' allow all;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7334. echo ' }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7335. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7336. echo ' # statically serve these file types when possible' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7337. echo ' # otherwise fall back to front controller' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7338. echo ' # allow browser to cache them' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7339. echo ' # added .htm for advanced source code editor library' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7340. echo ' location ~* \.(jpg|jpeg|gif|png|ico|css|js|htm|html|ttf|woff|svg)$ {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7341. echo ' expires 30d;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7342. echo ' try_files $uri /index.php?q=$uri&$args;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7343. echo ' }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7344. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7345. echo ' # block these file types' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7346. echo ' location ~* \.(tpl|md|tgz|log|out)$ {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7347. echo ' deny all;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7348. echo ' }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7349. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7350. echo ' # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7351. echo ' # or a unix socket' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7352. echo ' location ~* \.php$ {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7353. echo ' # Zero-day exploit defense.' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7354. echo ' # http://forum.nginx.org/read.php?2,88845,page=3' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7355. echo " # Won't work properly (404 error) if the file is not stored on this" >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7356. echo " # server, which is entirely possible with php-fpm/php-fcgi." >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7357. echo " # Comment the 'try_files' line out if you set up php-fpm/php-fcgi on" >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7358. echo " # another machine. And then cross your fingers that you won't get hacked." >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7359. echo ' try_files $uri $uri/ /index.php;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7360. echo ' # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7361. echo ' fastcgi_split_path_info ^(.+\.php)(/.+)$;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7362. echo ' # With php5-cgi alone:' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7363. echo ' # fastcgi_pass 127.0.0.1:9000;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7364. echo ' # With php5-fpm:' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7365. echo ' fastcgi_pass unix:/var/run/php5-fpm.sock;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7366. echo ' include fastcgi_params;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7367. echo ' fastcgi_index index.php;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7368. echo ' fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7369. echo ' }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7370. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7371. echo ' # deny access to all dot files' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7372. echo ' location ~ /\. {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7373. echo ' deny all;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7374. echo ' }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7375. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7376. echo ' #deny access to store' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7377. echo ' location ~ /store {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7378. echo ' deny all;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7379. echo ' }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7380. echo ' location ~ /(data|conf|bin|inc)/ {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7381. echo ' deny all;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7382. echo ' }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7383. echo ' location ~ /\.ht {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7384. echo ' deny 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 '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7388. else
  7389. echo -n '' > /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7390. fi
  7391. echo 'server {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7392. echo " listen 127.0.0.1:${FULLBLOG_ONION_PORT} default_server;" >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7393. echo " root /var/www/$FULLBLOG_DOMAIN_NAME/htdocs;" >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7394. echo " server_name $FULLBLOG_DOMAIN_NAME;" >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7395. echo ' access_log off;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7396. echo " error_log /var/log/nginx/${FULLBLOG_DOMAIN_NAME}_error_ssl.log $WEBSERVER_LOG_LEVEL;" >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7397. echo ' index index.php;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7398. echo ' charset utf-8;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7399. echo ' client_max_body_size 20m;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7400. echo ' client_body_buffer_size 128k;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7401. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7402. echo ' limit_conn conn_limit_per_ip 10;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7403. echo ' limit_req zone=req_limit_per_ip burst=10 nodelay;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7404. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7405. echo ' add_header X-Frame-Options DENY;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7406. echo ' add_header X-Content-Type-Options nosniff;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7407. echo ' add_header Strict-Transport-Security "max-age=0;";' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7408. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7409. echo ' # rewrite to front controller as default rule' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7410. echo ' location / {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7411. echo ' rewrite ^/(.*) /index.php?q=$uri&$args last;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7412. echo ' }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7413. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7414. echo " # make sure webfinger and other well known services aren't blocked" >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7415. echo ' # by denying dot files and rewrite request to the front controller' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7416. echo ' location ^~ /.well-known/ {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7417. echo ' allow all;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7418. echo ' }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7419. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7420. echo ' # statically serve these file types when possible' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7421. echo ' # otherwise fall back to front controller' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7422. echo ' # allow browser to cache them' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7423. echo ' # added .htm for advanced source code editor library' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7424. echo ' location ~* \.(jpg|jpeg|gif|png|ico|css|js|htm|html|ttf|woff|svg)$ {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7425. echo ' expires 30d;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7426. echo ' try_files $uri /index.php?q=$uri&$args;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7427. echo ' }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7428. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7429. echo ' # block these file types' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7430. echo ' location ~* \.(tpl|md|tgz|log|out)$ {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7431. echo ' deny all;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7432. echo ' }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7433. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7434. echo ' # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7435. echo ' # or a unix socket' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7436. echo ' location ~* \.php$ {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7437. echo ' # Zero-day exploit defense.' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7438. echo ' # http://forum.nginx.org/read.php?2,88845,page=3' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7439. echo " # Won't work properly (404 error) if the file is not stored on this" >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7440. echo " # server, which is entirely possible with php-fpm/php-fcgi." >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7441. echo " # Comment the 'try_files' line out if you set up php-fpm/php-fcgi on" >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7442. echo " # another machine. And then cross your fingers that you won't get hacked." >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7443. echo ' try_files $uri $uri/ /index.php;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7444. echo ' # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7445. echo ' fastcgi_split_path_info ^(.+\.php)(/.+)$;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7446. echo ' # With php5-cgi alone:' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7447. echo ' # fastcgi_pass 127.0.0.1:9000;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7448. echo ' # With php5-fpm:' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7449. echo ' fastcgi_pass unix:/var/run/php5-fpm.sock;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7450. echo ' include fastcgi_params;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7451. echo ' fastcgi_index index.php;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7452. echo ' fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7453. echo ' }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7454. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7455. echo ' # deny access to all dot files' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7456. echo ' location ~ /\. {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7457. echo ' deny all;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7458. echo ' }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7459. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7460. echo ' #deny access to store' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7461. echo ' location ~ /store {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7462. echo ' deny all;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7463. echo ' }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7464. echo ' location ~ /(data|conf|bin|inc)/ {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7465. echo ' deny all;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7466. echo ' }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7467. echo ' location ~ /\.ht {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7468. echo ' deny all;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7469. echo ' }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7470. echo '}' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7471. if [[ $ONION_ONLY == "no" ]]; then
  7472. if [ ! -f /etc/ssl/certs/$FULLBLOG_DOMAIN_NAME.dhparam ]; then
  7473. if [[ $LETSENCRYPT_ENABLED != "yes" ]]; then
  7474. ${PROJECT_NAME}-addcert -h $FULLBLOG_DOMAIN_NAME --dhkey $DH_KEYLENGTH
  7475. else
  7476. ${PROJECT_NAME}-addcert -e $FULLBLOG_DOMAIN_NAME -s $LETSENCRYPT_SERVER --dhkey $DH_KEYLENGTH --email $MY_EMAIL_ADDRESS
  7477. fi
  7478. check_certificates $FULLBLOG_DOMAIN_NAME
  7479. fi
  7480. fi
  7481. configure_php
  7482. # blog settings
  7483. cp /var/www/$FULLBLOG_DOMAIN_NAME/htdocs/config/config.ini.example /var/www/$FULLBLOG_DOMAIN_NAME/htdocs/config/config.ini
  7484. sed -i "s|site.url.*|site.url = '/'|g" /var/www/$FULLBLOG_DOMAIN_NAME/htdocs/config/config.ini
  7485. sed -i "s|blog.title.*|blog.title = '$MY_BLOG_TITLE'|g" /var/www/$FULLBLOG_DOMAIN_NAME/htdocs/config/config.ini
  7486. sed -i "s|blog.tagline.*|blog.tagline = '$MY_BLOG_SUBTITLE'|g" /var/www/$FULLBLOG_DOMAIN_NAME/htdocs/config/config.ini
  7487. sed -i 's|timezone.*|timezone = "Europe/London"|g' /var/www/$FULLBLOG_DOMAIN_NAME/htdocs/config/config.ini
  7488. sed -i "s|Your name|$MY_NAME|g" /var/www/$FULLBLOG_DOMAIN_NAME/htdocs/config/config.ini
  7489. # create a user password
  7490. get_blog_admin_password
  7491. if [ ! $FULLBLOG_ADMIN_PASSWORD ]; then
  7492. if [ -f $IMAGE_PASSWORD_FILE ]; then
  7493. FULLBLOG_ADMIN_PASSWORD="$(printf `cat $IMAGE_PASSWORD_FILE`)"
  7494. else
  7495. FULLBLOG_ADMIN_PASSWORD="$(openssl rand -base64 16)"
  7496. fi
  7497. echo '' >> /home/$MY_USERNAME/README
  7498. echo '' >> /home/$MY_USERNAME/README
  7499. echo $'HTMLy Blog' >> /home/$MY_USERNAME/README
  7500. echo '==========' >> /home/$MY_USERNAME/README
  7501. echo $"Your blog username: $MY_USERNAME" >> /home/$MY_USERNAME/README
  7502. echo $"Your blog password is: $FULLBLOG_ADMIN_PASSWORD" >> /home/$MY_USERNAME/README
  7503. echo $"Log into your blog at https://$FULLBLOG_DOMAIN_NAME/login" >> /home/$MY_USERNAME/README
  7504. echo $'Edit your blog title and time zone at:' >> /home/$MY_USERNAME/README
  7505. echo " /var/www/$FULLBLOG_DOMAIN_NAME/htdocs/config/config.ini" >> /home/$MY_USERNAME/README
  7506. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
  7507. chmod 600 /home/$MY_USERNAME/README
  7508. fi
  7509. # create a user
  7510. echo ';Password' > /var/www/$FULLBLOG_DOMAIN_NAME/htdocs/config/users/$MY_USERNAME.ini
  7511. echo "password = '$FULLBLOG_ADMIN_PASSWORD'" >> /var/www/$FULLBLOG_DOMAIN_NAME/htdocs/config/users/$MY_USERNAME.ini
  7512. echo 'encryption = clear' >> /var/www/$FULLBLOG_DOMAIN_NAME/htdocs/config/users/$MY_USERNAME.ini
  7513. echo ';Role' >> /var/www/$FULLBLOG_DOMAIN_NAME/htdocs/config/users/$MY_USERNAME.ini
  7514. echo 'role = admin' >> /var/www/$FULLBLOG_DOMAIN_NAME/htdocs/config/users/$MY_USERNAME.ini
  7515. nginx_ensite $FULLBLOG_DOMAIN_NAME
  7516. FULLBLOG_ONION_HOSTNAME=$(add_onion_service blog 80 ${FULLBLOG_ONION_PORT})
  7517. systemctl restart php5-fpm
  7518. systemctl restart nginx
  7519. if ! grep -q "Blog onion domain" /home/$MY_USERNAME/README; then
  7520. echo "Blog onion domain: ${FULLBLOG_ONION_HOSTNAME}" >> /home/$MY_USERNAME/README
  7521. echo '' >> /home/$MY_USERNAME/README
  7522. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
  7523. chmod 600 /home/$MY_USERNAME/README
  7524. fi
  7525. echo "Blog onion domain:${FULLBLOG_ONION_HOSTNAME}" >> $COMPLETION_FILE
  7526. # update the dynamic DNS
  7527. CURRENT_DDNS_DOMAIN=$FULLBLOG_DOMAIN_NAME
  7528. add_ddns_domain
  7529. echo 'install_blog' >> $COMPLETION_FILE
  7530. }
  7531. function install_gnu_social {
  7532. 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
  7533. return
  7534. fi
  7535. if [ ! $MICROBLOG_DOMAIN_NAME ]; then
  7536. echo $'No domain name was given for the microblog'
  7537. exit 7359
  7538. fi
  7539. # update to the next commit
  7540. if [ -d /var/www/$MICROBLOG_DOMAIN_NAME/htdocs ]; then
  7541. if grep -q "GNU Social commit" $COMPLETION_FILE; then
  7542. CURRENT_MICROBLOG_COMMIT=$(grep "GNU Social commit" $COMPLETION_FILE | awk -F ':' '{print $2}')
  7543. if [[ "$CURRENT_MICROBLOG_COMMIT" != "$MICROBLOG_COMMIT" ]]; then
  7544. cd /var/www/$MICROBLOG_DOMAIN_NAME/htdocs
  7545. git_pull $MICROBLOG_REPO $MICROBLOG_COMMIT
  7546. sed -i "s/GNU Social commit.*/GNU Social commit:$MICROBLOG_COMMIT/g" $COMPLETION_FILE
  7547. chown -R www-data:www-data /var/www/$MICROBLOG_DOMAIN_NAME/htdocs
  7548. fi
  7549. else
  7550. echo "GNU Social commit:$MICROBLOG_COMMIT" >> $COMPLETION_FILE
  7551. fi
  7552. fi
  7553. if grep -Fxq "install_gnu_social" $COMPLETION_FILE; then
  7554. return
  7555. fi
  7556. install_mariadb
  7557. get_mariadb_password
  7558. repair_databases_script
  7559. apt-get -y install php-gettext php5-curl php5-gd php5-mysql git curl php-xml-parser
  7560. if [ ! -d /var/www/$MICROBLOG_DOMAIN_NAME ]; then
  7561. mkdir /var/www/$MICROBLOG_DOMAIN_NAME
  7562. fi
  7563. if [ ! -d /var/www/$MICROBLOG_DOMAIN_NAME/htdocs ]; then
  7564. git_clone $MICROBLOG_REPO /var/www/$MICROBLOG_DOMAIN_NAME/htdocs
  7565. if [ ! -d /var/www/$MICROBLOG_DOMAIN_NAME/htdocs ]; then
  7566. echo $'Unable to clone gnusocial repo'
  7567. exit 87525
  7568. fi
  7569. fi
  7570. cd /var/www/$MICROBLOG_DOMAIN_NAME/htdocs
  7571. git checkout $MICROBLOG_COMMIT -b $MICROBLOG_COMMIT
  7572. if ! grep -q "GNU Social commit" $COMPLETION_FILE; then
  7573. echo "GNU Social commit:$MICROBLOG_COMMIT" >> $COMPLETION_FILE
  7574. else
  7575. sed -i "s/GNU Social commit.*/GNU Social commit:$MICROBLOG_COMMIT/g" $COMPLETION_FILE
  7576. fi
  7577. chmod a+w /var/www/$MICROBLOG_DOMAIN_NAME/htdocs
  7578. chown www-data:www-data /var/www/$MICROBLOG_DOMAIN_NAME/htdocs
  7579. chmod +x /var/www/$MICROBLOG_DOMAIN_NAME/htdocs/scripts/maildaemon.php
  7580. get_mariadb_gnusocial_admin_password
  7581. if [ ! $MICROBLOG_ADMIN_PASSWORD ]; then
  7582. if [ -f $IMAGE_PASSWORD_FILE ]; then
  7583. MICROBLOG_ADMIN_PASSWORD="$(printf `cat $IMAGE_PASSWORD_FILE`)"
  7584. else
  7585. MICROBLOG_ADMIN_PASSWORD="$(openssl rand -base64 32)"
  7586. fi
  7587. fi
  7588. create_database gnusocial "$MICROBLOG_ADMIN_PASSWORD" $MY_USERNAME
  7589. if [ ! -f "/etc/aliases" ]; then
  7590. touch /etc/aliases
  7591. fi
  7592. if grep -q "www-data: root" /etc/aliases; then
  7593. echo 'www-data: root' >> /etc/aliases
  7594. fi
  7595. if grep -q "/var/www/$MICROBLOG_DOMAIN_NAME/htdocs/scripts/maildaemon.php" /etc/aliases; then
  7596. echo "*: /var/www/$MICROBLOG_DOMAIN_NAME/htdocs/scripts/maildaemon.php" >> /etc/aliases
  7597. fi
  7598. newaliases
  7599. # update the dynamic DNS
  7600. CURRENT_DDNS_DOMAIN=$MICROBLOG_DOMAIN_NAME
  7601. add_ddns_domain
  7602. if [[ $ONION_ONLY == "no" ]]; then
  7603. echo 'server {' > /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7604. echo ' listen 80;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7605. echo ' listen [::]:80;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7606. echo " server_name $MICROBLOG_DOMAIN_NAME;" >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7607. echo ' rewrite ^ https://$server_name$request_uri? permanent;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7608. echo '}' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7609. echo '' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7610. echo 'server {' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7611. echo ' listen 443 ssl;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7612. echo " server_name $MICROBLOG_DOMAIN_NAME;" >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7613. echo '' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7614. echo ' # Security' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7615. echo ' ssl on;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7616. echo " ssl_certificate /etc/ssl/certs/$MICROBLOG_DOMAIN_NAME.pem;" >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7617. echo " ssl_certificate_key /etc/ssl/private/$MICROBLOG_DOMAIN_NAME.key;" >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7618. echo " ssl_dhparam /etc/ssl/certs/$MICROBLOG_DOMAIN_NAME.dhparam;" >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7619. echo '' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7620. echo ' ssl_session_timeout 60m;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7621. echo ' ssl_prefer_server_ciphers on;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7622. echo ' ssl_session_cache builtin:1000 shared:SSL:10m;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7623. echo " ssl_protocols $SSL_PROTOCOLS; # not possible to do exclusive" >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7624. echo " ssl_ciphers '$SSL_CIPHERS';" >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7625. echo ' add_header X-Frame-Options DENY;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7626. echo ' add_header X-Content-Type-Options nosniff;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7627. echo ' add_header Strict-Transport-Security max-age=15768000;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7628. echo '' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7629. echo ' # Logs' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7630. echo ' access_log off;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7631. echo ' error_log off;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7632. echo '' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7633. echo ' # Root' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7634. echo " root /var/www/$MICROBLOG_DOMAIN_NAME/htdocs;" >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7635. echo '' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7636. echo ' # Index' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7637. echo ' index index.php;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7638. echo '' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7639. echo ' # PHP' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7640. echo ' location ~ \.php {' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7641. echo ' include snippets/fastcgi-php.conf;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7642. echo ' fastcgi_pass unix:/var/run/php5-fpm.sock;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7643. echo ' }' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7644. echo '' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7645. echo ' # Location' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7646. echo ' location / {' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7647. echo ' try_files $uri $uri/ @gnusocial;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7648. echo ' }' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7649. echo '' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7650. echo ' # Fancy URLs' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7651. echo ' location @gnusocial {' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7652. echo ' rewrite ^(.*)$ /index.php?p=$1 last;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7653. echo ' }' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7654. echo '' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7655. echo ' # Restrict access that is unnecessary anyway' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7656. echo ' location ~ /\.(ht|git) {' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7657. echo ' deny all;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7658. echo ' }' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7659. echo '' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7660. echo ' client_max_body_size 15m;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7661. echo '}' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7662. else
  7663. echo -n '' > /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7664. fi
  7665. echo 'server {' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7666. echo " listen 127.0.0.1:$MICROBLOG_ONION_PORT default_server;" >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7667. echo " server_name $MICROBLOG_DOMAIN_NAME;" >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7668. echo '' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7669. echo ' # Logs' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7670. echo ' access_log off;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7671. echo ' error_log off;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7672. echo '' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7673. echo ' # Root' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7674. echo " root /var/www/$MICROBLOG_DOMAIN_NAME/htdocs;" >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7675. echo '' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7676. echo ' # Index' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7677. echo ' index index.php;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7678. echo '' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7679. echo ' # PHP' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7680. echo ' location ~ \.php {' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7681. echo ' include snippets/fastcgi-php.conf;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7682. echo ' fastcgi_pass unix:/var/run/php5-fpm.sock;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7683. echo ' }' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7684. echo '' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7685. echo ' # Location' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7686. echo ' location / {' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7687. echo ' try_files $uri $uri/ @gnusocial;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7688. echo ' }' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7689. echo '' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7690. echo ' # Fancy URLs' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7691. echo ' location @gnusocial {' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7692. echo ' rewrite ^(.*)$ /index.php?p=$1 last;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7693. echo ' }' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7694. echo '' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7695. echo ' # Restrict access that is unnecessary anyway' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7696. echo ' location ~ /\.(ht|git) {' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7697. echo ' deny all;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7698. echo ' }' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7699. echo '' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7700. echo ' client_max_body_size 15m;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7701. echo '}' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7702. configure_php
  7703. if [[ $ONION_ONLY == "no" ]]; then
  7704. if [ ! -f /etc/ssl/certs/$MICROBLOG_DOMAIN_NAME.dhparam ]; then
  7705. ${PROJECT_NAME}-addcert -e $MICROBLOG_DOMAIN_NAME -s $LETSENCRYPT_SERVER --dhkey $DH_KEYLENGTH --email $MY_EMAIL_ADDRESS
  7706. check_certificates $MICROBLOG_DOMAIN_NAME
  7707. fi
  7708. fi
  7709. # Ensure that the database gets backed up locally, if remote
  7710. # backups are not being used
  7711. backup_databases_script_header
  7712. if ! grep -q "GNU Social" /usr/bin/backupdatabases; then
  7713. echo '' >> /usr/bin/backupdatabases
  7714. echo $'# Backup the GNU Social database' >> /usr/bin/backupdatabases
  7715. echo 'TEMPFILE=/root/gnusocial.sql' >> /usr/bin/backupdatabases
  7716. echo 'DAILYFILE=/var/backups/gnusocial_daily.sql' >> /usr/bin/backupdatabases
  7717. echo 'mysqldump --password="$MYSQL_PASSWORD" gnusocial > $TEMPFILE' >> /usr/bin/backupdatabases
  7718. echo 'FILESIZE=$(stat -c%s $TEMPFILE)' >> /usr/bin/backupdatabases
  7719. echo 'if [ "$FILESIZE" -eq "0" ]; then' >> /usr/bin/backupdatabases
  7720. echo ' if [ -f $DAILYFILE ]; then' >> /usr/bin/backupdatabases
  7721. echo ' cp $DAILYFILE $TEMPFILE' >> /usr/bin/backupdatabases
  7722. echo '' >> /usr/bin/backupdatabases
  7723. echo ' # try to restore yesterdays database' >> /usr/bin/backupdatabases
  7724. echo ' mysql -u root --password="$MYSQL_PASSWORD" gnusocial -o < $DAILYFILE' >> /usr/bin/backupdatabases
  7725. echo '' >> /usr/bin/backupdatabases
  7726. echo ' # Send a warning email' >> /usr/bin/backupdatabases
  7727. 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
  7728. echo ' else' >> /usr/bin/backupdatabases
  7729. echo ' # Send a warning email' >> /usr/bin/backupdatabases
  7730. echo ' echo "Unable to create a backup of the GNU Social database." | mail -s "GNU Social backup" $EMAIL' >> /usr/bin/backupdatabases
  7731. echo ' fi' >> /usr/bin/backupdatabases
  7732. echo 'else' >> /usr/bin/backupdatabases
  7733. echo ' chmod 600 $TEMPFILE' >> /usr/bin/backupdatabases
  7734. echo ' mv $TEMPFILE $DAILYFILE' >> /usr/bin/backupdatabases
  7735. echo '' >> /usr/bin/backupdatabases
  7736. echo ' # Make the backup readable only by root' >> /usr/bin/backupdatabases
  7737. echo ' chmod 600 $DAILYFILE' >> /usr/bin/backupdatabases
  7738. echo 'fi' >> /usr/bin/backupdatabases
  7739. fi
  7740. if ! grep -q "GNU Social" /etc/cron.weekly/backupdatabasesweekly; then
  7741. echo '' >> /etc/cron.weekly/backupdatabasesweekly
  7742. echo $'# GNU Social' >> /etc/cron.weekly/backupdatabasesweekly
  7743. echo 'if [ -f /var/backups/gnusocial_weekly.sql ]; then' >> /etc/cron.weekly/backupdatabasesweekly
  7744. echo ' cp -f /var/backups/gnusocial_weekly.sql /var/backups/gnusocial_2weekly.sql' >> /etc/cron.weekly/backupdatabasesweekly
  7745. echo 'fi' >> /etc/cron.weekly/backupdatabasesweekly
  7746. echo 'if [ -f /var/backups/gnusocial_daily.sql ]; then' >> /etc/cron.weekly/backupdatabasesweekly
  7747. echo ' cp -f /var/backups/gnusocial_daily.sql /var/backups/gnusocial_weekly.sql' >> /etc/cron.weekly/backupdatabasesweekly
  7748. echo 'fi' >> /etc/cron.weekly/backupdatabasesweekly
  7749. fi
  7750. if ! grep -q "GNU Social" /etc/cron.monthly/backupdatabasesmonthly; then
  7751. echo '' >> /etc/cron.monthly/backupdatabasesmonthly
  7752. echo $'# GNU Social' >> /etc/cron.monthly/backupdatabasesmonthly
  7753. echo 'if [ -f /var/backups/gnusocial_monthly.sql ]; then' >> /etc/cron.monthly/backupdatabasesmonthly
  7754. echo ' cp -f /var/backups/gnusocial_monthly.sql /var/backups/gnusocial_2monthly.sql' >> /etc/cron.monthly/backupdatabasesmonthly
  7755. echo 'fi' >> /etc/cron.monthly/backupdatabasesmonthly
  7756. echo 'if [ -f /var/backups/gnusocial_weekly.sql ]; then' >> /etc/cron.monthly/backupdatabasesmonthly
  7757. echo ' cp -f /var/backups/gnusocial_weekly.sql /var/backups/gnusocial_monthly.sql' >> /etc/cron.monthly/backupdatabasesmonthly
  7758. echo 'fi' >> /etc/cron.monthly/backupdatabasesmonthly
  7759. fi
  7760. if ! grep -q "gnusocial" /etc/cron.hourly/repair; then
  7761. echo "${PROJECT_NAME}-repair-database gnusocial" >> /etc/cron.hourly/repair
  7762. fi
  7763. nginx_ensite $MICROBLOG_DOMAIN_NAME
  7764. # NOTE: For the typical case always enable SSL and only
  7765. # disable it if in onion only mode. This is due to complexities
  7766. # with the way URLs are generated by GNU Social
  7767. gnu_social_ssl='always'
  7768. if [[ $ONION_ONLY != 'no' ]]; then
  7769. gnu_social_ssl='never'
  7770. fi
  7771. # Create the configuration
  7772. gnu_social_installer=/var/www/${MICROBLOG_DOMAIN_NAME}/htdocs/scripts/install_cli.php
  7773. ${gnu_social_installer} --server "${MICROBLOG_DOMAIN_NAME}" \
  7774. --host="localhost" --database="gnusocial" \
  7775. --dbtype=mysql --username="root" -v \
  7776. --password="$MARIADB_PASSWORD" \
  7777. --sitename="${MICROBLOG_DOMAIN_NAME}" --fancy='yes' \
  7778. --admin-nick="$MY_USERNAME" \
  7779. --admin-pass="$MICROBLOG_ADMIN_PASSWORD" \
  7780. --site-profile="community" \
  7781. --ssl=${gnu_social_ssl}
  7782. if [ ! "$?" = "0" ]; then
  7783. # failed to install
  7784. echo $'Could not install GNU Social'
  7785. exit 72357
  7786. fi
  7787. # check microblog has a config file
  7788. microblog_config_file=/var/www/$MICROBLOG_DOMAIN_NAME/htdocs/config.php
  7789. if [ ! -f $microblog_config_file ]; then
  7790. echo $'Microblog config.php not found'
  7791. exit 87586
  7792. fi
  7793. # Some useful settings
  7794. if ! grep -q "Recommended GNU social settings" $microblog_config_file; then
  7795. echo "" >> $microblog_config_file
  7796. echo "// Recommended GNU social settings" >> $microblog_config_file
  7797. echo "\$config['thumbnail']['maxsize'] = 3000;" >> $microblog_config_file
  7798. echo "\$config['profile']['delete'] = true;" >> $microblog_config_file
  7799. echo "\$config['profile']['changenick'] = true;" >> $microblog_config_file
  7800. echo "\$config['public']['localonly'] = false;" >> $microblog_config_file
  7801. echo "addPlugin('StoreRemoteMedia');" >> $microblog_config_file
  7802. echo "\$config['queue']['enabled'] = true;" >> $microblog_config_file
  7803. echo "\$config['queue']['daemon'] = true;" >> $microblog_config_file
  7804. fi
  7805. # This improves performance
  7806. sed -i "s|\\\$config['db']['schemacheck'].*|\$config['db']['schemacheck'] = 'script';|g" $microblog_config_file
  7807. MICROBLOG_ONION_HOSTNAME=$(add_onion_service microblog 80 ${MICROBLOG_ONION_PORT})
  7808. systemctl restart php5-fpm
  7809. systemctl restart nginx
  7810. if ! grep -q "GNU Social onion domain" /home/$MY_USERNAME/README; then
  7811. echo "GNU Social onion domain: ${MICROBLOG_ONION_HOSTNAME}" >> /home/$MY_USERNAME/README
  7812. echo '' >> /home/$MY_USERNAME/README
  7813. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
  7814. chmod 600 /home/$MY_USERNAME/README
  7815. fi
  7816. echo "GNU Social onion domain:${MICROBLOG_ONION_HOSTNAME}" >> $COMPLETION_FILE
  7817. # some post-install instructions for the user
  7818. if ! grep -q $"Microblog administrator" /home/$MY_USERNAME/README; then
  7819. echo '' >> /home/$MY_USERNAME/README
  7820. echo '' >> /home/$MY_USERNAME/README
  7821. echo $'Microblog' >> /home/$MY_USERNAME/README
  7822. echo '=========' >> /home/$MY_USERNAME/README
  7823. echo $"Microblog administrator nickname: $MY_USERNAME" >> /home/$MY_USERNAME/README
  7824. echo $"Microblog administrator password: $MICROBLOG_ADMIN_PASSWORD" >> /home/$MY_USERNAME/README
  7825. echo '' >> /home/$MY_USERNAME/README
  7826. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
  7827. chmod 600 /home/$MY_USERNAME/README
  7828. fi
  7829. echo "GNU Social domain:$MICROBLOG_DOMAIN_NAME" >> $COMPLETION_FILE
  7830. echo 'install_gnu_social' >> $COMPLETION_FILE
  7831. }
  7832. function install_gnu_social_theme {
  7833. 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
  7834. return
  7835. fi
  7836. # update to the next commit
  7837. if grep -q "addPlugin('Qvitter')" /var/www/$MICROBLOG_DOMAIN_NAME/htdocs/config.php; then
  7838. if grep -q "GNU Social theme commit" $COMPLETION_FILE; then
  7839. CURRENT_MICROBLOG_THEME_COMMIT=$(grep "GNU Social theme commit" $COMPLETION_FILE | awk -F ':' '{print $2}')
  7840. if [[ "$CURRENT_MICROBLOG_THEME_COMMIT" != "$MICROBLOG_THEME_COMMIT" ]]; then
  7841. cd /var/www/$MICROBLOG_DOMAIN_NAME/htdocs/local/plugins
  7842. git_pull $MICROBLOG_THEME_REPO $MICROBLOG_THEME_COMMIT
  7843. sed -i "s/GNU Social theme commit.*/GNU Social theme commit:$MICROBLOG_THEME_COMMIT/g" $COMPLETION_FILE
  7844. chown -R www-data:www-data /var/www/$MICROBLOG_DOMAIN_NAME/htdocs/local
  7845. fi
  7846. else
  7847. echo "GNU Social theme commit:$MICROBLOG_THEME_COMMIT" >> $COMPLETION_FILE
  7848. fi
  7849. fi
  7850. if grep -Fxq "install_gnu_social_theme" $COMPLETION_FILE; then
  7851. return
  7852. fi
  7853. if [ ! -d /var/www/$MICROBLOG_DOMAIN_NAME/htdocs/local/plugins ]; then
  7854. mkdir -p /var/www/$MICROBLOG_DOMAIN_NAME/htdocs/local/plugins
  7855. fi
  7856. cd /var/www/$MICROBLOG_DOMAIN_NAME/htdocs/local/plugins
  7857. git_clone $MICROBLOG_THEME_REPO Qvitter
  7858. cd /var/www/$MICROBLOG_DOMAIN_NAME/htdocs/local/plugins/Qvitter
  7859. git checkout $MICROBLOG_THEME_COMMIT -b $MICROBLOG_THEME_COMMIT
  7860. microblog_config_file=/var/www/$MICROBLOG_DOMAIN_NAME/htdocs/config.php
  7861. if ! grep -q "addPlugin('Qvitter')" $microblog_config_file; then
  7862. MICROBLOG_WELCOME_MESSAGE=$(echo $MICROBLOG_WELCOME_MESSAGE | sed "s|\$MICROBLOG_DOMAIN_NAME|$MICROBLOG_DOMAIN_NAME|g")
  7863. echo "" >> $microblog_config_file
  7864. echo "// Qvitter settings" >> $microblog_config_file
  7865. echo "addPlugin('Qvitter');" >> $microblog_config_file
  7866. echo "\$config['site']['qvitter']['enabledbydefault'] = true;" >> $microblog_config_file
  7867. echo "\$config['site']['qvitter']['defaultbackgroundcolor'] = '#f4f4f4';" >> $microblog_config_file
  7868. echo "\$config['site']['qvitter']['defaultlinkcolor'] = '#0084B4';" >> $microblog_config_file
  7869. echo "\$config['site']['qvitter']['timebetweenpolling'] = 120000; // two minutes" >> $microblog_config_file
  7870. echo "\$config['site']['qvitter']['urlshortenerapiurl'] = 'http://qttr.at/shortener.php';" >> $microblog_config_file
  7871. echo "\$config['site']['qvitter']['urlshortenersignature'] = 'b6afeec983';" >> $microblog_config_file
  7872. echo "\$config['site']['qvitter']['sitebackground'] = 'img/vagnsmossen.jpg';" >> $microblog_config_file
  7873. echo "\$config['site']['qvitter']['favicon'] = 'img/favicon.ico?v=4';" >> $microblog_config_file
  7874. echo "\$config['site']['qvitter']['sprite'] = Plugin::staticPath('Qvitter', '').'img/sprite.png?v=40';" >> $microblog_config_file
  7875. echo "\$config['site']['qvitter']['enablewelcometext'] = true;" >> $microblog_config_file
  7876. echo "\$config['site']['qvitter']['customwelcometext']['en'] = '$MICROBLOG_WELCOME_MESSAGE';" >> $microblog_config_file
  7877. echo "\$config['site']['qvitter']['customwelcometext']['de'] = '$MICROBLOG_WELCOME_MESSAGE';" >> $microblog_config_file
  7878. echo "\$config['site']['qvitter']['customwelcometext']['fr'] = '$MICROBLOG_WELCOME_MESSAGE';" >> $microblog_config_file
  7879. echo "\$config['site']['qvitter']['customwelcometext']['es'] = '$MICROBLOG_WELCOME_MESSAGE';" >> $microblog_config_file
  7880. echo "\$config['site']['qvitter']['blocked_ips'] = array();" >> $microblog_config_file
  7881. fi
  7882. if ! grep -q "GNU Social theme commit" $COMPLETION_FILE; then
  7883. echo "GNU Social theme commit:$MICROBLOG_THEME_COMMIT" >> $COMPLETION_FILE
  7884. fi
  7885. chown -R www-data:www-data /var/www/$MICROBLOG_DOMAIN_NAME/htdocs
  7886. echo 'install_gnu_social_theme' >> $COMPLETION_FILE
  7887. }
  7888. function install_hubzilla {
  7889. 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
  7890. return
  7891. fi
  7892. if [ ! $HUBZILLA_DOMAIN_NAME ]; then
  7893. return
  7894. fi
  7895. # For now it probably won't install as onion-only. This might change in future
  7896. if [[ $ONION_ONLY != "no" ]]; then
  7897. return
  7898. fi
  7899. # update to the next commit
  7900. if [ -d /var/www/$HUBZILLA_DOMAIN_NAME/htdocs ]; then
  7901. if grep -q "Hubzilla commit" $COMPLETION_FILE; then
  7902. CURRENT_HUBZILLA_COMMIT=$(grep "Hubzilla commit" $COMPLETION_FILE | awk -F ':' '{print $2}')
  7903. if [[ "$CURRENT_HUBZILLA_COMMIT" != "$HUBZILLA_COMMIT" ]]; then
  7904. cd /var/www/$HUBZILLA_DOMAIN_NAME/htdocs
  7905. git_pull $HUBZILLA_REPO $HUBZILLA_COMMIT
  7906. sed -i "s/Hubzilla commit.*/Hubzilla commit:$HUBZILLA_COMMIT/g" $COMPLETION_FILE
  7907. chown -R www-data:www-data /var/www/$HUBZILLA_DOMAIN_NAME/htdocs
  7908. fi
  7909. else
  7910. echo "Hubzilla commit:$HUBZILLA_COMMIT" >> $COMPLETION_FILE
  7911. fi
  7912. if grep -q "Hubzilla addons commit" $COMPLETION_FILE; then
  7913. CURRENT_HUBZILLA_ADDONS_COMMIT=$(grep "Hubzilla addons commit" $COMPLETION_FILE | awk -F ':' '{print $2}')
  7914. if [[ "$CURRENT_HUBZILLA_ADDONS_COMMIT" != "$HUBZILLA_ADDONS_COMMIT" ]]; then
  7915. cd /var/www/$HUBZILLA_DOMAIN_NAME/htdocs/addon
  7916. git_pull $HUBZILLA_ADDONS_REPO $HUBZILLA_ADDONS_COMMIT
  7917. sed -i "s/Hubzilla addons commit.*/Hubzilla addons commit:$HUBZILLA_ADDONS_COMMIT/g" $COMPLETION_FILE
  7918. chown -R www-data:www-data /var/www/$HUBZILLA_DOMAIN_NAME/htdocs
  7919. fi
  7920. else
  7921. echo "Hubzilla addons commit:$HUBZILLA_ADDONS_COMMIT" >> $COMPLETION_FILE
  7922. fi
  7923. fi
  7924. if grep -Fxq "install_hubzilla" $COMPLETION_FILE; then
  7925. return
  7926. fi
  7927. install_mariadb
  7928. get_mariadb_password
  7929. repair_databases_script
  7930. apt-get -y install php5-common php5-cli php5-curl php5-gd php5-mysql php5-mcrypt git
  7931. apt-get -y install php5-dev imagemagick php5-imagick
  7932. if [ ! -d /var/www/$HUBZILLA_DOMAIN_NAME ]; then
  7933. mkdir /var/www/$HUBZILLA_DOMAIN_NAME
  7934. fi
  7935. if [ ! -d /var/www/$HUBZILLA_DOMAIN_NAME/htdocs ]; then
  7936. mkdir /var/www/$HUBZILLA_DOMAIN_NAME/htdocs
  7937. fi
  7938. if [ ! -f /var/www/$HUBZILLA_DOMAIN_NAME/htdocs/index.php ]; then
  7939. cd $INSTALL_DIR
  7940. git_clone $HUBZILLA_REPO hubzilla
  7941. git checkout $HUBZILLA_COMMIT -b $HUBZILLA_COMMIT
  7942. if ! grep -q "Hubzilla commit" $COMPLETION_FILE; then
  7943. echo "Hubzilla commit:$HUBZILLA_COMMIT" >> $COMPLETION_FILE
  7944. else
  7945. sed -i "s/Hubzilla commit.*/Hubzilla commit:$HUBZILLA_COMMIT/g" $COMPLETION_FILE
  7946. fi
  7947. rm -rf /var/www/$HUBZILLA_DOMAIN_NAME/htdocs
  7948. mv hubzilla /var/www/$HUBZILLA_DOMAIN_NAME/htdocs
  7949. git_clone $HUBZILLA_ADDONS_REPO /var/www/$HUBZILLA_DOMAIN_NAME/htdocs/addon
  7950. cd /var/www/$HUBZILLA_DOMAIN_NAME/htdocs/addon
  7951. git checkout $HUBZILLA_ADDONS_COMMIT -b $HUBZILLA_ADDONS_COMMIT
  7952. if ! grep -q "Hubzilla addons commit" $COMPLETION_FILE; then
  7953. echo "Hubzilla addons commit:$HUBZILLA_ADDONS_COMMIT" >> $COMPLETION_FILE
  7954. else
  7955. sed -i "s/Hubzilla addons commit.*/Hubzilla addons commit:$HUBZILLA_ADDONS_COMMIT/g" $COMPLETION_FILE
  7956. fi
  7957. # some extra themes
  7958. git_clone $HUBZILLA_THEMES_REPO /var/www/$HUBZILLA_DOMAIN_NAME/htdocs/redmatrix-themes1
  7959. cp -r /var/www/$HUBZILLA_DOMAIN_NAME/htdocs/redmatrix-themes1/* view/theme/
  7960. chown -R www-data:www-data /var/www/$HUBZILLA_DOMAIN_NAME/htdocs
  7961. fi
  7962. get_mariadb_hubzilla_admin_password
  7963. if [ ! $HUBZILLA_ADMIN_PASSWORD ]; then
  7964. if [ -f $IMAGE_PASSWORD_FILE ]; then
  7965. HUBZILLA_ADMIN_PASSWORD="$(printf `cat $IMAGE_PASSWORD_FILE`)"
  7966. else
  7967. HUBZILLA_ADMIN_PASSWORD="$(openssl rand -base64 32)"
  7968. fi
  7969. echo '' >> /home/$MY_USERNAME/README
  7970. echo '' >> /home/$MY_USERNAME/README
  7971. echo 'Hubzilla' >> /home/$MY_USERNAME/README
  7972. echo '==========' >> /home/$MY_USERNAME/README
  7973. echo $"Your MariaDB Hubzilla admin password is: $HUBZILLA_ADMIN_PASSWORD" >> /home/$MY_USERNAME/README
  7974. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
  7975. chmod 600 /home/$MY_USERNAME/README
  7976. fi
  7977. create_database hubzilla "$HUBZILLA_ADMIN_PASSWORD"
  7978. if ! grep -q "/var/www/$HUBZILLA_DOMAIN_NAME/htdocs" /etc/crontab; then
  7979. 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
  7980. fi
  7981. # update the dynamic DNS
  7982. CURRENT_DDNS_DOMAIN=$HUBZILLA_DOMAIN_NAME
  7983. add_ddns_domain
  7984. if [[ $ONION_ONLY == "no" ]]; then
  7985. echo 'server {' > /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7986. echo ' listen 80;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7987. echo " server_name $HUBZILLA_DOMAIN_NAME;" >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7988. echo " root /var/www/$HUBZILLA_DOMAIN_NAME/htdocs;" >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7989. echo ' access_log off;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7990. echo " error_log /var/log/nginx/${HUBZILLA_DOMAIN_NAME}_error.log $WEBSERVER_LOG_LEVEL;" >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7991. echo ' limit_conn conn_limit_per_ip 10;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7992. echo ' limit_req zone=req_limit_per_ip burst=10 nodelay;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7993. echo ' index index.php;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7994. echo '' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7995. echo ' rewrite ^ https://$server_name$request_uri? permanent;' >> /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 'server {' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  7999. echo ' listen 443 ssl;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8000. echo " root /var/www/$HUBZILLA_DOMAIN_NAME/htdocs;" >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8001. echo " server_name $HUBZILLA_DOMAIN_NAME;" >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8002. echo " error_log /var/log/nginx/${HUBZILLA_DOMAIN_NAME}_error_ssl.log $WEBSERVER_LOG_LEVEL;" >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8003. echo ' index index.php;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8004. echo ' charset utf-8;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8005. echo ' client_max_body_size 20m;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8006. echo ' client_body_buffer_size 128k;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8007. echo ' access_log off;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8008. echo '' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8009. echo ' limit_conn conn_limit_per_ip 10;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8010. echo ' limit_req zone=req_limit_per_ip burst=10 nodelay;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8011. echo '' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8012. echo ' ssl on;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8013. echo " ssl_certificate /etc/ssl/certs/$HUBZILLA_DOMAIN_NAME.bundle.crt;" >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8014. echo " ssl_certificate_key /etc/ssl/private/$HUBZILLA_DOMAIN_NAME.key;" >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8015. echo " ssl_dhparam /etc/ssl/certs/$HUBZILLA_DOMAIN_NAME.dhparam;" >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8016. echo '' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8017. echo ' ssl_session_timeout 60m;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8018. echo ' ssl_prefer_server_ciphers on;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8019. echo ' ssl_session_cache builtin:1000 shared:SSL:10m;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8020. echo " ssl_protocols $SSL_PROTOCOLS; # not possible to do exclusive" >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8021. echo " ssl_ciphers '$SSL_CIPHERS';" >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8022. echo ' add_header X-Frame-Options DENY;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8023. echo ' add_header X-Content-Type-Options nosniff;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8024. echo ' add_header Strict-Transport-Security max-age=15768000;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8025. echo '' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8026. echo ' # rewrite to front controller as default rule' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8027. echo ' location / {' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8028. echo ' rewrite ^/(.*) /index.php?q=$uri&$args last;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8029. echo ' }' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8030. echo '' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8031. echo " # make sure webfinger and other well known services aren't blocked" >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8032. echo ' # by denying dot files and rewrite request to the front controller' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8033. echo ' location ^~ /.well-known/ {' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8034. echo ' allow all;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8035. echo ' rewrite ^/(.*) /index.php?q=$uri&$args last;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8036. echo ' }' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8037. echo '' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8038. echo ' # statically serve these file types when possible' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8039. echo ' # otherwise fall back to front controller' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8040. echo ' # allow browser to cache them' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8041. echo ' # added .htm for advanced source code editor library' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8042. echo ' location ~* \.(jpg|jpeg|gif|png|ico|css|js|htm|html|ttf|woff|svg)$ {' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8043. echo ' expires 30d;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8044. echo ' try_files $uri /index.php?q=$uri&$args;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8045. echo ' }' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8046. echo '' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8047. echo ' # block these file types' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8048. echo ' location ~* \.(tpl|md|tgz|log|out)$ {' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8049. echo ' deny all;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8050. echo ' }' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8051. echo '' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8052. echo ' # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8053. echo ' # or a unix socket' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8054. echo ' location ~* \.php$ {' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8055. echo ' # Zero-day exploit defense.' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8056. echo ' # http://forum.nginx.org/read.php?2,88845,page=3' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8057. echo " # Won't work properly (404 error) if the file is not stored on this" >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8058. echo " # server, which is entirely possible with php-fpm/php-fcgi." >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8059. echo " # Comment the 'try_files' line out if you set up php-fpm/php-fcgi on" >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8060. echo " # another machine. And then cross your fingers that you won't get hacked." >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8061. echo ' try_files $uri $uri/ /index.php;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8062. echo ' # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8063. echo ' fastcgi_split_path_info ^(.+\.php)(/.+)$;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8064. echo ' # With php5-cgi alone:' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8065. echo ' # fastcgi_pass 127.0.0.1:9000;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8066. echo ' # With php5-fpm:' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8067. echo ' fastcgi_pass unix:/var/run/php5-fpm.sock;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8068. echo ' include fastcgi_params;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8069. echo ' fastcgi_index index.php;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8070. echo ' fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8071. echo ' fastcgi_read_timeout 300;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8072. echo ' }' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8073. echo '' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8074. echo ' # deny access to all dot files' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8075. echo ' location ~ /\. {' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8076. echo ' deny all;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8077. echo ' }' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8078. echo '' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8079. echo ' location ~ /\.ht {' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8080. echo ' deny all;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8081. echo ' }' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8082. echo '}' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8083. echo '' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8084. else
  8085. echo -n '' > /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8086. fi
  8087. echo 'server {' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8088. echo " listen 127.0.0.1:${HUBZILLA_ONION_PORT} default_server;" >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8089. echo " root /var/www/$HUBZILLA_DOMAIN_NAME/htdocs;" >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8090. echo " server_name $HUBZILLA_DOMAIN_NAME;" >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8091. echo " error_log /var/log/nginx/${HUBZILLA_DOMAIN_NAME}_error_ssl.log $WEBSERVER_LOG_LEVEL;" >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8092. echo ' index index.php;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8093. echo ' charset utf-8;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8094. echo ' client_max_body_size 20m;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8095. echo ' client_body_buffer_size 128k;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8096. echo ' access_log off;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8097. echo '' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8098. echo ' limit_conn conn_limit_per_ip 10;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8099. echo ' limit_req zone=req_limit_per_ip burst=10 nodelay;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8100. echo '' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8101. echo ' add_header X-Frame-Options DENY;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8102. echo ' add_header X-Content-Type-Options nosniff;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8103. echo ' add_header Strict-Transport-Security max-age=15768000;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8104. echo '' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8105. echo ' # rewrite to front controller as default rule' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8106. echo ' location / {' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8107. echo ' rewrite ^/(.*) /index.php?q=$uri&$args last;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8108. echo ' }' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8109. echo '' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8110. echo " # make sure webfinger and other well known services aren't blocked" >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8111. echo ' # by denying dot files and rewrite request to the front controller' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8112. echo ' location ^~ /.well-known/ {' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8113. echo ' allow all;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8114. echo ' rewrite ^/(.*) /index.php?q=$uri&$args last;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8115. echo ' }' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8116. echo '' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8117. echo ' # statically serve these file types when possible' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8118. echo ' # otherwise fall back to front controller' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8119. echo ' # allow browser to cache them' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8120. echo ' # added .htm for advanced source code editor library' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8121. echo ' location ~* \.(jpg|jpeg|gif|png|ico|css|js|htm|html|ttf|woff|svg)$ {' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8122. echo ' expires 30d;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8123. echo ' try_files $uri /index.php?q=$uri&$args;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8124. echo ' }' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8125. echo '' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8126. echo ' # block these file types' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8127. echo ' location ~* \.(tpl|md|tgz|log|out)$ {' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8128. echo ' deny all;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8129. echo ' }' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8130. echo '' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8131. echo ' # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8132. echo ' # or a unix socket' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8133. echo ' location ~* \.php$ {' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8134. echo ' # Zero-day exploit defense.' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8135. echo ' # http://forum.nginx.org/read.php?2,88845,page=3' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8136. echo " # Won't work properly (404 error) if the file is not stored on this" >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8137. echo " # server, which is entirely possible with php-fpm/php-fcgi." >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8138. echo " # Comment the 'try_files' line out if you set up php-fpm/php-fcgi on" >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8139. echo " # another machine. And then cross your fingers that you won't get hacked." >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8140. echo ' try_files $uri $uri/ /index.php;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8141. echo ' # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8142. echo ' fastcgi_split_path_info ^(.+\.php)(/.+)$;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8143. echo ' # With php5-cgi alone:' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8144. echo ' # fastcgi_pass 127.0.0.1:9000;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8145. echo ' # With php5-fpm:' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8146. echo ' fastcgi_pass unix:/var/run/php5-fpm.sock;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8147. echo ' include fastcgi_params;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8148. echo ' fastcgi_index index.php;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8149. echo ' fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8150. echo ' fastcgi_read_timeout 300;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8151. echo ' }' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8152. echo '' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8153. echo ' # deny access to all dot files' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8154. echo ' location ~ /\. {' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8155. echo ' deny all;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8156. echo ' }' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8157. echo '' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8158. echo ' location ~ /\.ht {' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8159. echo ' deny all;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8160. echo ' }' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8161. echo '}' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8162. configure_php
  8163. if [[ $ONION_ONLY == "no" ]]; then
  8164. if [ ! -f /etc/ssl/certs/$HUBZILLA_DOMAIN_NAME.dhparam ]; then
  8165. ${PROJECT_NAME}-addcert -e $HUBZILLA_DOMAIN_NAME -s $LETSENCRYPT_SERVER --dhkey $DH_KEYLENGTH --email $MY_EMAIL_ADDRESS
  8166. check_certificates $HUBZILLA_DOMAIN_NAME
  8167. fi
  8168. fi
  8169. if [ ! -d /var/www/$HUBZILLA_DOMAIN_NAME/htdocs/view/tpl/smarty3 ]; then
  8170. mkdir /var/www/$HUBZILLA_DOMAIN_NAME/htdocs/view/tpl/smarty3
  8171. fi
  8172. if [ ! -d "/var/www/$HUBZILLA_DOMAIN_NAME/htdocs/store" ]; then
  8173. mkdir "/var/www/$HUBZILLA_DOMAIN_NAME/htdocs/store"
  8174. fi
  8175. if [ ! -d "/var/www/$HUBZILLA_DOMAIN_NAME/htdocs/store/[data]" ]; then
  8176. mkdir "/var/www/$HUBZILLA_DOMAIN_NAME/htdocs/store/[data]"
  8177. fi
  8178. if [ ! -d "/var/www/$HUBZILLA_DOMAIN_NAME/htdocs/store/[data]/smarty3" ]; then
  8179. mkdir "/var/www/$HUBZILLA_DOMAIN_NAME/htdocs/store/[data]/smarty3"
  8180. chmod 777 "/var/www/$HUBZILLA_DOMAIN_NAME/htdocs/store/[data]/smarty3"
  8181. fi
  8182. chmod 777 /var/www/$HUBZILLA_DOMAIN_NAME/htdocs/view/tpl
  8183. chown -R www-data:www-data "/var/www/$HUBZILLA_DOMAIN_NAME/htdocs/store"
  8184. chmod 777 /var/www/$HUBZILLA_DOMAIN_NAME/htdocs/view/tpl/smarty3
  8185. # Ensure that the database gets backed up locally, if remote
  8186. # backups are not being used
  8187. backup_databases_script_header
  8188. echo '' >> /usr/bin/backupdatabases
  8189. echo $'# Backup the Hubzilla database' >> /usr/bin/backupdatabases
  8190. echo 'TEMPFILE=/root/hubzilla.sql' >> /usr/bin/backupdatabases
  8191. echo 'DAILYFILE=/var/backups/hubzilla_daily.sql' >> /usr/bin/backupdatabases
  8192. echo 'mysqldump --password="$MYSQL_PASSWORD" hubzilla > $TEMPFILE' >> /usr/bin/backupdatabases
  8193. echo 'FILESIZE=$(stat -c%s $TEMPFILE)' >> /usr/bin/backupdatabases
  8194. echo 'if [ "$FILESIZE" -lt "1024" ]; then' >> /usr/bin/backupdatabases
  8195. echo ' if [ -f $DAILYFILE ]; then' >> /usr/bin/backupdatabases
  8196. echo ' cp $DAILYFILE $TEMPFILE' >> /usr/bin/backupdatabases
  8197. echo '' >> /usr/bin/backupdatabases
  8198. echo ' # try to restore yesterdays database' >> /usr/bin/backupdatabases
  8199. echo ' mysql -u root --password="$MYSQL_PASSWORD" hubzilla -o < $DAILYFILE' >> /usr/bin/backupdatabases
  8200. echo '' >> /usr/bin/backupdatabases
  8201. echo ' # Send a warning email' >> /usr/bin/backupdatabases
  8202. 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
  8203. echo ' else' >> /usr/bin/backupdatabases
  8204. echo ' # Send a warning email' >> /usr/bin/backupdatabases
  8205. echo ' echo "Unable to create a backup of the Hubzilla database." | mail -s "Hubzilla backup" $EMAIL' >> /usr/bin/backupdatabases
  8206. echo ' fi' >> /usr/bin/backupdatabases
  8207. echo 'else' >> /usr/bin/backupdatabases
  8208. echo ' chmod 600 $TEMPFILE' >> /usr/bin/backupdatabases
  8209. echo ' mv $TEMPFILE $DAILYFILE' >> /usr/bin/backupdatabases
  8210. echo '' >> /usr/bin/backupdatabases
  8211. echo ' # Make the backup readable only by root' >> /usr/bin/backupdatabases
  8212. echo ' chmod 600 $DAILYFILE' >> /usr/bin/backupdatabases
  8213. echo 'fi' >> /usr/bin/backupdatabases
  8214. echo '' >> /etc/cron.weekly/backupdatabasesweekly
  8215. echo '# Hubzilla' >> /etc/cron.weekly/backupdatabasesweekly
  8216. echo 'if [ -f /var/backups/hubzilla_weekly.sql ]; then' >> /etc/cron.weekly/backupdatabasesweekly
  8217. echo ' cp -f /var/backups/hubzilla_weekly.sql /var/backups/hubzilla_2weekly.sql' >> /etc/cron.weekly/backupdatabasesweekly
  8218. echo 'fi' >> /etc/cron.weekly/backupdatabasesweekly
  8219. echo 'if [ -f /var/backups/hubzilla_daily.sql ]; then' >> /etc/cron.weekly/backupdatabasesweekly
  8220. echo ' cp -f /var/backups/hubzilla_daily.sql /var/backups/hubzilla_weekly.sql' >> /etc/cron.weekly/backupdatabasesweekly
  8221. echo 'fi' >> /etc/cron.weekly/backupdatabasesweekly
  8222. echo '' >> /etc/cron.monthly/backupdatabasesmonthly
  8223. echo '# Hubzilla' >> /etc/cron.monthly/backupdatabasesmonthly
  8224. echo 'if [ -f /var/backups/hubzilla_monthly.sql ]; then' >> /etc/cron.monthly/backupdatabasesmonthly
  8225. echo ' cp -f /var/backups/hubzilla_monthly.sql /var/backups/hubzilla_2monthly.sql' >> /etc/cron.monthly/backupdatabasesmonthly
  8226. echo 'fi' >> /etc/cron.monthly/backupdatabasesmonthly
  8227. echo 'if [ -f /var/backups/hubzilla_weekly.sql ]; then' >> /etc/cron.monthly/backupdatabasesmonthly
  8228. echo ' cp -f /var/backups/hubzilla_weekly.sql /var/backups/hubzilla_monthly.sql' >> /etc/cron.monthly/backupdatabasesmonthly
  8229. echo 'fi' >> /etc/cron.monthly/backupdatabasesmonthly
  8230. if ! grep -q "hubzilla" /etc/cron.hourly/repair; then
  8231. echo "${PROJECT_NAME}-repair-database hubzilla" >> /etc/cron.hourly/repair
  8232. # remove legacy stuff
  8233. sed -i 's|/usr/bin/repairdatabase redmatrix||g' /etc/cron.hourly/repair
  8234. fi
  8235. chown -R www-data:www-data /var/www/$HUBZILLA_DOMAIN_NAME/htdocs
  8236. nginx_ensite $HUBZILLA_DOMAIN_NAME
  8237. HUBZILLA_ONION_HOSTNAME=$(add_onion_service hubzilla 80 ${HUBZILLA_ONION_PORT})
  8238. systemctl restart php5-fpm
  8239. systemctl restart nginx
  8240. systemctl restart cron
  8241. if ! grep -q "Hubzilla onion domain" /home/$MY_USERNAME/README; then
  8242. echo "Hubzilla onion domain: ${HUBZILLA_ONION_HOSTNAME}" >> /home/$MY_USERNAME/README
  8243. echo '' >> /home/$MY_USERNAME/README
  8244. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
  8245. chmod 600 /home/$MY_USERNAME/README
  8246. fi
  8247. echo "Hubzilla domain:${HUBZILLA_DOMAIN_NAME}" >> $COMPLETION_FILE
  8248. echo "Hubzilla onion domain:${HUBZILLA_ONION_HOSTNAME}" >> $COMPLETION_FILE
  8249. echo 'install_hubzilla' >> $COMPLETION_FILE
  8250. }
  8251. function script_for_attaching_usb_drive {
  8252. if grep -Fxq "script_for_attaching_usb_drive" $COMPLETION_FILE; then
  8253. return
  8254. fi
  8255. echo '#!/bin/bash' > /usr/bin/attach-music
  8256. echo 'remove-music' >> /usr/bin/attach-music
  8257. echo "if [ ! -d $USB_MOUNT ]; then" >> /usr/bin/attach-music
  8258. echo " mkdir $USB_MOUNT" >> /usr/bin/attach-music
  8259. echo 'fi' >> /usr/bin/attach-music
  8260. echo "mount /dev/sda1 $USB_MOUNT" >> /usr/bin/attach-music
  8261. echo "chown root:root $USB_MOUNT" >> /usr/bin/attach-music
  8262. echo "chown -R minidlna:minidlna $USB_MOUNT/*" >> /usr/bin/attach-music
  8263. echo 'service minidlna restart' >> /usr/bin/attach-music
  8264. echo 'minidlnad -R' >> /usr/bin/attach-music
  8265. chmod +x /usr/bin/attach-music
  8266. ln -s /usr/bin/attach-music /usr/bin/attach-usb
  8267. ln -s /usr/bin/attach-music /usr/bin/attach-videos
  8268. ln -s /usr/bin/attach-music /usr/bin/attach-pictures
  8269. ln -s /usr/bin/attach-music /usr/bin/attach-media
  8270. echo '#!/bin/bash' > /usr/bin/remove-music
  8271. echo "if [ -d $USB_MOUNT ]; then" >> /usr/bin/remove-music
  8272. echo " umount $USB_MOUNT" >> /usr/bin/remove-music
  8273. echo " rm -rf $USB_MOUNT" >> /usr/bin/remove-music
  8274. echo 'fi' >> /usr/bin/remove-music
  8275. chmod +x /usr/bin/remove-music
  8276. ln -s /usr/bin/remove-music /usr/bin/detach-music
  8277. ln -s /usr/bin/remove-music /usr/bin/detach-usb
  8278. ln -s /usr/bin/remove-music /usr/bin/remove-usb
  8279. ln -s /usr/bin/remove-music /usr/bin/detach-media
  8280. ln -s /usr/bin/remove-music /usr/bin/remove-media
  8281. ln -s /usr/bin/remove-music /usr/bin/detach-videos
  8282. ln -s /usr/bin/remove-music /usr/bin/remove-videos
  8283. ln -s /usr/bin/remove-music /usr/bin/detach-pictures
  8284. ln -s /usr/bin/remove-music /usr/bin/remove-pictures
  8285. echo 'script_for_attaching_usb_drive' >> $COMPLETION_FILE
  8286. }
  8287. function install_dlna_server {
  8288. if grep -Fxq "install_dlna_server" $COMPLETION_FILE; then
  8289. return
  8290. fi
  8291. 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
  8292. return
  8293. fi
  8294. apt-get -y install minidlna
  8295. if [ ! -f /etc/minidlna.conf ]; then
  8296. echo $"ERROR: minidlna does not appear to have installed. $CHECK_MESSAGE"
  8297. exit 55
  8298. fi
  8299. sed -i "s|media_dir=/var/lib/minidlna|media_dir=A,/home/$MY_USERNAME/Music|g" /etc/minidlna.conf
  8300. if ! grep -q "/home/$MY_USERNAME/Pictures" /etc/minidlna.conf; then
  8301. echo "media_dir=P,/home/$MY_USERNAME/Pictures" >> /etc/minidlna.conf
  8302. fi
  8303. if ! grep -q "/home/$MY_USERNAME/Videos" /etc/minidlna.conf; then
  8304. echo "media_dir=V,/home/$MY_USERNAME/Videos" >> /etc/minidlna.conf
  8305. fi
  8306. if ! grep -q "$USB_MOUNT/Music" /etc/minidlna.conf; then
  8307. echo "media_dir=A,$USB_MOUNT/Music" >> /etc/minidlna.conf
  8308. fi
  8309. if ! grep -q "$USB_MOUNT/Pictures" /etc/minidlna.conf; then
  8310. echo "media_dir=P,$USB_MOUNT/Pictures" >> /etc/minidlna.conf
  8311. fi
  8312. if ! grep -q "$USB_MOUNT/Videos" /etc/minidlna.conf; then
  8313. echo "media_dir=V,$USB_MOUNT/Videos" >> /etc/minidlna.conf
  8314. fi
  8315. sed -i 's/#root_container=./root_container=B/g' /etc/minidlna.conf
  8316. if [[ $SYSTEM_TYPE != "$VARIANT_MESH" ]]; then
  8317. sed -i 's/#network_interface=/network_interface=eth0/g' /etc/minidlna.conf
  8318. else
  8319. sed -i 's/#network_interface=/network_interface=$WIFI_INTERFACE/g' /etc/minidlna.conf
  8320. fi
  8321. sed -i "s/#friendly_name=/friendly_name=\"${PROJECT_NAME} Media\"/g" /etc/minidlna.conf
  8322. sed -i 's|#db_dir=/var/cache/minidlna|db_dir=/var/cache/minidlna|g' /etc/minidlna.conf
  8323. sed -i 's/#inotify=yes/inotify=yes/g' /etc/minidlna.conf
  8324. sed -i 's/#notify_interval=895/notify_interval=300/g' /etc/minidlna.conf
  8325. sed -i "s|#presentation_url=/|presentation_url=http://localhost:8200|g" /etc/minidlna.conf
  8326. service minidlna force-reload
  8327. service minidlna reload
  8328. sed -i 's/fs.inotify.max_user_watches*/fs.inotify.max_user_watches=65536/g' /etc/sysctl.conf
  8329. if ! grep -q "max_user_watches" $COMPLETION_FILE; then
  8330. echo 'fs.inotify.max_user_watches=65536' >> /etc/sysctl.conf
  8331. fi
  8332. /sbin/sysctl -p
  8333. echo 'install_dlna_server' >> $COMPLETION_FILE
  8334. }
  8335. function install_mediagoblin {
  8336. return
  8337. if grep -Fxq "install_mediagoblin" $COMPLETION_FILE; then
  8338. return
  8339. fi
  8340. 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
  8341. return
  8342. fi
  8343. if [ ! $MEDIAGOBLIN_DOMAIN_NAME ]; then
  8344. return
  8345. fi
  8346. apt-get -y install git-core python python-dev python-lxml python-imaging python-virtualenv
  8347. apt-get -y install postgresql postgresql-client python-psycopg2
  8348. apt-get -y install python-gst-1.0 libjpeg62-turbo-dev gstreamer1.0-plugins-base python-gobject
  8349. apt-get -y install gstreamer1.0-plugins-good gstreamer1.0-libav libav-tools gstreamer0.10-tools
  8350. apt-get -y install python-numpy python-scipy libsndfile1-dev python-gst0.10-dev
  8351. apt-get -y install gstreamer0.10-plugins-base gstreamer0.10-plugins-good gstreamer1.0-tools
  8352. su -c "createuser -A -D mediagoblin" - postgres
  8353. su -c "createdb -E UNICODE -O mediagoblin mediagoblin" - postgres
  8354. adduser --disabled-login --gecos 'Mediagoblin' mediagoblin
  8355. MEDIAGOBLIN_DOMAIN_ROOT="/home/mediagoblin"
  8356. MEDIAGOBLIN_PATH="$MEDIAGOBLIN_DOMAIN_ROOT/mediagoblin"
  8357. MEDIAGOBLIN_PATH_BIN="$MEDIAGOBLIN_PATH/mediagoblin/bin"
  8358. mkdir -p $MEDIAGOBLIN_DOMAIN_ROOT
  8359. chown -hR mediagoblin: $MEDIAGOBLIN_DOMAIN_ROOT
  8360. su -c "cd $MEDIAGOBLIN_DOMAIN_ROOT; git clone $MEDIAGOBLIN_REPO" - mediagoblin
  8361. cd $MEDIAGOBLIN_DOMAIN_ROOT
  8362. git checkout -q v0.7.1
  8363. su -c "cd $MEDIAGOBLIN_PATH; git submodule init" - mediagoblin
  8364. su -c "cd $MEDIAGOBLIN_PATH; git submodule update" - mediagoblin
  8365. su -c "cd $MEDIAGOBLIN_PATH; (virtualenv --python=python2 --system-site-packages . || cd $MEDIAGOBLIN_PATH; virtualenv --python=python2 .) && ./bin/python setup.py develop" - mediagoblin
  8366. su -c "cd $MEDIAGOBLIN_PATH; ./bin/easy_install flup" - mediagoblin
  8367. if [ -f $MEDIAGOBLIN_PATH/lib/python2.7/no-global-site-packages.txt ]; then
  8368. virtualenv deactivate
  8369. rm -f $MEDIAGOBLIN_PATH/lib/python2.7/no-global-site-packages.txt
  8370. su -c "cd $MEDIAGOBLIN_PATH; source bin/activate" - mediagoblin
  8371. fi
  8372. if [ -f $MEDIAGOBLIN_PATH/mediagoblin.example.ini ]; then
  8373. # this is for versions > 0.7.1
  8374. su -c "cp $MEDIAGOBLIN_PATH/mediagoblin.example.ini $MEDIAGOBLIN_PATH/mediagoblin_local.ini" - mediagoblin
  8375. sed -i 's|# data_basedir.*|data_basedir = "/var/lib/mediagoblin"|g' $MEDIAGOBLIN_PATH/mediagoblin_local.ini
  8376. else
  8377. su -c "cp $MEDIAGOBLIN_PATH/mediagoblin.ini $MEDIAGOBLIN_PATH/mediagoblin_local.ini" - mediagoblin
  8378. fi
  8379. sed -i 's|# sql_engine.*|sql_engine = postgresql:///mediagoblin|g' $MEDIAGOBLIN_PATH/mediagoblin_local.ini
  8380. sed -i "s/email_sender_address.*/email_sender_address = \"$MY_EMAIL_ADDRESS\"/g" $MEDIAGOBLIN_PATH/mediagoblin_local.ini
  8381. sed -i 's|email_debug_mode.*|email_debug_mode = false|g' $MEDIAGOBLIN_PATH/mediagoblin_local.ini
  8382. # add extra media types
  8383. if ! grep -q "media_types.stl" $MEDIAGOBLIN_PATH/mediagoblin_local.ini; then
  8384. echo '[[mediagoblin.media_types.stl]]' >> $MEDIAGOBLIN_PATH/mediagoblin_local.ini
  8385. fi
  8386. if ! grep -q "media_types.audio" $MEDIAGOBLIN_PATH/mediagoblin_local.ini; then
  8387. echo '[[mediagoblin.media_types.audio]]' >> $MEDIAGOBLIN_PATH/mediagoblin_local.ini
  8388. fi
  8389. if ! grep -q "media_types.video" $MEDIAGOBLIN_PATH/mediagoblin_local.ini; then
  8390. echo '[[mediagoblin.media_types.video]]' >> $MEDIAGOBLIN_PATH/mediagoblin_local.ini
  8391. fi
  8392. #su -c 'cd $MEDIAGOBLIN_PATH; ./bin/pip install scikits.audiolab' - mediagoblin
  8393. #su -c "cd $MEDIAGOBLIN_PATH; git submodule update && ./bin/python setup.py develop --upgrade && ./bin/gmg dbupdate" - mediagoblin
  8394. su -c "cd $MEDIAGOBLIN_PATH; ./bin/gmg dbupdate" - mediagoblin
  8395. echo 'server {' > /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8396. echo ' listen 80;' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8397. echo " server_name $MEDIAGOBLIN_DOMAIN_NAME;" >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8398. echo ' access_log off;' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8399. echo " error_log /var/log/nginx/${MEDIAGOBLIN_DOMAIN_NAME}_error.log $WEBSERVER_LOG_LEVEL;" >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8400. echo ' limit_conn conn_limit_per_ip 10;' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8401. echo ' limit_req zone=req_limit_per_ip burst=10 nodelay;' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8402. echo ' location / {' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8403. echo ' proxy_pass http://localhost:6543;' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8404. echo ' }' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8405. echo ' location ^~ /auth/ {' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8406. echo ' rewrite ^ https://$server_name$request_uri?;' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8407. echo ' }' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8408. echo ' location ^~ /u/ {' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8409. echo ' rewrite ^ https://$server_name$request_uri?;' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8410. echo ' }' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8411. echo ' location ^~ /submit/ {' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8412. echo ' rewrite ^ https://$server_name$request_uri?;' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8413. echo ' }' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8414. echo '}' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8415. echo '' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8416. echo 'server {' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8417. echo ' listen 443 ssl;' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8418. echo " root /var/www/$MEDIAGOBLIN_DOMAIN_NAME/htdocs;" >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8419. echo " server_name $MEDIAGOBLIN_DOMAIN_NAME;" >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8420. echo ' access_log off;' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8421. echo " error_log /var/log/nginx/${MEDIAGOBLIN_DOMAIN_NAME}_error.log $WEBSERVER_LOG_LEVEL;" >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8422. echo '' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8423. echo ' limit_conn conn_limit_per_ip 10;' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8424. echo ' limit_req zone=req_limit_per_ip burst=10 nodelay;' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8425. echo '' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8426. echo ' ssl on;' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8427. echo " ssl_certificate /etc/ssl/certs/$MEDIAGOBLIN_DOMAIN_NAME.crt;" >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8428. echo " ssl_certificate_key /etc/ssl/private/$MEDIAGOBLIN_DOMAIN_NAME.key;" >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8429. echo " ssl_dhparam /etc/ssl/certs/$MEDIAGOBLIN_DOMAIN_NAME.dhparam;" >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8430. echo '' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8431. echo ' ssl_session_timeout 60m;' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8432. echo ' ssl_prefer_server_ciphers on;' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8433. echo " ssl_protocols $SSL_PROTOCOLS; # not possible to do exclusive" >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8434. echo " ssl_ciphers '$SSL_CIPHERS';" >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8435. echo ' add_header X-Frame-Options DENY;' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8436. echo ' add_header X-Content-Type-Options nosniff;' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8437. echo ' add_header Strict-Transport-Security max-age=0;' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8438. echo '' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8439. echo ' location / {' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8440. echo ' proxy_pass http://localhost:6543;' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8441. echo ' }' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8442. echo '' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8443. echo ' client_max_body_size 10G; # set max upload size' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8444. echo ' client_body_buffer_size 128k;' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8445. echo ' fastcgi_buffers 64 4K;' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8446. echo '' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8447. echo ' error_page 403 /core/templates/403.php;' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8448. echo ' error_page 404 /core/templates/404.php;' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8449. echo '' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8450. echo ' location = /robots.txt {' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8451. echo ' allow all;' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8452. echo ' log_not_found off;' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8453. echo ' access_log off;' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8454. echo ' }' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8455. echo '}' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8456. if [ ! -f /etc/ssl/certs/$MEDIAGOBLIN_DOMAIN_NAME.dhparam ]; then
  8457. if [[ $LETSENCRYPT_ENABLED != "yes" ]]; then
  8458. ${PROJECT_NAME}-addcert -h $MEDIAGOBLIN_DOMAIN_NAME --dhkey $DH_KEYLENGTH
  8459. else
  8460. ${PROJECT_NAME}-addcert -e $MEDIAGOBLIN_DOMAIN_NAME -s $LETSENCRYPT_SERVER --dhkey $DH_KEYLENGTH --email $MY_EMAIL_ADDRESS
  8461. fi
  8462. check_certificates $MEDIAGOBLIN_DOMAIN_NAME
  8463. fi
  8464. nginx_ensite $MEDIAGOBLIN_DOMAIN_NAME
  8465. systemctl restart php5-fpm
  8466. systemctl restart nginx
  8467. /usr/sbin/nginx -s reload
  8468. # update the dynamic DNS
  8469. CURRENT_DDNS_DOMAIN=$MEDIAGOBLIN_DOMAIN_NAME
  8470. add_ddns_domain
  8471. # init with systemd
  8472. echo '[Unit]' > /etc/systemd/system/mediagoblin.service
  8473. echo 'Description=Mediagoblin (Media Server)' >> /etc/systemd/system/mediagoblin.service
  8474. echo 'After=syslog.target' >> /etc/systemd/system/mediagoblin.service
  8475. echo 'After=network.target' >> /etc/systemd/system/mediagoblin.service
  8476. echo 'After=postgresql.service' >> /etc/systemd/system/mediagoblin.service
  8477. echo '' >> /etc/systemd/system/mediagoblin.service
  8478. echo '[Service]' >> /etc/systemd/system/mediagoblin.service
  8479. echo 'Type=simple' >> /etc/systemd/system/mediagoblin.service
  8480. echo 'User=mediagoblin' >> /etc/systemd/system/mediagoblin.service
  8481. echo 'Group=mediagoblin' >> /etc/systemd/system/mediagoblin.service
  8482. echo 'WorkingDirectory=/home/mediagoblin/mediagoblin' >> /etc/systemd/system/mediagoblin.service
  8483. echo 'ExecStart=/home/mediagoblin/mediagoblin/lazyserver.sh --server-name=broadcast' >> /etc/systemd/system/mediagoblin.service
  8484. echo 'Restart=always' >> /etc/systemd/system/mediagoblin.service
  8485. echo 'Environment="USER=mediagoblin","HOME=/home/mediagoblin"' >> /etc/systemd/system/mediagoblin.service
  8486. echo '' >> /etc/systemd/system/mediagoblin.service
  8487. echo '[Install]' >> /etc/systemd/system/mediagoblin.service
  8488. echo 'WantedBy=multi-user.target' >> /etc/systemd/system/mediagoblin.service
  8489. systemctl enable mediagoblin
  8490. systemctl restart mediagoblin
  8491. echo 'install_mediagoblin' >> $COMPLETION_FILE
  8492. }
  8493. function create_upgrade_script {
  8494. if [ -f /usr/local/bin/${PROJECT_NAME}-upgrade ]; then
  8495. cp /usr/local/bin/${PROJECT_NAME}-upgrade /etc/cron.weekly/$UPGRADE_SCRIPT_NAME
  8496. else
  8497. cp /usr/bin/${PROJECT_NAME}-upgrade /etc/cron.weekly/$UPGRADE_SCRIPT_NAME
  8498. fi
  8499. if grep -Fxq "create_upgrade_script" $COMPLETION_FILE; then
  8500. return
  8501. fi
  8502. apt-get -y install unattended-upgrades
  8503. echo 'create_upgrade_script' >> $COMPLETION_FILE
  8504. }
  8505. function intrusion_detection {
  8506. if grep -Fxq "intrusion_detection" $COMPLETION_FILE; then
  8507. return
  8508. fi
  8509. if [[ $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  8510. return
  8511. fi
  8512. apt-get -y install tripwire
  8513. apt-get -y autoremove
  8514. cd /etc/tripwire
  8515. cp site.key $DEFAULT_DOMAIN_NAME-site.key
  8516. echo '*** Installing intrusion detection ***'
  8517. echo '
  8518. ' | tripwire --init
  8519. # make a script for easy resetting of the tripwire
  8520. echo '#!/bin/sh' > /usr/bin/reset-tripwire
  8521. echo 'tripwire --update-policy --secure-mode low /etc/tripwire/twpol.txt' >> /usr/bin/reset-tripwire
  8522. chmod +x /usr/bin/reset-tripwire
  8523. sed -i 's/SYSLOGREPORTING.*/SYSLOGREPORTING =false/g' /etc/tripwire/twcfg.txt
  8524. # only send emails if something has changed
  8525. sed -i 's|MAILNOVIOLATIONS.*|MAILNOVIOLATIONS = false|g' /etc/tripwire/twcfg.txt
  8526. sed -i '/# These files change the behavior of the root account/,/}/ s/.*//g' /etc/tripwire/twpol.txt
  8527. sed -i 's|/etc/rc.boot.*||g' /etc/tripwire/twpol.txt
  8528. # Don't show any changes to /proc
  8529. sed -i 's|/proc.*||g' /etc/tripwire/twpol.txt
  8530. # Don't report log changes
  8531. sed -i 's|/var/log.*||g' /etc/tripwire/twpol.txt
  8532. # Ignore /etc/tripwire
  8533. if ! grep -q "!/etc/tripwire" /etc/tripwire/twpol.txt; then
  8534. sed -i '\|/etc\t\t->.*|a\ !/etc/tripwire;' /etc/tripwire/twpol.txt
  8535. fi
  8536. # Avoid logging the changed database
  8537. sed -i 's|$(TWETC)/tw.pol.*||g' /etc/tripwire/twpol.txt
  8538. # recreate the configuration
  8539. echo '
  8540. ' | twadmin --create-cfgfile -S /etc/tripwire/site.key /etc/tripwire/twcfg.txt
  8541. # reset
  8542. echo '
  8543. ' | reset-tripwire
  8544. echo 'intrusion_detection' >> $COMPLETION_FILE
  8545. }
  8546. # see https://trac.torproject.org/projects/tor/wiki/doc/TransparentProxy
  8547. # Local Redirection and Anonymizing Middlebox
  8548. function route_outgoing_traffic_through_tor {
  8549. if grep -Fxq "route_outgoing_traffic_through_tor" $COMPLETION_FILE; then
  8550. return
  8551. fi
  8552. if [[ $ROUTE_THROUGH_TOR != "yes" ]]; then
  8553. return
  8554. fi
  8555. apt-get -y install tor tor-arm
  8556. ### set variables
  8557. # Destinations you don't want routed through Tor
  8558. _non_tor="192.168.1.0/24 192.168.0.0/24"
  8559. # The user that Tor runs as
  8560. _tor_uid="debian-tor"
  8561. # Tor's TransPort
  8562. _trans_port="9040"
  8563. # Your internal interface
  8564. _int_if="eth0"
  8565. ### Set iptables *nat
  8566. iptables -t nat -A OUTPUT -o lo -j RETURN
  8567. iptables -t nat -A OUTPUT -m owner --uid-owner $_tor_uid -j RETURN
  8568. iptables -t nat -A OUTPUT -p udp --dport 53 -j REDIRECT --to-ports 53
  8569. # Allow clearnet access for hosts in $_non_tor
  8570. for _clearnet in $_non_tor; do
  8571. iptables -t nat -A OUTPUT -d $_clearnet -j RETURN
  8572. iptables -t nat -A PREROUTING -i $_int_if -d $_clearnet -j RETURN
  8573. done
  8574. # Redirect all other pre-routing and output to Tor
  8575. iptables -t nat -A OUTPUT -p tcp --syn -j REDIRECT --to-ports $_trans_port
  8576. iptables -t nat -A PREROUTING -i $_int_if -p udp --dport 53 -j REDIRECT --to-ports 53
  8577. iptables -t nat -A PREROUTING -i $_int_if -p tcp --syn -j REDIRECT --to-ports $_trans_port
  8578. ### set iptables *filter
  8579. iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
  8580. # Allow clearnet access for hosts in $_non_tor
  8581. for _clearnet in $_non_tor 127.0.0.0/8; do
  8582. iptables -A OUTPUT -d $_clearnet -j ACCEPT
  8583. done
  8584. # Allow only Tor output
  8585. iptables -A OUTPUT -m owner --uid-owner $_tor_uid -j ACCEPT
  8586. iptables -A OUTPUT -j REJECT
  8587. save_firewall_settings
  8588. if ! grep -q "fs.file-max" /etc/sysctl.conf; then
  8589. echo "fs.file-max=100000" >> /etc/sysctl.conf
  8590. /sbin/sysctl -p
  8591. fi
  8592. echo 'domain localdomain' > /etc/resolv.conf
  8593. echo 'search localdomain' >> /etc/resolv.conf
  8594. echo 'nameserver 127.0.0.1' >> /etc/resolv.conf
  8595. if ! grep -q "VirtualAddrNetworkIPv4" /etc/tor/torrc; then
  8596. echo 'VirtualAddrNetworkIPv4 10.192.0.0/10' >> /etc/tor/torrc
  8597. fi
  8598. if ! grep -q "AutomapHostsOnResolve" /etc/tor/torrc; then
  8599. echo 'AutomapHostsOnResolve 1' >> /etc/tor/torrc
  8600. fi
  8601. if ! grep -q "TransPort" /etc/tor/torrc; then
  8602. echo 'TransPort 9040' >> /etc/tor/torrc
  8603. fi
  8604. if ! grep -q "TransListenAddress 127.0.0.1" /etc/tor/torrc; then
  8605. echo 'TransListenAddress 127.0.0.1' >> /etc/tor/torrc
  8606. fi
  8607. if ! grep -q "TransListenAddress $LOCAL_NETWORK_STATIC_IP_ADDRESS" /etc/tor/torrc; then
  8608. echo "TransListenAddress $LOCAL_NETWORK_STATIC_IP_ADDRESS" >> /etc/tor/torrc
  8609. fi
  8610. if ! grep -q "DNSPort" /etc/tor/torrc; then
  8611. echo 'DNSPort 53' >> /etc/tor/torrc
  8612. fi
  8613. if ! grep -q "DNSListenAddress 127.0.0.1" /etc/tor/torrc; then
  8614. echo 'DNSListenAddress 127.0.0.1' >> /etc/tor/torrc
  8615. fi
  8616. if ! grep -q "DNSListenAddress $LOCAL_NETWORK_STATIC_IP_ADDRESS" /etc/tor/torrc; then
  8617. echo "DNSListenAddress $LOCAL_NETWORK_STATIC_IP_ADDRESS" >> /etc/tor/torrc
  8618. fi
  8619. echo 'route_outgoing_traffic_through_tor' >> $COMPLETION_FILE
  8620. }
  8621. # A command to create a git repository for a project
  8622. function create_git_project {
  8623. if grep -Fxq "create_git_project" $COMPLETION_FILE; then
  8624. return
  8625. fi
  8626. apt-get -y install git
  8627. echo '#!/bin/bash' > /usr/bin/$CREATE_GIT_PROJECT_COMMAND
  8628. echo '' >> /usr/bin/$CREATE_GIT_PROJECT_COMMAND
  8629. echo 'GIT_PROJECT_NAME=$1' >> /usr/bin/$CREATE_GIT_PROJECT_COMMAND
  8630. echo 'if [ ! $GIT_PROJECT_NAME ]; then' >> /usr/bin/$CREATE_GIT_PROJECT_COMMAND
  8631. echo ' echo "Please specify a project name, without any spaces"' >> /usr/bin/$CREATE_GIT_PROJECT_COMMAND
  8632. echo ' exit 1' >> /usr/bin/$CREATE_GIT_PROJECT_COMMAND
  8633. echo 'fi' >> /usr/bin/$CREATE_GIT_PROJECT_COMMAND
  8634. echo '' >> /usr/bin/$CREATE_GIT_PROJECT_COMMAND
  8635. echo 'if [ ! -d /home/$USER/projects/$GIT_PROJECT_NAME ]; then' >> /usr/bin/$CREATE_GIT_PROJECT_COMMAND
  8636. echo ' mkdir -p /home/$USER/projects/$GIT_PROJECT_NAME' >> /usr/bin/$CREATE_GIT_PROJECT_COMMAND
  8637. echo 'fi' >> /usr/bin/$CREATE_GIT_PROJECT_COMMAND
  8638. echo '' >> /usr/bin/$CREATE_GIT_PROJECT_COMMAND
  8639. echo 'cd /home/$USER/projects/$GIT_PROJECT_NAME' >> /usr/bin/$CREATE_GIT_PROJECT_COMMAND
  8640. echo 'git init --bare' >> /usr/bin/$CREATE_GIT_PROJECT_COMMAND
  8641. echo '' >> /usr/bin/$CREATE_GIT_PROJECT_COMMAND
  8642. echo -n 'echo "Your project has been created, ' >> /usr/bin/$CREATE_GIT_PROJECT_COMMAND
  8643. echo 'use the following command to clone the repository"' >> /usr/bin/$CREATE_GIT_PROJECT_COMMAND
  8644. echo -n " git clone ssh://$MY_USERNAME@$DEFAULT_DOMAIN_NAME:$SSH_PORT" >> /usr/bin/$CREATE_GIT_PROJECT_COMMAND
  8645. echo '/home/$USER/projects/$GIT_PROJECT_NAME' >> /usr/bin/$CREATE_GIT_PROJECT_COMMAND
  8646. echo '' >> /usr/bin/$CREATE_GIT_PROJECT_COMMAND
  8647. echo 'exit 0' >> /usr/bin/$CREATE_GIT_PROJECT_COMMAND
  8648. chmod +x /usr/bin/$CREATE_GIT_PROJECT_COMMAND
  8649. echo 'create_git_project' >> $COMPLETION_FILE
  8650. }
  8651. function check_date {
  8652. curr_date=$(date)
  8653. if [[ $curr_date == *"1970"* ]]; then
  8654. apt-get -y install ntp
  8655. fi
  8656. }
  8657. function install_dynamicdns {
  8658. if [[ $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  8659. return
  8660. fi
  8661. if [[ $ONION_ONLY != "no" ]]; then
  8662. return
  8663. fi
  8664. # update to the next commit
  8665. if [ -d $INSTALL_DIR/inadyn ]; then
  8666. if grep -q "inadyn commit" $COMPLETION_FILE; then
  8667. CURRENT_INADYN_COMMIT=$(grep "inadyn commit" $COMPLETION_FILE | awk -F ':' '{print $2}')
  8668. if [[ "$CURRENT_INADYN_COMMIT" != "$INADYN_COMMIT" ]]; then
  8669. cd $INSTALL_DIR/inadyn
  8670. git_pull $INADYN_REPO $INADYN_COMMIT
  8671. sed -i "s/inadyn commit.*/inadyn commit:$INADYN_COMMIT/g" $COMPLETION_FILE
  8672. ./configure
  8673. USE_OPENSSL=1 make
  8674. make install
  8675. systemctl restart inadyn
  8676. fi
  8677. else
  8678. echo "inadyn commit:$INADYN_COMMIT" >> $COMPLETION_FILE
  8679. fi
  8680. fi
  8681. if grep -Fxq "install_dynamicdns" $COMPLETION_FILE; then
  8682. return
  8683. fi
  8684. # Here we compile from source because the current package
  8685. # doesn't support https, which could result in passwords
  8686. # being leaked
  8687. # Debian version 1.99.4-1
  8688. # https version 1.99.8
  8689. apt-get -y install build-essential curl libgnutls28-dev automake1.11
  8690. git_clone $INADYN_REPO $INSTALL_DIR/inadyn
  8691. if [ ! -d $INSTALL_DIR/inadyn ]; then
  8692. echo 'inadyn repo not cloned'
  8693. echo -n | openssl s_client -showcerts -connect github.com:443 -CApath /etc/ssl/certs
  8694. exit 6785
  8695. fi
  8696. cd $INSTALL_DIR/inadyn
  8697. git checkout $INADYN_COMMIT -b $INADYN_COMMIT
  8698. if ! grep -q "inadyn commit" $COMPLETION_FILE; then
  8699. echo "inadyn commit:$INADYN_COMMIT" >> $COMPLETION_FILE
  8700. else
  8701. sed -i "s/inadyn commit.*/inadyn commit:$INADYN_COMMIT/g" $COMPLETION_FILE
  8702. fi
  8703. ./configure
  8704. if [ ! "$?" = "0" ]; then
  8705. exit 74890
  8706. fi
  8707. USE_OPENSSL=1 make
  8708. if [ ! "$?" = "0" ]; then
  8709. exit 74858
  8710. fi
  8711. make install
  8712. if [ ! "$?" = "0" ]; then
  8713. exit 3785
  8714. fi
  8715. # create an unprivileged user
  8716. #useradd -r -s /bin/false debian-inadyn
  8717. # create a configuration file
  8718. echo 'background' > /etc/inadyn.conf
  8719. echo 'verbose 1' >> /etc/inadyn.conf
  8720. echo 'period 300' >> /etc/inadyn.conf
  8721. echo 'startup-delay 60' >> /etc/inadyn.conf
  8722. echo 'cache-dir /run/inadyn' >> /etc/inadyn.conf
  8723. echo 'logfile /dev/null' >> /etc/inadyn.conf
  8724. chmod 600 /etc/inadyn.conf
  8725. echo '[Unit]' > /etc/systemd/system/inadyn.service
  8726. echo 'Description=inadyn (DynDNS updater)' >> /etc/systemd/system/inadyn.service
  8727. echo 'After=network.target' >> /etc/systemd/system/inadyn.service
  8728. echo '' >> /etc/systemd/system/inadyn.service
  8729. echo '[Service]' >> /etc/systemd/system/inadyn.service
  8730. echo 'ExecStart=/usr/local/sbin/inadyn --config /etc/inadyn.conf' >> /etc/systemd/system/inadyn.service
  8731. echo 'Restart=always' >> /etc/systemd/system/inadyn.service
  8732. echo 'Type=forking' >> /etc/systemd/system/inadyn.service
  8733. echo '' >> /etc/systemd/system/inadyn.service
  8734. echo '[Install]' >> /etc/systemd/system/inadyn.service
  8735. echo 'WantedBy=multi-user.target' >> /etc/systemd/system/inadyn.service
  8736. systemctl enable inadyn
  8737. systemctl start inadyn
  8738. systemctl daemon-reload
  8739. echo 'install_dynamicdns' >> $COMPLETION_FILE
  8740. }
  8741. function get_voip_server_password {
  8742. if [ -f /home/$MY_USERNAME/README ]; then
  8743. if grep -q "VoIP server password" /home/$MY_USERNAME/README; then
  8744. if [ ! $VOIP_SERVER_PASSWORD ]; then
  8745. VOIP_SERVER_PASSWORD=$(cat /home/$MY_USERNAME/README | grep "VoIP server password" | awk -F ':' '{print $2}' | sed 's/^ *//')
  8746. fi
  8747. fi
  8748. fi
  8749. }
  8750. function get_sip_server_password {
  8751. if [ -f /home/$MY_USERNAME/README ]; then
  8752. if grep -q "SIP server password" /home/$MY_USERNAME/README; then
  8753. if [ ! $SIP_SERVER_PASSWORD ]; then
  8754. SIP_SERVER_PASSWORD=$(cat /home/$MY_USERNAME/README | grep "SIP server password" | awk -F ':' '{print $2}' | sed 's/^ *//')
  8755. fi
  8756. fi
  8757. fi
  8758. }
  8759. function install_ipfs {
  8760. if [[ $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_MAILBOX" ]]; then
  8761. return
  8762. fi
  8763. export GOPATH=/home/git/go
  8764. systemctl set-environment GOPATH=/home/git/go
  8765. # update to the next commit
  8766. if [ -d /home/git/go/src/github.com/ipfs/go-ipfs ]; then
  8767. if grep -q "ipfs commit" $COMPLETION_FILE; then
  8768. CURRENT_IPFS_COMMIT=$(grep "ipfs commit" $COMPLETION_FILE | awk -F ':' '{print $2}')
  8769. if [[ "$CURRENT_IPFS_COMMIT" != "$IPFS_COMMIT" ]]; then
  8770. cd /home/git/go/src/github.com/ipfs/go-ipfs
  8771. git_pull $IPFS_GO_REPO $IPFS_COMMIT
  8772. sed -i "s/ipfs commit.*/ipfs commit:$IPFS_COMMIT/g" $COMPLETION_FILE
  8773. chown -R git:git /home/git
  8774. systemctl restart ipfs
  8775. systemctl daemon-reload
  8776. fi
  8777. else
  8778. echo "ipfs commit:$IPFS_COMMIT" >> $COMPLETION_FILE
  8779. fi
  8780. fi
  8781. if grep -Fxq "install_ipfs" $COMPLETION_FILE; then
  8782. return
  8783. fi
  8784. apt-get -y install golang libpam0g-dev fuse
  8785. if [ ! -d /home/git ]; then
  8786. # add a gogs user account
  8787. adduser --disabled-login --gecos 'Gogs' git
  8788. # install Go
  8789. if ! grep -q "export GOPATH=/home/git/go" ~/.bashrc; then
  8790. echo 'export GOPATH=/home/git/go' >> ~/.bashrc
  8791. echo 'systemctl set-environment GOPATH=/home/git/go' >> ~/.bashrc
  8792. fi
  8793. export GOPATH=/home/git/go
  8794. if [ ! -d $GOPATH ]; then
  8795. mkdir -p $GOPATH
  8796. fi
  8797. fi
  8798. IPFS_PATH=/home/git/go/bin
  8799. if ! grep -q 'GOPATH/bin' ~/.bashrc; then
  8800. export PATH="$GOPATH/bin:$PATH:"
  8801. echo 'export PATH="$GOPATH/bin:$PATH:";' >> ~/.bashrc
  8802. fi
  8803. # set gopath for the user
  8804. if ! grep -q "GOPATH=" /home/$MY_USERNAME/.bashrc; then
  8805. echo 'export GOPATH=/home/git/go' >> /home/$MY_USERNAME/.bashrc
  8806. echo 'export PATH="$GOPATH/bin:$PATH:";' >> /home/$MY_USERNAME/.bashrc
  8807. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.bashrc
  8808. fi
  8809. IPFS_GO_REPO2=$(echo "$IPFS_GO_REPO" | sed 's|https://||g')
  8810. go get -u ${IPFS_GO_REPO2}/cmd/ipfs
  8811. if [ ! "$?" = "0" ]; then
  8812. exit 8242
  8813. fi
  8814. cd /home/git/go/src/$IPFS_GO_REPO2
  8815. git checkout $IPFS_COMMIT -b $IPFS_COMMIT
  8816. if ! grep -q "ipfs commit" $COMPLETION_FILE; then
  8817. echo "ipfs commit:$IPFS_COMMIT" >> $COMPLETION_FILE
  8818. else
  8819. sed -i "s/ipfs commit.*/ipfs commit:$IPFS_COMMIT/g" $COMPLETION_FILE
  8820. fi
  8821. # initialise
  8822. su -c "$IPFS_PATH/ipfs init -b 4096" - $MY_USERNAME
  8823. if [ ! -d /home/$MY_USERNAME/.ipfs ]; then
  8824. echo "IPFS could not be initialised for user $MY_USERNAME"
  8825. exit 7358
  8826. fi
  8827. # directories to mount to
  8828. if [ ! -d /ipfs ]; then
  8829. mkdir /ipfs
  8830. mkdir /ipns
  8831. chown $MY_USERNAME:$MY_USERNAME /ipfs
  8832. chown $MY_USERNAME:$MY_USERNAME /ipns
  8833. fi
  8834. if [ -f /etc/fuse.conf ]; then
  8835. chown $MY_USERNAME:$MY_USERNAME /etc/fuse.conf
  8836. fi
  8837. if [ -f /dev/fuse ]; then
  8838. chown $MY_USERNAME:$MY_USERNAME /dev/fuse
  8839. fi
  8840. echo '[Unit]' > /etc/systemd/system/ipfs.service
  8841. echo 'Description=IPFS daemon' >> /etc/systemd/system/ipfs.service
  8842. echo 'After=syslog.target' >> /etc/systemd/system/ipfs.service
  8843. echo 'After=network.target' >> /etc/systemd/system/ipfs.service
  8844. echo '' >> /etc/systemd/system/ipfs.service
  8845. echo '[Service]' >> /etc/systemd/system/ipfs.service
  8846. echo 'Type=simple' >> /etc/systemd/system/ipfs.service
  8847. echo "User=$MY_USERNAME" >> /etc/systemd/system/ipfs.service
  8848. echo "Group=$MY_USERNAME" >> /etc/systemd/system/ipfs.service
  8849. echo "WorkingDirectory=/home/$MY_USERNAME" >> /etc/systemd/system/ipfs.service
  8850. echo "ExecStart=$IPFS_PATH/ipfs daemon --mount" >> /etc/systemd/system/ipfs.service
  8851. echo 'Restart=on-failure' >> /etc/systemd/system/ipfs.service
  8852. echo "Environment=\"USER=$MY_USERNAME\" \"HOME=/home/$MY_USERNAME\" \"GOPATH=/home/git/go\"" >> /etc/systemd/system/ipfs.service
  8853. echo '' >> /etc/systemd/system/ipfs.service
  8854. echo '[Install]' >> /etc/systemd/system/ipfs.service
  8855. echo 'WantedBy=multi-user.target' >> /etc/systemd/system/ipfs.service
  8856. systemctl enable ipfs
  8857. systemctl daemon-reload
  8858. systemctl restart ipfs
  8859. if [ -d /etc/avahi ]; then
  8860. su -c "echo $($IPFS_PATH/ipfs id | grep '\"ID\":' | awk -F '\"' '{print $4}') > /tmp/ipfsid" - $MY_USERNAME
  8861. if [ ! -f /tmp/ipfsid ]; then
  8862. echo 'No IPFS identity was created'
  8863. exit 37895
  8864. fi
  8865. IPFS_PEER_ID=$(cat /tmp/ipfsid)
  8866. if [ ${#IPFS_PEER_ID} -lt 10 ]; then
  8867. echo 'Invalid IPFS peer ID'
  8868. echo "$IPFS_PEER_ID"
  8869. exit 74782
  8870. fi
  8871. # Add an avahi service
  8872. echo '<?xml version="1.0" standalone="no"?><!--*-nxml-*-->' > /etc/avahi/services/ipfs.service
  8873. echo '<!DOCTYPE service-group SYSTEM "avahi-service.dtd">' >> /etc/avahi/services/ipfs.service
  8874. echo '<service-group>' >> /etc/avahi/services/ipfs.service
  8875. echo ' <name replace-wildcards="yes">%h IPFS</name>' >> /etc/avahi/services/ipfs.service
  8876. echo ' <service>' >> /etc/avahi/services/ipfs.service
  8877. echo ' <type>_ipfs._tcp</type>' >> /etc/avahi/services/ipfs.service
  8878. echo " <port>$IPFS_PORT</port>" >> /etc/avahi/services/ipfs.service
  8879. echo " <txt-record>$IPFS_PEER_ID</txt-record>" >> /etc/avahi/services/ipfs.service
  8880. echo ' </service>' >> /etc/avahi/services/ipfs.service
  8881. echo '</service-group>' >> /etc/avahi/services/ipfs.service
  8882. rm /tmp/ipfsid
  8883. fi
  8884. echo 'install_ipfs' >> $COMPLETION_FILE
  8885. }
  8886. function install_voip {
  8887. 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
  8888. return
  8889. fi
  8890. if grep -Fxq "install_voip" $COMPLETION_FILE; then
  8891. return
  8892. fi
  8893. apt-get -y install mumble-server
  8894. get_voip_server_password
  8895. if [ ! $VOIP_SERVER_PASSWORD ]; then
  8896. if [ -f $IMAGE_PASSWORD_FILE ]; then
  8897. VOIP_SERVER_PASSWORD="$(printf `cat $IMAGE_PASSWORD_FILE`)"
  8898. else
  8899. VOIP_SERVER_PASSWORD="$(openssl rand -base64 16)"
  8900. if [ ${#VOIP_SERVER_PASSWORD} -lt $MINIMUM_PASSWORD_LENGTH ]; then
  8901. VOIP_SERVER_PASSWORD="$(openssl rand -base64 16)"
  8902. fi
  8903. fi
  8904. fi
  8905. # Make an ssl cert for the server
  8906. if [ ! -f /etc/ssl/certs/mumble.dhparam ]; then
  8907. ${PROJECT_NAME}-addcert -h mumble --dhkey $DH_KEYLENGTH
  8908. check_certificates mumble
  8909. fi
  8910. # Check that the cert was created
  8911. if [ ! -f /etc/ssl/certs/mumble.crt ]; then
  8912. echo $'VoIP server certificate not created'
  8913. exit 57892
  8914. fi
  8915. if [ ! -f /etc/ssl/private/mumble.key ]; then
  8916. echo $'VoIP server key not created'
  8917. exit 57893
  8918. fi
  8919. if [ ! -d /var/lib/mumble-server ]; then
  8920. mkdir /var/lib/mumble-server
  8921. fi
  8922. cp /etc/ssl/certs/mumble.* /var/lib/mumble-server
  8923. cp /etc/ssl/private/mumble.key /var/lib/mumble-server
  8924. chown -R mumble-server:mumble-server /var/lib/mumble-server
  8925. sed -i "s|welcometext=.*|welcometext=\"<br />Welcome to $DEFAULT_DOMAIN_NAME <b>VoIP</b>.<br />Chat freely!<br />\"|g" /etc/mumble-server.ini
  8926. if [[ $VOIP_SERVER_PASSWORD && $SYSTEM_TYPE != "$VARIANT_MESH" ]]; then
  8927. sed -i "s|serverpassword=.*|serverpassword=$VOIP_SERVER_PASSWORD|g" /etc/mumble-server.ini
  8928. fi
  8929. sed -i 's|#autobanAttempts.*|autobanAttempts = 10|g' /etc/mumble-server.ini
  8930. sed -i 's|#autobanTimeframe.*|autobanTimeframe = 120|g' /etc/mumble-server.ini
  8931. sed -i 's|#autobanTime.*|autobanTime = 300|g' /etc/mumble-server.ini
  8932. sed -i 's|#sendversion=.*|sendversion=False|g' /etc/mumble-server.ini
  8933. sed -i 's|sendversion=.*|sendversion=False|g' /etc/mumble-server.ini
  8934. if ! grep -q "allowping" /etc/mumble-server.ini; then
  8935. echo 'allowping=False' >> /etc/mumble-server.ini
  8936. fi
  8937. sed -i 's|allowping=.*|allowping=False|g' /etc/mumble-server.ini
  8938. sed -i 's|#sslCert=.*|sslCert=/var/lib/mumble-server/mumble.crt|g' /etc/mumble-server.ini
  8939. sed -i 's|#sslKey=.*|sslKey=/var/lib/mumble-server/mumble.key|g' /etc/mumble-server.ini
  8940. sed -i 's|#certrequired=.*|certrequired=True|g' /etc/mumble-server.ini
  8941. sed -i 's|users=100|users=10|g' /etc/mumble-server.ini
  8942. sed -i 's|#channelnestinglimit=10|channelnestinglimit=10|g' /etc/mumble-server.ini
  8943. sed -i 's|#textmessagelength=.*|textmessagelength=1000|g' /etc/mumble-server.ini
  8944. sed -i 's|textmessagelength=.*|textmessagelength=1000|g' /etc/mumble-server.ini
  8945. sed -i 's|#imagemessagelength=.*|imagemessagelength=131072|g' /etc/mumble-server.ini
  8946. sed -i 's|#allowhtml=.*|allowhtml=False|g' /etc/mumble-server.ini
  8947. sed -i 's|allowhtml=.*|allowhtml=False|g' /etc/mumble-server.ini
  8948. sed -i "s|port=.*|port=${VOIP_PORT}|g" /etc/mumble-server.ini
  8949. VOIP_ONION_HOSTNAME=$(add_onion_service voip ${VOIP_PORT} ${VOIP_PORT})
  8950. if ! grep -q $"VoIP onion domain" $COMPLETION_FILE; then
  8951. echo "VoIP onion domain:$VOIP_ONION_HOSTNAME" >> $COMPLETION_FILE
  8952. fi
  8953. systemctl restart mumble-server
  8954. if ! grep -q $"VoIP Server" /home/$MY_USERNAME/README; then
  8955. echo '' >> /home/$MY_USERNAME/README
  8956. echo '' >> /home/$MY_USERNAME/README
  8957. echo $'VoIP Server' >> /home/$MY_USERNAME/README
  8958. echo '===========' >> /home/$MY_USERNAME/README
  8959. echo $"VoIP onion domain:$VOIP_ONION_HOSTNAME" >> /home/$MY_USERNAME/README
  8960. echo $'VoIP server username: mumble-server' >> /home/$MY_USERNAME/README
  8961. if [[ $SYSTEM_TYPE != "VARIANT_MESH" ]]; then
  8962. echo $"VoIP server password: $VOIP_SERVER_PASSWORD" >> /home/$MY_USERNAME/README
  8963. fi
  8964. echo '' >> /home/$MY_USERNAME/README
  8965. echo $'To connect to the VoIP server use your username and the server password shown above.' >> /home/$MY_USERNAME/README
  8966. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
  8967. chmod 600 /home/$MY_USERNAME/README
  8968. fi
  8969. echo 'install_voip' >> $COMPLETION_FILE
  8970. }
  8971. function install_sip {
  8972. 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
  8973. return
  8974. fi
  8975. if grep -Fxq "install_sip" $COMPLETION_FILE; then
  8976. return
  8977. fi
  8978. apt-get -y install sipwitch
  8979. get_sip_server_password
  8980. if [ ! $SIP_SERVER_PASSWORD ]; then
  8981. if [ -f $IMAGE_PASSWORD_FILE ]; then
  8982. SIP_SERVER_PASSWORD="$(printf `cat $IMAGE_PASSWORD_FILE`)"
  8983. else
  8984. SIP_SERVER_PASSWORD="$(openssl rand -base64 10)"
  8985. fi
  8986. fi
  8987. echo '<?xml version="1.0"?>' > /etc/sipwitch.conf
  8988. echo '<sipwitch>' >> /etc/sipwitch.conf
  8989. echo '<provision>' >> /etc/sipwitch.conf
  8990. echo "<user id=\"$MY_USERNAME\">" >> /etc/sipwitch.conf
  8991. echo '<extension>201</extension>' >> /etc/sipwitch.conf
  8992. echo "<secret>$SIP_SERVER_PASSWORD</secret>" >> /etc/sipwitch.conf
  8993. echo "<display>$MY_USERNAME 201</display>" >> /etc/sipwitch.conf
  8994. echo '</user>' >> /etc/sipwitch.conf
  8995. echo '</provision>' >> /etc/sipwitch.conf
  8996. echo '<access>' >> /etc/sipwitch.conf
  8997. echo '</access>' >> /etc/sipwitch.conf
  8998. echo '<stack>' >> /etc/sipwitch.conf
  8999. echo " <localnames>$DEFAULT_DOMAIN_NAME</localnames>" >> /etc/sipwitch.conf
  9000. echo ' <mapped>200</mapped>' >> /etc/sipwitch.conf
  9001. echo ' <threading>2</threading>' >> /etc/sipwitch.conf
  9002. echo ' <interface>*</interface>' >> /etc/sipwitch.conf
  9003. echo ' <dumping>false</dumping>' >> /etc/sipwitch.conf
  9004. echo ' <system>system</system>' >> /etc/sipwitch.conf
  9005. echo ' <anon>anonymous</anon>' >> /etc/sipwitch.conf
  9006. echo '</stack>' >> /etc/sipwitch.conf
  9007. echo '<timers>' >> /etc/sipwitch.conf
  9008. echo ' <!-- ring every 4 seconds -->' >> /etc/sipwitch.conf
  9009. echo ' <ring>4</ring>' >> /etc/sipwitch.conf
  9010. echo ' <!-- call forward no answer after x rings -->' >> /etc/sipwitch.conf
  9011. echo ' <cfna>4</cfna>' >> /etc/sipwitch.conf
  9012. echo ' <!-- call reset to clear cid in stack, 6 seconds -->' >> /etc/sipwitch.conf
  9013. echo ' <reset>6</reset>' >> /etc/sipwitch.conf
  9014. echo '</timers>' >> /etc/sipwitch.conf
  9015. echo '<!-- we have 2xx numbers plus space for external users -->' >> /etc/sipwitch.conf
  9016. echo '<registry>' >> /etc/sipwitch.conf
  9017. echo ' <prefix>200</prefix>' >> /etc/sipwitch.conf
  9018. echo ' <range>100</range>' >> /etc/sipwitch.conf
  9019. echo ' <keysize>77</keysize>' >> /etc/sipwitch.conf
  9020. echo ' <mapped>200</mapped>' >> /etc/sipwitch.conf
  9021. echo ' <!-- <realm>GNU Telephony</realm> -->' >> /etc/sipwitch.conf
  9022. echo '</registry>' >> /etc/sipwitch.conf
  9023. echo '<routing>' >> /etc/sipwitch.conf
  9024. echo '</routing>' >> /etc/sipwitch.conf
  9025. echo '</sipwitch>' >> /etc/sipwitch.conf
  9026. sed -i 's|#PLUGINS=|PLUGINS=|g' /etc/default/sipwitch
  9027. groupadd sipwitch
  9028. usermod -aG sipwitch $MY_USERNAME
  9029. SIP_ONION_HOSTNAME=$(add_onion_service sip ${SIP_PORT} ${SIP_PORT})
  9030. if ! grep -q $"SIP onion domain" $COMPLETION_FILE; then
  9031. echo "SIP onion domain:$SIP_ONION_HOSTNAME" >> $COMPLETION_FILE
  9032. fi
  9033. systemctl restart sipwitch
  9034. if ! grep -q $"SIP Server" /home/$MY_USERNAME/README; then
  9035. echo '' >> /home/$MY_USERNAME/README
  9036. echo '' >> /home/$MY_USERNAME/README
  9037. echo $'SIP Server' >> /home/$MY_USERNAME/README
  9038. echo '==========' >> /home/$MY_USERNAME/README
  9039. echo $"SIP onion_domain: $SIP_ONION_HOSTNAME" >> /home/$MY_USERNAME/README
  9040. echo $"SIP server username: $MY_USERNAME" >> /home/$MY_USERNAME/README
  9041. echo $"SIP server extension: 201" >> /home/$MY_USERNAME/README
  9042. echo $"SIP server password: $SIP_SERVER_PASSWORD" >> /home/$MY_USERNAME/README
  9043. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
  9044. chmod 600 /home/$MY_USERNAME/README
  9045. fi
  9046. echo 'install_sip' >> $COMPLETION_FILE
  9047. }
  9048. function install_final {
  9049. if grep -Fxq "install_final" $COMPLETION_FILE; then
  9050. return
  9051. fi
  9052. # unmount any attached usb drive
  9053. if [ -d $USB_MOUNT ]; then
  9054. umount $USB_MOUNT
  9055. rm -rf $USB_MOUNT
  9056. fi
  9057. split_gpg_key_into_fragments
  9058. echo 'install_final' >> $COMPLETION_FILE
  9059. clear
  9060. echo ''
  9061. echo $"
  9062. *** ${PROJECT_NAME} installation is complete. Rebooting... ***
  9063. Now forward these ports from your internet router
  9064. HTTP 80
  9065. HTTPS 443
  9066. SSH 2222
  9067. DLNA 1900
  9068. DLNA 8200
  9069. XMPP 5222-5223
  9070. XMPP 5269
  9071. XMPP 5280-5281
  9072. IRC 6697
  9073. Git 9418
  9074. Email 25
  9075. Email 587
  9076. Email 465
  9077. Email 993
  9078. VoIP 64738
  9079. VoIP 5060
  9080. Tox 33445
  9081. IPFS 4001
  9082. "
  9083. if [ -f "/home/$MY_USERNAME/README" ]; then
  9084. echo $"See /home/$MY_USERNAME/README for post-installation instructions."
  9085. echo ''
  9086. fi
  9087. if [ ! -f $IMAGE_PASSWORD_FILE ]; then
  9088. reboot
  9089. fi
  9090. }
  9091. read_configuration
  9092. set_default_onion_domains
  9093. locale_setup
  9094. parse_args
  9095. check_domains
  9096. install_not_on_BBB
  9097. remove_default_user
  9098. configure_firewall
  9099. configure_firewall_ping
  9100. configure_firewall_for_ssh
  9101. configure_firewall_for_dns
  9102. configure_firewall_for_ftp
  9103. configure_firewall_for_web_access
  9104. configure_firewall_for_voip
  9105. configure_firewall_for_sip
  9106. configure_firewall_for_avahi
  9107. configure_firewall_for_zeronet
  9108. configure_firewall_for_ipfs
  9109. remove_proprietary_repos
  9110. change_debian_repos
  9111. enable_backports
  9112. configure_dns
  9113. initial_setup
  9114. install_tor
  9115. enable_ssh_via_onion
  9116. check_date
  9117. install_dynamicdns
  9118. randomize_cron
  9119. create_freedns_updater
  9120. mark_admin_user_account
  9121. enforce_good_passwords
  9122. install_editor
  9123. change_login_message
  9124. enable_zram
  9125. random_number_generator
  9126. set_your_domain_name
  9127. time_synchronisation
  9128. configure_internet_protocol
  9129. create_git_project
  9130. configure_ssh
  9131. configure_ssh_onion
  9132. allow_ssh_to_onion_address
  9133. remove_instructions_from_motd
  9134. check_hwrng
  9135. search_for_attached_usb_drive
  9136. regenerate_ssh_keys
  9137. create_mirrors
  9138. create_upgrade_script
  9139. letsencrypt_renewals
  9140. install_zeronet
  9141. install_watchdog_script
  9142. configure_avahi
  9143. create_avahi_onion_domains
  9144. install_zeronet_blog
  9145. install_zeronet_mail
  9146. install_zeronet_forum
  9147. #install_atheros_wifi
  9148. configure_firewall_for_cjdns
  9149. mesh_cjdns
  9150. mesh_cjdns_tools
  9151. configure_firewall_for_batman
  9152. mesh_batman_bridge
  9153. configure_firewall_for_babel
  9154. mesh_babel
  9155. route_outgoing_traffic_through_tor
  9156. configure_email
  9157. create_procmail
  9158. spam_filtering
  9159. configure_imap
  9160. #configure_imap_client_certs
  9161. configure_gpg
  9162. configure_backup_key
  9163. encrypt_incoming_email
  9164. encrypt_outgoing_email
  9165. email_client
  9166. email_archiving
  9167. email_from_address
  9168. configure_firewall_for_email
  9169. create_public_mailing_list
  9170. #create_private_mailing_list
  9171. encrypt_all_email
  9172. import_email
  9173. script_for_attaching_usb_drive
  9174. install_web_server
  9175. configure_firewall_for_web_server
  9176. install_owncloud
  9177. install_owncloud_music_app
  9178. configure_owncloud_onion_site
  9179. install_gogs
  9180. install_xmpp
  9181. install_tox_node
  9182. install_tox_client
  9183. tox_avahi
  9184. configure_firewall_for_xmpp
  9185. install_irc_server
  9186. configure_firewall_for_irc
  9187. install_voip
  9188. install_sip
  9189. install_wiki
  9190. install_blog
  9191. mark_blog_domain
  9192. install_gnu_social
  9193. install_gnu_social_theme
  9194. install_hubzilla
  9195. install_dlna_server
  9196. configure_firewall_for_dlna
  9197. #install_mediagoblin
  9198. #install_ipfs
  9199. repair_databases_script
  9200. backup_to_friends_servers
  9201. intrusion_detection
  9202. install_final
  9203. echo "${PROJECT_NAME} installation is complete"
  9204. exit 0