freedombone 514KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334433543364337433843394340434143424343434443454346434743484349435043514352435343544355435643574358435943604361436243634364436543664367436843694370437143724373437443754376437743784379438043814382438343844385438643874388438943904391439243934394439543964397439843994400440144024403440444054406440744084409441044114412441344144415441644174418441944204421442244234424442544264427442844294430443144324433443444354436443744384439444044414442444344444445444644474448444944504451445244534454445544564457445844594460446144624463446444654466446744684469447044714472447344744475447644774478447944804481448244834484448544864487448844894490449144924493449444954496449744984499450045014502450345044505450645074508450945104511451245134514451545164517451845194520452145224523452445254526452745284529453045314532453345344535453645374538453945404541454245434544454545464547454845494550455145524553455445554556455745584559456045614562456345644565456645674568456945704571457245734574457545764577457845794580458145824583458445854586458745884589459045914592459345944595459645974598459946004601460246034604460546064607460846094610461146124613461446154616461746184619462046214622462346244625462646274628462946304631463246334634463546364637463846394640464146424643464446454646464746484649465046514652465346544655465646574658465946604661466246634664466546664667466846694670467146724673467446754676467746784679468046814682468346844685468646874688468946904691469246934694469546964697469846994700470147024703470447054706470747084709471047114712471347144715471647174718471947204721472247234724472547264727472847294730473147324733473447354736473747384739474047414742474347444745474647474748474947504751475247534754475547564757475847594760476147624763476447654766476747684769477047714772477347744775477647774778477947804781478247834784478547864787478847894790479147924793479447954796479747984799480048014802480348044805480648074808480948104811481248134814481548164817481848194820482148224823482448254826482748284829483048314832483348344835483648374838483948404841484248434844484548464847484848494850485148524853485448554856485748584859486048614862486348644865486648674868486948704871487248734874487548764877487848794880488148824883488448854886488748884889489048914892489348944895489648974898489949004901490249034904490549064907490849094910491149124913491449154916491749184919492049214922492349244925492649274928492949304931493249334934493549364937493849394940494149424943494449454946494749484949495049514952495349544955495649574958495949604961496249634964496549664967496849694970497149724973497449754976497749784979498049814982498349844985498649874988498949904991499249934994499549964997499849995000500150025003500450055006500750085009501050115012501350145015501650175018501950205021502250235024502550265027502850295030503150325033503450355036503750385039504050415042504350445045504650475048504950505051505250535054505550565057505850595060506150625063506450655066506750685069507050715072507350745075507650775078507950805081508250835084508550865087508850895090509150925093509450955096509750985099510051015102510351045105510651075108510951105111511251135114511551165117511851195120512151225123512451255126512751285129513051315132513351345135513651375138513951405141514251435144514551465147514851495150515151525153515451555156515751585159516051615162516351645165516651675168516951705171517251735174517551765177517851795180518151825183518451855186518751885189519051915192519351945195519651975198519952005201520252035204520552065207520852095210521152125213521452155216521752185219522052215222522352245225522652275228522952305231523252335234523552365237523852395240524152425243524452455246524752485249525052515252525352545255525652575258525952605261526252635264526552665267526852695270527152725273527452755276527752785279528052815282528352845285528652875288528952905291529252935294529552965297529852995300530153025303530453055306530753085309531053115312531353145315531653175318531953205321532253235324532553265327532853295330533153325333533453355336533753385339534053415342534353445345534653475348534953505351535253535354535553565357535853595360536153625363536453655366536753685369537053715372537353745375537653775378537953805381538253835384538553865387538853895390539153925393539453955396539753985399540054015402540354045405540654075408540954105411541254135414541554165417541854195420542154225423542454255426542754285429543054315432543354345435543654375438543954405441544254435444544554465447544854495450545154525453545454555456545754585459546054615462546354645465546654675468546954705471547254735474547554765477547854795480548154825483548454855486548754885489549054915492549354945495549654975498549955005501550255035504550555065507550855095510551155125513551455155516551755185519552055215522552355245525552655275528552955305531553255335534553555365537553855395540554155425543554455455546554755485549555055515552555355545555555655575558555955605561556255635564556555665567556855695570557155725573557455755576557755785579558055815582558355845585558655875588558955905591559255935594559555965597559855995600560156025603560456055606560756085609561056115612561356145615561656175618561956205621562256235624562556265627562856295630563156325633563456355636563756385639564056415642564356445645564656475648564956505651565256535654565556565657565856595660566156625663566456655666566756685669567056715672567356745675567656775678567956805681568256835684568556865687568856895690569156925693569456955696569756985699570057015702570357045705570657075708570957105711571257135714571557165717571857195720572157225723572457255726572757285729573057315732573357345735573657375738573957405741574257435744574557465747574857495750575157525753575457555756575757585759576057615762576357645765576657675768576957705771577257735774577557765777577857795780578157825783578457855786578757885789579057915792579357945795579657975798579958005801580258035804580558065807580858095810581158125813581458155816581758185819582058215822582358245825582658275828582958305831583258335834583558365837583858395840584158425843584458455846584758485849585058515852585358545855585658575858585958605861586258635864586558665867586858695870587158725873587458755876587758785879588058815882588358845885588658875888588958905891589258935894589558965897589858995900590159025903590459055906590759085909591059115912591359145915591659175918591959205921592259235924592559265927592859295930593159325933593459355936593759385939594059415942594359445945594659475948594959505951595259535954595559565957595859595960596159625963596459655966596759685969597059715972597359745975597659775978597959805981598259835984598559865987598859895990599159925993599459955996599759985999600060016002600360046005600660076008600960106011601260136014601560166017601860196020602160226023602460256026602760286029603060316032603360346035603660376038603960406041604260436044604560466047604860496050605160526053605460556056605760586059606060616062606360646065606660676068606960706071607260736074607560766077607860796080608160826083608460856086608760886089609060916092609360946095609660976098609961006101610261036104610561066107610861096110611161126113611461156116611761186119612061216122612361246125612661276128612961306131613261336134613561366137613861396140614161426143614461456146614761486149615061516152615361546155615661576158615961606161616261636164616561666167616861696170617161726173617461756176617761786179618061816182618361846185618661876188618961906191619261936194619561966197619861996200620162026203620462056206620762086209621062116212621362146215621662176218621962206221622262236224622562266227622862296230623162326233623462356236623762386239624062416242624362446245624662476248624962506251625262536254625562566257625862596260626162626263626462656266626762686269627062716272627362746275627662776278627962806281628262836284628562866287628862896290629162926293629462956296629762986299630063016302630363046305630663076308630963106311631263136314631563166317631863196320632163226323632463256326632763286329633063316332633363346335633663376338633963406341634263436344634563466347634863496350635163526353635463556356635763586359636063616362636363646365636663676368636963706371637263736374637563766377637863796380638163826383638463856386638763886389639063916392639363946395639663976398639964006401640264036404640564066407640864096410641164126413641464156416641764186419642064216422642364246425642664276428642964306431643264336434643564366437643864396440644164426443644464456446644764486449645064516452645364546455645664576458645964606461646264636464646564666467646864696470647164726473647464756476647764786479648064816482648364846485648664876488648964906491649264936494649564966497649864996500650165026503650465056506650765086509651065116512651365146515651665176518651965206521652265236524652565266527652865296530653165326533653465356536653765386539654065416542654365446545654665476548654965506551655265536554655565566557655865596560656165626563656465656566656765686569657065716572657365746575657665776578657965806581658265836584658565866587658865896590659165926593659465956596659765986599660066016602660366046605660666076608660966106611661266136614661566166617661866196620662166226623662466256626662766286629663066316632663366346635663666376638663966406641664266436644664566466647664866496650665166526653665466556656665766586659666066616662666366646665666666676668666966706671667266736674667566766677667866796680668166826683668466856686668766886689669066916692669366946695669666976698669967006701670267036704670567066707670867096710671167126713671467156716671767186719672067216722672367246725672667276728672967306731673267336734673567366737673867396740674167426743674467456746674767486749675067516752675367546755675667576758675967606761676267636764676567666767676867696770677167726773677467756776677767786779678067816782678367846785678667876788678967906791679267936794679567966797679867996800680168026803680468056806680768086809681068116812681368146815681668176818681968206821682268236824682568266827682868296830683168326833683468356836683768386839684068416842684368446845684668476848684968506851685268536854685568566857685868596860686168626863686468656866686768686869687068716872687368746875687668776878687968806881688268836884688568866887688868896890689168926893689468956896689768986899690069016902690369046905690669076908690969106911691269136914691569166917691869196920692169226923692469256926692769286929693069316932693369346935693669376938693969406941694269436944694569466947694869496950695169526953695469556956695769586959696069616962696369646965696669676968696969706971697269736974697569766977697869796980698169826983698469856986698769886989699069916992699369946995699669976998699970007001700270037004700570067007700870097010701170127013701470157016701770187019702070217022702370247025702670277028702970307031703270337034703570367037703870397040704170427043704470457046704770487049705070517052705370547055705670577058705970607061706270637064706570667067706870697070707170727073707470757076707770787079708070817082708370847085708670877088708970907091709270937094709570967097709870997100710171027103710471057106710771087109711071117112711371147115711671177118711971207121712271237124712571267127712871297130713171327133713471357136713771387139714071417142714371447145714671477148714971507151715271537154715571567157715871597160716171627163716471657166716771687169717071717172717371747175717671777178717971807181718271837184718571867187718871897190719171927193719471957196719771987199720072017202720372047205720672077208720972107211721272137214721572167217721872197220722172227223722472257226722772287229723072317232723372347235723672377238723972407241724272437244724572467247724872497250725172527253725472557256725772587259726072617262726372647265726672677268726972707271727272737274727572767277727872797280728172827283728472857286728772887289729072917292729372947295729672977298729973007301730273037304730573067307730873097310731173127313731473157316731773187319732073217322732373247325732673277328732973307331733273337334733573367337733873397340734173427343734473457346734773487349735073517352735373547355735673577358735973607361736273637364736573667367736873697370737173727373737473757376737773787379738073817382738373847385738673877388738973907391739273937394739573967397739873997400740174027403740474057406740774087409741074117412741374147415741674177418741974207421742274237424742574267427742874297430743174327433743474357436743774387439744074417442744374447445744674477448744974507451745274537454745574567457745874597460746174627463746474657466746774687469747074717472747374747475747674777478747974807481748274837484748574867487748874897490749174927493749474957496749774987499750075017502750375047505750675077508750975107511751275137514751575167517751875197520752175227523752475257526752775287529753075317532753375347535753675377538753975407541754275437544754575467547754875497550755175527553755475557556755775587559756075617562756375647565756675677568756975707571757275737574757575767577757875797580758175827583758475857586758775887589759075917592759375947595759675977598759976007601760276037604760576067607760876097610761176127613761476157616761776187619762076217622762376247625762676277628762976307631763276337634763576367637763876397640764176427643764476457646764776487649765076517652765376547655765676577658765976607661766276637664766576667667766876697670767176727673767476757676767776787679768076817682768376847685768676877688768976907691769276937694769576967697769876997700770177027703770477057706770777087709771077117712771377147715771677177718771977207721772277237724772577267727772877297730773177327733773477357736773777387739774077417742774377447745774677477748774977507751775277537754775577567757775877597760776177627763776477657766776777687769777077717772777377747775777677777778777977807781778277837784778577867787778877897790779177927793779477957796779777987799780078017802780378047805780678077808780978107811781278137814781578167817781878197820782178227823782478257826782778287829783078317832783378347835783678377838783978407841784278437844784578467847784878497850785178527853785478557856785778587859786078617862786378647865786678677868786978707871787278737874787578767877787878797880788178827883788478857886788778887889789078917892789378947895789678977898789979007901790279037904790579067907790879097910791179127913791479157916791779187919792079217922792379247925792679277928792979307931793279337934793579367937793879397940794179427943794479457946794779487949795079517952795379547955795679577958795979607961796279637964796579667967796879697970797179727973797479757976797779787979798079817982798379847985798679877988798979907991799279937994799579967997799879998000800180028003800480058006800780088009801080118012801380148015801680178018801980208021802280238024802580268027802880298030803180328033803480358036803780388039804080418042804380448045804680478048804980508051805280538054805580568057805880598060806180628063806480658066806780688069807080718072807380748075807680778078807980808081808280838084808580868087808880898090809180928093809480958096809780988099810081018102810381048105810681078108810981108111811281138114811581168117811881198120812181228123812481258126812781288129813081318132813381348135813681378138813981408141814281438144814581468147814881498150815181528153815481558156815781588159816081618162816381648165816681678168816981708171817281738174817581768177817881798180818181828183818481858186818781888189819081918192819381948195819681978198819982008201820282038204820582068207820882098210821182128213821482158216821782188219822082218222822382248225822682278228822982308231823282338234823582368237823882398240824182428243824482458246824782488249825082518252825382548255825682578258825982608261826282638264826582668267826882698270827182728273827482758276827782788279828082818282828382848285828682878288828982908291829282938294829582968297829882998300830183028303830483058306830783088309831083118312831383148315831683178318831983208321832283238324832583268327832883298330833183328333833483358336833783388339834083418342834383448345834683478348834983508351835283538354835583568357835883598360836183628363836483658366836783688369837083718372837383748375837683778378837983808381838283838384838583868387838883898390839183928393839483958396839783988399840084018402840384048405840684078408840984108411841284138414841584168417841884198420842184228423842484258426842784288429843084318432843384348435843684378438843984408441844284438444844584468447844884498450845184528453845484558456845784588459846084618462846384648465846684678468846984708471847284738474847584768477847884798480848184828483848484858486848784888489849084918492849384948495849684978498849985008501850285038504850585068507850885098510851185128513851485158516851785188519852085218522852385248525852685278528852985308531853285338534853585368537853885398540854185428543854485458546854785488549855085518552855385548555855685578558855985608561856285638564856585668567856885698570857185728573857485758576857785788579858085818582858385848585858685878588858985908591859285938594859585968597859885998600860186028603860486058606860786088609861086118612861386148615861686178618861986208621862286238624862586268627862886298630863186328633863486358636863786388639864086418642864386448645864686478648864986508651865286538654865586568657865886598660866186628663866486658666866786688669867086718672867386748675867686778678867986808681868286838684868586868687868886898690869186928693869486958696869786988699870087018702870387048705870687078708870987108711871287138714871587168717871887198720872187228723872487258726872787288729873087318732873387348735873687378738873987408741874287438744874587468747874887498750875187528753875487558756875787588759876087618762876387648765876687678768876987708771877287738774877587768777877887798780878187828783878487858786878787888789879087918792879387948795879687978798879988008801880288038804880588068807880888098810881188128813881488158816881788188819882088218822882388248825882688278828882988308831883288338834883588368837883888398840884188428843884488458846884788488849885088518852885388548855885688578858885988608861886288638864886588668867886888698870887188728873887488758876887788788879888088818882888388848885888688878888888988908891889288938894889588968897889888998900890189028903890489058906890789088909891089118912891389148915891689178918891989208921892289238924892589268927892889298930893189328933893489358936893789388939894089418942894389448945894689478948894989508951895289538954895589568957895889598960896189628963896489658966896789688969897089718972897389748975897689778978897989808981898289838984898589868987898889898990899189928993899489958996899789988999900090019002900390049005900690079008900990109011901290139014901590169017901890199020902190229023902490259026902790289029903090319032903390349035903690379038903990409041904290439044904590469047904890499050905190529053905490559056905790589059906090619062906390649065906690679068906990709071907290739074907590769077907890799080908190829083908490859086908790889089909090919092909390949095909690979098909991009101910291039104910591069107910891099110911191129113911491159116911791189119912091219122912391249125912691279128912991309131913291339134913591369137913891399140914191429143914491459146914791489149915091519152915391549155915691579158915991609161916291639164916591669167916891699170917191729173917491759176917791789179918091819182918391849185918691879188918991909191919291939194919591969197919891999200920192029203920492059206920792089209921092119212921392149215921692179218921992209221922292239224922592269227922892299230923192329233923492359236923792389239924092419242924392449245924692479248924992509251925292539254925592569257925892599260926192629263926492659266926792689269927092719272927392749275927692779278927992809281928292839284928592869287928892899290929192929293929492959296929792989299930093019302930393049305930693079308930993109311931293139314931593169317931893199320932193229323932493259326932793289329933093319332933393349335933693379338933993409341934293439344934593469347934893499350935193529353935493559356935793589359936093619362936393649365936693679368936993709371937293739374937593769377937893799380938193829383938493859386938793889389939093919392939393949395939693979398939994009401940294039404940594069407940894099410941194129413941494159416941794189419942094219422942394249425942694279428942994309431943294339434943594369437943894399440944194429443944494459446944794489449945094519452945394549455945694579458945994609461946294639464946594669467946894699470947194729473947494759476947794789479948094819482948394849485948694879488948994909491949294939494949594969497949894999500950195029503950495059506950795089509951095119512951395149515951695179518951995209521952295239524952595269527952895299530953195329533953495359536953795389539954095419542954395449545954695479548954995509551955295539554955595569557955895599560956195629563956495659566956795689569957095719572957395749575957695779578957995809581958295839584958595869587958895899590959195929593959495959596959795989599960096019602960396049605960696079608960996109611961296139614961596169617961896199620962196229623962496259626962796289629963096319632963396349635963696379638963996409641964296439644964596469647964896499650965196529653965496559656965796589659966096619662966396649665966696679668966996709671967296739674967596769677967896799680968196829683968496859686968796889689969096919692969396949695969696979698969997009701970297039704970597069707970897099710971197129713971497159716971797189719972097219722972397249725972697279728972997309731973297339734973597369737973897399740974197429743974497459746974797489749975097519752975397549755975697579758975997609761976297639764976597669767976897699770977197729773977497759776977797789779978097819782978397849785978697879788978997909791979297939794979597969797979897999800980198029803980498059806980798089809981098119812981398149815981698179818981998209821982298239824982598269827982898299830983198329833983498359836983798389839984098419842984398449845984698479848984998509851985298539854985598569857985898599860986198629863986498659866986798689869987098719872987398749875987698779878987998809881988298839884988598869887988898899890989198929893989498959896989798989899990099019902990399049905990699079908990999109911991299139914991599169917991899199920992199229923992499259926992799289929993099319932993399349935993699379938993999409941994299439944994599469947994899499950995199529953995499559956995799589959996099619962996399649965996699679968996999709971997299739974997599769977997899799980998199829983998499859986998799889989999099919992999399949995999699979998999910000100011000210003100041000510006100071000810009100101001110012100131001410015100161001710018100191002010021100221002310024100251002610027100281002910030100311003210033100341003510036100371003810039100401004110042100431004410045100461004710048100491005010051100521005310054100551005610057100581005910060100611006210063100641006510066100671006810069100701007110072100731007410075100761007710078100791008010081100821008310084100851008610087100881008910090100911009210093100941009510096100971009810099101001010110102101031010410105101061010710108101091011010111101121011310114101151011610117101181011910120101211012210123101241012510126101271012810129101301013110132101331013410135101361013710138101391014010141101421014310144101451014610147101481014910150101511015210153101541015510156101571015810159101601016110162101631016410165101661016710168101691017010171101721017310174101751017610177101781017910180101811018210183101841018510186101871018810189101901019110192101931019410195101961019710198101991020010201102021020310204102051020610207102081020910210102111021210213102141021510216102171021810219102201022110222102231022410225102261022710228102291023010231102321023310234102351023610237102381023910240102411024210243102441024510246102471024810249102501025110252102531025410255102561025710258102591026010261102621026310264102651026610267102681026910270102711027210273102741027510276102771027810279102801028110282102831028410285102861028710288102891029010291102921029310294102951029610297102981029910300103011030210303103041030510306103071030810309103101031110312103131031410315103161031710318103191032010321103221032310324103251032610327103281032910330103311033210333103341033510336103371033810339103401034110342103431034410345103461034710348103491035010351103521035310354103551035610357103581035910360103611036210363103641036510366103671036810369103701037110372103731037410375103761037710378103791038010381103821038310384103851038610387103881038910390103911039210393103941039510396103971039810399104001040110402104031040410405104061040710408104091041010411104121041310414104151041610417104181041910420104211042210423104241042510426104271042810429104301043110432104331043410435104361043710438104391044010441104421044310444104451044610447104481044910450104511045210453104541045510456104571045810459104601046110462104631046410465104661046710468104691047010471104721047310474104751047610477104781047910480104811048210483104841048510486104871048810489104901049110492104931049410495104961049710498104991050010501105021050310504105051050610507105081050910510105111051210513105141051510516105171051810519105201052110522105231052410525105261052710528105291053010531105321053310534105351053610537105381053910540105411054210543105441054510546105471054810549105501055110552105531055410555105561055710558105591056010561105621056310564105651056610567105681056910570105711057210573105741057510576105771057810579105801058110582105831058410585105861058710588105891059010591105921059310594105951059610597105981059910600106011060210603106041060510606106071060810609106101061110612106131061410615106161061710618106191062010621106221062310624106251062610627106281062910630106311063210633106341063510636106371063810639106401064110642106431064410645106461064710648106491065010651106521065310654106551065610657106581065910660106611066210663106641066510666106671066810669106701067110672106731067410675106761067710678106791068010681106821068310684106851068610687106881068910690106911069210693106941069510696106971069810699107001070110702107031070410705107061070710708107091071010711107121071310714107151071610717107181071910720107211072210723107241072510726107271072810729107301073110732107331073410735107361073710738107391074010741107421074310744107451074610747107481074910750107511075210753107541075510756107571075810759107601076110762107631076410765107661076710768107691077010771107721077310774107751077610777107781077910780107811078210783107841078510786107871078810789107901079110792107931079410795107961079710798107991080010801108021080310804108051080610807108081080910810108111081210813108141081510816108171081810819108201082110822108231082410825108261082710828108291083010831108321083310834108351083610837108381083910840108411084210843108441084510846108471084810849108501085110852108531085410855108561085710858108591086010861108621086310864108651086610867108681086910870
  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 Affero 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 Affero General Public License for more details.
  27. #
  28. # You should have received a copy of the GNU Affero 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. # default search engine for command line browser
  44. DEFAULT_SEARCH='https://searx.laquadrature.net'
  45. # Are we installing on a Beaglebone Black (BBB) or some other system?
  46. INSTALLING_ON_BBB="no"
  47. # Version number of this script
  48. VERSION="1.01"
  49. # if yes then this minimises the number of descisions presented during install
  50. MINIMAL_INSTALL="yes"
  51. # Whether web sites will be .onion addresses only
  52. ONION_ONLY="no"
  53. # Different system variants which may be specified within
  54. # the SYSTEM_TYPE option
  55. VARIANT_FULL="full"
  56. VARIANT_WRITER="writer"
  57. VARIANT_CLOUD="cloud"
  58. VARIANT_CHAT="chat"
  59. VARIANT_MAILBOX="mailbox"
  60. VARIANT_NONMAILBOX="nonmailbox"
  61. VARIANT_SOCIAL="social"
  62. VARIANT_MEDIA="media"
  63. VARIANT_DEVELOPER="developer"
  64. VARIANT_MESH="mesh"
  65. DEFAULT_DOMAIN_NAME=
  66. DEFAULT_DOMAIN_CODE=
  67. MY_USERNAME=
  68. SYSTEM_TYPE=$VARIANT_FULL
  69. # whether the system is being installed from a pre-created configuration file
  70. INSTALLING_FROM_CONFIGURATION_FILE="no"
  71. # An optional configuration file which overrides some of these variables
  72. CONFIGURATION_FILE="${PROJECT_NAME}.cfg"
  73. SSH_PORT=2222
  74. IRC_PORT=6697
  75. IRC_ONION_PORT=8093
  76. # password used for accessing your repo mirrors
  77. MY_MIRRORS_PASSWORD=
  78. # friend's repo mirrors
  79. FRIENDS_MIRRORS_PASSWORD=
  80. FRIENDS_MIRRORS_SERVER=
  81. FRIENDS_MIRRORS_SSH_PORT=2222
  82. # This isn't used here, but is included for mirrors creation purposes
  83. LETSENCRYPT_REPO="https://github.com/letsencrypt/letsencrypt"
  84. # An optional password to log into IRC. This applies to all users
  85. IRC_PASSWORD=
  86. # If this file exists it contains a global password used with
  87. # disk image installs. This simplifies password management for
  88. # deployment at scale
  89. IMAGE_PASSWORD_FILE=/root/login.txt
  90. # parameters used when adding a new domain
  91. DDNS_PROVIDER="default@freedns.afraid.org"
  92. DDNS_USERNAME=
  93. DDNS_PASSWORD=
  94. EXIM_ONION_REPO="https://github.com/petterreinholdtsen/exim4-smtorp"
  95. NGINX_ENSITE_REPO="https://github.com/perusio/nginx_ensite"
  96. NGINX_ENSITE_COMMIT='fa4d72ce1c0a490442c8474e9c8dc21ed52c93d0'
  97. CLEANUP_MAILDIR_REPO="https://github.com/bashrc/cleanup-maildir"
  98. CLEANUP_MAILDIR_COMMIT='33241d2e3861f901ba17f5c77ada007e1ec06a86'
  99. INADYN_REPO="https://github.com/bashrc/inadyn"
  100. INADYN_COMMIT='fadbe17f520d337dfb8d69ee4bf1fcaa23fce0d6'
  101. # Minimum number of characters in a password
  102. MINIMUM_PASSWORD_LENGTH=10
  103. # number of CPU cores
  104. CPU_CORES=1
  105. # If the system is on an IPv6 network
  106. IPV6_NETWORK='2001:470:26:307'
  107. # The static IP address of the system within the local network
  108. # By default the IP address is dynamic within your LAN
  109. LOCAL_NETWORK_STATIC_IP_ADDRESS=
  110. # IP address of the router (gateway)
  111. ROUTER_IP_ADDRESS="192.168.1.254"
  112. # DNS
  113. NAMESERVER1='213.73.91.35'
  114. NAMESERVER2='85.214.20.141'
  115. # whether to route outgoing traffic through Tor
  116. ROUTE_THROUGH_TOR="no"
  117. # Why use Google as a time source?
  118. # The thinking here is that it's likely to be reliable and fast.
  119. # The ping doesn't reveal any information other than that the server
  120. # is running, and if anyone maliciously alters the time on Google's
  121. # servers then that would certainly be newsworthy and they'd be
  122. # likely to do something about it quickly.
  123. # If you have better time sources then change them here.
  124. TLS_TIME_SOURCE1="google.com"
  125. TLS_TIME_SOURCE2="www.ptb.de"
  126. # The type of hardware random number generator being used
  127. # This can be empty, "beaglebone" or "onerng"
  128. HWRNG_TYPE=
  129. # Download location for OneRNG driver
  130. ONERNG_PACKAGE="onerng_3.4-1_all.deb"
  131. ONERNG_PACKAGE_DOWNLOAD="https://github.com/OneRNG/onerng.github.io/blob/master/sw/$ONERNG_PACKAGE?raw=true"
  132. # Hash for OneRNG driver
  133. ONERNG_PACKAGE_HASH='78f1c2f52ae573e3b398a695ece7ab9f41868252657ea269f0d5cf0bd4f2eb59'
  134. # device name for OneRNG
  135. ONERNG_DEVICE='ttyACM0'
  136. # Whether this system is being installed within a docker container
  137. INSTALLED_WITHIN_DOCKER="no"
  138. # If you want to run a public mailing list specify its name here.
  139. # There should be no spaces in the name
  140. PUBLIC_MAILING_LIST=
  141. # Optional different domain name for the public mailing list
  142. PUBLIC_MAILING_LIST_DOMAIN_NAME=
  143. # Directory where the public mailing list data is stored
  144. PUBLIC_MAILING_LIST_DIRECTORY="/var/spool/mlmmj"
  145. # If you want to run an encrypted mailing list specify its name here.
  146. # There should be no spaces in the name
  147. PRIVATE_MAILING_LIST=
  148. # Domain name for mediagoblin installation
  149. MEDIAGOBLIN_DOMAIN_NAME=
  150. MEDIAGOBLIN_CODE=
  151. MEDIAGOBLIN_REPO="git://git.savannah.gnu.org/mediagoblin.git"
  152. MEDIAGOBLIN_COMMIT='d1ac2d52fd8859c3f32fa38e4836ffe9615e5bba'
  153. MEDIAGOBLIN_ADMIN_PASSWORD=
  154. MEDIAGOBLIN_ONION_PORT=8096
  155. # Domain name for microblog installation
  156. MICROBLOG_DOMAIN_NAME=
  157. MICROBLOG_CODE=
  158. MICROBLOG_ONION_PORT=8087
  159. MICROBLOG_REPO="https://git.gnu.io/gnu/gnu-social.git"
  160. MICROBLOG_COMMIT='c67b89e56bf0f90730a9e22beca7e1bd41fc26c3'
  161. MICROBLOG_ADMIN_PASSWORD=
  162. MICROBLOG_THEME_REPO="https://git.gnu.io/h2p/Qvitter.git"
  163. MICROBLOG_THEME_COMMIT='e933ff9510fb3ff8a7a856b5a88002859c43b237'
  164. MICROBLOG_WELCOME_MESSAGE=$'<h1>Welcome to GNU Social – a federated microblog</h1><p>Another Freedombone site</p>'
  165. MICROBLOG_BACKGROUND_IMAGE_URL=
  166. MICROBLOG_MARKDOWN_REPO="https://git.gnu.io/chimo/markdown.git"
  167. MICROBLOG_MARKDOWN_COMMIT='03c53942f94b3376f0946e6e1fe566cc21ccf232'
  168. # Domain name for hubzilla installation
  169. HUBZILLA_DOMAIN_NAME=
  170. HUBZILLA_CODE=
  171. HUBZILLA_ONION_PORT=8085
  172. HUBZILLA_REPO="https://github.com/redmatrix/hubzilla.git"
  173. HUBZILLA_THEMES_REPO="https://github.com/DeadSuperHero/redmatrix-themes"
  174. HUBZILLA_ADDONS_REPO="https://github.com/redmatrix/hubzilla-addons.git"
  175. HUBZILLA_ADMIN_PASSWORD=
  176. HUBZILLA_COMMIT='b6ae2bff01f8a4dfc057ef2971b3d988b1028b3e'
  177. HUBZILLA_ADDONS_COMMIT='48725235777e2088fe109b722a5fc9141b6840ec'
  178. # Domain name for git hosting installation
  179. GIT_DOMAIN_NAME=
  180. GIT_CODE=
  181. GIT_ONION_PORT=8090
  182. GIT_DOMAIN_REPO="https://github.com/gogits/gogs"
  183. GIT_ADMIN_PASSWORD=
  184. GOGS_COMMIT='3fb4f7f4980b4339fd9ef6a3ba5b0acab83d264d'
  185. GO_PACKAGE_MANAGER_REPO="https://github.com/gpmgo/gopm"
  186. GVM_REPO="https://github.com/moovweb/gvm"
  187. GVM_COMMIT='25ea8ae158e2861c92e2b22c458e60840157832f'
  188. # Domain name for Owncloud installation
  189. OWNCLOUD_DOMAIN_NAME=
  190. OWNCLOUD_CODE=
  191. OWNCLOUD_ONION_PORT=8088
  192. OWNCLOUD_ADMIN_PASSWORD=
  193. OWNCLOUD_PATH=/var/www/owncloud
  194. OWNCLOUD_UPGRADE_PATH=/root/owncloud_upgrade
  195. # Domain name for your wiki
  196. WIKI_DOMAIN_NAME=
  197. WIKI_ADMIN_PASSWORD=
  198. WIKI_TITLE="${PROJECT_NAME} Wiki"
  199. WIKI_CODE=
  200. WIKI_ONION_PORT=8089
  201. # Domain name for your blog
  202. FULLBLOG_DOMAIN_NAME=
  203. FULLBLOG_CODE=
  204. FULLBLOG_ONION_PORT=8086
  205. FULLBLOG_REPO="https://github.com/danpros/htmly"
  206. FULLBLOG_COMMIT='bf5fe9486160be4da86d8987d3e5c977e1dc6d32'
  207. MY_BLOG_TITLE="My Blog"
  208. MY_BLOG_SUBTITLE="Another ${PROJECT_NAME} Blog"
  209. # search engine
  210. SEARCH_ENGINE_REPO="https://github.com/asciimoo/searx"
  211. SEARCH_ENGINE_COMMIT='fee556c9904637051a9ba874ba7e71cd9f10789f'
  212. SEARCH_ENGINE_PATH=/etc
  213. SEARCH_ENGINE_ONION_PORT=8094
  214. SEARCH_ENGINE_ONION_HOSTNAME=
  215. SEARCH_ENGINE_LOGIN_TEXT=$"Search engine login"
  216. SEARCH_ENGINE_PASSWORD=
  217. GPG_KEYSERVER="hkp://keys.gnupg.net"
  218. # whether to encrypt all incoming email with your public key
  219. GPG_ENCRYPT_STORED_EMAIL="yes"
  220. # gets set to yes if gpg keys are imported from usb
  221. GPG_KEYS_IMPORTED="no"
  222. # optionally you can provide your exported GPG key pair here
  223. # Note that the private key file will be deleted after use
  224. # If these are unspecified then a new GPG key will be created
  225. MY_GPG_PUBLIC_KEY=
  226. MY_GPG_PRIVATE_KEY=
  227. # optionally specify your public key ID
  228. MY_GPG_PUBLIC_KEY_ID=
  229. # If you have existing mail within a Maildir
  230. # you can specify the directory here and the files
  231. # will be imported
  232. IMPORT_MAILDIR=
  233. # The Debian package repository to use.
  234. DEBIAN_REPO="ftp.us.debian.org"
  235. DEBIAN_VERSION="jessie"
  236. # Directory where source code is downloaded and compiled
  237. INSTALL_DIR=$HOME/build
  238. # device name for an attached usb drive
  239. USB_DRIVE=/dev/sda1
  240. # Location where the USB drive is mounted to
  241. USB_MOUNT=/mnt/usb
  242. # name of a script used to upgrade the system
  243. UPGRADE_SCRIPT_NAME="${PROJECT_NAME}-upgrade"
  244. # name of a script which keeps running processes going even if they crash
  245. WATCHDOG_SCRIPT_NAME="keepon"
  246. # Number of days to keep backups for
  247. BACKUP_MAX_DAYS=30
  248. # memory limit for php in MB
  249. MAX_PHP_MEMORY=64
  250. # default MariaDB password
  251. MARIADB_PASSWORD=
  252. # Directory where XMPP settings are stored
  253. XMPP_DIRECTORY="/var/lib/prosody"
  254. XMPP_PASSWORD=
  255. # file containing a list of remote locations to backup to
  256. # Format: [username@friendsdomain//home/username] [ssh_password]
  257. # With the only space character being between the server and the password
  258. FRIENDS_SERVERS_LIST=/home/$MY_USERNAME/backup.list
  259. # list of encryption protocols
  260. SSL_PROTOCOLS="TLSv1 TLSv1.1 TLSv1.2"
  261. # list of ciphers to use. See bettercrypto.org recommendations
  262. 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"
  263. # ssh (from https://stribika.github.io/2015/01/04/secure-secure-shell.html)
  264. SSH_CIPHERS="chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com,aes256-ctr,aes192-ctr,aes128-ctr"
  265. 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"
  266. SSH_KEX="curve25519-sha256@libssh.org,diffie-hellman-group-exchange-sha256"
  267. 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"
  268. # xmpp ciphers and curve
  269. 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"'
  270. XMPP_ECC_CURVE='"secp384r1"'
  271. # the default email address
  272. MY_EMAIL_ADDRESS=$MY_USERNAME@$DEFAULT_DOMAIN_NAME
  273. # optionally specify your name to appear on the blog
  274. MY_NAME=$DEFAULT_DOMAIN_NAME
  275. export DEBIAN_FRONTEND=noninteractive
  276. # logging level for Nginx
  277. WEBSERVER_LOG_LEVEL='warn'
  278. # used to limit CPU usage
  279. CPULIMIT='/usr/bin/cpulimit -l 20 -e'
  280. # command to create a git repository
  281. CREATE_GIT_PROJECT_COMMAND='create-project'
  282. # File which keeps track of what has already been installed
  283. COMPLETION_FILE=$HOME/${PROJECT_NAME}-completed.txt
  284. # Used to indicate whether the backup contains MariaDB databases or not
  285. BACKUP_INCLUDES_DATABASES="no"
  286. # contains the mysql root password which
  287. # is used for backups and repair
  288. DATABASE_PASSWORD_FILE=/root/dbpass
  289. # log file where details of remote backups are stored
  290. REMOTE_BACKUPS_LOG=/var/log/remotebackups.log
  291. # message if something fails to install
  292. 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."
  293. # web site used to obtain the external IP address of the system
  294. GET_IP_ADDRESS_URL="checkip.two-dns.de"
  295. # Password used for VoIP server
  296. VOIP_SERVER_PASSWORD=
  297. # Port on which VoIP server listens
  298. VOIP_PORT=64738
  299. SIP_SERVER_PASSWORD=
  300. SIP_PORT=5060
  301. SIP_TLS_PORT=5061
  302. VOIP_TURN_PORT=3478
  303. VOIP_TURN_TLS_PORT=5349
  304. VOIP_TURN_NONCE=
  305. # Location of VoIP database and configuration
  306. VOIP_DATABASE="mumble-server.sqlite"
  307. VOIP_CONFIG_FILE="mumble-server.ini"
  308. # other possible services to obtain the external IP address
  309. EXTERNAL_IP_SERVICES=( \
  310. 'https://check.torproject.org/' \
  311. 'https://www.whatsmydns.net/whats-my-ip-address.html' \
  312. 'https://www.privateinternetaccess.com/pages/whats-my-ip/' \
  313. 'http://checkip.two-dns.de' \
  314. 'http://ip.dnsexit.com' \
  315. 'http://ifconfig.me/ip' \
  316. 'http://ipecho.net/plain' \
  317. 'http://checkip.dyndns.org/plain' \
  318. 'http://ipogre.com/linux.php' \
  319. 'http://whatismyipaddress.com/' \
  320. 'http://ip.my-proxy.com/' \
  321. 'http://websiteipaddress.com/WhatIsMyIp' \
  322. 'http://getmyipaddress.org/' \
  323. 'http://www.my-ip-address.net/' \
  324. 'http://myexternalip.com/raw' \
  325. 'http://www.canyouseeme.org/' \
  326. 'http://www.trackip.net/' \
  327. 'http://icanhazip.com/' \
  328. 'http://www.iplocation.net/' \
  329. 'http://www.howtofindmyipaddress.com/' \
  330. 'http://www.ipchicken.com/' \
  331. 'http://whatsmyip.net/' \
  332. 'http://www.ip-adress.com/' \
  333. 'http://checkmyip.com/' \
  334. 'http://www.tracemyip.org/' \
  335. 'http://checkmyip.net/' \
  336. 'http://www.lawrencegoetz.com/programs/ipinfo/' \
  337. 'http://www.findmyip.co/' \
  338. 'http://ip-lookup.net/' \
  339. 'http://www.dslreports.com/whois' \
  340. 'http://www.mon-ip.com/en/my-ip/' \
  341. 'http://www.myip.ru' \
  342. 'http://ipgoat.com/' \
  343. 'http://www.myipnumber.com/my-ip-address.asp' \
  344. 'http://www.whatsmyipaddress.net/' \
  345. 'http://formyip.com/' \
  346. 'http://www.displaymyip.com/' \
  347. 'http://www.bobborst.com/tools/whatsmyip/' \
  348. 'http://www.geoiptool.com/' \
  349. 'http://checkip.dyndns.com/' \
  350. 'http://myexternalip.com/' \
  351. 'http://www.ip-adress.eu/' \
  352. 'http://www.infosniper.net/' \
  353. 'http://wtfismyip.com/' \
  354. 'http://ipinfo.io/' \
  355. 'http://httpbin.org/ip')
  356. WIFI_CHANNEL=2
  357. WIFI_INTERFACE=wlan0
  358. # cjdns settings
  359. ENABLE_CJDNS="no"
  360. CJDNS_PRIVATE_KEY=
  361. CJDNS_PUBLIC_KEY=
  362. CJDNS_IPV6=
  363. CJDNS_PASSWORD=
  364. CJDNS_PORT=
  365. CJDNS_REPO="https://github.com/cjdelisle/cjdns.git"
  366. CJDNS_COMMIT='13189fde111d0500427a7a0ce06a970753527bca'
  367. CJDCMD_REPO="https://github.com/inhies/cjdcmd"
  368. CJDCMD_COMMIT='973cca6ed0eecf9041c3403a40193c0b1291b808'
  369. # B.A.T.M.A.N settings
  370. ENABLE_BATMAN="no"
  371. BATMAN_CELLID='any'
  372. ESSID='mesh'
  373. # Babel mesh
  374. ENABLE_BABEL="no"
  375. BABEL_PORT=6696
  376. # social key management
  377. ENABLE_SOCIAL_KEY_MANAGEMENT="no"
  378. TOX_PORT=33445
  379. TOX_REPO="git://github.com/irungentoo/toxcore.git"
  380. TOXID_REPO="https://github.com/bashrc/toxid"
  381. TOX_COMMIT='73b2144edcfd1ca617e9054479b66ab0c0361a14'
  382. TOX_BOOTSTRAP_ID_FILE=/var/lib/tox-bootstrapd/pubkey.txt
  383. # These are some default nodes, but you can replace them with trusted nodes
  384. # as you prefer. See https://wiki.tox.im/Nodes
  385. TOX_NODES=
  386. #TOX_NODES=(
  387. # '192.254.75.102,2607:5600:284::2,33445,951C88B7E75C867418ACDB5D273821372BB5BD652740BCDF623A4FA293E75D2F,Tox RELENG,US'
  388. # '144.76.60.215,2a01:4f8:191:64d6::1,33445,04119E835DF3E78BACF0F84235B300546AF8B936F035185E2A8E9E0A67C8924F,sonOfRa,DE'
  389. #)
  390. TOXIC_REPO="https://github.com/Tox/toxic"
  391. TOXIC_COMMIT='88270827a96b2082e254677f35585ed24581a42c'
  392. #ZERONET_REPO='https://github.com/HelloZeroNet/ZeroNet.git'
  393. ZERONET_REPO="https://github.com/HelloZeroNet/ZeroNet.git"
  394. ZERONET_COMMIT='675bd462556c541d65e2d95f91f899146a373aad'
  395. ZERONET_BLOG_REPO="https://github.com/HelloZeroNet/ZeroBlog"
  396. ZERONET_BLOG_COMMIT='bbb0d6c36465fed2e6df71f1aab45fcc9c6ad609'
  397. ZERONET_MAIL_REPO="https://github.com/HelloZeroNet/ZeroMail"
  398. ZERONET_MAIL_COMMIT='955af09d643c72b02e4983d71eca5c0c93a6c131'
  399. ZERONET_FORUM_REPO="https://github.com/HelloZeroNet/ZeroTalk"
  400. ZERONET_FORUM_COMMIT='e2d2c9cb1cfbfef91b244935efb5c14c2ad95faa'
  401. ZERONET_URL=http://127.0.0.1:43110
  402. ZERONET_PORT=15441
  403. TRACKER_PORT=6969
  404. ZERONET_DEFAULT_BLOG_TAGLINE="Blogging on the Mesh"
  405. ZERONET_DEFAULT_FORUM_TAGLINE="A decentralized discussion group"
  406. ZERONET_DEFAULT_MAIL_TAGLINE="Mail for the Mesh"
  407. # https://github.com/ipfs/go-ipfs
  408. IPFS_GO_REPO="https://github.com/ipfs/go-ipfs"
  409. IPFS_COMMIT='20b06a4cbce8884f5b194da6e98cb11f2c77f166'
  410. IPFS_PORT=4001
  411. GPGIT_REPO="https://github.com/mikecardwell/gpgit"
  412. GPGIT_COMMIT='583dc76119f19420f8a33f606744faa7c8922738'
  413. # Default diffie-hellman key length in bits
  414. DH_KEYLENGTH=2048
  415. # repo for atheros AR9271 wifi driver
  416. ATHEROS_WIFI_REPO="https://github.com/qca/open-ath9k-htc-firmware.git"
  417. # Whether Let's Encrypt is enabled for all sites
  418. LETSENCRYPT_ENABLED="no"
  419. LETSENCRYPT_SERVER='https://acme-v01.api.letsencrypt.org/directory'
  420. RSS_READER_REPO="https://tt-rss.org/git/tt-rss.git"
  421. RSS_READER_COMMIT='50bda3fefbff31e5a5503d6fd1a927412fe29026'
  422. RSS_READER_ADMIN_PASSWORD=
  423. RSS_READER_ONION_PORT=8092
  424. RSS_MOBILE_READER_ONION_PORT=8095
  425. RSS_READER_DOMAIN_NAME=ttrss
  426. RSS_MOBILE_READER_REPO="https://github.com/mboinet/ttrss-mobile"
  427. RSS_MOBILE_READER_COMMIT='d5242e1c269e9480ab3b66b7a38da3c892dfb326'
  428. RSS_READER_PATH=/etc/share/tt-rss
  429. RSS_READER_GNUSOCIAL_REPO="https://github.com/bashrc/ttrss-gnusocial"
  430. RSS_READER_GNUSOCIAL_COMMIT='8b92b8f5db7b0d12459c7bd86a50f48815efe642'
  431. function show_help {
  432. echo ''
  433. echo $"${PROJECT_NAME} -c [configuration file]"
  434. echo ''
  435. echo $' -h --help Show help'
  436. echo $' menuconfig Easy interactive installation'
  437. echo $' menuconfig-full Full interactive installation'
  438. echo $' menuconfig-onion Interactive installation for onion-only sites'
  439. echo $' -c --config Installing from a configuration file'
  440. echo $' --bbb Installing on Beaglebone Black'
  441. echo $' -u --user User to install the system as'
  442. echo $' -d --domain Default domain name'
  443. echo $' -s --system System type'
  444. echo $' --ip Static LAN IP address of the system'
  445. echo $' --iprouter LAN IP address of the internet router'
  446. echo $' --ddns Dynamic DNS provider domain'
  447. echo $' --ddnsuser Dynamic DNS provider username'
  448. echo $' --ddnspass Dynamic DNS provider password'
  449. echo ''
  450. echo $' --microblogdomain Microblog domain name'
  451. echo $' --wikidomain Wiki domain name'
  452. echo $' --blogdomain Blog domain name'
  453. echo $' --ownclouddomain Owncloud domain name'
  454. echo $' --hubzilladomain Hubzilla domain name'
  455. echo $' --gitdomain Git hosting domain name'
  456. echo $' -t --time Domain used as a TLS time source'
  457. echo $' --ssh ssh port number'
  458. echo $' --list Public mailing list name'
  459. echo $' --cores Number of CPU cores'
  460. echo $' --name Your name'
  461. echo $' --email Your email address'
  462. echo $' --usb Path for the USB drive (eg. /dev/sdb1)'
  463. echo $' --cjdns Enable CJDNS'
  464. echo $' --vpass VoIP server password'
  465. echo $' --vport VoIP server port'
  466. echo $' --ns1 First DNS nameserver'
  467. echo $' --ns2 Second DNS nameserver'
  468. echo $' --repo Debian repository'
  469. echo ''
  470. echo $'system types'
  471. echo '------------'
  472. echo $'This can either be blank if you wish to install the full system,'
  473. echo $"or for more specialised variants you can specify '$VARIANT_MAILBOX', '$VARIANT_CLOUD',"
  474. echo $"'$VARIANT_CHAT', '$VARIANT_SOCIAL', '$VARIANT_MEDIA', '$VARIANT_WRITER', '$VARIANT_DEVELOPER'"
  475. echo $"or '$VARIANT_MESH'."
  476. echo ''
  477. echo $"If you wish to install everything except email then use the '$VARIANT_NONMAILBOX' variaint."
  478. echo ''
  479. exit 0
  480. }
  481. function git_clone {
  482. repo_url="$1"
  483. destination_dir="$2"
  484. if [[ "$repo_url" == "ssh:"* ]]; then
  485. if [ "${FRIENDS_MIRRORS_SERVER}" ]; then
  486. if [ ${#FRIENDS_MIRRORS_SERVER} -gt 2 ]; then
  487. if [ "$FRIENDS_MIRRORS_PASSWORD" ]; then
  488. if [ ${#FRIENDS_MIRRORS_PASSWORD} -gt 2 ]; then
  489. sshpass -p "$FRIENDS_MIRRORS_PASSWORD" git clone "$repo_url" "$destination_dir"
  490. return
  491. fi
  492. fi
  493. fi
  494. fi
  495. fi
  496. git clone "$repo_url" "$destination_dir"
  497. }
  498. function git_pull {
  499. if [ ! $1 ]; then
  500. echo $'git_pull no repo specified'
  501. fi
  502. git stash
  503. git remote set-url origin $1
  504. git checkout master
  505. if [ "${FRIENDS_MIRRORS_SERVER}" ]; then
  506. if [ ${#FRIENDS_MIRRORS_SERVER} -gt 2 ]; then
  507. if [ "$FRIENDS_MIRRORS_PASSWORD" ]; then
  508. if [ ${#FRIENDS_MIRRORS_PASSWORD} -gt 2 ]; then
  509. sshpass -p "$FRIENDS_MIRRORS_PASSWORD" git pull
  510. if [ $2 ]; then
  511. git checkout $2 -b $2
  512. fi
  513. return
  514. fi
  515. fi
  516. fi
  517. fi
  518. git pull
  519. if [ $2 ]; then
  520. git checkout $2 -b $2
  521. fi
  522. }
  523. function remove_database {
  524. app_name="$1"
  525. if [ ! -d $INSTALL_DIR ]; then
  526. mkdir $INSTALL_DIR
  527. fi
  528. echo "drop database ${app_name};
  529. quit" > $INSTALL_DIR/batch.sql
  530. chmod 600 $INSTALL_DIR/batch.sql
  531. mysql -u root --password="$MARIADB_PASSWORD" < $INSTALL_DIR/batch.sql
  532. shred -zu $INSTALL_DIR/batch.sql
  533. }
  534. function create_database {
  535. app_name="$1"
  536. app_admin_password="$2"
  537. app_admin_username=$3
  538. if [ ! -d $INSTALL_DIR ]; then
  539. mkdir $INSTALL_DIR
  540. fi
  541. if [ ! $app_admin_username ]; then
  542. app_admin_username=${app_name}admin
  543. fi
  544. echo "create database ${app_name};
  545. CREATE USER '$app_admin_username@localhost' IDENTIFIED BY '${app_admin_password}';
  546. GRANT ALL PRIVILEGES ON ${app_name}.* TO '$app_admin_username@localhost';
  547. quit" > $INSTALL_DIR/batch.sql
  548. chmod 600 $INSTALL_DIR/batch.sql
  549. mysql -u root --password="$MARIADB_PASSWORD" < $INSTALL_DIR/batch.sql
  550. shred -zu $INSTALL_DIR/batch.sql
  551. }
  552. function locale_setup {
  553. if grep -Fxq "locale_setup" $COMPLETION_FILE; then
  554. return
  555. fi
  556. apt-get -y install locales locales-all debconf
  557. if [ ! "$DEFAULT_LANGUAGE" ]; then
  558. DEFAULT_LANGUAGE='en_GB.UTF-8'
  559. fi
  560. if [ ${#DEFAULT_LANGUAGE} -lt 2 ]; then
  561. DEFAULT_LANGUAGE='en_GB.UTF-8'
  562. fi
  563. update-locale LANG=${DEFAULT_LANGUAGE}
  564. update-locale LANGUAGE=${DEFAULT_LANGUAGE}
  565. update-locale LC_MESSAGES=${DEFAULT_LANGUAGE}
  566. update-locale LC_ALL=${DEFAULT_LANGUAGE}
  567. update-locale LC_CTYPE=${DEFAULT_LANGUAGE}
  568. echo 'locale_setup' >> $COMPLETION_FILE
  569. }
  570. function interactive_configuration_remote_backups {
  571. if [[ $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  572. return
  573. fi
  574. if [ ! -f /usr/local/bin/${PROJECT_NAME}-remote ]; then
  575. if [ ! -f /usr/bin/${PROJECT_NAME}-remote ]; then
  576. echo $"The command ${PROJECT_NAME}-remote was not found"
  577. exit 87354
  578. fi
  579. fi
  580. ${PROJECT_NAME}-remote -u $MY_USERNAME -l $FRIENDS_SERVERS_LIST -m $MINIMUM_PASSWORD_LENGTH -r yes
  581. if [ ! "$?" = "0" ]; then
  582. echo $'Command failed:'
  583. echo ''
  584. echo $" ${PROJECT_NAME}-remote -u $MY_USERNAME -l $FRIENDS_SERVERS_LIST -m $MINIMUM_PASSWORD_LENGTH -r yes"
  585. echo ''
  586. exit 65892
  587. fi
  588. }
  589. # test a domain name to see if it's valid
  590. function validate_domain_name {
  591. # count the number of dots in the domain name
  592. dots=${TEST_DOMAIN_NAME//[^.]}
  593. no_of_dots=${#dots}
  594. if (( $no_of_dots > 3 )); then
  595. 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"
  596. fi
  597. if (( $no_of_dots == 0 )); then
  598. 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"
  599. fi
  600. }
  601. function interactive_configuration {
  602. if [ ! -f /usr/local/bin/${PROJECT_NAME}-config ]; then
  603. if [ ! -f /usr/bin/${PROJECT_NAME}-config ]; then
  604. echo $"The command ${PROJECT_NAME}-config was not found"
  605. exit 63935
  606. fi
  607. fi
  608. if [ -f /tmp/meshuserdevice ]; then
  609. rm -f /tmp/meshuserdevice
  610. fi
  611. if [[ $ONION_ONLY == "no" ]]; then
  612. if [[ $MINIMAL_INSTALL == "no" ]]; then
  613. ${PROJECT_NAME}-config \
  614. -f $CONFIGURATION_FILE \
  615. -w $PROJECT_WEBSITE \
  616. -b $PROJECT_BITMESSAGE \
  617. -m $MINIMUM_PASSWORD_LENGTH
  618. else
  619. ${PROJECT_NAME}-config \
  620. -f $CONFIGURATION_FILE \
  621. -w $PROJECT_WEBSITE \
  622. -b $PROJECT_BITMESSAGE \
  623. -m $MINIMUM_PASSWORD_LENGTH \
  624. --minimal "yes"
  625. fi
  626. else
  627. ${PROJECT_NAME}-config \
  628. -f $CONFIGURATION_FILE \
  629. -w $PROJECT_WEBSITE \
  630. -b $PROJECT_BITMESSAGE \
  631. -m $MINIMUM_PASSWORD_LENGTH \
  632. --onion "yes"
  633. fi
  634. if [ -f /tmp/meshuserdevice ]; then
  635. # mesh network user device installation
  636. rm -f /tmp/meshuserdevice
  637. exit 0
  638. fi
  639. if [ ! "$?" = "0" ]; then
  640. echo $'Command failed:'
  641. echo ''
  642. echo $" ${PROJECT_NAME}-config -u $MY_USERNAME -f $CONFIGURATION_FILE -w $PROJECT_WEBSITE -b $PROJECT_BITMESSAGE -m $MINIMUM_PASSWORD_LENGTH --minimal [yes|no]"
  643. echo ''
  644. exit 73594
  645. fi
  646. if [[ $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  647. FRIENDS_SERVERS_LIST=/home/$MY_USERNAME/backup.list
  648. dialog --title $"Encrypted backup to other servers" \
  649. --backtitle $"${PROJECT_NAME} Configuration" \
  650. --defaultno \
  651. --yesno $"\nDo you wish to configure some remote backup locations?" 7 60
  652. sel=$?
  653. case $sel in
  654. 0) interactive_configuration_remote_backups;;
  655. esac
  656. fi
  657. }
  658. command_options=$1
  659. if [[ $command_options == "menuconfig-full" ]]; then
  660. MINIMAL_INSTALL="no"
  661. command_options="menuconfig"
  662. fi
  663. if [[ $command_options == "menuconfig-onion" ]]; then
  664. MINIMAL_INSTALL="yes"
  665. ONION_ONLY="yes"
  666. command_options="menuconfig"
  667. fi
  668. if [[ $command_options == "menuconfig" ]]; then
  669. interactive_configuration
  670. else
  671. while [[ $# > 1 ]]
  672. do
  673. key="$1"
  674. case $key in
  675. -h|--help)
  676. show_help
  677. ;;
  678. # load a configuration file
  679. -c|--config)
  680. shift
  681. CONFIGURATION_FILE="$1"
  682. INSTALLING_FROM_CONFIGURATION_FILE="yes"
  683. break
  684. ;;
  685. # username within /home
  686. -u|--user)
  687. shift
  688. MY_USERNAME="$1"
  689. ;;
  690. # microblog domain name
  691. --microblogdomain)
  692. shift
  693. MICROBLOG_DOMAIN_NAME="$1"
  694. ;;
  695. # wiki domain name
  696. --wikidomain)
  697. shift
  698. WIKI_DOMAIN_NAME="$1"
  699. ;;
  700. # blog domain name
  701. --blogdomain)
  702. shift
  703. FULLBLOG_DOMAIN_NAME="$1"
  704. ;;
  705. # owncloud domain name
  706. --ownclouddomain)
  707. shift
  708. OWNCLOUD_DOMAIN_NAME="$1"
  709. ;;
  710. # hubzilla domain name
  711. --hubzilladomain)
  712. shift
  713. HUBZILLA_DOMAIN_NAME="$1"
  714. ;;
  715. # git hosting domain name
  716. --gitdomain)
  717. shift
  718. GIT_DOMAIN_NAME="$1"
  719. ;;
  720. # default domain name
  721. -d|--domain)
  722. shift
  723. DEFAULT_DOMAIN_NAME="$1"
  724. ;;
  725. # The type of system
  726. -s|--system)
  727. shift
  728. SYSTEM_TYPE="$1"
  729. ;;
  730. # The dynamic DNS provider
  731. --ddns)
  732. shift
  733. DDNS_PROVIDER="$1"
  734. ;;
  735. # Username for the synamic DNS provider
  736. --ddnsuser)
  737. shift
  738. DDNS_USERNAME="$1"
  739. ;;
  740. # Password for the synamic DNS provider
  741. --ddnspass)
  742. shift
  743. DDNS_PASSWORD="$1"
  744. ;;
  745. # Whether this installation is on a Beaglebone Black
  746. --bbb)
  747. INSTALLING_ON_BBB="yes"
  748. ;;
  749. # Domain name to use as a TLS time source
  750. -t|--time)
  751. shift
  752. TLS_TIME_SOURCE1="$1"
  753. ;;
  754. # Static IP address for the system
  755. --ip)
  756. shift
  757. LOCAL_NETWORK_STATIC_IP_ADDRESS=$1
  758. ;;
  759. # IP address for the internet router
  760. --iprouter)
  761. shift
  762. ROUTER_IP_ADDRESS=$1
  763. ;;
  764. # ssh port
  765. --ssh)
  766. shift
  767. SSH_PORT=$1
  768. ;;
  769. # public mailing list name
  770. --list)
  771. shift
  772. PUBLIC_MAILING_LIST="$1"
  773. ;;
  774. # Number of CPU cores
  775. --cores)
  776. shift
  777. CPU_CORES=$1
  778. ;;
  779. # my name
  780. --name)
  781. shift
  782. MY_NAME="$1"
  783. ;;
  784. # my email address
  785. --email)
  786. shift
  787. MY_EMAIL_ADDRESS="$1"
  788. ;;
  789. # USB drive
  790. --usb)
  791. shift
  792. USB_DRIVE=$1
  793. ;;
  794. # Enable CJDNS
  795. --cjdns)
  796. shift
  797. ENABLE_CJDNS="yes"
  798. ;;
  799. # Enable B.A.T.M.A.N
  800. --batman)
  801. shift
  802. ENABLE_BATMAN="yes"
  803. ;;
  804. # Enable Babel
  805. --babel)
  806. shift
  807. ENABLE_BABEL="yes"
  808. ;;
  809. # VoIP server password
  810. --vpass)
  811. shift
  812. VOIP_SERVER_PASSWORD=$1
  813. ;;
  814. # VoIP server port
  815. --vport)
  816. shift
  817. VOIP_PORT=$1
  818. ;;
  819. # DNS Nameserver 1
  820. --ns1)
  821. shift
  822. NAMESERVER1=$1
  823. ;;
  824. # DNS Nameserver 2
  825. --ns2)
  826. shift
  827. NAMESERVER2=$1
  828. ;;
  829. # Debian repository
  830. --repo)
  831. shift
  832. DEBIAN_REPO=$1
  833. ;;
  834. # minimal install
  835. --minimal)
  836. shift
  837. MINIMAL_INSTALL=$1
  838. ;;
  839. *)
  840. # unknown option
  841. ;;
  842. esac
  843. shift
  844. done
  845. fi
  846. function parse_args {
  847. if [[ $NO_OF_ARGS == 0 ]]; then
  848. echo 'no_of_args = 0'
  849. show_help
  850. exit 0
  851. fi
  852. if [ ! -d /home/$MY_USERNAME ]; then
  853. echo $"There is no user '$MY_USERNAME' on the system. Use 'adduser $MY_USERNAME' to create the user."
  854. exit 1
  855. fi
  856. if [ ! "$DEFAULT_DOMAIN_NAME" ]; then
  857. if [[ $SYSTEM_TYPE != "$VARIANT_MESH" ]]; then
  858. echo 'No default domain specified'
  859. show_help
  860. exit 2
  861. fi
  862. fi
  863. if [ ! $MY_USERNAME ]; then
  864. echo 'No username specified'
  865. show_help
  866. exit 3
  867. fi
  868. if [[ $SYSTEM_TYPE != "$VARIANT_MESH" ]]; then
  869. if [[ $ONION_ONLY == "no" ]]; then
  870. if [ ! $DDNS_USERNAME ]; then
  871. echo $'Please provide the username for your dynamic DNS provider with the --ddnsuser option'
  872. exit 7823
  873. fi
  874. if [ ! $DDNS_PASSWORD ]; then
  875. echo $'Please provide the password for your dynamic DNS provider with the --ddnspass option'
  876. exit 6382
  877. fi
  878. fi
  879. fi
  880. if [ ! $SYSTEM_TYPE ]; then
  881. SYSTEM_TYPE=$VARIANT_FULL
  882. fi
  883. 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
  884. echo $"'$SYSTEM_TYPE' is an unrecognised ${PROJECT_NAME} variant."
  885. exit 30
  886. fi
  887. }
  888. function read_repo_servers {
  889. if [ -f $CONFIGURATION_FILE ]; then
  890. if grep -q "FRIENDS_MIRRORS_SERVER" $CONFIGURATION_FILE; then
  891. FRIENDS_MIRRORS_SERVER=$(grep "FRIENDS_MIRRORS_SERVER" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  892. fi
  893. if grep -q "FRIENDS_MIRRORS_SSH_PORT" $CONFIGURATION_FILE; then
  894. FRIENDS_MIRRORS_SSH_PORT=$(grep "FRIENDS_MIRRORS_SSH_PORT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  895. fi
  896. if grep -q "MY_MIRRORS_PASSWORD" $CONFIGURATION_FILE; then
  897. MY_MIRRORS_PASSWORD=$(grep "MY_MIRRORS_PASSWORD" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  898. fi
  899. if grep -q "FRIENDS_MIRRORS_PASSWORD" $CONFIGURATION_FILE; then
  900. FRIENDS_MIRRORS_PASSWORD=$(grep "FRIENDS_MIRRORS_PASSWORD" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  901. fi
  902. fi
  903. if [ ! $FRIENDS_MIRRORS_SERVER ]; then
  904. return
  905. fi
  906. if [ ${#FRIENDS_MIRRORS_SERVER} -lt 2 ]; then
  907. return
  908. fi
  909. MAIN_COMMAND=/usr/local/bin/${PROJECT_NAME}
  910. if [ ! -f $MAIN_COMMAND ]; then
  911. MAIN_COMMAND=/usr/bin/${PROJECT_NAME}
  912. fi
  913. REPOS=($(cat ${MAIN_COMMAND} | grep "_REPO=\"" | uniq -u | sed 's|${PROJECT_NAME}|'"${PROJECT_NAME}"'|g'))
  914. for line in "${REPOS[@]}"
  915. do
  916. repo_name=$(echo "$line" | awk -F '=' '{print $1}')
  917. mirrors_name=$(echo "$repo_name" | sed "s|_REPO||g" | awk '{print tolower($0)}')
  918. friends_repo_url="ssh://mirrors@${FRIENDS_MIRRORS_SERVER}:${FRIENDS_MIRRORS_SSH_PORT}/home/mirrors/${mirrors_name}"
  919. ${repo_name}="${friends_repo_url}"
  920. done
  921. }
  922. function read_configuration {
  923. # if not installing on a Beaglebone then use sdb as the USB drive by default
  924. if [ ! $INSTALLING_ON_BBB ]; then
  925. if [[ $USB_DRIVE == /dev/sda1 ]]; then
  926. USB_DRIVE=/dev/sdb1
  927. fi
  928. fi
  929. if [[ $INSTALLING_FROM_CONFIGURATION_FILE == "yes" ]]; then
  930. if [ ! -f $CONFIGURATION_FILE ]; then
  931. echo $"The configuration file $CONFIGURATION_FILE was not found"
  932. exit 8935
  933. fi
  934. fi
  935. if [ -f $CONFIGURATION_FILE ]; then
  936. read_repo_servers
  937. # Ensure that a copy of the config exists for upgrade purposes
  938. if [[ $CONFIGURATION_FILE != "/root/${PROJECT_NAME}.cfg" ]]; then
  939. cp $CONFIGURATION_FILE /root/${PROJECT_NAME}.cfg
  940. fi
  941. if grep -q "VOIP_TURN_PORT" $CONFIGURATION_FILE; then
  942. VOIP_TURN_PORT=$(grep "VOIP_TURN_PORT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  943. fi
  944. if grep -q "VOIP_TURN_TLS_PORT" $CONFIGURATION_FILE; then
  945. VOIP_TURN_TLS_PORT=$(grep "VOIP_TURN_TLS_PORT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  946. fi
  947. if grep -q "VOIP_TURN_NONCE" $CONFIGURATION_FILE; then
  948. VOIP_TURN_NONCE=$(grep "VOIP_TURN_NONCE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  949. fi
  950. if grep -q "DEFAULT_SEARCH" $CONFIGURATION_FILE; then
  951. DEFAULT_SEARCH=$(grep "DEFAULT_SEARCH" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  952. fi
  953. if grep -q "SEARCH_ENGINE_PASSWORD" $CONFIGURATION_FILE; then
  954. SEARCH_ENGINE_PASSWORD=$(grep "SEARCH_ENGINE_PASSWORD" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  955. fi
  956. if grep -q "XMPP_PASSWORD" $CONFIGURATION_FILE; then
  957. XMPP_PASSWORD=$(grep "XMPP_PASSWORD" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  958. fi
  959. if grep -q "RSS_READER_REPO" $CONFIGURATION_FILE; then
  960. RSS_READER_REPO=$(grep "RSS_READER_REPO" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  961. fi
  962. if grep -q "RSS_MOBILE_READER_REPO" $CONFIGURATION_FILE; then
  963. RSS_MOBILE_READER_REPO=$(grep "RSS_MOBILE_READER_REPO" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  964. fi
  965. if grep -q "RSS_READER_COMMIT" $CONFIGURATION_FILE; then
  966. RSS_READER_COMMIT=$(grep "RSS_READER_COMMIT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  967. fi
  968. if grep -q "RSS_MOBILE_READER_COMMIT" $CONFIGURATION_FILE; then
  969. RSS_MOBILE_READER_COMMIT=$(grep "RSS_MOBILE_READER_COMMIT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  970. fi
  971. if grep -q "RSS_READER_ADMIN_PASSWORD" $CONFIGURATION_FILE; then
  972. RSS_READER_ADMIN_PASSWORD=$(grep "RSS_READER_ADMIN_PASSWORD" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  973. fi
  974. if grep -q "RSS_READER_DOMAIN_NAME" $CONFIGURATION_FILE; then
  975. RSS_READER_DOMAIN_NAME=$(grep "RSS_READER_DOMAIN_NAME" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  976. fi
  977. if grep -q "MICROBLOG_BACKGROUND_IMAGE_URL" $CONFIGURATION_FILE; then
  978. MICROBLOG_BACKGROUND_IMAGE_URL=$(grep "MICROBLOG_BACKGROUND_IMAGE_URL" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  979. fi
  980. if grep -q "MICROBLOG_WELCOME_MESSAGE" $CONFIGURATION_FILE; then
  981. MICROBLOG_WELCOME_MESSAGE=$(grep "MICROBLOG_WELCOME_MESSAGE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  982. fi
  983. if grep -q "PROJECT_WEBSITE" $CONFIGURATION_FILE; then
  984. PROJECT_WEBSITE=$(grep "PROJECT_WEBSITE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  985. fi
  986. if grep -q "PROJECT_REPO" $CONFIGURATION_FILE; then
  987. PROJECT_REPO=$(grep "PROJECT_REPO" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  988. fi
  989. if grep -q "ONION_ONLY" $CONFIGURATION_FILE; then
  990. ONION_ONLY=$(grep "ONION_ONLY" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  991. fi
  992. if grep -q "IRC_PASSWORD" $CONFIGURATION_FILE; then
  993. IRC_PASSWORD=$(grep "IRC_PASSWORD" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  994. fi
  995. if grep -q "DEFAULT_LANGUAGE" $CONFIGURATION_FILE; then
  996. DEFAULT_LANGUAGE=$(grep "DEFAULT_LANGUAGE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  997. fi
  998. if grep -q "MINIMAL_INSTALL" $CONFIGURATION_FILE; then
  999. MINIMAL_INSTALL=$(grep "MINIMAL_INSTALL" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1000. fi
  1001. if grep -q "LETSENCRYPT_SERVER" $CONFIGURATION_FILE; then
  1002. LETSENCRYPT_SERVER=$(grep "LETSENCRYPT_SERVER" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1003. fi
  1004. if grep -q "FULLBLOG_REPO" $CONFIGURATION_FILE; then
  1005. FULLBLOG_REPO=$(grep "FULLBLOG_REPO" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1006. fi
  1007. if grep -q "FULLBLOG_COMMIT" $CONFIGURATION_FILE; then
  1008. FULLBLOG_COMMIT=$(grep "FULLBLOG_COMMIT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1009. fi
  1010. if grep -q "GOGS_COMMIT" $CONFIGURATION_FILE; then
  1011. GOGS_COMMIT=$(grep "GOGS_COMMIT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1012. fi
  1013. if grep -q "TOX_COMMIT" $CONFIGURATION_FILE; then
  1014. TOX_COMMIT=$(grep "TOX_COMMIT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1015. fi
  1016. if grep -q "TOXIC_COMMIT" $CONFIGURATION_FILE; then
  1017. TOXIC_COMMIT=$(grep "TOXIC_COMMIT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1018. fi
  1019. if grep -q "GPGIT_REPO" $CONFIGURATION_FILE; then
  1020. GPGIT_REPO=$(grep "GPGIT_REPO" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1021. fi
  1022. if grep -q "GPGIT_COMMIT" $CONFIGURATION_FILE; then
  1023. GPGIT_COMMIT=$(grep "GPGIT_COMMIT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1024. fi
  1025. if grep -q "HUBZILLA_REPO" $CONFIGURATION_FILE; then
  1026. HUBZILLA_REPO=$(grep "HUBZILLA_REPO" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1027. fi
  1028. if grep -q "HUBZILLA_COMMIT" $CONFIGURATION_FILE; then
  1029. HUBZILLA_COMMIT=$(grep "HUBZILLA_COMMIT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1030. fi
  1031. if grep -q "IPFS_COMMIT" $CONFIGURATION_FILE; then
  1032. IPFS_COMMIT=$(grep "IPFS_COMMIT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1033. fi
  1034. if grep -q "ZERONET_BLOG_COMMIT" $CONFIGURATION_FILE; then
  1035. ZERONET_BLOG_COMMIT=$(grep "ZERONET_BLOG_COMMIT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1036. fi
  1037. if grep -q "ZERONET_MAIL_COMMIT" $CONFIGURATION_FILE; then
  1038. ZERONET_MAIL_COMMIT=$(grep "ZERONET_MAIL_COMMIT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1039. fi
  1040. if grep -q "ZERONET_FORUM_COMMIT" $CONFIGURATION_FILE; then
  1041. ZERONET_FORUM_COMMIT=$(grep "ZERONET_FORUM_COMMIT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1042. fi
  1043. if grep -q "MICROBLOG_COMMIT" $CONFIGURATION_FILE; then
  1044. MICROBLOG_COMMIT=$(grep "MICROBLOG_COMMIT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1045. fi
  1046. if grep -q "NGINX_ENSITE_REPO" $CONFIGURATION_FILE; then
  1047. NGINX_ENSITE_REPO=$(grep "NGINX_ENSITE_REPO" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1048. fi
  1049. if grep -q "NGINX_ENSITE_COMMIT" $CONFIGURATION_FILE; then
  1050. NGINX_ENSITE_COMMIT=$(grep "NGINX_ENSITE_COMMIT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1051. fi
  1052. if grep -q "CLEANUP_MAILDIR_COMMIT" $CONFIGURATION_FILE; then
  1053. CLEANUP_MAILDIR_COMMIT=$(grep "CLEANUP_MAILDIR_COMMIT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1054. fi
  1055. if grep -q "CLEANUP_MAILDIR_REPO" $CONFIGURATION_FILE; then
  1056. CLEANUP_MAILDIR_REPO=$(grep "CLEANUP_MAILDIR_REPO" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1057. fi
  1058. if grep -q "ZERONET_COMMIT" $CONFIGURATION_FILE; then
  1059. ZERONET_COMMIT=$(grep "ZERONET_COMMIT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1060. fi
  1061. if grep -q "INADYN_REPO" $CONFIGURATION_FILE; then
  1062. INADYN_REPO=$(grep "INADYN_REPO" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1063. fi
  1064. if grep -q "INADYN_COMMIT" $CONFIGURATION_FILE; then
  1065. INADYN_COMMIT=$(grep "INADYN_COMMIT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1066. fi
  1067. if grep -q "GPG_KEYSERVER" $CONFIGURATION_FILE; then
  1068. GPG_KEYSERVER=$(grep "GPG_KEYSERVER" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1069. fi
  1070. if grep -q "IPFS_PORT" $CONFIGURATION_FILE; then
  1071. IPFS_PORT=$(grep "IPFS_PORT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1072. fi
  1073. if grep -q "TRACKER_PORT" $CONFIGURATION_FILE; then
  1074. TRACKER_PORT=$(grep "TRACKER_PORT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1075. fi
  1076. if grep -q "ZERONET_PORT" $CONFIGURATION_FILE; then
  1077. ZERONET_PORT=$(grep "ZERONET_PORT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1078. fi
  1079. if grep -q "DH_KEYLENGTH" $CONFIGURATION_FILE; then
  1080. DH_KEYLENGTH=$(grep "DH_KEYLENGTH" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1081. fi
  1082. if grep -q "WIFI_INTERFACE" $CONFIGURATION_FILE; then
  1083. WIFI_INTERFACE=$(grep "WIFI_INTERFACE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1084. fi
  1085. if grep -q "IRC_PORT" $CONFIGURATION_FILE; then
  1086. IRC_PORT=$(grep "IRC_PORT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1087. fi
  1088. if grep -q "WIFI_CHANNEL" $CONFIGURATION_FILE; then
  1089. WIFI_CHANNEL=$(grep "WIFI_CHANNEL" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1090. fi
  1091. if grep -q "BATMAN_CELLID" $CONFIGURATION_FILE; then
  1092. BATMAN_CELLID=$(grep "BATMAN_CELLID" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1093. fi
  1094. if grep -q "ESSID" $CONFIGURATION_FILE; then
  1095. ESSID=$(grep "ESSID" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1096. fi
  1097. if grep -q "TOX_PORT" $CONFIGURATION_FILE; then
  1098. TOX_PORT=$(grep "TOX_PORT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1099. fi
  1100. if grep -q "TOX_NODES" $CONFIGURATION_FILE; then
  1101. TOX_NODES=$(grep "TOX_NODES" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1102. fi
  1103. if grep -q "TOX_REPO" $CONFIGURATION_FILE; then
  1104. TOX_REPO=$(grep "TOX_REPO" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1105. fi
  1106. if grep -q "ENABLE_SOCIAL_KEY_MANAGEMENT" $CONFIGURATION_FILE; then
  1107. ENABLE_SOCIAL_KEY_MANAGEMENT=$(grep "ENABLE_SOCIAL_KEY_MANAGEMENT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1108. fi
  1109. if grep -q "IPV6_NETWORK" $CONFIGURATION_FILE; then
  1110. IPV6_NETWORK=$(grep "IPV6_NETWORK" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1111. fi
  1112. if grep -q "HWRNG_TYPE" $CONFIGURATION_FILE; then
  1113. HWRNG_TYPE=$(grep "HWRNG_TYPE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1114. fi
  1115. if grep -q "MEDIAGOBLIN_DOMAIN_NAME" $CONFIGURATION_FILE; then
  1116. MEDIAGOBLIN_DOMAIN_NAME=$(grep "MEDIAGOBLIN_DOMAIN_NAME" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1117. fi
  1118. if grep -q "MEDIAGOBLIN_CODE" $CONFIGURATION_FILE; then
  1119. MEDIAGOBLIN_CODE=$(grep "MEDIAGOBLIN_CODE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1120. fi
  1121. if grep -q "MEDIAGOBLIN_REPO" $CONFIGURATION_FILE; then
  1122. MEDIAGOBLIN_REPO=$(grep "MEDIAGOBLIN_REPO" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1123. fi
  1124. if grep -q "MEDIAGOBLIN_COMMIT" $CONFIGURATION_FILE; then
  1125. MEDIAGOBLIN_COMMIT=$(grep "MEDIAGOBLIN_COMMIT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1126. fi
  1127. if grep -q "GIT_ADMIN_PASSWORD" $CONFIGURATION_FILE; then
  1128. GIT_ADMIN_PASSWORD=$(grep "GIT_ADMIN_PASSWORD" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1129. fi
  1130. if grep -q "GIT_DOMAIN_NAME" $CONFIGURATION_FILE; then
  1131. GIT_DOMAIN_NAME=$(grep "GIT_DOMAIN_NAME" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1132. fi
  1133. if grep -q "GIT_CODE" $CONFIGURATION_FILE; then
  1134. GIT_CODE=$(grep "GIT_CODE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1135. fi
  1136. if grep -q "SYSTEM_TYPE" $CONFIGURATION_FILE; then
  1137. SYSTEM_TYPE=$(grep "SYSTEM_TYPE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1138. fi
  1139. if grep -q "SSL_PROTOCOLS" $CONFIGURATION_FILE; then
  1140. SSL_PROTOCOLS=$(grep "SSL_PROTOCOLS" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1141. fi
  1142. if grep -q "SSL_CIPHERS" $CONFIGURATION_FILE; then
  1143. SSL_CIPHERS=$(grep "SSL_CIPHERS" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1144. fi
  1145. if grep -q "SSH_CIPHERS" $CONFIGURATION_FILE; then
  1146. SSH_CIPHERS=$(grep "SSH_CIPHERS" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1147. fi
  1148. if grep -q "SSH_MACS" $CONFIGURATION_FILE; then
  1149. SSH_MACS=$(grep "SSH_MACS" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1150. fi
  1151. if grep -q "SSH_KEX" $CONFIGURATION_FILE; then
  1152. SSH_KEX=$(grep "SSH_KEX" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1153. fi
  1154. if grep -q "SSH_HOST_KEY_ALGORITHMS" $CONFIGURATION_FILE; then
  1155. SSH_HOST_KEY_ALGORITHMS=$(grep "SSH_HOST_KEY_ALGORITHMS" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1156. fi
  1157. if grep -q "SSH_PASSWORDS" $CONFIGURATION_FILE; then
  1158. SSH_PASSWORDS=$(grep "SSH_PASSWORDS" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1159. fi
  1160. if grep -q "XMPP_CIPHERS" $CONFIGURATION_FILE; then
  1161. XMPP_CIPHERS=$(grep "XMPP_CIPHERS" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1162. fi
  1163. if grep -q "XMPP_ECC_CURVE" $CONFIGURATION_FILE; then
  1164. XMPP_ECC_CURVE=$(grep "XMPP_ECC_CURVE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1165. fi
  1166. if grep -q "MY_USERNAME" $CONFIGURATION_FILE; then
  1167. MY_USERNAME=$(grep "MY_USERNAME" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1168. fi
  1169. if grep -q "DOMAIN_NAME" $CONFIGURATION_FILE; then
  1170. # for backwards compatability
  1171. DEFAULT_DOMAIN_NAME=$(grep "DOMAIN_NAME" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1172. fi
  1173. if grep -q "DEFAULT_DOMAIN_NAME" $CONFIGURATION_FILE; then
  1174. DEFAULT_DOMAIN_NAME=$(grep "DEFAULT_DOMAIN_NAME" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1175. fi
  1176. if grep -q "DEFAULT_DOMAIN_CODE" $CONFIGURATION_FILE; then
  1177. DEFAULT_DOMAIN_CODE=$(grep "DEFAULT_DOMAIN_CODE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1178. fi
  1179. if grep -q "NAMESERVER1" $CONFIGURATION_FILE; then
  1180. NAMESERVER1=$(grep "NAMESERVER1" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1181. fi
  1182. if grep -q "NAMESERVER2" $CONFIGURATION_FILE; then
  1183. NAMESERVER2=$(grep "NAMESERVER2" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1184. fi
  1185. if grep -q "DEBIAN_REPO" $CONFIGURATION_FILE; then
  1186. DEBIAN_REPO=$(grep "DEBIAN_REPO" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1187. 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."
  1188. fi
  1189. if grep -q "VOIP_PORT" $CONFIGURATION_FILE; then
  1190. VOIP_PORT=$(grep "VOIP_PORT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1191. fi
  1192. if grep -q "VOIP_SERVER_PASSWORD" $CONFIGURATION_FILE; then
  1193. VOIP_SERVER_PASSWORD=$(grep "VOIP_SERVER_PASSWORD" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1194. fi
  1195. if grep -q "SIP_PORT" $CONFIGURATION_FILE; then
  1196. SIP_PORT=$(grep "SIP_PORT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1197. fi
  1198. if grep -q "SIP_TLS_PORT" $CONFIGURATION_FILE; then
  1199. SIP_TLS_PORT=$(grep "SIP_TLS_PORT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1200. fi
  1201. if grep -q "SIP_SERVER_PASSWORD" $CONFIGURATION_FILE; then
  1202. SIP_SERVER_PASSWORD=$(grep "SIP_SERVER_PASSWORD" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1203. fi
  1204. if grep -q "GET_IP_ADDRESS_URL" $CONFIGURATION_FILE; then
  1205. GET_IP_ADDRESS_URL=$(grep "GET_IP_ADDRESS_URL" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1206. fi
  1207. if grep -q "DDNS_PROVIDER" $CONFIGURATION_FILE; then
  1208. DDNS_PROVIDER=$(grep "DDNS_PROVIDER" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1209. fi
  1210. if grep -q "DDNS_USERNAME" $CONFIGURATION_FILE; then
  1211. DDNS_USERNAME=$(grep "DDNS_USERNAME" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1212. fi
  1213. if grep -q "DDNS_PASSWORD" $CONFIGURATION_FILE; then
  1214. DDNS_PASSWORD=$(grep "DDNS_PASSWORD" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1215. fi
  1216. if grep -q "LOCAL_NETWORK_STATIC_IP_ADDRESS" $CONFIGURATION_FILE; then
  1217. LOCAL_NETWORK_STATIC_IP_ADDRESS=$(grep "LOCAL_NETWORK_STATIC_IP_ADDRESS" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1218. fi
  1219. if grep -q "ENABLE_BABEL" $CONFIGURATION_FILE; then
  1220. ENABLE_BABEL=$(grep "ENABLE_BABEL" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1221. fi
  1222. if grep -q "ENABLE_BATMAN" $CONFIGURATION_FILE; then
  1223. ENABLE_BATMAN=$(grep "ENABLE_BATMAN" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1224. fi
  1225. if grep -q "ENABLE_CJDNS" $CONFIGURATION_FILE; then
  1226. ENABLE_CJDNS=$(grep "ENABLE_CJDNS" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1227. fi
  1228. if grep -q "CJDNS_COMMIT" $CONFIGURATION_FILE; then
  1229. CJDNS_COMMIT=$(grep "CJDNS_COMMIT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1230. fi
  1231. if grep -q "CJDNS_IPV6" $CONFIGURATION_FILE; then
  1232. CJDNS_IPV6=$(grep "CJDNS_IPV6" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1233. fi
  1234. if grep -q "CJDNS_PUBLIC_KEY" $CONFIGURATION_FILE; then
  1235. CJDNS_PUBLIC_KEY=$(grep "CJDNS_PUBLIC_KEY" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1236. fi
  1237. if grep -q "CJDNS_PRIVATE_KEY" $CONFIGURATION_FILE; then
  1238. CJDNS_PRIVATE_KEY=$(grep "CJDNS_PRIVATE_KEY" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1239. fi
  1240. if grep -q "ROUTER_IP_ADDRESS" $CONFIGURATION_FILE; then
  1241. ROUTER_IP_ADDRESS=$(grep "ROUTER_IP_ADDRESS" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1242. fi
  1243. if grep -q "CPU_CORES" $CONFIGURATION_FILE; then
  1244. CPU_CORES=$(grep "CPU_CORES" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1245. fi
  1246. if grep -q "WEBSERVER_LOG_LEVEL" $CONFIGURATION_FILE; then
  1247. WEBSERVER_LOG_LEVEL=$(grep "WEBSERVER_LOG_LEVEL" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1248. fi
  1249. if grep -q "ROUTE_THROUGH_TOR" $CONFIGURATION_FILE; then
  1250. ROUTE_THROUGH_TOR=$(grep "ROUTE_THROUGH_TOR" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1251. fi
  1252. if grep -q "WIKI_TITLE" $CONFIGURATION_FILE; then
  1253. WIKI_TITLE=$(grep "WIKI_TITLE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1254. fi
  1255. if grep -q "MY_NAME" $CONFIGURATION_FILE; then
  1256. MY_NAME=$(grep "MY_NAME" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1257. fi
  1258. if grep -q "MY_EMAIL_ADDRESS" $CONFIGURATION_FILE; then
  1259. MY_EMAIL_ADDRESS=$(grep "MY_EMAIL_ADDRESS" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1260. fi
  1261. if grep -q "INSTALLING_ON_BBB" $CONFIGURATION_FILE; then
  1262. INSTALLING_ON_BBB=$(grep "INSTALLING_ON_BBB" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1263. fi
  1264. if grep -q "SSH_PORT" $CONFIGURATION_FILE; then
  1265. SSH_PORT=$(grep "SSH_PORT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1266. fi
  1267. if grep -q "INSTALLED_WITHIN_DOCKER" $CONFIGURATION_FILE; then
  1268. INSTALLED_WITHIN_DOCKER=$(grep "INSTALLED_WITHIN_DOCKER" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1269. fi
  1270. if grep -q "PUBLIC_MAILING_LIST" $CONFIGURATION_FILE; then
  1271. PUBLIC_MAILING_LIST=$(grep "PUBLIC_MAILING_LIST" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1272. fi
  1273. if grep -q "MICROBLOG_DOMAIN_NAME" $CONFIGURATION_FILE; then
  1274. MICROBLOG_DOMAIN_NAME=$(grep "MICROBLOG_DOMAIN_NAME" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1275. fi
  1276. if grep -q "MICROBLOG_CODE" $CONFIGURATION_FILE; then
  1277. MICROBLOG_CODE=$(grep "MICROBLOG_CODE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1278. fi
  1279. if grep -q "HUBZILLA_DOMAIN_NAME" $CONFIGURATION_FILE; then
  1280. HUBZILLA_DOMAIN_NAME=$(grep "HUBZILLA_DOMAIN_NAME" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1281. fi
  1282. if grep -q "HUBZILLA_CODE" $CONFIGURATION_FILE; then
  1283. HUBZILLA_CODE=$(grep "HUBZILLA_CODE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1284. fi
  1285. if grep -q "OWNCLOUD_DOMAIN_NAME" $CONFIGURATION_FILE; then
  1286. OWNCLOUD_DOMAIN_NAME=$(grep "OWNCLOUD_DOMAIN_NAME" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1287. fi
  1288. if grep -q "OWNCLOUD_CODE" $CONFIGURATION_FILE; then
  1289. OWNCLOUD_CODE=$(grep "OWNCLOUD_CODE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1290. fi
  1291. if grep -q "WIKI_DOMAIN_NAME" $CONFIGURATION_FILE; then
  1292. WIKI_DOMAIN_NAME=$(grep "WIKI_DOMAIN_NAME" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1293. fi
  1294. if grep -q "WIKI_CODE" $CONFIGURATION_FILE; then
  1295. WIKI_CODE=$(grep "WIKI_CODE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1296. fi
  1297. if grep -q "FULLBLOG_DOMAIN_NAME" $CONFIGURATION_FILE; then
  1298. FULLBLOG_DOMAIN_NAME=$(grep "FULLBLOG_DOMAIN_NAME" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1299. fi
  1300. if grep -q "FULLBLOG_CODE" $CONFIGURATION_FILE; then
  1301. FULLBLOG_CODE=$(grep "FULLBLOG_CODE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1302. fi
  1303. if grep -q "MY_BLOG_TITLE" $CONFIGURATION_FILE; then
  1304. MY_BLOG_TITLE=$(grep "MY_BLOG_TITLE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1305. fi
  1306. if grep -q "MY_BLOG_SUBTITLE" $CONFIGURATION_FILE; then
  1307. MY_BLOG_SUBTITLE=$(grep "MY_BLOG_SUBTITLE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1308. fi
  1309. if grep -q "GPG_ENCRYPT_STORED_EMAIL" $CONFIGURATION_FILE; then
  1310. GPG_ENCRYPT_STORED_EMAIL=$(grep "GPG_ENCRYPT_STORED_EMAIL" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1311. fi
  1312. if grep -q "MY_GPG_PUBLIC_KEY" $CONFIGURATION_FILE; then
  1313. MY_GPG_PUBLIC_KEY=$(grep "MY_GPG_PUBLIC_KEY" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1314. fi
  1315. if grep -q "MY_GPG_PRIVATE_KEY" $CONFIGURATION_FILE; then
  1316. MY_GPG_PRIVATE_KEY=$(grep "MY_GPG_PRIVATE_KEY" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1317. fi
  1318. if grep -q "MY_GPG_PUBLIC_KEY_ID" $CONFIGURATION_FILE; then
  1319. MY_GPG_PUBLIC_KEY_ID=$(grep "MY_GPG_PUBLIC_KEY_ID" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1320. fi
  1321. if grep -q "USB_DRIVE" $CONFIGURATION_FILE; then
  1322. USB_DRIVE=$(grep "USB_DRIVE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1323. fi
  1324. if grep -q "MAX_PHP_MEMORY" $CONFIGURATION_FILE; then
  1325. MAX_PHP_MEMORY=$(grep "MAX_PHP_MEMORY" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1326. fi
  1327. if grep -q "TLS_TIME_SOURCE1" $CONFIGURATION_FILE; then
  1328. TLS_TIME_SOURCE1=$(grep "TLS_TIME_SOURCE1" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1329. fi
  1330. if grep -q "TLS_TIME_SOURCE2" $CONFIGURATION_FILE; then
  1331. TLS_TIME_SOURCE2=$(grep "TLS_TIME_SOURCE2" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  1332. fi
  1333. fi
  1334. echo "System type: $SYSTEM_TYPE"
  1335. }
  1336. function set_default_onion_domains {
  1337. # If sites are only visible via Tor then for installation
  1338. # purposes assign them some default domain names
  1339. if [[ $ONION_ONLY == "no" ]]; then
  1340. return
  1341. fi
  1342. if [ ${#OWNCLOUD_DOMAIN_NAME} -gt 1 ]; then
  1343. OWNCLOUD_DOMAIN_NAME='owncloud.local'
  1344. fi
  1345. if [ ${#MICROBLOG_DOMAIN_NAME} -gt 1 ]; then
  1346. MICROBLOG_DOMAIN_NAME='microblog.local'
  1347. fi
  1348. if [ ${#FULLBLOG_DOMAIN_NAME} -gt 1 ]; then
  1349. FULLBLOG_DOMAIN_NAME='blog.local'
  1350. fi
  1351. if [ ${#WIKI_DOMAIN_NAME} -gt 1 ]; then
  1352. WIKI_DOMAIN_NAME='wiki.local'
  1353. fi
  1354. if [ ${#DEFAULT_DOMAIN_NAME} -gt 1 ]; then
  1355. DEFAULT_DOMAIN_NAME="${PROJECT_NAME}.local"
  1356. fi
  1357. if [ ${#GIT_DOMAIN_NAME} -gt 1 ]; then
  1358. GIT_DOMAIN_NAME='git.local'
  1359. fi
  1360. if [ ${#MEDIAGOBLIN_DOMAIN_NAME} -gt 1 ]; then
  1361. MEDIAGOBLIN_DOMAIN_NAME='media.local'
  1362. fi
  1363. }
  1364. function nginx_disable_sniffing {
  1365. domain_name=$1
  1366. filename=/etc/nginx/sites-available/$domain_name
  1367. echo ' add_header X-Frame-Options DENY;' >> $filename
  1368. echo ' add_header X-Content-Type-Options nosniff;' >> $filename
  1369. echo '' >> $filename
  1370. }
  1371. function nginx_limits {
  1372. domain_name=$1
  1373. max_body='20m'
  1374. if [ $2 ]; then
  1375. max_body=$2
  1376. fi
  1377. filename=/etc/nginx/sites-available/$domain_name
  1378. echo " client_max_body_size ${max_body};" >> $filename
  1379. echo ' client_body_buffer_size 128k;' >> $filename
  1380. echo '' >> $filename
  1381. echo ' limit_conn conn_limit_per_ip 10;' >> $filename
  1382. echo ' limit_req zone=req_limit_per_ip burst=10 nodelay;' >> $filename
  1383. echo '' >> $filename
  1384. }
  1385. function nginx_http_redirect {
  1386. # redirect port 80 to https
  1387. domain_name=$1
  1388. filename=/etc/nginx/sites-available/$domain_name
  1389. echo 'server {' > $filename
  1390. echo ' listen 80;' >> $filename
  1391. echo ' listen [::]:80;' >> $filename
  1392. echo " server_name ${domain_name};" >> $filename
  1393. echo " root /var/www/${domain_name}/htdocs;" >> $filename
  1394. echo ' access_log off;' >> $filename
  1395. echo " error_log /var/log/nginx/${domain_name}_error.log $WEBSERVER_LOG_LEVEL;" >> $filename
  1396. nginx_limits $domain_name
  1397. echo ' rewrite ^ https://$server_name$request_uri? permanent;' >> $filename
  1398. echo '}' >> $filename
  1399. echo '' >> $filename
  1400. }
  1401. function nginx_ssl {
  1402. # creates the SSL/TLS section for a website
  1403. domain_name=$1
  1404. filename=/etc/nginx/sites-available/$domain_name
  1405. echo ' ssl on;' >> $filename
  1406. echo " ssl_certificate /etc/ssl/certs/${domain_name}.crt;" >> $filename
  1407. echo " ssl_certificate_key /etc/ssl/private/${domain_name}.key;" >> $filename
  1408. echo " ssl_dhparam /etc/ssl/certs/${domain_name}.dhparam;" >> $filename
  1409. echo '' >> $filename
  1410. echo ' ssl_session_timeout 60m;' >> $filename
  1411. echo ' ssl_prefer_server_ciphers on;' >> $filename
  1412. echo " ssl_protocols $SSL_PROTOCOLS;" >> $filename
  1413. echo " ssl_ciphers '$SSL_CIPHERS';" >> $filename
  1414. }
  1415. function set_repo_commit {
  1416. repo_dir=$1
  1417. repo_commit_name=$2
  1418. repo_commit=$3
  1419. repo_url=$4
  1420. if [ -d $repo_dir ]; then
  1421. if grep -q "$repo_commit_name" $COMPLETION_FILE; then
  1422. CURRENT_REPO_COMMIT=$(grep "$repo_commit_name" $COMPLETION_FILE | awk -F ':' '{print $2}')
  1423. if [[ "$CURRENT_REPO_COMMIT" != "$repo_commit" ]]; then
  1424. cd $repo_dir
  1425. git_pull $repo_url $repo_commit
  1426. sed -i "s/${repo_commit_name}.*/${repo_commit_name}:$repo_commit/g" $COMPLETION_FILE
  1427. # application specific stuff after updating the repo
  1428. if [[ $repo_dir == *"www"* ]]; then
  1429. chown -R www-data:www-data $repo_dir
  1430. fi
  1431. if [[ $repo_dir == *"cjdns" ]]; then
  1432. ./do
  1433. fi
  1434. if [[ $repo_dir == *"gpgit" ]]; then
  1435. cp gpgit.pl /usr/bin/gpgit.pl
  1436. fi
  1437. if [[ $repo_dir == *"cleanup-maildir" ]]; then
  1438. cp $INSTALL_DIR/cleanup-maildir/cleanup-maildir /usr/bin
  1439. fi
  1440. if [[ $repo_dir == *"nginx_ensite" ]]; then
  1441. make install
  1442. fi
  1443. if [[ $repo_dir == *"gogs" ]]; then
  1444. git checkout master
  1445. go get -u ./...
  1446. if [ ! "$?" = "0" ]; then
  1447. echo $'Failed to get gogs'
  1448. exit 52792
  1449. fi
  1450. git checkout $repo_commit
  1451. go build
  1452. if [ ! "$?" = "0" ]; then
  1453. echo $'Failed to build gogs'
  1454. exit 36226
  1455. fi
  1456. systemctl restart gogs
  1457. fi
  1458. if [[ $repo_dir == *"toxcore" ]]; then
  1459. autoreconf -i
  1460. ./configure --enable-daemon
  1461. make
  1462. make install
  1463. systemctl restart tox-bootstrapd.service
  1464. fi
  1465. if [[ $repo_dir == *"toxic" ]]; then
  1466. make
  1467. make install
  1468. fi
  1469. if [[ $repo_dir == $RSS_READER_PATH ]]; then
  1470. if ! grep -q "CURLOPT_PROXYTYPE" $RSS_READER_PATH/plugins/af_unburn/init.php; then
  1471. sed -i '/curl_setopt($ch, CURLOPT_PROXY, _CURL_HTTP_PROXY);/a \\t\t\t\t\tcurl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5);' $RSS_READER_PATH/plugins/af_unburn/init.php
  1472. fi
  1473. if ! grep -q "CURLOPT_PROXYTYPE" $RSS_READER_PATH/include/functions.php; then
  1474. sed -i '/curl_setopt($ch, CURLOPT_PROXY, _CURL_HTTP_PROXY);/a \\t\t\t\tcurl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5);' $RSS_READER_PATH/include/functions.php
  1475. fi
  1476. chown -R www-data:www-data $RSS_READER_PATH
  1477. fi
  1478. if [[ $repo_dir == *"inadyn" ]]; then
  1479. ./configure
  1480. USE_OPENSSL=1 make
  1481. make install
  1482. systemctl restart inadyn
  1483. fi
  1484. if [[ $repo_dir == *"ipfs" ]]; then
  1485. chown -R git:git /home/git
  1486. systemctl restart ipfs
  1487. systemctl daemon-reload
  1488. fi
  1489. fi
  1490. else
  1491. echo "${repo_commit_name}:${repo_commit}" >> $COMPLETION_FILE
  1492. fi
  1493. fi
  1494. }
  1495. function wait_for_onion_service {
  1496. onion_service_name="$1"
  1497. sleep_ctr=0
  1498. while [ ! -f /var/lib/tor/hidden_service_${onion_service_name}/hostname ]; do
  1499. sleep 1
  1500. sleep_ctr=$((sleep_ctr + 1))
  1501. if [ $sleep_ctr -gt 10 ]; then
  1502. break
  1503. fi
  1504. done
  1505. if [ ! -f /var/lib/tor/hidden_service_${onion_service_name}/hostname ]; then
  1506. # restart and try a second time
  1507. systemctl restart tor
  1508. sleep_ctr=0
  1509. while [ ! -f /var/lib/tor/hidden_service_${onion_service_name}/hostname ]; do
  1510. sleep 1
  1511. sleep_ctr=$((sleep_ctr + 1))
  1512. if [ $sleep_ctr -gt 10 ]; then
  1513. break
  1514. fi
  1515. done
  1516. fi
  1517. }
  1518. function add_onion_service {
  1519. onion_service_name="$1"
  1520. onion_service_port_from=$2
  1521. onion_service_port_to=$3
  1522. if [ -f /var/lib/tor/hidden_service_${onion_service_name}/hostname ]; then
  1523. echo $(cat /var/lib/tor/hidden_service_${onion_service_name}/hostname)
  1524. return
  1525. fi
  1526. if [ ! -d /var/lib/tor ]; then
  1527. echo $"No Tor installation found. ${onion_service_name} onion site cannot be configured."
  1528. exit 877367
  1529. fi
  1530. if ! grep -q "hidden_service_${onion_service_name}" /etc/tor/torrc; then
  1531. echo "HiddenServiceDir /var/lib/tor/hidden_service_${onion_service_name}/" >> /etc/tor/torrc
  1532. echo "HiddenServicePort ${onion_service_port_from} 127.0.0.1:${onion_service_port_to}" >> /etc/tor/torrc
  1533. fi
  1534. systemctl restart tor
  1535. wait_for_onion_service ${onion_service_name}
  1536. if [ ! -f /var/lib/tor/hidden_service_${onion_service_name}/hostname ]; then
  1537. echo $"${onion_service_name} onion site hostname not found"
  1538. exit 76362
  1539. fi
  1540. echo $(cat /var/lib/tor/hidden_service_${onion_service_name}/hostname)
  1541. }
  1542. function create_avahi_onion_domains {
  1543. if [[ $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  1544. return
  1545. fi
  1546. if [ ! -d /etc/avahi/services ]; then
  1547. return
  1548. fi
  1549. if [ $OWNCLOUD_DOMAIN_NAME ]; then
  1550. echo '<?xml version="1.0" standalone="no"?><!--*-nxml-*-->' > /etc/avahi/services/owncloud.service
  1551. echo '<!DOCTYPE service-group SYSTEM "avahi-service.dtd">' >> /etc/avahi/services/owncloud.service
  1552. echo '<service-group>' >> /etc/avahi/services/owncloud.service
  1553. echo ' <name replace-wildcards="yes">%h HTTP</name>' >> /etc/avahi/services/owncloud.service
  1554. echo ' <service>' >> /etc/avahi/services/owncloud.service
  1555. echo ' <type>_http._tcp</type>' >> /etc/avahi/services/owncloud.service
  1556. echo " <port>$OWNCLOUD_ONION_PORT</port>" >> /etc/avahi/services/owncloud.service
  1557. echo ' </service>' >> /etc/avahi/services/owncloud.service
  1558. echo '</service-group>' >> /etc/avahi/services/owncloud.service
  1559. fi
  1560. if [ $MICROBLOG_DOMAIN_NAME ]; then
  1561. echo '<?xml version="1.0" standalone="no"?><!--*-nxml-*-->' > /etc/avahi/services/microblog.service
  1562. echo '<!DOCTYPE service-group SYSTEM "avahi-service.dtd">' >> /etc/avahi/services/microblog.service
  1563. echo '<service-group>' >> /etc/avahi/services/microblog.service
  1564. echo ' <name replace-wildcards="yes">%h HTTP</name>' >> /etc/avahi/services/microblog.service
  1565. echo ' <service>' >> /etc/avahi/services/microblog.service
  1566. echo ' <type>_http._tcp</type>' >> /etc/avahi/services/microblog.service
  1567. echo " <port>$MICROBLOG_ONION_PORT</port>" >> /etc/avahi/services/microblog.service
  1568. echo ' </service>' >> /etc/avahi/services/microblog.service
  1569. echo '</service-group>' >> /etc/avahi/services/microblog.service
  1570. fi
  1571. if [ $FULLBLOG_DOMAIN_NAME ]; then
  1572. echo '<?xml version="1.0" standalone="no"?><!--*-nxml-*-->' > /etc/avahi/services/blog.service
  1573. echo '<!DOCTYPE service-group SYSTEM "avahi-service.dtd">' >> /etc/avahi/services/blog.service
  1574. echo '<service-group>' >> /etc/avahi/services/blog.service
  1575. echo ' <name replace-wildcards="yes">%h HTTP</name>' >> /etc/avahi/services/blog.service
  1576. echo ' <service>' >> /etc/avahi/services/blog.service
  1577. echo ' <type>_http._tcp</type>' >> /etc/avahi/services/blog.service
  1578. echo " <port>$BLOG_ONION_PORT</port>" >> /etc/avahi/services/blog.service
  1579. echo ' </service>' >> /etc/avahi/services/blog.service
  1580. echo '</service-group>' >> /etc/avahi/services/blog.service
  1581. fi
  1582. if [ $GIT_DOMAIN_NAME ]; then
  1583. echo '<?xml version="1.0" standalone="no"?><!--*-nxml-*-->' > /etc/avahi/services/git.service
  1584. echo '<!DOCTYPE service-group SYSTEM "avahi-service.dtd">' >> /etc/avahi/services/git.service
  1585. echo '<service-group>' >> /etc/avahi/services/git.service
  1586. echo ' <name replace-wildcards="yes">%h HTTP</name>' >> /etc/avahi/services/git.service
  1587. echo ' <service>' >> /etc/avahi/services/git.service
  1588. echo ' <type>_http._tcp</type>' >> /etc/avahi/services/git.service
  1589. echo " <port>$GIT_ONION_PORT</port>" >> /etc/avahi/services/git.service
  1590. echo ' </service>' >> /etc/avahi/services/git.service
  1591. echo '</service-group>' >> /etc/avahi/services/git.service
  1592. fi
  1593. if [ $WIKI_DOMAIN_NAME ]; then
  1594. echo '<?xml version="1.0" standalone="no"?><!--*-nxml-*-->' > /etc/avahi/services/wiki.service
  1595. echo '<!DOCTYPE service-group SYSTEM "avahi-service.dtd">' >> /etc/avahi/services/wiki.service
  1596. echo '<service-group>' >> /etc/avahi/services/wiki.service
  1597. echo ' <name replace-wildcards="yes">%h HTTP</name>' >> /etc/avahi/services/wiki.service
  1598. echo ' <service>' >> /etc/avahi/services/wiki.service
  1599. echo ' <type>_http._tcp</type>' >> /etc/avahi/services/wiki.service
  1600. echo " <port>$WIKI_ONION_PORT</port>" >> /etc/avahi/services/wiki.service
  1601. echo ' </service>' >> /etc/avahi/services/wiki.service
  1602. echo '</service-group>' >> /etc/avahi/services/wiki.service
  1603. fi
  1604. }
  1605. # check an individual domain name
  1606. function test_domain_name {
  1607. if [ $1 ]; then
  1608. TEST_DOMAIN_NAME=$1
  1609. validate_domain_name
  1610. if [[ $TEST_DOMAIN_NAME != $1 ]]; then
  1611. echo $TEST_DOMAIN_NAME
  1612. exit 8528
  1613. fi
  1614. fi
  1615. }
  1616. # check that domain names are sensible
  1617. function check_domains {
  1618. if [ ${#WIKI_DOMAIN_NAME} -gt 1 ]; then
  1619. test_domain_name "$WIKI_DOMAIN_NAME"
  1620. if [[ "$test_domain_name" == "$OWNCLOUD_DOMAIN_NAME" ]]; then
  1621. echo $'Wiki domain name is the same as Owncloud domain name. They must be different'
  1622. exit 73863
  1623. fi
  1624. if [[ "$test_domain_name" == "$FULLBLOG_DOMAIN_NAME" ]]; then
  1625. echo $'Wiki domain name is the same as blog domain name. They must be different'
  1626. exit 97326
  1627. fi
  1628. if [[ "$test_domain_name" == "$MICROBLOG_DOMAIN_NAME" ]]; then
  1629. echo $'Wiki domain name is the same as microblog domain name. They must be different'
  1630. exit 36827
  1631. fi
  1632. if [[ "$test_domain_name" == "$HUBZILLA_DOMAIN_NAME" ]]; then
  1633. echo $'Wiki domain name is the same as hubzilla domain name. They must be different'
  1634. exit 65848
  1635. fi
  1636. if [ ${#GIT_DOMAIN_NAME} -gt 1 ]; then
  1637. if [[ "$test_domain_name" == "$GIT_DOMAIN_NAME" ]]; then
  1638. echo $'Wiki domain name is the same as Gogs domain name. They must be different'
  1639. exit 73529
  1640. fi
  1641. fi
  1642. fi
  1643. if [ ${#OWNCLOUD_DOMAIN_NAME} -gt 1 ]; then
  1644. test_domain_name "$OWNCLOUD_DOMAIN_NAME"
  1645. if [[ "$test_domain_name" == "$WIKI_DOMAIN_NAME" ]]; then
  1646. echo $'Owncloud domain name is the same as wiki domain name. They must be different'
  1647. exit 37994
  1648. fi
  1649. if [[ "$test_domain_name" == "$FULLBLOG_DOMAIN_NAME" ]]; then
  1650. echo $'Owncloud domain name is the same as blog domain name. They must be different'
  1651. exit 37936
  1652. fi
  1653. if [[ "$test_domain_name" == "$MICROBLOG_DOMAIN_NAME" ]]; then
  1654. echo $'Owncloud domain name is the same as microblog domain name. They must be different'
  1655. exit 36896
  1656. fi
  1657. if [[ "$test_domain_name" == "$HUBZILLA_DOMAIN_NAME" ]]; then
  1658. echo $'Owncloud domain name is the same as hubzilla domain name. They must be different'
  1659. exit 68365
  1660. fi
  1661. if [ $GIT_DOMAIN_NAME ]; then
  1662. if [[ "$test_domain_name" == "$GIT_DOMAIN_NAME" ]]; then
  1663. echo $'Owncloud domain name is the same as Gogs domain name. They must be different'
  1664. exit 27692
  1665. fi
  1666. fi
  1667. fi
  1668. if [ ${#FULLBLOG_DOMAIN_NAME} -gt 1 ]; then
  1669. test_domain_name "$FULLBLOG_DOMAIN_NAME"
  1670. if [[ "$test_domain_name" == "$WIKI_DOMAIN_NAME" ]]; then
  1671. echo $'Blog domain name is the same as wiki domain name. They must be different'
  1672. exit 62348
  1673. fi
  1674. if [[ "$test_domain_name" == "$OWNCLOUD_DOMAIN_NAME" ]]; then
  1675. echo $'Blog domain name is the same as Owncloud domain name. They must be different'
  1676. exit 84682
  1677. fi
  1678. if [[ "$test_domain_name" == "$MICROBLOG_DOMAIN_NAME" ]]; then
  1679. echo $'Blog domain name is the same as microblog domain name. They must be different'
  1680. exit 38236
  1681. fi
  1682. if [[ "$test_domain_name" == "$HUBZILLA_DOMAIN_NAME" ]]; then
  1683. echo $'Blog domain name is the same as hubzilla domain name. They must be different'
  1684. exit 35483
  1685. fi
  1686. if [ $GIT_DOMAIN_NAME ]; then
  1687. if [[ "$test_domain_name" == "$GIT_DOMAIN_NAME" ]]; then
  1688. echo $'Blog domain name is the same as Gogs domain name. They must be different'
  1689. exit 84695
  1690. fi
  1691. fi
  1692. fi
  1693. if [ ${#MICROBLOG_DOMAIN_NAME} -gt 1 ]; then
  1694. test_domain_name "$MICROBLOG_DOMAIN_NAME"
  1695. if [[ "$test_domain_name" == "$WIKI_DOMAIN_NAME" ]]; then
  1696. echo $'Microblog domain name is the same as wiki domain name. They must be different'
  1697. exit 73924
  1698. fi
  1699. if [[ "$test_domain_name" == "$OWNCLOUD_DOMAIN_NAME" ]]; then
  1700. echo $'Microblog domain name is the same as Owncloud domain name. They must be different'
  1701. exit 73683
  1702. fi
  1703. if [[ "$test_domain_name" == "$FULLBLOG_DOMAIN_NAME" ]]; then
  1704. echo $'Microblog domain name is the same as blog domain name. They must be different'
  1705. exit 26832
  1706. fi
  1707. if [[ "$test_domain_name" == "$HUBZILLA_DOMAIN_NAME" ]]; then
  1708. echo $'Microblog domain name is the same as hubzilla domain name. They must be different'
  1709. exit 678382
  1710. fi
  1711. if [ $GIT_DOMAIN_NAME ]; then
  1712. if [[ "$test_domain_name" == "$GIT_DOMAIN_NAME" ]]; then
  1713. echo $'Microblog domain name is the same as Gogs domain name. They must be different'
  1714. exit 684325
  1715. fi
  1716. fi
  1717. fi
  1718. if [ $HUBZILLA_DOMAIN_NAME ]; then
  1719. test_domain_name "$HUBZILLA_DOMAIN_NAME"
  1720. if [[ "$test_domain_name" == "$WIKI_DOMAIN_NAME" ]]; then
  1721. echo $'Hubzilla domain name is the same as wiki domain name. They must be different'
  1722. exit 83682
  1723. fi
  1724. if [[ "$test_domain_name" == "$OWNCLOUD_DOMAIN_NAME" ]]; then
  1725. echo $'Hubzilla domain name is the same as Owncloud domain name. They must be different'
  1726. exit 65192
  1727. fi
  1728. if [[ "$test_domain_name" == "$FULLBLOG_DOMAIN_NAME" ]]; then
  1729. echo $'Hubzilla domain name is the same as blog domain name. They must be different'
  1730. exit 74817
  1731. fi
  1732. if [[ "$test_domain_name" == "$MICROBLOG_DOMAIN_NAME" ]]; then
  1733. echo $'Hubzilla domain name is the same as microblog domain name. They must be different'
  1734. exit 83683
  1735. fi
  1736. if [ ${#GIT_DOMAIN_NAME} -gt 1 ]; then
  1737. if [[ "$test_domain_name" == "$GIT_DOMAIN_NAME" ]]; then
  1738. echo $'Hubzilla domain name is the same as Gogs domain name. They must be different'
  1739. exit 135523
  1740. fi
  1741. fi
  1742. fi
  1743. if [ ${#GIT_DOMAIN_NAME} -gt 1 ]; then
  1744. test_domain_name "$GIT_DOMAIN_NAME"
  1745. if [[ "$test_domain_name" == "$WIKI_DOMAIN_NAME" ]]; then
  1746. echo $'Hubzilla domain name is the same as wiki domain name. They must be different'
  1747. exit 83682
  1748. fi
  1749. if [[ "$test_domain_name" == "$OWNCLOUD_DOMAIN_NAME" ]]; then
  1750. echo $'Hubzilla domain name is the same as Owncloud domain name. They must be different'
  1751. exit 65192
  1752. fi
  1753. if [[ "$test_domain_name" == "$FULLBLOG_DOMAIN_NAME" ]]; then
  1754. echo $'Hubzilla domain name is the same as blog domain name. They must be different'
  1755. exit 74817
  1756. fi
  1757. if [[ "$test_domain_name" == "$MICROBLOG_DOMAIN_NAME" ]]; then
  1758. echo $'Hubzilla domain name is the same as microblog domain name. They must be different'
  1759. exit 83683
  1760. fi
  1761. if [[ "$test_domain_name" == "$HUBZILLA_DOMAIN_NAME" ]]; then
  1762. echo $'Microblog domain name is the same as hubzilla domain name. They must be different'
  1763. exit 678382
  1764. fi
  1765. fi
  1766. }
  1767. # Checks whether certificates were generated for the given hostname
  1768. function check_certificates {
  1769. if [ ! $1 ]; then
  1770. return
  1771. fi
  1772. USE_LETSENCRYPT='no'
  1773. if [ $2 ]; then
  1774. USE_LETSENCRYPT=$2
  1775. fi
  1776. if [[ $USE_LETSENCRYPT == 'no' ]]; then
  1777. if [ ! -f /etc/ssl/private/$1.key ]; then
  1778. echo $"Private certificate for $CHECK_HOSTNAME was not created"
  1779. exit 63959
  1780. fi
  1781. if [ ! -f /etc/ssl/certs/$1.crt ]; then
  1782. echo $"Public certificate for $CHECK_HOSTNAME was not created"
  1783. exit 7679
  1784. fi
  1785. else
  1786. if [ ! -f /etc/letsencrypt/live/${1}/privkey.pem ]; then
  1787. echo $"Private certificate for $CHECK_HOSTNAME was not created"
  1788. exit 6282
  1789. fi
  1790. if [ ! -f /etc/letsencrypt/live/${1}/fullchain.pem ]; then
  1791. echo $"Public certificate for $CHECK_HOSTNAME was not created"
  1792. exit 5328
  1793. fi
  1794. fi
  1795. if [ ! -f /etc/ssl/certs/$1.dhparam ]; then
  1796. echo $"Diffie–Hellman parameters for $CHECK_HOSTNAME were not created"
  1797. exit 5989
  1798. fi
  1799. }
  1800. function create_site_certificate {
  1801. SITE_DOMAIN_NAME="$1"
  1802. # if yes then only "valid" certs are allowed, not self-signed
  1803. NO_SELF_SIGNED='no'
  1804. if [ $2 ]; then
  1805. NO_SELF_SIGNED="$2"
  1806. fi
  1807. if [[ $ONION_ONLY == "no" ]]; then
  1808. if [ ! -f /etc/ssl/certs/$SITE_DOMAIN_NAME.dhparam ]; then
  1809. if [[ $LETSENCRYPT_ENABLED != "yes" ]]; then
  1810. ${PROJECT_NAME}-addcert -h $SITE_DOMAIN_NAME --dhkey $DH_KEYLENGTH
  1811. check_certificates $SITE_DOMAIN_NAME
  1812. else
  1813. ${PROJECT_NAME}-addcert -e $SITE_DOMAIN_NAME -s $LETSENCRYPT_SERVER --dhkey $DH_KEYLENGTH --email $MY_EMAIL_ADDRESS
  1814. if [ ! "$?" = "0" ]; then
  1815. if [[ $NO_SELF_SIGNED == 'no' ]]; then
  1816. echo $"Lets Encrypt failed for $SITE_DOMAIN_NAME, so try making a self-signed cert"
  1817. ${PROJECT_NAME}-addcert -h $SITE_DOMAIN_NAME --dhkey $DH_KEYLENGTH
  1818. check_certificates $SITE_DOMAIN_NAME
  1819. else
  1820. echo $"Lets Encrypt failed for $SITE_DOMAIN_NAME"
  1821. exit 682529
  1822. fi
  1823. else
  1824. check_certificates $SITE_DOMAIN_NAME 'yes'
  1825. fi
  1826. fi
  1827. fi
  1828. fi
  1829. }
  1830. function backup_database_local {
  1831. # Makes local backups of databases which can then be automatically rolled
  1832. # back if corruption is detected
  1833. database_name=$1
  1834. backup_databases_script=/usr/bin/backupdatabases
  1835. echo '' >> $backup_databases_script
  1836. echo "# Backup the ${database_name} database" >> $backup_databases_script
  1837. echo "TEMPFILE=/root/${database_name}.sql" >> $backup_databases_script
  1838. echo 'DAILYFILE=/var/backups/${database_name}_daily.sql' >> $backup_databases_script
  1839. echo "mysqldump --password=\"\$MYSQL_PASSWORD\" ${database_name} > \$TEMPFILE" >> $backup_databases_script
  1840. echo 'FILESIZE=$(stat -c%s $TEMPFILE)' >> $backup_databases_script
  1841. echo 'if [ "$FILESIZE" -eq "0" ]; then' >> $backup_databases_script
  1842. echo ' if [ -f $DAILYFILE ]; then' >> $backup_databases_script
  1843. echo ' cp $DAILYFILE $TEMPFILE' >> $backup_databases_script
  1844. echo '' >> $backup_databases_script
  1845. echo ' # try to restore yesterdays database' >> $backup_databases_script
  1846. echo " mysql -u root --password=\"\$MYSQL_PASSWORD\" ${database_name} -o < \$DAILYFILE" >> $backup_databases_script
  1847. echo '' >> $backup_databases_script
  1848. echo ' # Send a warning email' >> $backup_databases_script
  1849. echo " echo \"Unable to create a backup of the ${database_name} database. Attempted to restore from yesterdays backup\" | mail -s \"${database_name} backup\" \$EMAIL" >> $backup_databases_script
  1850. echo ' else' >> $backup_databases_script
  1851. echo ' # Send a warning email' >> $backup_databases_script
  1852. echo " echo \"Unable to create a backup of the ${database_name} database.\" | mail -s \"${database_name} backup\" \$EMAIL" >> $backup_databases_script
  1853. echo ' fi' >> $backup_databases_script
  1854. echo 'else' >> $backup_databases_script
  1855. echo ' chmod 600 $TEMPFILE' >> $backup_databases_script
  1856. echo ' mv $TEMPFILE $DAILYFILE' >> $backup_databases_script
  1857. echo '' >> $backup_databases_script
  1858. echo ' # Make the backup readable only by root' >> $backup_databases_script
  1859. echo ' chmod 600 $DAILYFILE' >> $backup_databases_script
  1860. echo 'fi' >> $backup_databases_script
  1861. weekly_backup_script=/etc/cron.weekly/backupdatabasesweekly
  1862. if ! grep -q "${database_name}" ${weekly_backup_script}; then
  1863. echo '' >> ${weekly_backup_script}
  1864. echo "# ${database_name}" >> ${weekly_backup_script}
  1865. echo "if [ -f /var/backups/${database_name}_weekly.sql ]; then" >> ${weekly_backup_script}
  1866. echo " cp -f /var/backups/${database_name}_weekly.sql /var/backups/${database_name}_2weekly.sql" >> ${weekly_backup_script}
  1867. echo 'fi' >> ${weekly_backup_script}
  1868. echo "if [ -f /var/backups/${database_name}_daily.sql ]; then" >> ${weekly_backup_script}
  1869. echo " cp -f /var/backups/${database_name}_daily.sql /var/backups/${database_name}_weekly.sql" >> ${weekly_backup_script}
  1870. echo 'fi' >> ${weekly_backup_script}
  1871. fi
  1872. monthly_backup_script=/etc/cron.monthly/backupdatabasesmonthly
  1873. if ! grep -q "${database_name}" ${monthly_backup_script}; then
  1874. echo '' >> ${monthly_backup_script}
  1875. echo "# ${database_name}" >> ${monthly_backup_script}
  1876. echo "if [ -f /var/backups/${database_name}_monthly.sql ]; then" >> ${monthly_backup_script}
  1877. echo " cp -f /var/backups/${database_name}_monthly.sql /var/backups/${database_name}_2monthly.sql" >> ${monthly_backup_script}
  1878. echo 'fi' >> ${monthly_backup_script}
  1879. echo "if [ -f /var/backups/${database_name}_weekly.sql ]; then" >> ${monthly_backup_script}
  1880. echo " cp -f /var/backups/${database_name}_weekly.sql /var/backups/${database_name}_monthly.sql" >> ${monthly_backup_script}
  1881. echo 'fi' >> ${monthly_backup_script}
  1882. fi
  1883. if ! grep -q "${database_name}" /etc/cron.hourly/repair; then
  1884. echo "${PROJECT_NAME}-repair-database ${database_name}" >> /etc/cron.hourly/repair
  1885. # remove legacy stuff
  1886. sed -i 's|/usr/bin/repairdatabase redmatrix||g' /etc/cron.hourly/repair
  1887. fi
  1888. }
  1889. function install_not_on_BBB {
  1890. if grep -Fxq "install_not_on_BBB" $COMPLETION_FILE; then
  1891. return
  1892. fi
  1893. if [[ INSTALLING_ON_BBB == "yes" ]]; then
  1894. return
  1895. fi
  1896. if [ ! $LOCAL_NETWORK_STATIC_IP_ADDRESS ]; then
  1897. return
  1898. fi
  1899. echo '# The loopback network interface' > /etc/network/interfaces
  1900. echo 'auto lo' >> /etc/network/interfaces
  1901. echo 'iface lo inet loopback' >> /etc/network/interfaces
  1902. echo '' >> /etc/network/interfaces
  1903. echo '# The primary network interface' >> /etc/network/interfaces
  1904. echo 'auto eth0' >> /etc/network/interfaces
  1905. echo 'iface eth0 inet static' >> /etc/network/interfaces
  1906. echo " address $LOCAL_NETWORK_STATIC_IP_ADDRESS" >> /etc/network/interfaces
  1907. echo ' netmask 255.255.255.0' >> /etc/network/interfaces
  1908. echo " gateway $ROUTER_IP_ADDRESS" >> /etc/network/interfaces
  1909. echo " dns-nameservers $NAMESERVER1 $NAMESERVER2" >> /etc/network/interfaces
  1910. echo '# Example to keep MAC address between reboots' >> /etc/network/interfaces
  1911. echo '#hwaddress ether DE:AD:BE:EF:CA:FE' >> /etc/network/interfaces
  1912. echo '' >> /etc/network/interfaces
  1913. echo '# The secondary network interface' >> /etc/network/interfaces
  1914. echo '#auto eth1' >> /etc/network/interfaces
  1915. echo '#iface eth1 inet dhcp' >> /etc/network/interfaces
  1916. echo '' >> /etc/network/interfaces
  1917. echo '# WiFi Example' >> /etc/network/interfaces
  1918. echo "#auto $WIFI_INTERFACE" >> /etc/network/interfaces
  1919. echo "#iface $WIFI_INTERFACE inet dhcp" >> /etc/network/interfaces
  1920. echo '# wpa-ssid "essid"' >> /etc/network/interfaces
  1921. echo '# wpa-psk "password"' >> /etc/network/interfaces
  1922. echo '' >> /etc/network/interfaces
  1923. echo '# Ethernet/RNDIS gadget (g_ether)' >> /etc/network/interfaces
  1924. echo '# ... or on host side, usbnet and random hwaddr' >> /etc/network/interfaces
  1925. echo '# Note on some boards, usb0 is automaticly setup with an init script' >> /etc/network/interfaces
  1926. echo '#iface usb0 inet static' >> /etc/network/interfaces
  1927. echo '# address 192.168.7.2' >> /etc/network/interfaces
  1928. echo '# netmask 255.255.255.0' >> /etc/network/interfaces
  1929. echo '# network 192.168.7.0' >> /etc/network/interfaces
  1930. echo '# gateway 192.168.7.1' >> /etc/network/interfaces
  1931. echo 'install_not_on_BBB' >> $COMPLETION_FILE
  1932. }
  1933. function mark_admin_user_account {
  1934. if ! grep -q "Admin user:" $COMPLETION_FILE; then
  1935. echo "Admin user:$MY_USERNAME" >> $COMPLETION_FILE
  1936. fi
  1937. }
  1938. function mark_blog_domain {
  1939. 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
  1940. return
  1941. fi
  1942. if ! grep -q "Blog domain:" $COMPLETION_FILE; then
  1943. echo "Blog domain:$FULLBLOG_DOMAIN_NAME" >> $COMPLETION_FILE
  1944. fi
  1945. }
  1946. function randomize_cron {
  1947. # The predictable default timing of Debian cron jobs might
  1948. # be exploitable knowledge. Avoid too much predictability
  1949. # by randomizing the times when cron jobs run
  1950. if grep -Fxq "randomize_cron" $COMPLETION_FILE; then
  1951. return
  1952. fi
  1953. # randomize the day on which the weekly cron job runs
  1954. randdow=$(($RANDOM%6+1))
  1955. sed -i "s|\* \* 7|* * $randdow|g" /etc/crontab
  1956. # randomize the time when the weekly cron job runs
  1957. randmin=$(($RANDOM%60))
  1958. randhr=$(($RANDOM%3+1))
  1959. sed -i "s|47 6|$randmin $randhr|g" /etc/crontab
  1960. # randomize the time when the daily cron job runs
  1961. randmin=$(($RANDOM%60))
  1962. randhr=$(($RANDOM%3+4))
  1963. sed -i "s|25 6\t\* \* \*|$randmin $randhr\t* * *|g" /etc/crontab
  1964. # randomize the time when the hourly cron job runs
  1965. randmin=$(($RANDOM%60))
  1966. sed -i "s|17 \*\t|$randmin *\t|g" /etc/crontab
  1967. # randomize monthly cron job time and day
  1968. randmin=$(($RANDOM%60))
  1969. randhr=$(($RANDOM%22+1))
  1970. randdom=$(($RANDOM%27+1))
  1971. sed -i "s|52 6\t|$randmin $randhr\t|g" /etc/crontab
  1972. sed -i "s|\t1 \* \*|\t$randdom * *|g" /etc/crontab
  1973. systemctl restart cron
  1974. echo 'randomize_cron' >> $COMPLETION_FILE
  1975. }
  1976. function get_cjdns_public_key {
  1977. if [ -f /home/$MY_USERNAME/README ]; then
  1978. if grep -q "cjdns public key" /home/$MY_USERNAME/README; then
  1979. if [ ! $CJDNS_PUBLIC_KEY ]; then
  1980. CJDNS_PUBLIC_KEY=$(cat /home/$MY_USERNAME/README | grep "cjdns public key" | awk -F ':' '{print $2}' | sed 's/^ *//')
  1981. fi
  1982. fi
  1983. fi
  1984. }
  1985. function get_cjdns_private_key {
  1986. if [ -f /home/$MY_USERNAME/README ]; then
  1987. if grep -q "cjdns private key" /home/$MY_USERNAME/README; then
  1988. if [ ! $CJDNS_PRIVATE_KEY ]; then
  1989. CJDNS_PRIVATE_KEY=$(cat /home/$MY_USERNAME/README | grep "cjdns private key" | awk -F ':' '{print $2}' | sed 's/^ *//')
  1990. fi
  1991. fi
  1992. fi
  1993. }
  1994. function get_cjdns_ipv6_address {
  1995. if [ -f /home/$MY_USERNAME/README ]; then
  1996. if grep -q "cjdns IPv6 address" /home/$MY_USERNAME/README; then
  1997. if [ ! $CJDNS_IPV6 ]; then
  1998. CJDNS_IPV6=$(cat /home/$MY_USERNAME/README | grep "cjdns IPv6 address" | awk -F ':' '{print $2}' | sed 's/^ *//')
  1999. fi
  2000. fi
  2001. fi
  2002. }
  2003. function get_cjdns_port {
  2004. if [ -f /home/$MY_USERNAME/README ]; then
  2005. if grep -q "cjdns port" /home/$MY_USERNAME/README; then
  2006. if [ ! $CJDNS_PORT ]; then
  2007. CJDNS_PORT=$(cat /home/$MY_USERNAME/README | grep "cjdns port" | awk -F ':' '{print $2}' | sed 's/^ *//')
  2008. fi
  2009. fi
  2010. fi
  2011. }
  2012. function get_cjdns_password {
  2013. if [ -f /home/$MY_USERNAME/README ]; then
  2014. if grep -q "cjdns password" /home/$MY_USERNAME/README; then
  2015. if [ ! $CJDNS_PASSWORD ]; then
  2016. CJDNS_PASSWORD=$(cat /home/$MY_USERNAME/README | grep "cjdns password" | awk -F ':' '{print $2}' | sed 's/^ *//')
  2017. fi
  2018. fi
  2019. fi
  2020. }
  2021. # script to automatically renew any Let's Encrypt certificates
  2022. function letsencrypt_renewals {
  2023. if [[ $ONION_ONLY != "no" ]]; then
  2024. return
  2025. fi
  2026. renewals_script=/etc/cron.monthly/letsencrypt
  2027. renewals_retry_script=/etc/cron.daily/letsencrypt
  2028. renewal_failure_msg=$'The certificate for $LETSENCRYPT_DOMAIN could not be renewed'
  2029. renewal_email_title=$'${PROJECT_NAME} Lets Encrypt certificate renewal'
  2030. # the main script tries to renew once per month
  2031. echo '#!/bin/bash' > $renewals_script
  2032. echo '' >> $renewals_script
  2033. echo "PROJECT_NAME='${PROJECT_NAME}'" >> $renewals_script
  2034. echo 'COMPLETION_FILE=$HOME/${PROJECT_NAME}-completed.txt' >> $renewals_script
  2035. echo '' >> $renewals_script
  2036. echo 'if [ -d /etc/letsencrypt ]; then' >> $renewals_script
  2037. echo ' if [ -f ~/letsencrypt_failed ]; then' >> $renewals_script
  2038. echo ' rm ~/letsencrypt_failed' >> $renewals_script
  2039. echo ' fi' >> $renewals_script
  2040. echo -n ' ADMIN_USERNAME=$(cat $COMPLETION_FILE | grep "Admin user" | ' >> $renewals_script
  2041. echo -n "awk -F ':' '{print " >> $renewals_script
  2042. echo -n '$2' >> $renewals_script
  2043. echo "}')" >> $renewals_script
  2044. echo ' ADMIN_EMAIL_ADDRESS=$ADMIN_USERNAME@$HOSTNAME' >> $renewals_script
  2045. echo ' for d in /etc/letsencrypt/live/*/ ; do' >> $renewals_script
  2046. echo -n ' LETSENCRYPT_DOMAIN=$(echo "$d" | ' >> $renewals_script
  2047. echo -n "awk -F '/' '{print " >> $renewals_script
  2048. echo -n '$5' >> $renewals_script
  2049. echo "}')" >> $renewals_script
  2050. echo ' if [ -f /etc/nginx/sites-available/$LETSENCRYPT_DOMAIN ]; then' >> $renewals_script
  2051. echo ' ${PROJECT_NAME}-renew-cert -h $LETSENCRYPT_DOMAIN -p letsencrypt' >> $renewals_script
  2052. echo ' if [ ! "$?" = "0" ]; then' >> $renewals_script
  2053. echo " echo \"${renewal_failure_msg}\" > ~/temp_renewletsencrypt.txt" >> $renewals_script
  2054. echo ' echo "" >> ~/temp_renewletsencrypt.txt' >> $renewals_script
  2055. echo ' ${PROJECT_NAME}-renew-cert -h $LETSENCRYPT_DOMAIN -p letsencrypt 2>> ~/temp_renewletsencrypt.txt' >> $renewals_script
  2056. echo -n " cat ~/temp_renewletsencrypt.txt | mail -s \"${renewal_email_title}\" " >> $renewals_script
  2057. echo '$ADMIN_EMAIL_ADDRESS' >> $renewals_script
  2058. echo ' rm ~/temp_renewletsencrypt.txt' >> $renewals_script
  2059. echo ' if [ ! -f ~/letsencrypt_failed ]; then' >> $renewals_script
  2060. echo ' touch ~/letsencrypt_failed' >> $renewals_script
  2061. echo ' fi' >> $renewals_script
  2062. echo ' fi' >> $renewals_script
  2063. echo ' fi' >> $renewals_script
  2064. echo ' done' >> $renewals_script
  2065. echo 'fi' >> $renewals_script
  2066. chmod +x $renewals_script
  2067. # a secondary script keeps trying to renew after a failure
  2068. echo '#!/bin/bash' > $renewals_retry_script
  2069. echo '' >> $renewals_retry_script
  2070. echo "PROJECT_NAME='${PROJECT_NAME}'" >> $renewals_retry_script
  2071. echo 'COMPLETION_FILE=$HOME/${PROJECT_NAME}-completed.txt' >> $renewals_retry_script
  2072. echo '' >> $renewals_retry_script
  2073. echo 'if [ -d /etc/letsencrypt ]; then' >> $renewals_retry_script
  2074. echo ' if [ -f ~/letsencrypt_failed ]; then' >> $renewals_retry_script
  2075. echo ' rm ~/letsencrypt_failed' >> $renewals_retry_script
  2076. echo -n ' ADMIN_USERNAME=$(cat $COMPLETION_FILE | grep "Admin user" | ' >> $renewals_retry_script
  2077. echo -n "awk -F ':' '{print " >> $renewals_retry_script
  2078. echo -n '$2' >> $renewals_retry_script
  2079. echo "}')" >> $renewals_retry_script
  2080. echo ' ADMIN_EMAIL_ADDRESS=$ADMIN_USERNAME@$HOSTNAME' >> $renewals_retry_script
  2081. echo ' for d in /etc/letsencrypt/live/*/ ; do' >> $renewals_retry_script
  2082. echo -n ' LETSENCRYPT_DOMAIN=$(echo "$d" | ' >> $renewals_retry_script
  2083. echo -n "awk -F '/' '{print " >> $renewals_retry_script
  2084. echo -n '$5' >> $renewals_retry_script
  2085. echo "}')" >> $renewals_retry_script
  2086. echo ' if [ -f /etc/nginx/sites-available/$LETSENCRYPT_DOMAIN ]; then' >> $renewals_retry_script
  2087. echo ' ${PROJECT_NAME}-renew-cert -h $LETSENCRYPT_DOMAIN -p letsencrypt' >> $renewals_retry_script
  2088. echo ' if [ ! "$?" = "0" ]; then' >> $renewals_retry_script
  2089. echo " echo \"${renewal_failure_msg}\" > ~/temp_renewletsencrypt.txt" >> $renewals_retry_script
  2090. echo ' echo "" >> ~/temp_renewletsencrypt.txt' >> $renewals_retry_script
  2091. echo ' ${PROJECT_NAME}-renew-cert -h $LETSENCRYPT_DOMAIN -p letsencrypt 2>> ~/temp_renewletsencrypt.txt' >> $renewals_retry_script
  2092. echo -n " cat ~/temp_renewletsencrypt.txt | mail -s \"${renewal_email_title}\" " >> $renewals_retry_script
  2093. echo '$ADMIN_EMAIL_ADDRESS' >> $renewals_retry_script
  2094. echo ' rm ~/temp_renewletsencrypt.txt' >> $renewals_retry_script
  2095. echo ' if [ ! -f ~/letsencrypt_failed ]; then' >> $renewals_retry_script
  2096. echo ' touch ~/letsencrypt_failed' >> $renewals_retry_script
  2097. echo ' fi' >> $renewals_retry_script
  2098. echo ' fi' >> $renewals_retry_script
  2099. echo ' fi' >> $renewals_retry_script
  2100. echo ' done' >> $renewals_retry_script
  2101. echo ' fi' >> $renewals_retry_script
  2102. echo 'fi' >> $renewals_retry_script
  2103. chmod +x $renewals_retry_script
  2104. }
  2105. function save_firewall_settings {
  2106. iptables-save > /etc/firewall.conf
  2107. ip6tables-save > /etc/firewall6.conf
  2108. printf '#!/bin/sh\n' > /etc/network/if-up.d/iptables
  2109. printf 'iptables-restore < /etc/firewall.conf\n' >> /etc/network/if-up.d/iptables
  2110. printf 'ip6tables-restore < /etc/firewall6.conf\n' >> /etc/network/if-up.d/iptables
  2111. chmod +x /etc/network/if-up.d/iptables
  2112. }
  2113. function enable_ipv6 {
  2114. # endure that ipv6 is enabled and can route
  2115. sed -i 's/net.ipv6.conf.all.disable_ipv6.*/net.ipv6.conf.all.disable_ipv6 = 0/g' /etc/sysctl.conf
  2116. #sed -i "s/net.ipv6.conf.all.accept_redirects.*/net.ipv6.conf.all.accept_redirects = 1/g" /etc/sysctl.conf
  2117. #sed -i "s/net.ipv6.conf.all.accept_source_route.*/net.ipv6.conf.all.accept_source_route = 1/g" /etc/sysctl.conf
  2118. sed -i "s/net.ipv6.conf.all.forwarding.*/net.ipv6.conf.all.forwarding=1/g" /etc/sysctl.conf
  2119. echo 1 > /proc/sys/net/ipv6/conf/all/forwarding
  2120. }
  2121. function mesh_cjdns {
  2122. if [[ $ENABLE_CJDNS != "yes" ]]; then
  2123. return
  2124. fi
  2125. # update to the next commit
  2126. set_repo_commit /etc/cjdns "cjdns commit" "$CJDNS_COMMIT" $CJDNS_REPO
  2127. if grep -Fxq "mesh_cjdns" $COMPLETION_FILE; then
  2128. return
  2129. fi
  2130. apt-get -y install nodejs git build-essential nmap
  2131. # if a README exists then obtain the cjdns parameters
  2132. get_cjdns_ipv6_address
  2133. get_cjdns_public_key
  2134. get_cjdns_private_key
  2135. get_cjdns_port
  2136. get_cjdns_password
  2137. # special compile settings for running ./do on the Beaglebone Black
  2138. if [[ $INSTALLING_ON_BBB == "yes" ]]; then
  2139. CFLAGS="-O2 -march=armv7-a -mtune=cortex-a8 -mfpu=neon -ftree-vectorize -ffast-math -mfloat-abi=hard -marm -Wno-error=maybe-uninitialized"
  2140. export LDFLAGS="$CFLAGS"
  2141. fi
  2142. if [ ! -d /etc/cjdns ]; then
  2143. git_clone $CJDNS_REPO /etc/cjdns
  2144. cd /etc/cjdns
  2145. git checkout $CJDNS_COMMIT -b $CJDNS_COMMIT
  2146. if ! grep -q "cjdns commit" $COMPLETION_FILE; then
  2147. echo "cjdns commit:$CJDNS_COMMIT" >> $COMPLETION_FILE
  2148. else
  2149. sed -i "s/cjdns commit.*/cjdns commit:$CJDNS_COMMIT/g" $COMPLETION_FILE
  2150. fi
  2151. ./do
  2152. if [ ! "$?" = "0" ]; then
  2153. exit 7439
  2154. fi
  2155. # create a configuration
  2156. if [ ! -f /etc/cjdns/cjdroute.conf ]; then
  2157. ./cjdroute --genconf > /etc/cjdns/cjdroute.conf
  2158. if [ ! "$?" = "0" ]; then
  2159. exit 5922
  2160. fi
  2161. fi
  2162. # create a user to run as
  2163. useradd cjdns
  2164. else
  2165. cd /etc/cjdns
  2166. git_pull $CJDNS_REPO
  2167. ./do
  2168. if [ ! "$?" = "0" ]; then
  2169. exit 9926
  2170. fi
  2171. fi
  2172. # set permissions
  2173. chown -R cjdns:cjdns /etc/cjdns
  2174. chmod 600 /etc/cjdns/cjdroute.conf
  2175. /sbin/ip tuntap add mode tun user cjdns dev cjdroute0
  2176. # insert values into the configuration file
  2177. if [ $CJDNS_PRIVATE_KEY ]; then
  2178. sed -i "s/\"privateKey\":.*/\"privateKey\": \"$CJDNS_PRIVATE_KEY\",/g" /etc/cjdns/cjdroute.conf
  2179. else
  2180. CJDNS_PRIVATE_KEY=$(cat /etc/cjdns/cjdroute.conf | grep '"privateKey"' | awk -F '"' '{print $4}' | sed -n 1p)
  2181. fi
  2182. if [ $CJDNS_PUBLIC_KEY ]; then
  2183. sed -i "s/\"publicKey\":.*/\"publicKey\": \"$CJDNS_PUBLIC_KEY\",/g" /etc/cjdns/cjdroute.conf
  2184. else
  2185. CJDNS_PUBLIC_KEY=$(cat /etc/cjdns/cjdroute.conf | grep '"publicKey"' | awk -F '"' '{print $4}' | sed -n 1p)
  2186. fi
  2187. if [ $CJDNS_IPV6 ]; then
  2188. sed -i "s/\"ipv6\":.*/\"ipv6\": \"$CJDNS_IPV6\",/g" /etc/cjdns/cjdroute.conf
  2189. else
  2190. CJDNS_IPV6=$(cat /etc/cjdns/cjdroute.conf | grep '"ipv6"' | awk -F '"' '{print $4}' | sed -n 1p)
  2191. fi
  2192. if [ $CJDNS_PASSWORD ]; then
  2193. sed -i "0,/{\"password\":.*/s//{\"password\": \"$CJDNS_PASSWORD\"}/g" /etc/cjdns/cjdroute.conf
  2194. else
  2195. CJDNS_PASSWORD=$(cat /etc/cjdns/cjdroute.conf | grep '"password"' | awk -F '"' '{print $4}' | sed -n 1p)
  2196. fi
  2197. if [ $CJDNS_PORT ]; then
  2198. sed -i "s/\"bind\": \"0.0.0.0:.*/\"bind\": \"0.0.0.0:$CJDNS_PORT\",/g" /etc/cjdns/cjdroute.conf
  2199. else
  2200. CJDNS_PORT=$(cat /etc/cjdns/cjdroute.conf | grep '"bind": "0.0.0.0:' | awk -F '"' '{print $4}' | awk -F ':' '{print $2}' | sed -n 1p)
  2201. fi
  2202. enable_ipv6
  2203. echo '#!/bin/sh -e' > /etc/init.d/cjdns
  2204. echo '### BEGIN INIT INFO' >> /etc/init.d/cjdns
  2205. echo '# hyperboria.sh - An init script (/etc/init.d/) for cjdns' >> /etc/init.d/cjdns
  2206. echo '# Provides: cjdroute' >> /etc/init.d/cjdns
  2207. echo '# Required-Start: $remote_fs $network' >> /etc/init.d/cjdns
  2208. echo '# Required-Stop: $remote_fs $network' >> /etc/init.d/cjdns
  2209. echo '# Default-Start: 2 3 4 5' >> /etc/init.d/cjdns
  2210. echo '# Default-Stop: 0 1 6' >> /etc/init.d/cjdns
  2211. echo '# Short-Description: Cjdns router' >> /etc/init.d/cjdns
  2212. echo '# Description: A routing engine designed for security, scalability, speed and ease of use.' >> /etc/init.d/cjdns
  2213. echo '# cjdns git repo: https://github.com/cjdelisle/cjdns/' >> /etc/init.d/cjdns
  2214. echo '### END INIT INFO' >> /etc/init.d/cjdns
  2215. echo '' >> /etc/init.d/cjdns
  2216. echo 'PROG="cjdroute"' >> /etc/init.d/cjdns
  2217. echo 'GIT_PATH="/etc/cjdns"' >> /etc/init.d/cjdns
  2218. echo 'PROG_PATH="/etc/cjdns"' >> /etc/init.d/cjdns
  2219. echo 'CJDNS_CONFIG="cjdroute.conf"' >> /etc/init.d/cjdns
  2220. echo 'CJDNS_USER="cjdns"' >> /etc/init.d/cjdns
  2221. echo "CJDNS_IP='$CJDNS_IPV6'" >> /etc/init.d/cjdns
  2222. echo '' >> /etc/init.d/cjdns
  2223. echo 'start() {' >> /etc/init.d/cjdns
  2224. echo ' # Start it up with the user cjdns' >> /etc/init.d/cjdns
  2225. echo ' if [ $(pgrep cjdroute | wc -l) != 0 ];' >> /etc/init.d/cjdns
  2226. echo ' then' >> /etc/init.d/cjdns
  2227. echo ' echo "cjdroute is already running. Doing nothing..."' >> /etc/init.d/cjdns
  2228. echo ' else' >> /etc/init.d/cjdns
  2229. echo ' echo " * Starting cjdroute"' >> /etc/init.d/cjdns
  2230. echo ' su -c "$PROG_PATH/$PROG < $PROG_PATH/$CJDNS_CONFIG" - $CJDNS_USER' >> /etc/init.d/cjdns
  2231. echo ' /sbin/ip addr add $CJDNS_IP/8 dev tun0' >> /etc/init.d/cjdns
  2232. echo ' /sbin/ip link set mtu 1312 dev tun0' >> /etc/init.d/cjdns
  2233. echo ' /sbin/ip link set tun0 up' >> /etc/init.d/cjdns
  2234. echo ' /sbin/ip tuntap add mode tun user cjdns dev tun0' >> /etc/init.d/cjdns
  2235. echo ' fi' >> /etc/init.d/cjdns
  2236. echo '}' >> /etc/init.d/cjdns
  2237. echo '' >> /etc/init.d/cjdns
  2238. echo 'stop() {' >> /etc/init.d/cjdns
  2239. echo '' >> /etc/init.d/cjdns
  2240. echo ' if [ $(pgrep cjdroute | wc -l) != 2 ];' >> /etc/init.d/cjdns
  2241. echo ' then' >> /etc/init.d/cjdns
  2242. echo ' echo "cjdns isnt running."' >> /etc/init.d/cjdns
  2243. echo ' else' >> /etc/init.d/cjdns
  2244. echo ' echo "Killing cjdroute"' >> /etc/init.d/cjdns
  2245. echo ' killall cjdroute' >> /etc/init.d/cjdns
  2246. echo ' fi' >> /etc/init.d/cjdns
  2247. echo '}' >> /etc/init.d/cjdns
  2248. echo '' >> /etc/init.d/cjdns
  2249. echo 'status() {' >> /etc/init.d/cjdns
  2250. echo ' if [ $(pgrep cjdroute | wc -l) != 0 ];' >> /etc/init.d/cjdns
  2251. echo ' then' >> /etc/init.d/cjdns
  2252. echo ' echo "Cjdns is running"' >> /etc/init.d/cjdns
  2253. echo ' else' >> /etc/init.d/cjdns
  2254. echo ' echo "Cjdns is not running"' >> /etc/init.d/cjdns
  2255. echo ' fi' >> /etc/init.d/cjdns
  2256. echo '}' >> /etc/init.d/cjdns
  2257. echo '' >> /etc/init.d/cjdns
  2258. echo ' update() {' >> /etc/init.d/cjdns
  2259. echo ' cd $GIT_PATH' >> /etc/init.d/cjdns
  2260. echo ' echo "Updating..."' >> /etc/init.d/cjdns
  2261. echo ' git pull' >> /etc/init.d/cjdns
  2262. echo ' ./do' >> /etc/init.d/cjdns
  2263. echo '}' >> /etc/init.d/cjdns
  2264. echo '' >> /etc/init.d/cjdns
  2265. echo '## Check to see if we are running as root first.' >> /etc/init.d/cjdns
  2266. echo 'if [ "$(id -u)" != "0" ]; then' >> /etc/init.d/cjdns
  2267. echo ' echo "This script must be run as root" 1>&2' >> /etc/init.d/cjdns
  2268. echo ' exit 1' >> /etc/init.d/cjdns
  2269. echo 'fi' >> /etc/init.d/cjdns
  2270. echo '' >> /etc/init.d/cjdns
  2271. echo 'case $1 in' >> /etc/init.d/cjdns
  2272. echo ' start)' >> /etc/init.d/cjdns
  2273. echo ' start' >> /etc/init.d/cjdns
  2274. echo ' exit 0' >> /etc/init.d/cjdns
  2275. echo ' ;;' >> /etc/init.d/cjdns
  2276. echo ' stop)' >> /etc/init.d/cjdns
  2277. echo ' stop' >> /etc/init.d/cjdns
  2278. echo ' exit 0' >> /etc/init.d/cjdns
  2279. echo ' ;;' >> /etc/init.d/cjdns
  2280. echo ' reload|restart|force-reload)' >> /etc/init.d/cjdns
  2281. echo ' stop' >> /etc/init.d/cjdns
  2282. echo ' sleep 1' >> /etc/init.d/cjdns
  2283. echo ' start' >> /etc/init.d/cjdns
  2284. echo ' exit 0' >> /etc/init.d/cjdns
  2285. echo ' ;;' >> /etc/init.d/cjdns
  2286. echo ' status)' >> /etc/init.d/cjdns
  2287. echo ' status' >> /etc/init.d/cjdns
  2288. echo ' exit 0' >> /etc/init.d/cjdns
  2289. echo ' ;;' >> /etc/init.d/cjdns
  2290. echo ' update|upgrade)' >> /etc/init.d/cjdns
  2291. echo ' update' >> /etc/init.d/cjdns
  2292. echo ' stop' >> /etc/init.d/cjdns
  2293. echo ' sleep 2' >> /etc/init.d/cjdns
  2294. echo ' start' >> /etc/init.d/cjdns
  2295. echo ' exit 0' >> /etc/init.d/cjdns
  2296. echo ' ;;' >> /etc/init.d/cjdns
  2297. echo ' **)' >> /etc/init.d/cjdns
  2298. echo ' echo "Usage: $0 (start|stop|restart|status|update)" 1>&2' >> /etc/init.d/cjdns
  2299. echo ' exit 1' >> /etc/init.d/cjdns
  2300. echo ' ;;' >> /etc/init.d/cjdns
  2301. echo 'esac' >> /etc/init.d/cjdns
  2302. chmod +x /etc/init.d/cjdns
  2303. update-rc.d cjdns defaults
  2304. service cjdns start
  2305. if [ ! "$?" = "0" ]; then
  2306. systemctl status cjdns.service
  2307. exit 8260
  2308. fi
  2309. apt-get -y install radvd
  2310. echo 'interface eth0' > /etc/radvd.conf
  2311. echo '{' >> /etc/radvd.conf
  2312. echo ' AdvSendAdvert on;' >> /etc/radvd.conf
  2313. echo ' prefix fdfc::1/64' >> /etc/radvd.conf
  2314. echo ' {' >> /etc/radvd.conf
  2315. echo ' AdvRouterAddr on;' >> /etc/radvd.conf
  2316. echo ' };' >> /etc/radvd.conf
  2317. echo '};' >> /etc/radvd.conf
  2318. systemctl restart radvd
  2319. if [ ! "$?" = "0" ]; then
  2320. systemctl status radvd.service
  2321. exit 4395
  2322. fi
  2323. if ! grep -q "# Mesh Networking (cjdns)" /etc/network/interfaces; then
  2324. echo '' >> /etc/network/interfaces
  2325. echo '# Mesh Networking (cjdns)' >> /etc/network/interfaces
  2326. echo 'iface eth0 inet6 static' >> /etc/network/interfaces
  2327. echo ' pre-up modprobe ipv6' >> /etc/network/interfaces
  2328. echo ' address fdfc:0000:0000:0000:0000:0000:0000:0001' >> /etc/network/interfaces
  2329. echo ' netmask 64' >> /etc/network/interfaces
  2330. service network-manager restart
  2331. if [ ! "$?" = "0" ]; then
  2332. systemctl status networking.service
  2333. exit 6949
  2334. fi
  2335. fi
  2336. ip6tables -A INPUT -p udp --dport $CJDNS_PORT -j ACCEPT
  2337. ip6tables -A INPUT -p tcp --dport $CJDNS_PORT -j ACCEPT
  2338. save_firewall_settings
  2339. if ! grep -q $"Mesh Networking (cjdns)" /home/$MY_USERNAME/README; then
  2340. CURRENT_IP_ADDRESS=$(ip addr show | grep "inet " | sed -n 2p | awk -F ' ' '{print $2}' | awk -F '/' '{print $1}')
  2341. echo '' >> /home/$MY_USERNAME/README
  2342. echo '' >> /home/$MY_USERNAME/README
  2343. echo $'Mesh Networking (cjdns)' >> /home/$MY_USERNAME/README
  2344. echo '=======================' >> /home/$MY_USERNAME/README
  2345. echo $"cjdns IPv6 address: $CJDNS_IPV6" >> /home/$MY_USERNAME/README
  2346. echo $"cjdns public key: $CJDNS_PUBLIC_KEY" >> /home/$MY_USERNAME/README
  2347. echo $"cjdns private key: $CJDNS_PRIVATE_KEY" >> /home/$MY_USERNAME/README
  2348. echo $"cjdns password: $CJDNS_PASSWORD" >> /home/$MY_USERNAME/README
  2349. echo $"cjdns port: $CJDNS_PORT" >> /home/$MY_USERNAME/README
  2350. echo '' >> /home/$MY_USERNAME/README
  2351. echo $"Forward port $CJDNS_PORT from your internet router to the ${PROJECT_NAME}" >> /home/$MY_USERNAME/README
  2352. echo '' >> /home/$MY_USERNAME/README
  2353. echo $'Below is an example of your connection credentials' >> /home/$MY_USERNAME/README
  2354. echo $'that you can give to other people so they can connect' >> /home/$MY_USERNAME/README
  2355. echo $'to you using your default password' >> /home/$MY_USERNAME/README
  2356. echo $'Adding a unique password for each user is advisable' >> /home/$MY_USERNAME/README
  2357. echo $'so that leaks can be isolated.' >> /home/$MY_USERNAME/README
  2358. echo '' >> /home/$MY_USERNAME/README
  2359. echo "\"$CURRENT_IP_ADDRESS:$CJDNS_PORT\":{\"password\":\"$CJDNS_PASSWORD\",\"publicKey\":\"$CJDNS_PUBLIC_KEY\"}" >> /home/$MY_USERNAME/README
  2360. echo '' >> /home/$MY_USERNAME/README
  2361. echo $'More is not better. 3-5 cjdns peers is good. 30 peers is bad.' >> /home/$MY_USERNAME/README
  2362. echo '' >> /home/$MY_USERNAME/README
  2363. echo $'NEVER USE A PUBLIC PEER. These degrade the network and make it centralized.' >> /home/$MY_USERNAME/README
  2364. echo $'Each node can handle many peers, but no node can handle the entire internet.' >> /home/$MY_USERNAME/README
  2365. echo $'As this network grows any public peer will simply become saturated and' >> /home/$MY_USERNAME/README
  2366. echo $'useless causing issues for the entire network.' >> /home/$MY_USERNAME/README
  2367. echo $'Please report anyone offering you a public peer as they are promoting shared' >> /home/$MY_USERNAME/README
  2368. echo $'passwords which could lead to people pretending to be you. A peering pass' >> /home/$MY_USERNAME/README
  2369. echo $'should not contain someone elses nickname or info but should contain yours' >> /home/$MY_USERNAME/README
  2370. echo $'to ensure it is not shared. It also helps when editing the conf to know who' >> /home/$MY_USERNAME/README
  2371. echo $'each password is for.' >> /home/$MY_USERNAME/README
  2372. echo '' >> /home/$MY_USERNAME/README
  2373. echo $'Possible cjdns destinations of interest:' >> /home/$MY_USERNAME/README
  2374. echo ' http://transitiontech.ca/faq' >> /home/$MY_USERNAME/README
  2375. echo ' http://cjdns.ca/hypeirc.txt' >> /home/$MY_USERNAME/README
  2376. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
  2377. chmod 600 /home/$MY_USERNAME/README
  2378. fi
  2379. echo 'mesh_cjdns' >> $COMPLETION_FILE
  2380. }
  2381. function create_mirrors {
  2382. if [ -d /home/trove ]; then
  2383. userdel -r trove
  2384. fi
  2385. if grep -Fxq "create_mirrors" $COMPLETION_FILE; then
  2386. return
  2387. fi
  2388. ${PROJECT_NAME}-mirrors
  2389. echo 'create_mirrors' >> $COMPLETION_FILE
  2390. }
  2391. function mesh_cjdns_tools {
  2392. if grep -Fxq "mesh_cjdns_tools" $COMPLETION_FILE; then
  2393. return
  2394. fi
  2395. if [[ $ENABLE_CJDNS != "yes" ]]; then
  2396. return
  2397. fi
  2398. if [ ! -d /etc/cjdns ]; then
  2399. mesh_cjdns
  2400. fi
  2401. apt-get -y install golang mercurial
  2402. if [ ! -f ~/.bashrc ]; then
  2403. touch ~/.bashrc
  2404. fi
  2405. export GOPATH=/home/git/go
  2406. if [ ! -d /home/git ]; then
  2407. # add a gogs user account
  2408. adduser --disabled-login --gecos 'Gogs' git
  2409. # install Go
  2410. if ! grep -q "export GOPATH=/home/git/go" ~/.bashrc; then
  2411. echo 'export GOPATH=/home/git/go' >> ~/.bashrc
  2412. echo 'systemctl set-environment GOPATH=/home/git/go' >> ~/.bashrc
  2413. fi
  2414. if [ ! -d $GOPATH ]; then
  2415. mkdir -p $GOPATH
  2416. fi
  2417. fi
  2418. if ! grep -q "export GOPATH=" ~/.bashrc; then
  2419. echo "export GOPATH=$GOPATH" >> ~/.bashrc
  2420. fi
  2421. expected_go_path='export PATH=$PATH:'${GOPATH}'/bin'
  2422. if ! grep -q "$expected_go_path" ~/.bashrc; then
  2423. export PATH=$PATH:${GOPATH}/bin
  2424. echo "$expected_go_path" >> ~/.bashrc
  2425. fi
  2426. export PATH=$PATH:$GOPATH/bin
  2427. CJDCMD_REPO2=$(echo "$CJDCMD_REPO" | sed 's|https://||g')
  2428. go get $CJDCMD_REPO2
  2429. if [ ! -f $GOPATH/bin/cjdcmd ]; then
  2430. echo $'cjdcmd was not compiled. Check your golang installation'
  2431. exit 7439
  2432. fi
  2433. cp $GOPATH/bin/cjdcmd /usr/bin
  2434. # initialise from the cjdns config
  2435. /usr/bin/cjdcmd cjdnsadmin -file /etc/cjdns/cjdroute.conf
  2436. echo 'mesh_cjdns_tools' >> $COMPLETION_FILE
  2437. }
  2438. function install_zeronet_blog {
  2439. if [[ $SYSTEM_TYPE != "$VARIANT_MESH" ]]; then
  2440. return
  2441. fi
  2442. set_repo_commit /opt/zeronet/ZeroBlog "ZeroNet Blog commit" "$ZERONET_BLOG_COMMIT" $ZERONET_BLOG_REPO
  2443. if grep -Fxq "install_zeronet_blog" $COMPLETION_FILE; then
  2444. return
  2445. fi
  2446. if [ ! -f /home/$MY_USERNAME/README ]; then
  2447. touch /home/$MY_USERNAME/README
  2448. fi
  2449. if grep -q "ZeroNet Blog address" /home/$MY_USERNAME/README; then
  2450. return
  2451. fi
  2452. if [ ! -d /etc/avahi ]; then
  2453. echo $'Avahi is not installed'
  2454. exit 736
  2455. fi
  2456. ZERONET_DEFAULT_BLOG_TITLE="${MY_USERNAME}'s Blog"
  2457. cd /opt/zeronet
  2458. python zeronet.py --batch siteCreate 2> /opt/zeronet/blog.txt
  2459. if [ ! -f /opt/zeronet/blog.txt ]; then
  2460. echo $'Unable to create blog'
  2461. exit 479
  2462. fi
  2463. blog_address=$(cat blog.txt | grep "Site address" | awk -F ':' '{print $2}')
  2464. blog_private_key=$(cat blog.txt | grep "Site private key" | awk -F ':' '{print $2}')
  2465. ZERONET_BLOG_ADDRESS=${blog_address//[[:blank:]]/}
  2466. ZERONET_BLOG_PRIVATE_KEY=${blog_private_key//[[:blank:]]/}
  2467. if [ ${#ZERONET_BLOG_ADDRESS} -lt 20 ]; then
  2468. echo $"Address: $ZERONET_BLOG_ADDRESS"
  2469. echo $"Public key: $ZERONET_BLOG_PRIVATE_KEY"
  2470. echo $'Unable to create zeronet blog address'
  2471. exit 7358
  2472. fi
  2473. if [ ${#ZERONET_BLOG_PRIVATE_KEY} -lt 20 ]; then
  2474. echo $"Address: $ZERONET_BLOG_ADDRESS"
  2475. echo $"Public key: $ZERONET_BLOG_PRIVATE_KEY"
  2476. echo $'Unable to create zeronet blog private key'
  2477. exit 1639
  2478. fi
  2479. if [ ! -d "/opt/zeronet/data/$ZERONET_BLOG_ADDRESS" ]; then
  2480. echo $"Unable to find site directory: /opt/zeronet/data/$ZERONET_BLOG_ADDRESS"
  2481. exit 7638
  2482. fi
  2483. git_clone $ZERONET_BLOG_REPO ZeroBlog
  2484. if [ ! -d /opt/zeronet/ZeroBlog ]; then
  2485. echo $'ZeroBlog repo could not be cloned'
  2486. exit 6739
  2487. fi
  2488. cd /opt/zeronet/ZeroBlog
  2489. git checkout $ZERONET_BLOG_COMMIT -b $ZERONET_BLOG_COMMIT
  2490. if ! grep -q "ZeroNet Blog commit" $COMPLETION_FILE; then
  2491. echo "ZeroNet Blog commit:$ZERONET_BLOG_COMMIT" >> $COMPLETION_FILE
  2492. else
  2493. sed -i "s/ZeroNet Blog commit.*/ZeroNet Blog commit:$ZERONET_BLOG_COMMIT/g" $COMPLETION_FILE
  2494. fi
  2495. echo $"ZeroNet Blog address: $ZERONET_BLOG_ADDRESS"
  2496. echo $"ZeroNet Blog private key: $ZERONET_BLOG_PRIVATE_KEY"
  2497. cp -r /opt/zeronet/ZeroBlog/* /opt/zeronet/data/$ZERONET_BLOG_ADDRESS
  2498. if [ ! -d /opt/zeronet/data/$ZERONET_BLOG_ADDRESS/data ]; then
  2499. mkdir /opt/zeronet/data/$ZERONET_BLOG_ADDRESS/data
  2500. fi
  2501. cp /opt/zeronet/data/$ZERONET_BLOG_ADDRESS/data-default/data.json /opt/zeronet/data/$ZERONET_BLOG_ADDRESS/data
  2502. sed -i "s/MyZeroBlog/$ZERONET_DEFAULT_BLOG_TITLE/g" /opt/zeronet/data/$ZERONET_BLOG_ADDRESS/data/data.json
  2503. sed -i "s/My ZeroBlog./$ZERONET_DEFAULT_BLOG_TAGLINE/g" /opt/zeronet/data/$ZERONET_BLOG_ADDRESS/data/data.json
  2504. sed -i "s/ZeroBlog Demo/$ZERONET_DEFAULT_BLOG_TITLE/g" /opt/zeronet/data/$ZERONET_BLOG_ADDRESS/index.html
  2505. sed -i "s|<h3 class=\"description\">.*|<h3 class=\"description\">$ZERONET_DEFAULT_BLOG_TAGLINE</h3>|g" /opt/zeronet/data/$ZERONET_BLOG_ADDRESS/index.html
  2506. sed -i "s/Blogging platform Demo/Blogging platform/g" /opt/zeronet/data/$ZERONET_BLOG_ADDRESS/content.json
  2507. python zeronet.py siteSign $ZERONET_BLOG_ADDRESS $ZERONET_BLOG_PRIVATE_KEY
  2508. # Add an avahi service
  2509. echo '<?xml version="1.0" standalone="no"?><!--*-nxml-*-->' > /tmp/zeronet-blog.service
  2510. echo '<!DOCTYPE service-group SYSTEM "avahi-service.dtd">' >> /tmp/zeronet-blog.service
  2511. echo '<service-group>' >> /tmp/zeronet-blog.service
  2512. echo ' <name replace-wildcards="yes">%h ZeroNet Blog</name>' >> /tmp/zeronet-blog.service
  2513. echo ' <service>' >> /tmp/zeronet-blog.service
  2514. echo ' <type>_zeronet._udp</type>' >> /tmp/zeronet-blog.service
  2515. echo " <port>$ZERONET_PORT</port>" >> /tmp/zeronet-blog.service
  2516. echo " <txt-record>$ZERONET_URL/$ZERONET_BLOG_ADDRESS</txt-record>" >> /tmp/zeronet-blog.service
  2517. echo ' </service>' >> /tmp/zeronet-blog.service
  2518. echo '</service-group>' >> /tmp/zeronet-blog.service
  2519. cp /tmp/zeronet-blog.service /etc/avahi/services/zeronet-blog.service
  2520. if [ ! -d /home/$MY_USERNAME/.config/zeronet ]; then
  2521. mkdir -p /home/$MY_USERNAME/.config/zeronet
  2522. chown -R $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.config
  2523. fi
  2524. echo "$ZERONET_URL/$ZERONET_BLOG_ADDRESS" > /home/$MY_USERNAME/.config/zeronet/myblog
  2525. if ! grep -q "ZeroNet Blog address" /home/$MY_USERNAME/README; then
  2526. echo '' >> /home/$MY_USERNAME/README
  2527. echo "ZeroNet Blog address: $ZERONET_BLOG_ADDRESS" >> /home/$MY_USERNAME/README
  2528. echo "ZeroNet Blog private key: $ZERONET_BLOG_PRIVATE_KEY" >> /home/$MY_USERNAME/README
  2529. fi
  2530. echo 'install_zeronet_blog' >> $COMPLETION_FILE
  2531. }
  2532. function install_zeronet_mail {
  2533. if [[ $SYSTEM_TYPE != "$VARIANT_MESH" ]]; then
  2534. return
  2535. fi
  2536. set_repo_commit /opt/zeronet/ZeroMail "ZeroNet Mail commit" "$ZERONET_MAIL_COMMIT" $ZERONET_MAIL_REPO
  2537. if grep -Fxq "install_zeronet_mail" $COMPLETION_FILE; then
  2538. return
  2539. fi
  2540. if [ ! -f /home/$MY_USERNAME/README ]; then
  2541. touch /home/$MY_USERNAME/README
  2542. fi
  2543. if grep -q "ZeroNet Mail address" /home/$MY_USERNAME/README; then
  2544. return
  2545. fi
  2546. if [ ! -d /etc/avahi ]; then
  2547. echo 'Avahi is not installed'
  2548. exit 736
  2549. fi
  2550. ZERONET_DEFAULT_MAIL_TITLE="${MY_USERNAME}'s Mail"
  2551. cd /opt/zeronet
  2552. python zeronet.py --batch siteCreate 2> /opt/zeronet/mail.txt
  2553. if [ ! -f /opt/zeronet/mail.txt ]; then
  2554. echo $'Unable to create mail'
  2555. exit 479
  2556. fi
  2557. mail_address=$(cat mail.txt | grep "Site address" | awk -F ':' '{print $2}')
  2558. mail_private_key=$(cat mail.txt | grep "Site private key" | awk -F ':' '{print $2}')
  2559. ZERONET_MAIL_ADDRESS=${mail_address//[[:blank:]]/}
  2560. ZERONET_MAIL_PRIVATE_KEY=${mail_private_key//[[:blank:]]/}
  2561. if [ ${#ZERONET_MAIL_ADDRESS} -lt 20 ]; then
  2562. echo $"Address: $ZERONET_MAIL_ADDRESS"
  2563. echo $"Public key: $ZERONET_MAIL_PRIVATE_KEY"
  2564. echo $'Unable to create zeronet mail address'
  2565. exit 7358
  2566. fi
  2567. if [ ${#ZERONET_MAIL_PRIVATE_KEY} -lt 20 ]; then
  2568. echo $"Address: $ZERONET_MAIL_ADDRESS"
  2569. echo $"Public key: $ZERONET_MAIL_PRIVATE_KEY"
  2570. echo $'Unable to create zeronet mail private key'
  2571. exit 1639
  2572. fi
  2573. if [ ! -d "/opt/zeronet/data/$ZERONET_MAIL_ADDRESS" ]; then
  2574. echo $"Unable to find site directory: /opt/zeronet/data/$ZERONET_MAIL_ADDRESS"
  2575. exit 7638
  2576. fi
  2577. git_clone $ZERONET_MAIL_REPO ZeroMail
  2578. if [ ! -d /opt/zeronet/ZeroMail ]; then
  2579. echo $'ZeroMail repo could not be cloned'
  2580. exit 6739
  2581. fi
  2582. cd /opt/zeronet/ZeroMail
  2583. git checkout $ZERONET_MAIL_COMMIT -b $ZERONET_MAIL_COMMIT
  2584. if ! grep -q "ZeroNet Mail commit" $COMPLETION_FILE; then
  2585. echo "ZeroNet Mail commit:$ZERONET_MAIL_COMMIT" >> $COMPLETION_FILE
  2586. else
  2587. sed -i "s/ZeroNet Mail commit.*/ZeroNet Mail commit:$ZERONET_MAIL_COMMIT/g" $COMPLETION_FILE
  2588. fi
  2589. echo $"ZeroNet Mail address: $ZERONET_MAIL_ADDRESS"
  2590. echo $"ZeroNet Mail private key: $ZERONET_MAIL_PRIVATE_KEY"
  2591. cp -r /opt/zeronet/ZeroMail/* /opt/zeronet/data/$ZERONET_MAIL_ADDRESS
  2592. if [ ! -d /opt/zeronet/data/$ZERONET_MAIL_ADDRESS/data ]; then
  2593. mkdir /opt/zeronet/data/$ZERONET_MAIL_ADDRESS/data
  2594. fi
  2595. cp /opt/zeronet/data/$ZERONET_MAIL_ADDRESS/data-default/data.json /opt/zeronet/data/$ZERONET_MAIL_ADDRESS/data
  2596. sed -i "s/MyZeroMail/$ZERONET_DEFAULT_MAIL_TITLE/g" /opt/zeronet/data/$ZERONET_MAIL_ADDRESS/data/data.json
  2597. sed -i "s/My ZeroMail./$ZERONET_DEFAULT_MAIL_TAGLINE/g" /opt/zeronet/data/$ZERONET_MAIL_ADDRESS/data/data.json
  2598. sed -i "s/ZeroMail Demo/$ZERONET_DEFAULT_MAIL_TITLE/g" /opt/zeronet/data/$ZERONET_MAIL_ADDRESS/index.html
  2599. sed -i "s|<h3 class=\"description\">.*|<h3 class=\"description\">$ZERONET_DEFAULT_MAIL_TAGLINE</h3>|g" /opt/zeronet/data/$ZERONET_MAIL_ADDRESS/index.html
  2600. sed -i "s/Mailging platform Demo/Mailging platform/g" /opt/zeronet/data/$ZERONET_MAIL_ADDRESS/content.json
  2601. python zeronet.py siteSign $ZERONET_MAIL_ADDRESS $ZERONET_MAIL_PRIVATE_KEY
  2602. # Add an avahi service
  2603. echo '<?xml version="1.0" standalone="no"?><!--*-nxml-*-->' > /tmp/zeronet-mail.service
  2604. echo '<!DOCTYPE service-group SYSTEM "avahi-service.dtd">' >> /tmp/zeronet-mail.service
  2605. echo '<service-group>' >> /tmp/zeronet-mail.service
  2606. echo ' <name replace-wildcards="yes">%h ZeroNet Mail</name>' >> /tmp/zeronet-mail.service
  2607. echo ' <service>' >> /tmp/zeronet-mail.service
  2608. echo ' <type>_zeronet._udp</type>' >> /tmp/zeronet-mail.service
  2609. echo " <port>$ZERONET_PORT</port>" >> /tmp/zeronet-mail.service
  2610. echo " <txt-record>$ZERONET_URL/$ZERONET_MAIL_ADDRESS</txt-record>" >> /tmp/zeronet-mail.service
  2611. echo ' </service>' >> /tmp/zeronet-mail.service
  2612. echo '</service-group>' >> /tmp/zeronet-mail.service
  2613. cp /tmp/zeronet-mail.service /etc/avahi/services/zeronet-mail.service
  2614. if [ ! -d /home/$MY_USERNAME/.config/zeronet ]; then
  2615. mkdir -p /home/$MY_USERNAME/.config/zeronet
  2616. chown -R $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.config
  2617. fi
  2618. echo "$ZERONET_URL/$ZERONET_MAIL_ADDRESS" > /home/$MY_USERNAME/.config/zeronet/mymail
  2619. if ! grep -q $"ZeroNet Mail address" /home/$MY_USERNAME/README; then
  2620. echo '' >> /home/$MY_USERNAME/README
  2621. echo $"ZeroNet Mail address: $ZERONET_MAIL_ADDRESS" >> /home/$MY_USERNAME/README
  2622. echo $"ZeroNet Mail private key: $ZERONET_MAIL_PRIVATE_KEY" >> /home/$MY_USERNAME/README
  2623. fi
  2624. echo 'install_zeronet_mail' >> $COMPLETION_FILE
  2625. }
  2626. function install_zeronet_forum {
  2627. if [[ $SYSTEM_TYPE != "$VARIANT_MESH" ]]; then
  2628. return
  2629. fi
  2630. # update to the next commit
  2631. set_repo_commit /opt/zeronet/ZeroTalk "ZeroNet Forum commit" "$ZERONET_FORUM_COMMIT" $ZERONET_FORUM_REPO
  2632. if grep -Fxq "install_zeronet_forum" $COMPLETION_FILE; then
  2633. return
  2634. fi
  2635. if [ ! -f /home/$MY_USERNAME/README ]; then
  2636. touch /home/$MY_USERNAME/README
  2637. fi
  2638. if grep -q "ZeroNet Forum address" /home/$MY_USERNAME/README; then
  2639. return
  2640. fi
  2641. if [ ! -d /etc/avahi ]; then
  2642. echo $'Avahi is not installed'
  2643. exit 736
  2644. fi
  2645. ZERONET_DEFAULT_FORUM_TITLE=$"${MY_USERNAME}'s Forum"
  2646. cd /opt/zeronet
  2647. python zeronet.py --batch siteCreate 2> /opt/zeronet/forum.txt
  2648. if [ ! -f /opt/zeronet/forum.txt ]; then
  2649. echo $'Unable to create forum'
  2650. exit 479
  2651. fi
  2652. forum_address=$(cat forum.txt | grep "Site address" | awk -F ':' '{print $2}')
  2653. forum_private_key=$(cat forum.txt | grep "Site private key" | awk -F ':' '{print $2}')
  2654. ZERONET_FORUM_ADDRESS=${forum_address//[[:blank:]]/}
  2655. ZERONET_FORUM_PRIVATE_KEY=${forum_private_key//[[:blank:]]/}
  2656. if [ ${#ZERONET_FORUM_ADDRESS} -lt 20 ]; then
  2657. echo $"Address: $ZERONET_FORUM_ADDRESS"
  2658. echo $"Public key: $ZERONET_FORUM_PRIVATE_KEY"
  2659. echo $'Unable to create zeronet forum address'
  2660. exit 76352
  2661. fi
  2662. if [ ${#ZERONET_FORUM_PRIVATE_KEY} -lt 20 ]; then
  2663. echo $"Address: $ZERONET_FORUM_ADDRESS"
  2664. echo $"Public key: $ZERONET_FORUM_PRIVATE_KEY"
  2665. echo $'Unable to create zeronet forum private key'
  2666. exit 87356
  2667. fi
  2668. if [ ! -d "/opt/zeronet/data/$ZERONET_FORUM_ADDRESS" ]; then
  2669. echo $"Unable to find site directory: /opt/zeronet/data/$ZERONET_FORUM_ADDRESS"
  2670. exit 7638
  2671. fi
  2672. git_clone $ZERONET_FORUM_REPO ZeroTalk
  2673. if [ ! -d /opt/zeronet/ZeroTalk ]; then
  2674. echo $'ZeroTalk repo could not be cloned'
  2675. exit 6739
  2676. fi
  2677. git checkout $ZERONET_FORUM_COMMIT -b $ZERONET_FORUM_COMMIT
  2678. if ! grep -q "ZeroNet Forum commit" $COMPLETION_FILE; then
  2679. echo "ZeroNet Forum commit:$ZERONET_FORUM_COMMIT" >> $COMPLETION_FILE
  2680. else
  2681. sed -i "s/ZeroNet Forum commit.*/ZeroNet Forum commit:$ZERONET_FORUM_COMMIT/g" $COMPLETION_FILE
  2682. fi
  2683. echo $"Forum address: $ZERONET_FORUM_ADDRESS"
  2684. echo $"Forum private key: $ZERONET_FORUM_PRIVATE_KEY"
  2685. cp -r /opt/zeronet/ZeroTalk/* /opt/zeronet/data/$ZERONET_FORUM_ADDRESS
  2686. sed -i "s/ZeroBoard/$ZERONET_DEFAULT_FORUM_TITLE/g" /opt/zeronet/data/$ZERONET_FORUM_ADDRESS/index.html
  2687. sed -i "s/ZeroTalk/$ZERONET_DEFAULT_FORUM_TITLE/g" /opt/zeronet/data/$ZERONET_FORUM_ADDRESS/index.html
  2688. sed -i "s|Demo for dynamic, decentralized content publishing.|$ZERONET_DEFAULT_FORUM_TAGLINE|g" /opt/zeronet/data/$ZERONET_FORUM_ADDRESS/index.html
  2689. sed -i 's/Messaging Board Demo/Messaging Board/g' /opt/zeronet/data/$ZERONET_FORUM_ADDRESS/content.json
  2690. sed -i "s/ZeroBoard/$ZERONET_DEFAULT_FORUM_TITLE/g" /opt/zeronet/data/$ZERONET_FORUM_ADDRESS/content.json
  2691. python zeronet.py siteSign $ZERONET_FORUM_ADDRESS $ZERONET_FORUM_PRIVATE_KEY --inner_path data/users/content.json
  2692. # Add an avahi service
  2693. echo '<?xml version="1.0" standalone="no"?><!--*-nxml-*-->' > /tmp/zeronet-forum.service
  2694. echo '<!DOCTYPE service-group SYSTEM "avahi-service.dtd">' >> /tmp/zeronet-forum.service
  2695. echo '<service-group>' >> /tmp/zeronet-forum.service
  2696. echo ' <name replace-wildcards="yes">%h ZeroNet Forum</name>' >> /tmp/zeronet-forum.service
  2697. echo ' <service>' >> /tmp/zeronet-forum.service
  2698. echo ' <type>_zeronet._udp</type>' >> /tmp/zeronet-forum.service
  2699. echo " <port>$ZERONET_PORT</port>" >> /tmp/zeronet-forum.service
  2700. echo " <txt-record>$ZERONET_URL/$ZERONET_FORUM_ADDRESS</txt-record>" >> /tmp/zeronet-forum.service
  2701. echo ' </service>' >> /tmp/zeronet-forum.service
  2702. echo '</service-group>' >> /tmp/zeronet-forum.service
  2703. sudo cp /tmp/zeronet-forum.service /etc/avahi/services/zeronet-forum.service
  2704. if [ ! -d /home/$MY_USERNAME/.config/zeronet ]; then
  2705. mkdir -p /home/$MY_USERNAME/.config/zeronet
  2706. chown -R $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.config
  2707. fi
  2708. echo "$ZERONET_URL/$ZERONET_FORUM_ADDRESS" > /home/$MY_USERNAME/.config/zeronet/myforum
  2709. if ! grep -q $"ZeroNet Forum address" /home/$MY_USERNAME/README; then
  2710. echo '' >> /home/$MY_USERNAME/README
  2711. echo $"ZeroNet Forum address: $ZERONET_FORUM_ADDRESS" >> /home/$MY_USERNAME/README
  2712. echo $"ZeroNet Forum private key: $ZERONET_FORUM_PRIVATE_KEY" >> /home/$MY_USERNAME/README
  2713. fi
  2714. echo 'install_zeronet_forum' >> $COMPLETION_FILE
  2715. }
  2716. function install_zeronet {
  2717. if [[ $SYSTEM_TYPE != "$VARIANT_MESH" ]]; then
  2718. return
  2719. fi
  2720. # update to the next commit
  2721. set_repo_commit /opt/zeronet "ZeroNet commit" "$ZERONET_COMMIT" $ZERONET_REPO
  2722. if grep -Fxq "install_zeronet" $COMPLETION_FILE; then
  2723. return
  2724. fi
  2725. ${PROJECT_NAME}=mesh-install zeronet
  2726. systemctl daemon-reload
  2727. systemctl start tracker.service
  2728. systemctl start zeronet.service
  2729. echo 'mesh_zeronet' >> $COMPLETION_FILE
  2730. }
  2731. function install_vpn_tunnel {
  2732. if ! grep -q "repo.universe-factory.net" /etc/apt/sources.list; then
  2733. echo 'deb http://repo.universe-factory.net/debian/ sid main' >> /etc/apt/sources.list
  2734. gpg --keyserver pgpkeys.mit.edu --recv-key 16EF3F64CB201D9C
  2735. if [ ! "$?" = "0" ]; then
  2736. exit 76272
  2737. fi
  2738. gpg -a --export 16EF3F64CB201D9C | sudo apt-key add -
  2739. apt-get update
  2740. apt-get -y install fastd
  2741. if [ ! "$?" = "0" ]; then
  2742. exit 52026
  2743. fi
  2744. fi
  2745. }
  2746. # ath9k_htc driver
  2747. function install_atheros_wifi {
  2748. if grep -Fxq "install_atheros_wifi" $COMPLETION_FILE; then
  2749. return
  2750. fi
  2751. if [ $INSTALLING_ON_BBB != "yes" ]; then
  2752. return
  2753. fi
  2754. if [[ $ENABLE_BABEL != "yes" && $ENABLE_BATMAN != "yes" && $ENABLE_CJDNS != "yes" ]]; then
  2755. return
  2756. fi
  2757. if [ -d $INSTALL_DIR/open-ath9k-htc-firmware ]; then
  2758. return
  2759. fi
  2760. # have drivers already been installed ?
  2761. if [ -f /lib/firmware/htc_9271.fw ]; then
  2762. return
  2763. fi
  2764. apt-get -y install build-essential cmake git m4 texinfo
  2765. if [ ! -d $INSTALL_DIR ]; then
  2766. mkdir -p $INSTALL_DIR
  2767. fi
  2768. cd $INSTALL_DIR
  2769. if [ ! -d $INSTALL_DIR/open-ath9k-htc-firmware ]; then
  2770. git_clone $ATHEROS_WIFI_REPO $INSTALL_DIR/open-ath9k-htc-firmware
  2771. if [ ! "$?" = "0" ]; then
  2772. rm -rf $INSTALL_DIR/open-ath9k-htc-firmware
  2773. exit 74283
  2774. fi
  2775. fi
  2776. cd $INSTALL_DIR/open-ath9k-htc-firmware
  2777. git checkout 1.4.0
  2778. make toolchain
  2779. if [ ! "$?" = "0" ]; then
  2780. rm -rf $INSTALL_DIR/open-ath9k-htc-firmware
  2781. exit 24820
  2782. fi
  2783. make firmware
  2784. if [ ! "$?" = "0" ]; then
  2785. rm -rf $INSTALL_DIR/open-ath9k-htc-firmware
  2786. exit 63412
  2787. fi
  2788. cp target_firmware/*.fw /lib/firmware/
  2789. if [ ! "$?" = "0" ]; then
  2790. exit 74681
  2791. fi
  2792. echo 'install_atheros_wifi' >> $COMPLETION_FILE
  2793. }
  2794. function configure_avahi {
  2795. if grep -Fxq "configure_avahi" $COMPLETION_FILE; then
  2796. return
  2797. fi
  2798. # only enable avahi if we're doing mesh networking
  2799. if [[ $ENABLE_BABEL != "yes" && $ENABLE_BATMAN != "yes" && $ENABLE_CJDNS != "yes" ]]; then
  2800. return
  2801. fi
  2802. ${PROJECT_NAME}-mesh-install avahi
  2803. if [ $DEFAULT_DOMAIN_NAME ]; then
  2804. sed -i "s|#host-name=.*|host-name=$DEFAULT_DOMAIN_NAME|g" /etc/avahi/avahi-daemon.conf
  2805. sed -i "s|host-name=.*|host-name=$DEFAULT_DOMAIN_NAME|g" /etc/avahi/avahi-daemon.conf
  2806. else
  2807. decarray=( 1 2 3 4 5 6 7 8 9 0 )
  2808. 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]}
  2809. sed -i "s|#host-name=.*|host-name=P$PEER_ID|g" /etc/avahi/avahi-daemon.conf
  2810. sed -i "s|host-name=.*|host-name=P$PEER_ID|g" /etc/avahi/avahi-daemon.conf
  2811. fi
  2812. echo 'configure_avahi' >> $COMPLETION_FILE
  2813. }
  2814. function mesh_babel {
  2815. if grep -Fxq "mesh_babel" $COMPLETION_FILE; then
  2816. return
  2817. fi
  2818. if [[ $ENABLE_BABEL != "yes" ]]; then
  2819. return
  2820. fi
  2821. ${PROJECT_NAME}-mesh-install babel
  2822. echo 'mesh_babel' >> $COMPLETION_FILE
  2823. }
  2824. function mesh_batman {
  2825. if grep -Fxq "mesh_batman" $COMPLETION_FILE; then
  2826. return
  2827. fi
  2828. if [[ $ENABLE_BATMAN != "yes" ]]; then
  2829. return
  2830. fi
  2831. ${PROJECT_NAME}-mesh-install -f batman
  2832. if ! grep -q "Mesh Networking (B.A.T.M.A.N)" /home/$MY_USERNAME/README; then
  2833. echo '' >> /home/$MY_USERNAME/README
  2834. echo '' >> /home/$MY_USERNAME/README
  2835. echo 'Mesh Networking (B.A.T.M.A.N)' >> /home/$MY_USERNAME/README
  2836. echo '=============================' >> /home/$MY_USERNAME/README
  2837. echo "Mesh ESSID: $ESSID" >> /home/$MY_USERNAME/README
  2838. echo "Mesh cell ID: $BATMAN_CELLID" >> /home/$MY_USERNAME/README
  2839. echo "Mesh wifi channel: $WIFI_CHANNEL" >> /home/$MY_USERNAME/README
  2840. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
  2841. chmod 600 /home/$MY_USERNAME/README
  2842. fi
  2843. echo 'mesh_batman' >> $COMPLETION_FILE
  2844. }
  2845. function remove_instructions_from_motd {
  2846. sed -i '/## /d' /etc/motd
  2847. }
  2848. function check_hwrng {
  2849. if [[ $HWRNG_TYPE == "beaglebone" ]]; then
  2850. # If hardware random number generation was enabled then make sure that the device exists.
  2851. # if /dev/hwrng is not found then any subsequent cryptographic key generation would
  2852. # suffer from low entropy and might be insecure
  2853. if [ ! -e /dev/hwrng ]; then
  2854. ls /dev/hw*
  2855. echo $'The hardware random number generator is enabled but could not be detected on'
  2856. echo $'/dev/hwrng. There may be a problem with the installation or the Beaglebone hardware.'
  2857. exit 75
  2858. fi
  2859. fi
  2860. # If a OneRNG device was installed then verify its firmware
  2861. #check_onerng_verification
  2862. }
  2863. function get_mariadb_password {
  2864. if [ -f /home/$MY_USERNAME/README ]; then
  2865. if grep -q "MariaDB password" /home/$MY_USERNAME/README; then
  2866. if [ -f $DATABASE_PASSWORD_FILE ]; then
  2867. MARIADB_PASSWORD=$(cat $DATABASE_PASSWORD_FILE)
  2868. else
  2869. MARIADB_PASSWORD=$(cat /home/$MY_USERNAME/README | grep "MariaDB password" | awk -F ':' '{print $2}' | sed 's/^ *//')
  2870. echo "$MARIADB_PASSWORD" > $DATABASE_PASSWORD_FILE
  2871. chmod 600 $DATABASE_PASSWORD_FILE
  2872. fi
  2873. fi
  2874. fi
  2875. }
  2876. function get_mariadb_gnusocial_admin_password {
  2877. if [ -f /home/$MY_USERNAME/README ]; then
  2878. if grep -q "MariaDB gnusocial admin password" /home/$MY_USERNAME/README; then
  2879. MICROBLOG_ADMIN_PASSWORD=$(cat /home/$MY_USERNAME/README | grep "MariaDB gnusocial admin password" | awk -F ':' '{print $2}' | sed 's/^ *//')
  2880. fi
  2881. if grep -q "Microblog administrator password" /home/$MY_USERNAME/README; then
  2882. MICROBLOG_ADMIN_PASSWORD=$(cat /home/$MY_USERNAME/README | grep "Microblog administrator password" | awk -F ':' '{print $2}' | sed 's/^ *//')
  2883. fi
  2884. fi
  2885. }
  2886. function get_mariadb_rss_reader_admin_password {
  2887. if [ -f /home/$MY_USERNAME/README ]; then
  2888. if grep -q "RSS reader admin password" /home/$MY_USERNAME/README; then
  2889. RSS_READER_ADMIN_PASSWORD=$(cat /home/$MY_USERNAME/README | grep "RSS reader admin password" | awk -F ':' '{print $2}' | sed 's/^ *//')
  2890. fi
  2891. fi
  2892. }
  2893. function get_mariadb_git_admin_password {
  2894. if [ -f /home/$MY_USERNAME/README ]; then
  2895. if grep -q "Gogs admin user password" /home/$MY_USERNAME/README; then
  2896. GIT_ADMIN_PASSWORD=$(cat /home/$MY_USERNAME/README | grep "Gogs admin user password" | awk -F ':' '{print $2}' | sed 's/^ *//')
  2897. fi
  2898. fi
  2899. }
  2900. function get_mariadb_hubzilla_admin_password {
  2901. if [ -f /home/$MY_USERNAME/README ]; then
  2902. if grep -q "MariaDB Hubzilla admin password" /home/$MY_USERNAME/README; then
  2903. HUBZILLA_ADMIN_PASSWORD=$(cat /home/$MY_USERNAME/README | grep "MariaDB Hubzilla admin password" | awk -F ':' '{print $2}' | sed 's/^ *//')
  2904. fi
  2905. fi
  2906. }
  2907. function get_mariadb_owncloud_admin_password {
  2908. if [ -f /home/$MY_USERNAME/README ]; then
  2909. if grep -q "Owncloud database password" /home/$MY_USERNAME/README; then
  2910. OWNCLOUD_ADMIN_PASSWORD=$(cat /home/$MY_USERNAME/README | grep "Owncloud database password" | awk -F ':' '{print $2}' | sed 's/^ *//')
  2911. fi
  2912. fi
  2913. }
  2914. function create_freedns_updater {
  2915. if [[ $ONION_ONLY != "no" ]]; then
  2916. return
  2917. fi
  2918. # currently inadyn doesn't work as expected with freeDNS, so this is a workaround
  2919. if grep -Fxq "create_freedns_updater" $COMPLETION_FILE; then
  2920. return
  2921. fi
  2922. if [[ $DDNS_PROVIDER != "default@freedns.afraid.org" ]]; then
  2923. return
  2924. fi
  2925. if [[ $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  2926. return
  2927. fi
  2928. FREEDNS_WGET='wget -q --read-timeout=0.0 --waitretry=5 --tries=4 https://freedns.afraid.org/dynamic/update.php?'
  2929. echo '#!/bin/bash' > /usr/bin/dynamicdns
  2930. echo 'cd /tmp' >> /usr/bin/dynamicdns
  2931. if [ $DEFAULT_DOMAIN_CODE ]; then
  2932. echo "# $DEFAULT_DOMAIN_NAME" >> /usr/bin/dynamicdns
  2933. echo "$FREEDNS_WGET$DEFAULT_DOMAIN_CODE=" >> /usr/bin/dynamicdns
  2934. fi
  2935. if [ $WIKI_CODE ]; then
  2936. if [[ $WIKI_CODE != "$DEFAULT_DOMAIN_CODE" ]]; then
  2937. echo "# $WIKI_DOMAIN_NAME" >> /usr/bin/dynamicdns
  2938. echo "$FREEDNS_WGET$WIKI_CODE=" >> /usr/bin/dynamicdns
  2939. fi
  2940. fi
  2941. if [ $FULLBLOG_CODE ]; then
  2942. if [[ $FULLBLOG_CODE != "$DEFAULT_DOMAIN_CODE" ]]; then
  2943. echo "# $FULLBLOG_DOMAIN_NAME" >> /usr/bin/dynamicdns
  2944. echo "$FREEDNS_WGET$FULLBLOG_CODE=" >> /usr/bin/dynamicdns
  2945. fi
  2946. fi
  2947. if [ $HUBZILLA_CODE ]; then
  2948. if [[ $HUBZILLA_CODE != "$DEFAULT_DOMAIN_CODE" ]]; then
  2949. echo "# $HUBZILLA_DOMAIN_NAME" >> /usr/bin/dynamicdns
  2950. echo "$FREEDNS_WGET$HUBZILLA_CODE=" >> /usr/bin/dynamicdns
  2951. fi
  2952. fi
  2953. if [ $OWNCLOUD_CODE ]; then
  2954. if [[ $OWNCLOUD_CODE != "$DEFAULT_DOMAIN_CODE" ]]; then
  2955. echo "# $OWNCLOUD_DOMAIN_NAME" >> /usr/bin/dynamicdns
  2956. echo "$FREEDNS_WGET$OWNCLOUD_CODE=" >> /usr/bin/dynamicdns
  2957. fi
  2958. fi
  2959. if [ $MICROBLOG_CODE ]; then
  2960. if [[ $MICROBLOG_CODE != "$DEFAULT_DOMAIN_CODE" ]]; then
  2961. echo "# $MICROBLOG_DOMAIN_NAME" >> /usr/bin/dynamicdns
  2962. echo "$FREEDNS_WGET$MICROBLOG_CODE=" >> /usr/bin/dynamicdns
  2963. fi
  2964. fi
  2965. if [ $GIT_CODE ]; then
  2966. if [[ $GIT_CODE != "$DEFAULT_DOMAIN_CODE" ]]; then
  2967. echo "# $GIT_DOMAIN_NAME" >> /usr/bin/dynamicdns
  2968. echo "$FREEDNS_WGET$GIT_CODE=" >> /usr/bin/dynamicdns
  2969. fi
  2970. fi
  2971. if [ $MEDIAGOBLIN_CODE ]; then
  2972. if [[ $MEDIAGOBLIN_CODE != "$DEFAULT_DOMAIN_CODE" ]]; then
  2973. echo "# $MEDIAGOBLIN_DOMAIN_NAME" >> /usr/bin/dynamicdns
  2974. echo "$FREEDNS_WGET$MEDIAGOBLIN_CODE=" >> /usr/bin/dynamicdns
  2975. fi
  2976. fi
  2977. echo 'exit 0' >> /usr/bin/dynamicdns
  2978. chmod 600 /usr/bin/dynamicdns
  2979. chmod +x /usr/bin/dynamicdns
  2980. if ! grep -q "/usr/bin/dynamicdns" /etc/crontab; then
  2981. echo '*/3 * * * * root /usr/bin/dynamicdns' >> /etc/crontab
  2982. systemctl restart cron
  2983. fi
  2984. echo 'create_freedns_updater' >> $COMPLETION_FILE
  2985. }
  2986. function backup_to_friends_servers {
  2987. # update crontab
  2988. echo '#!/bin/bash' > /etc/cron.daily/backuptofriends
  2989. echo "if [ -f /usr/local/bin/${PROJECT_NAME}-backup-remote ]; then" >> /etc/cron.daily/backuptofriends
  2990. echo " /usr/local/bin/${PROJECT_NAME}-backup-remote" >> /etc/cron.daily/backuptofriends
  2991. echo 'else' >> /etc/cron.daily/backuptofriends
  2992. echo " /usr/bin/${PROJECT_NAME}-backup-remote" >> /etc/cron.daily/backuptofriends
  2993. echo 'fi' >> /etc/cron.daily/backuptofriends
  2994. chmod +x /etc/cron.daily/backuptofriends
  2995. }
  2996. function remove_default_user {
  2997. # make sure you don't use the default user account
  2998. if [[ $MY_USERNAME == "debian" ]]; then
  2999. echo 'Do not use the default debian user account. Create a different user with: adduser [username]'
  3000. exit 68
  3001. fi
  3002. # remove the default debian user to prevent it from becoming an attack vector
  3003. if [ -d /home/debian ]; then
  3004. userdel -r debian
  3005. echo 'Default debian user account removed'
  3006. fi
  3007. }
  3008. function enforce_good_passwords {
  3009. # because humans are generally bad at choosing passwords
  3010. if grep -Fxq "enforce_good_passwords" $COMPLETION_FILE; then
  3011. return
  3012. fi
  3013. apt-get -y install libpam-cracklib
  3014. 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
  3015. echo 'enforce_good_passwords' >> $COMPLETION_FILE
  3016. }
  3017. function change_login_message {
  3018. if grep -Fxq "change_login_message" $COMPLETION_FILE; then
  3019. return
  3020. fi
  3021. # remove automatic motd creator if it exists
  3022. if [ -f /etc/init.d/motd ]; then
  3023. rm -f /etc/init.d/motd
  3024. fi
  3025. echo '' > /etc/motd
  3026. echo ".---. . . " >> /etc/motd
  3027. echo "| | | " >> /etc/motd
  3028. echo "|--- .--. .-. .-. .-.| .-. .--.--. |.-. .-. .--. .-. " >> /etc/motd
  3029. echo "| | (.-' (.-' ( | ( )| | | | )( )| | (.-' " >> /etc/motd
  3030. echo "' ' --' --' -' - -' ' ' -' -' -' ' - --'" >> /etc/motd
  3031. if [[ $SYSTEM_TYPE == "$VARIANT_MAILBOX" ]]; then
  3032. echo $' M A I L B O X E D I T I O N' >> /etc/motd
  3033. fi
  3034. if [[ $SYSTEM_TYPE == "$VARIANT_SOCIAL" ]]; then
  3035. echo $' S O C I A L E D I T I O N' >> /etc/motd
  3036. fi
  3037. if [[ $SYSTEM_TYPE == "$VARIANT_CHAT" ]]; then
  3038. echo $' C H A T E D I T I O N' >> /etc/motd
  3039. fi
  3040. if [[ $SYSTEM_TYPE == "$VARIANT_CLOUD" ]]; then
  3041. echo $' C L O U D E D I T I O N' >> /etc/motd
  3042. fi
  3043. if [[ $SYSTEM_TYPE == "$VARIANT_WRITER" ]]; then
  3044. echo $' W R I T E R E D I T I O N ' >> /etc/motd
  3045. fi
  3046. if [[ $SYSTEM_TYPE == "$VARIANT_MEDIA" ]]; then
  3047. echo $' M E D I A E D I T I O N' >> /etc/motd
  3048. fi
  3049. if [[ $SYSTEM_TYPE == "$VARIANT_DEVELOPER" ]]; then
  3050. echo $' D E V E L O P E R E D I T I O N' >> /etc/motd
  3051. fi
  3052. echo '' >> /etc/motd
  3053. if [[ $SYSTEM_TYPE != "$VARIANT_MESH" ]]; then
  3054. echo $' Freedom in the Cloud' >> /etc/motd
  3055. else
  3056. echo $' Freedom in the Mesh' >> /etc/motd
  3057. fi
  3058. echo '' >> /etc/motd
  3059. echo 'change_login_message' >> $COMPLETION_FILE
  3060. }
  3061. function search_for_attached_usb_drive {
  3062. # If a USB drive is attached then search for email,
  3063. # gpg, ssh keys and emacs configuration
  3064. if grep -Fxq "search_for_attached_usb_drive" $COMPLETION_FILE; then
  3065. return
  3066. fi
  3067. if [ -b $USB_DRIVE ]; then
  3068. if [ ! -d $USB_MOUNT ]; then
  3069. echo $'Mounting USB drive'
  3070. mkdir $USB_MOUNT
  3071. mount $USB_DRIVE $USB_MOUNT
  3072. fi
  3073. 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
  3074. if [ -d $USB_MOUNT/Maildir ]; then
  3075. echo $'Maildir found on USB drive'
  3076. IMPORT_MAILDIR=$USB_MOUNT/Maildir
  3077. fi
  3078. if [ -d $USB_MOUNT/.gnupg ]; then
  3079. echo $'Importing GPG keyring'
  3080. cp -r $USB_MOUNT/.gnupg /home/$MY_USERNAME
  3081. chown -R $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.gnupg
  3082. GPG_KEYS_IMPORTED="yes"
  3083. if [ ! -f /home/$MY_USERNAME/.gnupg/secring.gpg ]; then
  3084. echo $'GPG files did not copy'
  3085. exit 73529
  3086. fi
  3087. fi
  3088. if [ -f $USB_MOUNT/.procmailrc ]; then
  3089. echo $'Importing procmail settings'
  3090. cp $USB_MOUNT/.procmailrc /home/$MY_USERNAME
  3091. chown -R $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.procmailrc
  3092. fi
  3093. if [ -f $USB_MOUNT/private_key.gpg ]; then
  3094. echo $'GPG private key found on USB drive'
  3095. MY_GPG_PRIVATE_KEY=$USB_MOUNT/private_key.gpg
  3096. fi
  3097. if [ -f $USB_MOUNT/public_key.gpg ]; then
  3098. echo $'GPG public key found on USB drive'
  3099. MY_GPG_PUBLIC_KEY=$USB_MOUNT/public_key.gpg
  3100. fi
  3101. fi
  3102. if [ -d $USB_MOUNT/prosody ]; then
  3103. if [ ! -d $XMPP_DIRECTORY ]; then
  3104. mkdir $XMPP_DIRECTORY
  3105. fi
  3106. cp -r $USB_MOUNT/prosody/* $XMPP_DIRECTORY
  3107. chown -R prosody:prosody $XMPP_DIRECTORY
  3108. fi
  3109. if [ -d $USB_MOUNT/.ssh ]; then
  3110. echo $'Importing ssh keys'
  3111. cp -r $USB_MOUNT/.ssh /home/$MY_USERNAME
  3112. chown -R $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.ssh
  3113. # for security delete the ssh keys from the usb drive
  3114. if [ ! -f /home/$MY_USERNAME/.ssh/id_rsa ]; then
  3115. echo $'ssh files did not copy'
  3116. exit 8
  3117. fi
  3118. fi
  3119. if [ -f $USB_MOUNT/.emacs ]; then
  3120. echo $'Importing .emacs file'
  3121. cp -f $USB_MOUNT/.emacs /home/$MY_USERNAME/.emacs
  3122. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.emacs
  3123. fi
  3124. if [ -d $USB_MOUNT/.emacs.d ]; then
  3125. echo $'Importing .emacs.d directory'
  3126. cp -r $USB_MOUNT/.emacs.d /home/$MY_USERNAME
  3127. chown -R $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.emacs.d
  3128. fi
  3129. if [ -d $USB_MOUNT/ssl ]; then
  3130. echo $'Importing SSL certificates'
  3131. cp -r $USB_MOUNT/ssl/* /etc/ssl
  3132. chmod 640 /etc/ssl/certs/*
  3133. chmod 400 /etc/ssl/private/*
  3134. # change ownership of some certificates
  3135. if [ -d /etc/prosody ]; then
  3136. chown prosody:prosody /etc/ssl/private/xmpp.*
  3137. chown prosody:prosody /etc/ssl/certs/xmpp.*
  3138. fi
  3139. if [ -d /etc/dovecot ]; then
  3140. chown root:dovecot /etc/ssl/certs/dovecot.*
  3141. chown root:dovecot /etc/ssl/private/dovecot.*
  3142. fi
  3143. if [ -f /etc/ssl/private/exim.key ]; then
  3144. cp /etc/ssl/private/exim.key /etc/exim4
  3145. cp /etc/ssl/certs/exim.crt /etc/exim4
  3146. cp /etc/ssl/certs/exim.dhparam /etc/exim4
  3147. chown root:Debian-exim /etc/exim4/exim.key /etc/exim4/exim.crt /etc/exim4/exim.dhparam
  3148. chmod 640 /etc/exim4/exim.key /etc/exim4/exim.crt /etc/exim4/exim.dhparam
  3149. fi
  3150. fi
  3151. if [ -d $USB_MOUNT/personal ]; then
  3152. echo $'Importing personal directory'
  3153. cp -r $USB_MOUNT/personal /home/$MY_USERNAME
  3154. chown -R $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/personal
  3155. fi
  3156. else
  3157. if [ -d $USB_MOUNT ]; then
  3158. umount $USB_MOUNT
  3159. rm -rf $USB_MOUNT
  3160. fi
  3161. echo $'No USB drive attached'
  3162. fi
  3163. echo 'search_for_attached_usb_drive' >> $COMPLETION_FILE
  3164. }
  3165. function create_repo_sources {
  3166. if grep -Fxq "create_repo_sources" $COMPLETION_FILE; then
  3167. return
  3168. fi
  3169. rm -rf /var/lib/apt/lists/*
  3170. apt-get clean
  3171. echo "deb http://${DEBIAN_REPO}/debian/ ${DEBIAN_VERSION} main" > /etc/apt/sources.list
  3172. echo "deb-src http://${DEBIAN_REPO}/debian/ ${DEBIAN_VERSION} main" >> /etc/apt/sources.list
  3173. echo '' >> /etc/apt/sources.list
  3174. echo "deb http://security.debian.org/ ${DEBIAN_VERSION}/updates main" >> /etc/apt/sources.list
  3175. echo "deb-src http://security.debian.org/ ${DEBIAN_VERSION}/updates main" >> /etc/apt/sources.list
  3176. echo '' >> /etc/apt/sources.list
  3177. echo "deb http://${DEBIAN_REPO}/debian/ ${DEBIAN_VERSION}-updates main" >> /etc/apt/sources.list
  3178. echo "deb-src http://${DEBIAN_REPO}/debian/ ${DEBIAN_VERSION}-updates main" >> /etc/apt/sources.list
  3179. echo '' >> /etc/apt/sources.list
  3180. echo "deb http://${DEBIAN_REPO}/debian/ ${DEBIAN_VERSION}-backports main" >> /etc/apt/sources.list
  3181. echo "deb-src http://${DEBIAN_REPO}/debian/ ${DEBIAN_VERSION}-backports main" >> /etc/apt/sources.list
  3182. apt-get update
  3183. apt-get -y install apt-transport-https
  3184. echo 'create_repo_sources' >> $COMPLETION_FILE
  3185. }
  3186. function initial_setup {
  3187. if grep -Fxq "initial_setup" $COMPLETION_FILE; then
  3188. return
  3189. fi
  3190. apt-get -y remove --purge apache*
  3191. apt-get -y dist-upgrade
  3192. apt-get -y install ca-certificates emacs24 cpulimit
  3193. apt-get -y install cryptsetup libgfshare-bin obnam sshpass wget
  3194. apt-get -y install avahi-daemon avahi-utils avahi-discover
  3195. apt-get -y install connect-proxy
  3196. if [ ! -d $INSTALL_DIR ]; then
  3197. mkdir -p $INSTALL_DIR
  3198. fi
  3199. echo 'initial_setup' >> $COMPLETION_FILE
  3200. }
  3201. function allow_ssh_to_onion_address {
  3202. if [ ! -d /home/$MY_USERNAME/.ssh ]; then
  3203. mkdir /home/$MY_USERNAME/.ssh
  3204. fi
  3205. if [ ! -d /etc/tor ]; then
  3206. echo $'Tor not found when updating ssh'
  3207. exit 528257
  3208. fi
  3209. if ! grep -q "onion" /home/$MY_USERNAME/.ssh/config; then
  3210. echo 'Host *.onion' >> /home/$MY_USERNAME/.ssh/config
  3211. echo 'ProxyCommand connect -R remote -5 -S 127.0.0.1:9050 %h %p' >> /home/$MY_USERNAME/.ssh/config
  3212. fi
  3213. }
  3214. function install_tor {
  3215. if [[ $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  3216. return
  3217. fi
  3218. if grep -Fxq "install_tor" $COMPLETION_FILE; then
  3219. return
  3220. fi
  3221. apt-get -y install tor
  3222. if [ ! -f /etc/tor/torrc ]; then
  3223. echo 'Tor failed to install'
  3224. exit 38259
  3225. fi
  3226. echo 'install_tor' >> $COMPLETION_FILE
  3227. }
  3228. function resolve_dns_via_tor {
  3229. if [[ $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  3230. return
  3231. fi
  3232. if grep -Fxq "resolve_dns_via_tor" $COMPLETION_FILE; then
  3233. return
  3234. fi
  3235. if [ ! -f /etc/tor/torrc ]; then
  3236. echo $'tor was not installed'
  3237. exit 52952
  3238. fi
  3239. # resolve DNS via tor
  3240. if ! grep 'DNSPort 53' /etc/tor/torrc; then
  3241. echo 'DNSPort 53' >> /etc/tor/torrc
  3242. echo 'AutomapHostsOnResolve 1' >> /etc/tor/torrc
  3243. echo 'AutomapHostsSuffixes .exit,.onion' >> /etc/tor/torrc
  3244. systemctl restart tor
  3245. fi
  3246. # don't change resolv.conf
  3247. sed -i 's|, domain-name-servers||g' /etc/dhcp/dhclient.conf
  3248. # point resolv.conf to tor
  3249. echo 'nameserver 127.0.0.1:53' > /etc/resolv.conf
  3250. echo 'resolve_dns_via_tor' >> $COMPLETION_FILE
  3251. }
  3252. function enable_ssh_via_onion {
  3253. if [[ $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  3254. return
  3255. fi
  3256. if grep -Fxq "enable_ssh_via_onion" $COMPLETION_FILE; then
  3257. return
  3258. fi
  3259. apt-get -y install tor connect-proxy
  3260. if ! grep -q 'Host *.onion' /home/$MY_USERNAME/.ssh/config; then
  3261. if [ ! -d /home/$MY_USERNAME/.ssh ]; then
  3262. mkdir /home/$MY_USERNAME/.ssh
  3263. fi
  3264. echo 'Host *.onion' >> /home/$MY_USERNAME/.ssh/config
  3265. echo 'ProxyCommand connect -R remote -5 -S 127.0.0.1:9050 %h %p' >> /home/$MY_USERNAME/.ssh/config
  3266. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.ssh
  3267. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.ssh/config
  3268. fi
  3269. if ! grep -q 'Host *.onion' /root/.ssh/config; then
  3270. if [ ! -d /root/.ssh ]; then
  3271. mkdir /root/.ssh
  3272. fi
  3273. echo 'Host *.onion' >> /root/.ssh/config
  3274. echo 'ProxyCommand connect -R remote -5 -S 127.0.0.1:9050 %h %p' >> /root/.ssh/config
  3275. fi
  3276. echo 'enable_ssh_via_onion' >> $COMPLETION_FILE
  3277. }
  3278. function install_editor {
  3279. if grep -Fxq "install_editor" $COMPLETION_FILE; then
  3280. return
  3281. fi
  3282. update-alternatives --set editor /usr/bin/emacs24
  3283. # A minimal emacs configuration
  3284. #echo -n "(add-to-list 'load-path " > /home/$MY_USERNAME/.emacs
  3285. #echo '"~/.emacs.d/")' >> /home/$MY_USERNAME/.emacs
  3286. #echo '' >> /home/$MY_USERNAME/.emacs
  3287. echo $';; ===== Remove trailing whitepace ======================================' >> /home/$MY_USERNAME/.emacs
  3288. echo '' >> /home/$MY_USERNAME/.emacs
  3289. echo ";;(add-hook 'before-save-hook 'delete-trailing-whitespace)" >> /home/$MY_USERNAME/.emacs
  3290. echo '' >> /home/$MY_USERNAME/.emacs
  3291. echo ';; Goto a line number with CTRL-l' >> /home/$MY_USERNAME/.emacs
  3292. echo -n '(global-set-key "\C-l" ' >> /home/$MY_USERNAME/.emacs
  3293. echo "'goto-line)" >> /home/$MY_USERNAME/.emacs
  3294. echo '' >> /home/$MY_USERNAME/.emacs
  3295. echo $';; ===== Show line numbers ==============================================' >> /home/$MY_USERNAME/.emacs
  3296. echo '' >> /home/$MY_USERNAME/.emacs
  3297. echo "(add-hook 'find-file-hook (lambda () (linum-mode 1)))" >> /home/$MY_USERNAME/.emacs
  3298. echo '' >> /home/$MY_USERNAME/.emacs
  3299. echo $';; ===== Enable line wrapping in org-mode ===============================' >> /home/$MY_USERNAME/.emacs
  3300. echo '' >> /home/$MY_USERNAME/.emacs
  3301. echo " (add-hook 'org-mode-hook" >> /home/$MY_USERNAME/.emacs
  3302. echo " '(lambda ()" >> /home/$MY_USERNAME/.emacs
  3303. echo " (visual-line-mode 1)))" >> /home/$MY_USERNAME/.emacs
  3304. echo '' >> /home/$MY_USERNAME/.emacs
  3305. echo $';; ===== Enable shift select in org mode ================================' >> /home/$MY_USERNAME/.emacs
  3306. echo '' >> /home/$MY_USERNAME/.emacs
  3307. echo '(setq org-support-shift-select t)' >> /home/$MY_USERNAME/.emacs
  3308. echo '' >> /home/$MY_USERNAME/.emacs
  3309. echo $';; ===== Set standard indent to 4 rather that 4 =========================' >> /home/$MY_USERNAME/.emacs
  3310. echo '' >> /home/$MY_USERNAME/.emacs
  3311. echo '(setq standard-indent 4)' >> /home/$MY_USERNAME/.emacs
  3312. echo '(setq-default tab-width 4)' >> /home/$MY_USERNAME/.emacs
  3313. echo '(setq c-basic-offset 4)' >> /home/$MY_USERNAME/.emacs
  3314. echo '' >> /home/$MY_USERNAME/.emacs
  3315. echo $';; ===== Support Wheel Mouse Scrolling ==================================' >> /home/$MY_USERNAME/.emacs
  3316. echo '' >> /home/$MY_USERNAME/.emacs
  3317. echo '(mouse-wheel-mode t)' >> /home/$MY_USERNAME/.emacs
  3318. echo '' >> /home/$MY_USERNAME/.emacs
  3319. echo $';; ===== Place Backup Files in Specific Directory =======================' >> /home/$MY_USERNAME/.emacs
  3320. echo '' >> /home/$MY_USERNAME/.emacs
  3321. echo '(setq make-backup-files t)' >> /home/$MY_USERNAME/.emacs
  3322. echo '(setq version-control t)' >> /home/$MY_USERNAME/.emacs
  3323. echo '(setq backup-directory-alist (quote ((".*" . "~/.emacs_backups/"))))' >> /home/$MY_USERNAME/.emacs
  3324. echo '' >> /home/$MY_USERNAME/.emacs
  3325. echo $';; ===== Make Text mode the default mode for new buffers ================' >> /home/$MY_USERNAME/.emacs
  3326. echo '' >> /home/$MY_USERNAME/.emacs
  3327. echo "(setq default-major-mode 'text-mode)" >> /home/$MY_USERNAME/.emacs
  3328. echo '' >> /home/$MY_USERNAME/.emacs
  3329. echo $';; ===== Line length ====================================================' >> /home/$MY_USERNAME/.emacs
  3330. echo '' >> /home/$MY_USERNAME/.emacs
  3331. echo '(setq-default fill-column 72)' >> /home/$MY_USERNAME/.emacs
  3332. echo '' >> /home/$MY_USERNAME/.emacs
  3333. echo $';; ===== Enable Line and Column Numbering ===============================' >> /home/$MY_USERNAME/.emacs
  3334. echo '' >> /home/$MY_USERNAME/.emacs
  3335. echo '(line-number-mode 1)' >> /home/$MY_USERNAME/.emacs
  3336. echo '(column-number-mode 1)' >> /home/$MY_USERNAME/.emacs
  3337. echo '' >> /home/$MY_USERNAME/.emacs
  3338. echo $';; ===== Turn on Auto Fill mode automatically in all modes ==============' >> /home/$MY_USERNAME/.emacs
  3339. echo '' >> /home/$MY_USERNAME/.emacs
  3340. echo ';; Auto-fill-mode the the automatic wrapping of lines and insertion of' >> /home/$MY_USERNAME/.emacs
  3341. echo ';; newlines when the cursor goes over the column limit.' >> /home/$MY_USERNAME/.emacs
  3342. echo '' >> /home/$MY_USERNAME/.emacs
  3343. echo ';; This should actually turn on auto-fill-mode by default in all major' >> /home/$MY_USERNAME/.emacs
  3344. echo ';; modes. The other way to do this is to turn on the fill for specific modes' >> /home/$MY_USERNAME/.emacs
  3345. echo ';; via hooks.' >> /home/$MY_USERNAME/.emacs
  3346. echo '' >> /home/$MY_USERNAME/.emacs
  3347. echo '(setq auto-fill-mode 1)' >> /home/$MY_USERNAME/.emacs
  3348. echo '' >> /home/$MY_USERNAME/.emacs
  3349. echo $';; ===== Enable GPG encryption =========================================' >> /home/$MY_USERNAME/.emacs
  3350. echo '' >> /home/$MY_USERNAME/.emacs
  3351. echo "(require 'epa)" >> /home/$MY_USERNAME/.emacs
  3352. echo '(epa-file-enable)' >> /home/$MY_USERNAME/.emacs
  3353. cp /home/$MY_USERNAME/.emacs /root/.emacs
  3354. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.emacs
  3355. echo 'install_editor' >> $COMPLETION_FILE
  3356. }
  3357. function enable_zram {
  3358. if grep -Fxq "enable_zram" $COMPLETION_FILE; then
  3359. return
  3360. fi
  3361. if [[ $INSTALLED_WITHIN_DOCKER == "yes" || $INSTALLING_ON_BBB != "yes" ]]; then
  3362. ${PROJECT_NAME}-zram off
  3363. return
  3364. fi
  3365. ${PROJECT_NAME}-zram on
  3366. echo 'enable_zram' >> $COMPLETION_FILE
  3367. }
  3368. function check_onerng_verification {
  3369. if grep -Fxq "check_onerng_verification" $COMPLETION_FILE; then
  3370. return
  3371. fi
  3372. if [[ $HWRNG_TYPE != "onerng" ]]; then
  3373. return
  3374. fi
  3375. echo $'Checking OneRNG firmware verification'
  3376. last_onerng_validation=$(cat /var/log/syslog.1 | grep "OneRNG: firmware verification" | awk '/./{line=$0} END{print line}')
  3377. if [[ $last_onerng_validation != *"passed OK"* ]]; then
  3378. last_onerng_validation=$(cat /var/log/syslog | grep "OneRNG: firmware verification" | awk '/./{line=$0} END{print line}')
  3379. if [[ $last_onerng_validation != *"passed OK"* ]]; then
  3380. echo $last_onerng_validation
  3381. echo $'OneRNG firmware verification failed'
  3382. exit 735026
  3383. fi
  3384. fi
  3385. echo $'OneRNG firmware verification passed'
  3386. # if haveged was previously installed then remove it
  3387. apt-get -y remove haveged
  3388. echo 'check_onerng_verification' >> $COMPLETION_FILE
  3389. }
  3390. function install_onerng {
  3391. apt-get -y install rng-tools at python-gnupg
  3392. # Move to the installation directory
  3393. if [ ! -d $INSTALL_DIR ]; then
  3394. mkdir $INSTALL_DIR
  3395. fi
  3396. cd $INSTALL_DIR
  3397. # Download the package
  3398. if [ ! -f $ONERNG_PACKAGE ]; then
  3399. wget $ONERNG_PACKAGE_DOWNLOAD
  3400. mv "$ONERNG_PACKAGE?raw=true" $ONERNG_PACKAGE
  3401. fi
  3402. if [ ! -f $ONERNG_PACKAGE ]; then
  3403. echo $"OneRNG package could not be downloaded"
  3404. exit 59249
  3405. fi
  3406. # Check the hash
  3407. hash=$(sha256sum $ONERNG_PACKAGE | awk -F ' ' '{print $1}')
  3408. if [[ $hash != $ONERNG_PACKAGE_HASH ]]; then
  3409. echo $"OneRNG package: $ONERNG_PACKAGE"
  3410. echo $"Hash does not match. This could indicate that the package has been tampered with."
  3411. echo $"OneRNG expected package hash: $ONERNG_PACKAGE_HASH"
  3412. echo $"OneRNG actual hash: $hash"
  3413. exit 25934
  3414. fi
  3415. # install the package
  3416. dpkg -i $ONERNG_PACKAGE
  3417. # Check that the install worked
  3418. if [ ! -f /etc/onerng.conf ]; then
  3419. echo $'OneRNG configuration file not found. The package may not have installed successfully.'
  3420. exit 42904
  3421. fi
  3422. dialog --title $"OneRNG Device" \
  3423. --msgbox $"Please plug in the OneRNG device" 6 40
  3424. # check rng-tools configuration
  3425. if ! grep -q "/dev/$ONERNG_DEVICE" /etc/default/rng-tools; then
  3426. echo "HRNGDEVICE=/dev/$ONERNG_DEVICE" >> /etc/default/rng-tools
  3427. fi
  3428. systemctl restart rng-tools
  3429. }
  3430. function random_number_generator {
  3431. if grep -Fxq "random_number_generator" $COMPLETION_FILE; then
  3432. return
  3433. fi
  3434. if [[ $INSTALLED_WITHIN_DOCKER == "yes" ]]; then
  3435. # it is assumed that docker uses the random number
  3436. # generator of the host system
  3437. return
  3438. fi
  3439. # if the hrng type has not been set but /dev/hwrng is detected
  3440. if [[ $HWRNG_TYPE != "beaglebone" ]]; then
  3441. if [ -e /dev/hwrng ]; then
  3442. HWRNG_TYPE="beaglebone"
  3443. fi
  3444. fi
  3445. case $HWRNG_TYPE in
  3446. beaglebone)
  3447. apt-get -y install rng-tools
  3448. sed -i 's|#HRNGDEVICE=/dev/hwrng|HRNGDEVICE=/dev/hwrng|g' /etc/default/rng-tools
  3449. ;;
  3450. onerng)
  3451. install_onerng
  3452. ;;
  3453. *)
  3454. apt-get -y install haveged
  3455. ;;
  3456. esac
  3457. echo 'random_number_generator' >> $COMPLETION_FILE
  3458. }
  3459. function configure_ssh {
  3460. if grep -Fxq "configure_ssh" $COMPLETION_FILE; then
  3461. return
  3462. fi
  3463. sed -i "s/Port .*/Port $SSH_PORT/g" /etc/ssh/sshd_config
  3464. sed -i 's/PermitRootLogin.*/PermitRootLogin no/g' /etc/ssh/sshd_config
  3465. sed -i 's/X11Forwarding.*/X11Forwarding no/g' /etc/ssh/sshd_config
  3466. sed -i 's/ServerKeyBits.*/ServerKeyBits 4096/g' /etc/ssh/sshd_config
  3467. sed -i 's/TCPKeepAlive.*/TCPKeepAlive no/g' /etc/ssh/sshd_config
  3468. sed -i 's|HostKey /etc/ssh/ssh_host_dsa_key|#HostKey /etc/ssh/ssh_host_dsa_key|g' /etc/ssh/sshd_config
  3469. sed -i 's|HostKey /etc/ssh/ssh_host_ecdsa_key|#HostKey /etc/ssh/ssh_host_ecdsa_key|g' /etc/ssh/sshd_config
  3470. if ! grep -q 'DebianBanner' /etc/ssh/sshd_config; then
  3471. echo 'DebianBanner no' >> /etc/ssh/sshd_config
  3472. else
  3473. sed -i 's|DebianBanner.*|DebianBanner no|g' /etc/ssh/sshd_config
  3474. fi
  3475. if grep -q 'ClientAliveInterval' /etc/ssh/sshd_config; then
  3476. sed -i 's/ClientAliveInterval.*/ClientAliveInterval 60/g' /etc/ssh/sshd_config
  3477. else
  3478. echo 'ClientAliveInterval 60' >> /etc/ssh/sshd_config
  3479. fi
  3480. if grep -q 'ClientAliveCountMax' /etc/ssh/sshd_config; then
  3481. sed -i 's/ClientAliveCountMax.*/ClientAliveCountMax 3/g' /etc/ssh/sshd_config
  3482. else
  3483. echo 'ClientAliveCountMax 3' >> /etc/ssh/sshd_config
  3484. fi
  3485. if grep -q 'Ciphers' /etc/ssh/sshd_config; then
  3486. sed -i "s|Ciphers.*|Ciphers $SSH_CIPHERS|g" /etc/ssh/sshd_config
  3487. else
  3488. echo "Ciphers $SSH_CIPHERS" >> /etc/ssh/sshd_config
  3489. fi
  3490. if grep -q 'MACs' /etc/ssh/sshd_config; then
  3491. sed -i "s|MACs.*|MACs $SSH_MACS|g" /etc/ssh/sshd_config
  3492. else
  3493. echo "MACs $SSH_MACS" >> /etc/ssh/sshd_config
  3494. fi
  3495. if grep -q 'KexAlgorithms' /etc/ssh/sshd_config; then
  3496. sed -i "s|KexAlgorithms.*|KexAlgorithms $SSH_KEX|g" /etc/ssh/sshd_config
  3497. else
  3498. echo "KexAlgorithms $SSH_KEX" >> /etc/ssh/sshd_config
  3499. fi
  3500. apt-get -y install fail2ban
  3501. echo 'configure_ssh' >> $COMPLETION_FILE
  3502. }
  3503. function configure_ssh_onion {
  3504. if grep -Fxq "configure_ssh_onion" $COMPLETION_FILE; then
  3505. return
  3506. fi
  3507. if [[ $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  3508. return
  3509. fi
  3510. SSH_ONION_HOSTNAME=$(add_onion_service ssh ${SSH_PORT} ${SSH_PORT})
  3511. if ! grep -q "ssh onion domain" $COMPLETION_FILE; then
  3512. echo "ssh onion domain:${SSH_ONION_HOSTNAME}" >> $COMPLETION_FILE
  3513. else
  3514. sed -i "s|ssh onion domain.*|ssh onion domain:${SSH_ONION_HOSTNAME}|g" $COMPLETION_FILE
  3515. fi
  3516. echo 'configure_ssh_onion' >> $COMPLETION_FILE
  3517. }
  3518. # see https://stribika.github.io/2015/01/04/secure-secure-shell.html
  3519. function ssh_remove_small_moduli {
  3520. awk '$5 > 2000' /etc/ssh/moduli > ~/moduli
  3521. mv ~/moduli /etc/ssh/moduli
  3522. }
  3523. function configure_ssh_client {
  3524. if grep -Fxq "configure_ssh_client" $COMPLETION_FILE; then
  3525. return
  3526. fi
  3527. #sed -i 's/# PasswordAuthentication.*/ PasswordAuthentication no/g' /etc/ssh/ssh_config
  3528. #sed -i 's/# ChallengeResponseAuthentication.*/ ChallengeResponseAuthentication no/g' /etc/ssh/ssh_config
  3529. sed -i "s/# HostKeyAlgorithms.*/ HostKeyAlgorithms $SSH_HOST_KEY_ALGORITHMS/g" /etc/ssh/ssh_config
  3530. sed -i "s/# Ciphers.*/ Ciphers $SSH_CIPHERS/g" /etc/ssh/ssh_config
  3531. sed -i "s/# MACs.*/ MACs $SSH_MACS/g" /etc/ssh/ssh_config
  3532. if ! grep -q "HostKeyAlgorithms" /etc/ssh/ssh_config; then
  3533. echo " HostKeyAlgorithms $SSH_HOST_KEY_ALGORITHMS" >> /etc/ssh/ssh_config
  3534. fi
  3535. sed -i "s/Ciphers.*/Ciphers $SSH_CIPHERS/g" /etc/ssh/ssh_config
  3536. if ! grep -q "Ciphers " /etc/ssh/ssh_config; then
  3537. echo " Ciphers $SSH_CIPHERS" >> /etc/ssh/ssh_config
  3538. fi
  3539. sed -i "s/MACs.*/MACs $SSH_MACS/g" /etc/ssh/ssh_config
  3540. if ! grep -q "MACs " /etc/ssh/ssh_config; then
  3541. echo " MACs $SSH_MACS" >> /etc/ssh/ssh_config
  3542. fi
  3543. # Create ssh keys
  3544. if [ ! -f ~/.ssh/id_ed25519 ]; then
  3545. ssh-keygen -t ed25519 -o -a 100
  3546. fi
  3547. if [ ! -f ~/.ssh/id_rsa ]; then
  3548. ssh-keygen -t rsa -b 4096 -o -a 100
  3549. fi
  3550. ssh_remove_small_moduli
  3551. echo 'configure_ssh_client' >> $COMPLETION_FILE
  3552. }
  3553. function regenerate_ssh_keys {
  3554. if grep -Fxq "regenerate_ssh_keys" $COMPLETION_FILE; then
  3555. return
  3556. fi
  3557. rm -f /etc/ssh/ssh_host_*
  3558. dpkg-reconfigure openssh-server
  3559. ssh_remove_small_moduli
  3560. systemctl restart ssh
  3561. echo 'regenerate_ssh_keys' >> $COMPLETION_FILE
  3562. }
  3563. function configure_dns {
  3564. if grep -Fxq "configure_dns" $COMPLETION_FILE; then
  3565. return
  3566. fi
  3567. echo 'domain localdomain' > /etc/resolv.conf
  3568. echo 'search localdomain' >> /etc/resolv.conf
  3569. echo "nameserver $NAMESERVER1" >> /etc/resolv.conf
  3570. echo "nameserver $NAMESERVER2" >> /etc/resolv.conf
  3571. echo 'configure_dns' >> $COMPLETION_FILE
  3572. }
  3573. function set_hostname {
  3574. DEFAULT_DOMAIN_NAME="$1"
  3575. echo "$DEFAULT_DOMAIN_NAME" > /etc/hostname
  3576. hostname $DEFAULT_DOMAIN_NAME
  3577. if grep -q "127.0.1.1" /etc/hosts; then
  3578. sed -i "s/127.0.1.1.*/127.0.1.1 $DEFAULT_DOMAIN_NAME/g" /etc/hosts
  3579. else
  3580. echo "127.0.1.1 $DEFAULT_DOMAIN_NAME" >> /etc/hosts
  3581. fi
  3582. }
  3583. function set_your_domain_name {
  3584. if grep -Fxq "set_your_domain_name" $COMPLETION_FILE; then
  3585. return
  3586. fi
  3587. set_hostname $DEFAULT_DOMAIN_NAME
  3588. echo 'set_your_domain_name' >> $COMPLETION_FILE
  3589. }
  3590. function time_synchronisation {
  3591. # mesh peers typically don't sync over the internet
  3592. if [[ $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  3593. return
  3594. fi
  3595. if [ -f /usr/local/bin/${PROJECT_NAME}-update-date ]; then
  3596. cp /usr/local/bin/${PROJECT_NAME}-update-date /usr/bin/updatedate
  3597. else
  3598. cp /usr/bin/${PROJECT_NAME}-update-date /usr/bin/updatedate
  3599. fi
  3600. chmod +x /usr/bin/updatedate
  3601. if grep -Fxq "time_synchronisation" $COMPLETION_FILE; then
  3602. return
  3603. fi
  3604. apt-get -y install tlsdate
  3605. apt-get -y remove ntpdate
  3606. echo '*/15 * * * * root /usr/bin/updatedate' >> /etc/crontab
  3607. systemctl restart cron
  3608. echo 'time_synchronisation' >> $COMPLETION_FILE
  3609. }
  3610. function configure_firewall {
  3611. if grep -Fxq "configure_firewall" $COMPLETION_FILE; then
  3612. return
  3613. fi
  3614. if [[ $INSTALLED_WITHIN_DOCKER == "yes" ]]; then
  3615. # docker does its own firewalling
  3616. return
  3617. fi
  3618. iptables -P INPUT ACCEPT
  3619. ip6tables -P INPUT ACCEPT
  3620. iptables -F
  3621. ip6tables -F
  3622. iptables -t nat -F
  3623. ip6tables -t nat -F
  3624. iptables -X
  3625. ip6tables -X
  3626. iptables -P INPUT DROP
  3627. ip6tables -P INPUT DROP
  3628. iptables -A INPUT -i lo -j ACCEPT
  3629. iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
  3630. # Make sure incoming tcp connections are SYN packets
  3631. iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
  3632. # Drop packets with incoming fragments
  3633. iptables -A INPUT -f -j DROP
  3634. # Drop bogons
  3635. iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
  3636. iptables -A INPUT -p tcp --tcp-flags ALL FIN,PSH,URG -j DROP
  3637. iptables -A INPUT -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP
  3638. # Incoming malformed NULL packets:
  3639. iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
  3640. echo 'configure_firewall' >> $COMPLETION_FILE
  3641. }
  3642. function configure_firewall_ping {
  3643. if grep -Fxq "configure_firewall_ping" $COMPLETION_FILE; then
  3644. return
  3645. fi
  3646. # Only allow ping for mesh installs
  3647. if [[ $SYSTEM_TYPE != "$VARIANT_MESH" ]]; then
  3648. return
  3649. fi
  3650. iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
  3651. iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT
  3652. save_firewall_settings
  3653. echo 'configure_firewall_ping' >> $COMPLETION_FILE
  3654. }
  3655. function configure_firewall_for_voip {
  3656. 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
  3657. return
  3658. fi
  3659. if grep -Fxq "configure_firewall_for_voip" $COMPLETION_FILE; then
  3660. return
  3661. fi
  3662. if [[ $ONION_ONLY != "no" ]]; then
  3663. return
  3664. fi
  3665. iptables -A INPUT -p udp --dport $VOIP_PORT -j ACCEPT
  3666. iptables -A INPUT -p tcp --dport $VOIP_PORT -j ACCEPT
  3667. save_firewall_settings
  3668. echo 'configure_firewall_for_voip' >> $COMPLETION_FILE
  3669. }
  3670. function configure_firewall_for_voip_turn {
  3671. 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
  3672. return
  3673. fi
  3674. if grep -Fxq "configure_firewall_for_voip_turn" $COMPLETION_FILE; then
  3675. return
  3676. fi
  3677. if [[ $ONION_ONLY != "no" ]]; then
  3678. return
  3679. fi
  3680. iptables -A INPUT -p udp --dport $VOIP_TURN_PORT -j ACCEPT
  3681. iptables -A INPUT -p tcp --dport $VOIP_TURN_PORT -j ACCEPT
  3682. iptables -A INPUT -p tcp --dport $VOIP_TURN_TLS_PORT -j ACCEPT
  3683. save_firewall_settings
  3684. echo 'configure_firewall_for_voip_turn' >> $COMPLETION_FILE
  3685. }
  3686. function configure_firewall_for_sip4 {
  3687. 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
  3688. return
  3689. fi
  3690. if grep -Fxq "configure_firewall_for_sip4" $COMPLETION_FILE; then
  3691. return
  3692. fi
  3693. if [[ $ONION_ONLY != "no" ]]; then
  3694. return
  3695. fi
  3696. iptables -A INPUT -p udp --dport $SIP_PORT -j ACCEPT
  3697. iptables -A INPUT -p tcp --dport $SIP_PORT -j ACCEPT
  3698. iptables -A INPUT -p udp --dport $SIP_TLS_PORT -j ACCEPT
  3699. iptables -A INPUT -p tcp --dport $SIP_TLS_PORT -j ACCEPT
  3700. save_firewall_settings
  3701. echo 'configure_firewall_for_sip4' >> $COMPLETION_FILE
  3702. }
  3703. function configure_firewall_for_ipfs {
  3704. if [[ $SYSTEM_TYPE == "$VARIANT_MAILBOX" || $SYSTEM_TYPE == "$VARIANT_CHAT" ]]; then
  3705. return
  3706. fi
  3707. if grep -Fxq "configure_firewall_for_ipfs" $COMPLETION_FILE; then
  3708. return
  3709. fi
  3710. if [[ $ONION_ONLY != "no" ]]; then
  3711. return
  3712. fi
  3713. iptables -A INPUT -p tcp --dport $IPFS_PORT -j ACCEPT
  3714. save_firewall_settings
  3715. echo 'configure_firewall_for_ipfs' >> $COMPLETION_FILE
  3716. }
  3717. function configure_firewall_for_avahi {
  3718. if grep -Fxq "configure_firewall_for_avahi" $COMPLETION_FILE; then
  3719. return
  3720. fi
  3721. iptables -A INPUT -p tcp --dport 548 -j ACCEPT
  3722. iptables -A INPUT -p udp --dport 548 -j ACCEPT
  3723. iptables -A INPUT -p tcp --dport 5353 -j ACCEPT
  3724. iptables -A INPUT -p udp --dport 5353 -j ACCEPT
  3725. iptables -A INPUT -p tcp --dport 5354 -j ACCEPT
  3726. iptables -A INPUT -p udp --dport 5354 -j ACCEPT
  3727. save_firewall_settings
  3728. echo 'configure_firewall_for_avahi' >> $COMPLETION_FILE
  3729. }
  3730. function configure_firewall_for_cjdns {
  3731. if grep -Fxq "configure_firewall_for_cjdns" $COMPLETION_FILE; then
  3732. return
  3733. fi
  3734. if [[ $ENABLE_CJDNS != "yes" ]]; then
  3735. return
  3736. fi
  3737. ip6tables -t nat -A POSTROUTING -o tun0 -j MASQUERADE
  3738. ip6tables -A FORWARD -i tun0 -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
  3739. save_firewall_settings
  3740. echo 'configure_firewall_for_cjdns' >> $COMPLETION_FILE
  3741. }
  3742. function configure_firewall_for_batman {
  3743. if grep -Fxq "configure_firewall_for_batman" $COMPLETION_FILE; then
  3744. return
  3745. fi
  3746. if [[ $ENABLE_BATMAN != "yes" ]]; then
  3747. return
  3748. fi
  3749. save_firewall_settings
  3750. echo 'configure_firewall_for_batman' >> $COMPLETION_FILE
  3751. }
  3752. function configure_firewall_for_babel {
  3753. if grep -Fxq "configure_firewall_for_babel" $COMPLETION_FILE; then
  3754. return
  3755. fi
  3756. if [[ $ENABLE_BABEL != "yes" ]]; then
  3757. return
  3758. fi
  3759. iptables -A INPUT -i $WIFI_INTERFACE -p udp --dport $BABEL_PORT -j ACCEPT
  3760. save_firewall_settings
  3761. echo 'configure_firewall_for_babel' >> $COMPLETION_FILE
  3762. }
  3763. function configure_firewall_for_zeronet {
  3764. if grep -Fxq "configure_firewall_for_zeronet" $COMPLETION_FILE; then
  3765. return
  3766. fi
  3767. if [[ $SYSTEM_TYPE != "$VARIANT_MESH" ]]; then
  3768. return
  3769. fi
  3770. iptables -A INPUT -i $WIFI_INTERFACE -p udp --dport $ZERONET_PORT -j ACCEPT
  3771. iptables -A INPUT -i $WIFI_INTERFACE -p tcp --dport $ZERONET_PORT -j ACCEPT
  3772. iptables -A INPUT -i $WIFI_INTERFACE -p udp --dport $TRACKER_PORT -j ACCEPT
  3773. iptables -A INPUT -i $WIFI_INTERFACE -p tcp --dport $TRACKER_PORT -j ACCEPT
  3774. iptables -A INPUT -i $WIFI_INTERFACE -p udp --dport 1900 -j ACCEPT
  3775. save_firewall_settings
  3776. echo 'configure_firewall_for_zeronet' >> $COMPLETION_FILE
  3777. }
  3778. function configure_firewall_for_dlna {
  3779. if grep -Fxq "configure_firewall_for_dlna" $COMPLETION_FILE; then
  3780. return
  3781. fi
  3782. if [[ $INSTALLED_WITHIN_DOCKER == "yes" ]]; then
  3783. # docker does its own firewalling
  3784. return
  3785. fi
  3786. if [[ $SYSTEM_TYPE == "$VARIANT_CLOUD" || $SYSTEM_TYPE == "$VARIANT_MAILBOX" || $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_WRITER" || $SYSTEM_TYPE == "$VARIANT_SOCIAL" ]]; then
  3787. return
  3788. fi
  3789. iptables -A INPUT -p udp --dport 1900 -j ACCEPT
  3790. iptables -A INPUT -p tcp --dport 8200 -j ACCEPT
  3791. save_firewall_settings
  3792. echo 'configure_firewall_for_dlna' >> $COMPLETION_FILE
  3793. }
  3794. function configure_firewall_for_dns {
  3795. if grep -Fxq "configure_firewall_for_dns" $COMPLETION_FILE; then
  3796. return
  3797. fi
  3798. if [[ $INSTALLED_WITHIN_DOCKER == "yes" ]]; then
  3799. # docker does its own firewalling
  3800. return
  3801. fi
  3802. iptables -A INPUT -p udp -m udp --dport 1024:65535 --sport 53 -j ACCEPT
  3803. save_firewall_settings
  3804. echo 'configure_firewall_for_dns' >> $COMPLETION_FILE
  3805. }
  3806. function configure_firewall_for_xmpp {
  3807. if [ ! -d /etc/prosody ]; then
  3808. return
  3809. fi
  3810. if grep -Fxq "configure_firewall_for_xmpp" $COMPLETION_FILE; then
  3811. return
  3812. fi
  3813. if [[ $INSTALLED_WITHIN_DOCKER == "yes" ]]; then
  3814. # docker does its own firewalling
  3815. return
  3816. fi
  3817. if [[ $ONION_ONLY != "no" ]]; then
  3818. return
  3819. fi
  3820. iptables -A INPUT -p tcp --dport 5222:5223 -j ACCEPT
  3821. iptables -A INPUT -p tcp --dport 5269 -j ACCEPT
  3822. iptables -A INPUT -p tcp --dport 5280:5281 -j ACCEPT
  3823. save_firewall_settings
  3824. echo 'configure_firewall_for_xmpp' >> $COMPLETION_FILE
  3825. }
  3826. function configure_firewall_for_irc {
  3827. if [ ! -d /etc/ngircd ]; then
  3828. return
  3829. fi
  3830. if grep -Fxq "configure_firewall_for_irc" $COMPLETION_FILE; then
  3831. return
  3832. fi
  3833. if [[ $INSTALLED_WITHIN_DOCKER == "yes" ]]; then
  3834. # docker does its own firewalling
  3835. return
  3836. fi
  3837. if [[ $ONION_ONLY != "no" ]]; then
  3838. return
  3839. fi
  3840. iptables -A INPUT -p tcp --dport $IRC_PORT -j ACCEPT
  3841. iptables -I INPUT -p tcp --dport 1024:65535 --sport $IRC_PORT -j ACCEPT
  3842. save_firewall_settings
  3843. echo 'configure_firewall_for_irc' >> $COMPLETION_FILE
  3844. }
  3845. function configure_firewall_for_ftp {
  3846. if grep -Fxq "configure_firewall_for_ftp" $COMPLETION_FILE; then
  3847. return
  3848. fi
  3849. if [[ $INSTALLED_WITHIN_DOCKER == "yes" ]]; then
  3850. # docker does its own firewalling
  3851. return
  3852. fi
  3853. if [[ $ONION_ONLY != "no" ]]; then
  3854. return
  3855. fi
  3856. iptables -I INPUT -p tcp --dport 1024:65535 --sport 20:21 -j ACCEPT
  3857. save_firewall_settings
  3858. echo 'configure_firewall_for_ftp' >> $COMPLETION_FILE
  3859. }
  3860. function configure_firewall_for_web_access {
  3861. if grep -Fxq "configure_firewall_for_web_access" $COMPLETION_FILE; then
  3862. return
  3863. fi
  3864. if [[ $INSTALLED_WITHIN_DOCKER == "yes" ]]; then
  3865. # docker does its own firewalling
  3866. return
  3867. fi
  3868. if [[ $ONION_ONLY != "no" ]]; then
  3869. return
  3870. fi
  3871. iptables -A INPUT -p tcp --dport 32768:61000 --sport 80 -j ACCEPT
  3872. iptables -A INPUT -p tcp --dport 32768:61000 --sport 443 -j ACCEPT
  3873. save_firewall_settings
  3874. echo 'configure_firewall_for_web_access' >> $COMPLETION_FILE
  3875. }
  3876. function configure_firewall_for_web_server {
  3877. if grep -Fxq "configure_firewall_for_web_server" $COMPLETION_FILE; then
  3878. return
  3879. fi
  3880. if [[ $INSTALLED_WITHIN_DOCKER == "yes" ]]; then
  3881. # docker does its own firewalling
  3882. return
  3883. fi
  3884. if [[ $ONION_ONLY != "no" ]]; then
  3885. return
  3886. fi
  3887. iptables -A INPUT -p tcp --dport 80 -j ACCEPT
  3888. iptables -A INPUT -p tcp --dport 443 -j ACCEPT
  3889. save_firewall_settings
  3890. echo 'configure_firewall_for_web_server' >> $COMPLETION_FILE
  3891. }
  3892. function configure_firewall_for_tox {
  3893. if grep -Fxq "configure_firewall_for_tox" $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 $TOX_PORT -j ACCEPT
  3904. save_firewall_settings
  3905. echo 'configure_firewall_for_tox' >> $COMPLETION_FILE
  3906. }
  3907. function configure_firewall_for_ssh {
  3908. if grep -Fxq "configure_firewall_for_ssh" $COMPLETION_FILE; then
  3909. return
  3910. fi
  3911. if [[ $INSTALLED_WITHIN_DOCKER == "yes" ]]; then
  3912. # docker does its own firewalling
  3913. return
  3914. fi
  3915. iptables -A INPUT -p tcp --dport 22 -j ACCEPT
  3916. iptables -A INPUT -p tcp --dport $SSH_PORT -j ACCEPT
  3917. save_firewall_settings
  3918. echo 'configure_firewall_for_ssh' >> $COMPLETION_FILE
  3919. }
  3920. function configure_firewall_for_git {
  3921. if grep -Fxq "configure_firewall_for_git" $COMPLETION_FILE; then
  3922. return
  3923. fi
  3924. if [[ $INSTALLED_WITHIN_DOCKER == "yes" ]]; then
  3925. # docker does its own firewalling
  3926. return
  3927. fi
  3928. if [[ $ONION_ONLY != "no" ]]; then
  3929. return
  3930. fi
  3931. iptables -A INPUT -p tcp --dport 9418 -j ACCEPT
  3932. save_firewall_settings
  3933. echo 'configure_firewall_for_git' >> $COMPLETION_FILE
  3934. }
  3935. function configure_firewall_for_email {
  3936. 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
  3937. return
  3938. fi
  3939. if grep -Fxq "configure_firewall_for_email" $COMPLETION_FILE; then
  3940. return
  3941. fi
  3942. if [[ $INSTALLED_WITHIN_DOCKER == "yes" ]]; then
  3943. # docker does its own firewalling
  3944. return
  3945. fi
  3946. if [[ $ONION_ONLY != "no" ]]; then
  3947. return
  3948. fi
  3949. iptables -A INPUT -p tcp --dport 25 -j ACCEPT
  3950. iptables -A INPUT -p tcp --dport 587 -j ACCEPT
  3951. iptables -A INPUT -p tcp --dport 465 -j ACCEPT
  3952. iptables -A INPUT -p tcp --dport 993 -j ACCEPT
  3953. save_firewall_settings
  3954. echo 'configure_firewall_for_email' >> $COMPLETION_FILE
  3955. }
  3956. function configure_internet_protocol {
  3957. if grep -Fxq "configure_internet_protocol" $COMPLETION_FILE; then
  3958. return
  3959. fi
  3960. if [[ $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  3961. return
  3962. fi
  3963. sed -i "s/#net.ipv4.tcp_syncookies=1/net.ipv4.tcp_syncookies=1/g" /etc/sysctl.conf
  3964. sed -i "s/#net.ipv4.conf.all.accept_redirects = 0/net.ipv4.conf.all.accept_redirects = 0/g" /etc/sysctl.conf
  3965. sed -i "s/#net.ipv6.conf.all.accept_redirects = 0/net.ipv6.conf.all.accept_redirects = 0/g" /etc/sysctl.conf
  3966. sed -i "s/#net.ipv4.conf.all.send_redirects = 0/net.ipv4.conf.all.send_redirects = 0/g" /etc/sysctl.conf
  3967. sed -i "s/#net.ipv4.conf.all.accept_source_route = 0/net.ipv4.conf.all.accept_source_route = 0/g" /etc/sysctl.conf
  3968. sed -i "s/#net.ipv6.conf.all.accept_source_route = 0/net.ipv6.conf.all.accept_source_route = 0/g" /etc/sysctl.conf
  3969. sed -i "s/#net.ipv4.conf.default.rp_filter=1/net.ipv4.conf.default.rp_filter=1/g" /etc/sysctl.conf
  3970. sed -i "s/#net.ipv4.conf.all.rp_filter=1/net.ipv4.conf.all.rp_filter=1/g" /etc/sysctl.conf
  3971. sed -i "s/#net.ipv4.ip_forward=1/net.ipv4.ip_forward=0/g" /etc/sysctl.conf
  3972. sed -i "s/#net.ipv6.conf.all.forwarding=1/net.ipv6.conf.all.forwarding=0/g" /etc/sysctl.conf
  3973. if ! grep -q "ignore pings" /etc/sysctl.conf; then
  3974. echo '# ignore pings' >> /etc/sysctl.conf
  3975. echo 'net.ipv4.icmp_echo_ignore_all = 1' >> /etc/sysctl.conf
  3976. echo 'net.ipv6.icmp_echo_ignore_all = 1' >> /etc/sysctl.conf
  3977. fi
  3978. if ! grep -q "disable ipv6" /etc/sysctl.conf; then
  3979. echo '# disable ipv6' >> /etc/sysctl.conf
  3980. echo 'net.ipv6.conf.all.disable_ipv6 = 1' >> /etc/sysctl.conf
  3981. fi
  3982. if ! grep -q "net.ipv4.tcp_synack_retries" /etc/sysctl.conf; then
  3983. echo 'net.ipv4.tcp_synack_retries = 2' >> /etc/sysctl.conf
  3984. echo 'net.ipv4.tcp_syn_retries = 1' >> /etc/sysctl.conf
  3985. fi
  3986. if ! grep -q "keepalive" /etc/sysctl.conf; then
  3987. echo '# keepalive' >> /etc/sysctl.conf
  3988. echo 'net.ipv4.tcp_keepalive_probes = 9' >> /etc/sysctl.conf
  3989. echo 'net.ipv4.tcp_keepalive_intvl = 75' >> /etc/sysctl.conf
  3990. echo 'net.ipv4.tcp_keepalive_time = 7200' >> /etc/sysctl.conf
  3991. fi
  3992. echo 'configure_internet_protocol' >> $COMPLETION_FILE
  3993. }
  3994. function install_command_line_browser {
  3995. if grep -Fxq "install_command_line_browser" $COMPLETION_FILE; then
  3996. return
  3997. fi
  3998. apt-get -y install elinks
  3999. # set the home page
  4000. if ! grep -q "WWW_HOME" /home/$MY_USERNAME/.bashrc; then
  4001. if ! grep -q 'control' /home/$MY_USERNAME/.bashrc; then
  4002. echo "export WWW_HOME=$DEFAULT_SEARCH" >> /home/$MY_USERNAME/.bashrc
  4003. else
  4004. sed -i "/control/i export WWW_HOME=$DEFAULT_SEARCH" /home/$MY_USERNAME/.bashrc
  4005. fi
  4006. fi
  4007. echo 'install_command_line_browser' >> $COMPLETION_FILE
  4008. }
  4009. function configure_email {
  4010. if [[ $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  4011. return
  4012. fi
  4013. if grep -Fxq "configure_email" $COMPLETION_FILE; then
  4014. return
  4015. fi
  4016. apt-get -y remove postfix
  4017. apt-get -y install exim4 sasl2-bin swaks libnet-ssleay-perl procmail xinetd
  4018. if [ ! -d /etc/exim4 ]; then
  4019. echo $"ERROR: Exim does not appear to have installed. $CHECK_MESSAGE"
  4020. exit 48
  4021. fi
  4022. onion_service_name='email'
  4023. if [ ! -d /var/lib/tor ]; then
  4024. echo $"No Tor installation found. ${onion_service_name} onion site cannot be configured."
  4025. exit 877367
  4026. fi
  4027. if ! grep -q "hidden_service_${onion_service_name}" /etc/tor/torrc; then
  4028. echo "HiddenServiceDir /var/lib/tor/hidden_service_${onion_service_name}/" >> /etc/tor/torrc
  4029. echo 'HiddenServicePort 25 127.0.0.1:25' >> /etc/tor/torrc
  4030. echo 'HiddenServicePort 587 127.0.0.1:587' >> /etc/tor/torrc
  4031. echo 'HiddenServicePort 465 127.0.0.1:465' >> /etc/tor/torrc
  4032. echo 'HiddenServicePort 993 127.0.0.1:993' >> /etc/tor/torrc
  4033. echo $"Added onion site for ${onion_service_name}"
  4034. fi
  4035. systemctl restart tor
  4036. wait_for_onion_service ${onion_service_name}
  4037. if [ ! -f /var/lib/tor/hidden_service_${onion_service_name}/hostname ]; then
  4038. echo $"${onion_service_name} onion site hostname not found"
  4039. exit 76362
  4040. fi
  4041. EMAIL_ONION_HOSTNAME=$(cat /var/lib/tor/hidden_service_${onion_service_name}/hostname)
  4042. if [[ $ONION_ONLY != "no" ]]; then
  4043. set_hostname ${EMAIL_ONION_HOSTNAME}
  4044. MY_EMAIL_ADDRESS=${MY_USERNAME}@${DEFAULT_DOMAIN_NAME}
  4045. fi
  4046. if ! grep -q "Email onion domain" $COMPLETION_FILE; then
  4047. echo "Email onion domain:${EMAIL_ONION_HOSTNAME}" >> $COMPLETION_FILE
  4048. else
  4049. sed -i "s|Email onion domain.*|Email onion domain:${EMAIL_ONION_HOSTNAME}|g" $COMPLETION_FILE
  4050. fi
  4051. # see https://github.com/petterreinholdtsen/exim4-smtorp
  4052. echo '# tor stuff first' > /etc/exim4/conf.d/router/100_exim4-smtorp
  4053. echo '#' >> /etc/exim4/conf.d/router/100_exim4-smtorp
  4054. echo '# if were submitting mail *from* a .tor/.onion address,' >> /etc/exim4/conf.d/router/100_exim4-smtorp
  4055. echo '# make sure any header lines that may give us away is' >> /etc/exim4/conf.d/router/100_exim4-smtorp
  4056. echo '# stripped out, and add a new, cryptic Message-ID.' >> /etc/exim4/conf.d/router/100_exim4-smtorp
  4057. echo '# In address_data we store the name we should HELO as.' >> /etc/exim4/conf.d/router/100_exim4-smtorp
  4058. echo 'tor_to_any:' >> /etc/exim4/conf.d/router/100_exim4-smtorp
  4059. echo ' debug_print = "R: manualroute from .onion to $local_part@$domain"' >> /etc/exim4/conf.d/router/100_exim4-smtorp
  4060. echo ' driver = manualroute' >> /etc/exim4/conf.d/router/100_exim4-smtorp
  4061. echo ' domains = ! +local_domains' >> /etc/exim4/conf.d/router/100_exim4-smtorp
  4062. echo ' condition = ${if match {$sender_address_domain}{\N.*\.(onion|tor)$\N}}' >> /etc/exim4/conf.d/router/100_exim4-smtorp
  4063. echo ' address_data = $sender_address_domain' >> /etc/exim4/conf.d/router/100_exim4-smtorp
  4064. echo ' transport = remote_smtp_onion' >> /etc/exim4/conf.d/router/100_exim4-smtorp
  4065. echo ' self = send' >> /etc/exim4/conf.d/router/100_exim4-smtorp
  4066. echo ' route_list = * localhost' >> /etc/exim4/conf.d/router/100_exim4-smtorp
  4067. echo ' headers_remove = Received:Message-ID:X-Mailer:User-Agent' >> /etc/exim4/conf.d/router/100_exim4-smtorp
  4068. echo ' headers_add = Message-ID: <${lc:${sha1:$message_id}}@$sender_address_domain>' >> /etc/exim4/conf.d/router/100_exim4-smtorp
  4069. echo '' >> /etc/exim4/conf.d/router/100_exim4-smtorp
  4070. echo '# this catches the case where were submitting mail' >> /etc/exim4/conf.d/router/100_exim4-smtorp
  4071. echo '# from a regular email address where we dont need to' >> /etc/exim4/conf.d/router/100_exim4-smtorp
  4072. echo '# rewrite any headers' >> /etc/exim4/conf.d/router/100_exim4-smtorp
  4073. echo 'any_to_tor:' >> /etc/exim4/conf.d/router/100_exim4-smtorp
  4074. echo ' debug_print = "R: manualroute for $local_part@$domain"' >> /etc/exim4/conf.d/router/100_exim4-smtorp
  4075. echo ' driver = manualroute' >> /etc/exim4/conf.d/router/100_exim4-smtorp
  4076. echo ' domains = ! +local_domains' >> /etc/exim4/conf.d/router/100_exim4-smtorp
  4077. echo ' transport = remote_smtp_onion' >> /etc/exim4/conf.d/router/100_exim4-smtorp
  4078. echo ' self = send' >> /etc/exim4/conf.d/router/100_exim4-smtorp
  4079. echo ' route_list = *.onion localhost ; *.tor localhost' >> /etc/exim4/conf.d/router/100_exim4-smtorp
  4080. echo ' address_data = $smtp_active_hostname' >> /etc/exim4/conf.d/router/100_exim4-smtorp
  4081. echo 'remote_smtp_onion:' > /etc/exim4/conf.d/transport/100_exim4-smtorp
  4082. echo ' debug_print = "T: remote_smtp_onion for $local_part@$original_domain"' >> /etc/exim4/conf.d/transport/100_exim4-smtorp
  4083. echo ' driver = smtp' >> /etc/exim4/conf.d/transport/100_exim4-smtorp
  4084. echo '' >> /etc/exim4/conf.d/transport/100_exim4-smtorp
  4085. echo ' # set helo_data to where we want to connect to,' >> /etc/exim4/conf.d/transport/100_exim4-smtorp
  4086. echo ' # for the proxy program tor-smtp' >> /etc/exim4/conf.d/transport/100_exim4-smtorp
  4087. echo ' helo_data = "$address_data $original_domain"' >> /etc/exim4/conf.d/transport/100_exim4-smtorp
  4088. echo '' >> /etc/exim4/conf.d/transport/100_exim4-smtorp
  4089. echo ' # wherever we configured our script at' >> /etc/exim4/conf.d/transport/100_exim4-smtorp
  4090. echo ' port = 12668' >> /etc/exim4/conf.d/transport/100_exim4-smtorp
  4091. echo '' >> /etc/exim4/conf.d/transport/100_exim4-smtorp
  4092. echo ' # cannot use TLS otherwise it will EHLO again!!' >> /etc/exim4/conf.d/transport/100_exim4-smtorp
  4093. echo ' hosts_avoid_tls = *' >> /etc/exim4/conf.d/transport/100_exim4-smtorp
  4094. if [ ! -d $INSTALL_DIR ]; then
  4095. mkdir -p $INSTALL_DIR
  4096. fi
  4097. cd $INSTALL_DIR
  4098. git_clone $EXIM_ONION_REPO $INSTALL_DIR/exim4-smtorp
  4099. cd $INSTALL_DIR/exim4-smtorp/tor-smtp
  4100. make
  4101. if [ ! -f $INSTALL_DIR/exim4-smtorp/tor-smtp/tor-smtp ]; then
  4102. echo $'Unable to make tor smtp transport'
  4103. exit 52629
  4104. fi
  4105. if [ ! -d /usr/lib/exim4-smtorp ]; then
  4106. mkdir /usr/lib/exim4-smtorp
  4107. fi
  4108. cp $INSTALL_DIR/exim4-smtorp/tor-smtp/tor-smtp /usr/lib/exim4-smtorp/tor-smtp
  4109. if [ ! -f /usr/lib/exim4-smtorp/tor-smtp ]; then
  4110. echo $'Unable to copy tor-smtp'
  4111. exit 83503
  4112. fi
  4113. cp $INSTALL_DIR/exim4-smtorp/xinetd /etc/xinetd.d/tor-smtp
  4114. if [ ! -f /etc/xinetd.d/tor-smtp ]; then
  4115. echo $'Unable to copy to xinetd.d'
  4116. exit 835954
  4117. fi
  4118. systemctl restart xinetd
  4119. # configure for Maildir format
  4120. sed -i 's/MAIL_DIR/#MAIL_DIR/g' /etc/login.defs
  4121. sed -i 's|#MAIL_FILE.*|MAIL_FILE Maildir/|g' /etc/login.defs
  4122. if ! grep -q "export MAIL" /etc/profile; then
  4123. echo 'export MAIL=~/Maildir' >> /etc/profile
  4124. fi
  4125. sed -i 's|pam_mail.so standard|pam_mail.so dir=~/Maildir standard|g' /etc/pam.d/login
  4126. sed -i 's|pam_mail.so standard noenv|pam_mail.so dir=~/Maildir standard|g' /etc/pam.d/sshd
  4127. sed -i 's|pam_mail.so nopen|pam_mail.so dir=~/Maildir nopen|g' /etc/pam.d/su
  4128. echo 'dc_eximconfig_configtype="internet"' > /etc/exim4/update-exim4.conf.conf
  4129. if [[ $ONION_ONLY == "no" ]]; then
  4130. # both ICANN and onion domains
  4131. echo "dc_other_hostnames='${DEFAULT_DOMAIN_NAME};${EMAIL_ONION_HOSTNAME}'" >> /etc/exim4/update-exim4.conf.conf
  4132. else
  4133. echo "dc_other_hostnames='${EMAIL_ONION_HOSTNAME}'" >> /etc/exim4/update-exim4.conf.conf
  4134. fi
  4135. echo "dc_local_interfaces=''" >> /etc/exim4/update-exim4.conf.conf
  4136. echo "dc_readhost=''" >> /etc/exim4/update-exim4.conf.conf
  4137. echo "dc_relay_domains=''" >> /etc/exim4/update-exim4.conf.conf
  4138. echo "dc_minimaldns='false'" >> /etc/exim4/update-exim4.conf.conf
  4139. RELAY_NETS='192.168.1.0/24'
  4140. if [ $LOCAL_NETWORK_STATIC_IP_ADDRESS ]; then
  4141. RELAY_NETS=$(echo $LOCAL_NETWORK_STATIC_IP_ADDRESS | awk -F '.' '{print $1 "." $2 "." $3 ".0/24"}')
  4142. fi
  4143. echo "dc_relay_nets='$RELAY_NETS'" >> /etc/exim4/update-exim4.conf.conf
  4144. echo "dc_smarthost=''" >> /etc/exim4/update-exim4.conf.conf
  4145. echo "CFILEMODE='644'" >> /etc/exim4/update-exim4.conf.conf
  4146. echo "dc_use_split_config='false'" >> /etc/exim4/update-exim4.conf.conf
  4147. echo "dc_hide_mailname=''" >> /etc/exim4/update-exim4.conf.conf
  4148. echo "dc_mailname_in_oh='true'" >> /etc/exim4/update-exim4.conf.conf
  4149. echo "dc_localdelivery='maildir_home'" >> /etc/exim4/update-exim4.conf.conf
  4150. update-exim4.conf
  4151. sed -i "s/START=no/START=yes/g" /etc/default/saslauthd
  4152. systemctl start saslauthd
  4153. # make a tls certificate for email
  4154. if [ ! -f /etc/ssl/certs/exim.dhparam ]; then
  4155. ${PROJECT_NAME}-addcert -h exim --dhkey $DH_KEYLENGTH
  4156. check_certificates exim
  4157. fi
  4158. cp /etc/ssl/private/exim.key /etc/exim4
  4159. cp /etc/ssl/certs/exim.crt /etc/exim4
  4160. cp /etc/ssl/certs/exim.dhparam /etc/exim4
  4161. chown root:Debian-exim /etc/exim4/exim.key /etc/exim4/exim.crt /etc/exim4/exim.dhparam
  4162. chmod 640 /etc/exim4/exim.key /etc/exim4/exim.crt /etc/exim4/exim.dhparam
  4163. sed -i '/login_saslauthd_server/,/.endif/ s/# *//' /etc/exim4/exim4.conf.template
  4164. sed -i "/.ifdef MAIN_HARDCODE_PRIMARY_HOSTNAME/i\MAIN_HARDCODE_PRIMARY_HOSTNAME = $DEFAULT_DOMAIN_NAME\nMAIN_TLS_ENABLE = true" /etc/exim4/exim4.conf.template
  4165. sed -i "s|SMTPLISTENEROPTIONS=''|SMTPLISTENEROPTIONS='-oX 465:25:587 -oP /var/run/exim4/exim.pid'|g" /etc/default/exim4
  4166. if ! grep -q "tls_on_connect_ports=465" /etc/exim4/exim4.conf.template; then
  4167. sed -i '/SSL configuration for exim/i\tls_on_connect_ports=465' /etc/exim4/exim4.conf.template
  4168. fi
  4169. adduser $MY_USERNAME sasl
  4170. addgroup Debian-exim sasl
  4171. systemctl restart exim4
  4172. if [ ! -d /etc/skel/Maildir ]; then
  4173. mkdir -m 700 /etc/skel/.mutt
  4174. mkdir -m 700 /etc/skel/Maildir
  4175. mkdir -m 700 /etc/skel/Maildir/new
  4176. mkdir -m 700 /etc/skel/Maildir/cur
  4177. mkdir -m 700 /etc/skel/Maildir/Sent
  4178. mkdir -m 700 /etc/skel/Maildir/Sent/tmp
  4179. mkdir -m 700 /etc/skel/Maildir/Sent/cur
  4180. mkdir -m 700 /etc/skel/Maildir/Sent/new
  4181. mkdir -m 700 /etc/skel/Maildir/.learn-spam
  4182. mkdir -m 700 /etc/skel/Maildir/.learn-spam/cur
  4183. mkdir -m 700 /etc/skel/Maildir/.learn-spam/new
  4184. mkdir -m 700 /etc/skel/Maildir/.learn-spam/tmp
  4185. mkdir -m 700 /etc/skel/Maildir/.learn-ham
  4186. mkdir -m 700 /etc/skel/Maildir/.learn-ham/cur
  4187. mkdir -m 700 /etc/skel/Maildir/.learn-ham/new
  4188. mkdir -m 700 /etc/skel/Maildir/.learn-ham/tmp
  4189. ln -s /etc/skel/Maildir/.learn-spam /etc/skel/Maildir/spam
  4190. ln -s /etc/skel/Maildir/.learn-ham /etc/skel/Maildir/ham
  4191. fi
  4192. if [ ! -d /home/$MY_USERNAME/Maildir ]; then
  4193. mkdir -m 700 /home/$MY_USERNAME/.mutt
  4194. mkdir -m 700 /home/$MY_USERNAME/Maildir
  4195. mkdir -m 700 /home/$MY_USERNAME/Maildir/cur
  4196. mkdir -m 700 /home/$MY_USERNAME/Maildir/tmp
  4197. mkdir -m 700 /home/$MY_USERNAME/Maildir/new
  4198. mkdir -m 700 /home/$MY_USERNAME/Maildir/Sent
  4199. mkdir -m 700 /home/$MY_USERNAME/Maildir/Sent/cur
  4200. mkdir -m 700 /home/$MY_USERNAME/Maildir/Sent/tmp
  4201. mkdir -m 700 /home/$MY_USERNAME/Maildir/Sent/new
  4202. mkdir -m 700 /home/$MY_USERNAME/Maildir/.learn-spam
  4203. mkdir -m 700 /home/$MY_USERNAME/Maildir/.learn-spam/cur
  4204. mkdir -m 700 /home/$MY_USERNAME/Maildir/.learn-spam/new
  4205. mkdir -m 700 /home/$MY_USERNAME/Maildir/.learn-spam/tmp
  4206. mkdir -m 700 /home/$MY_USERNAME/Maildir/.learn-ham
  4207. mkdir -m 700 /home/$MY_USERNAME/Maildir/.learn-ham/cur
  4208. mkdir -m 700 /home/$MY_USERNAME/Maildir/.learn-ham/new
  4209. mkdir -m 700 /home/$MY_USERNAME/Maildir/.learn-ham/tmp
  4210. ln -s /home/$MY_USERNAME/Maildir/.learn-spam /home/$MY_USERNAME/Maildir/spam
  4211. ln -s /home/$MY_USERNAME/Maildir/.learn-ham /home/$MY_USERNAME/Maildir/ham
  4212. chown -R $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/Maildir
  4213. fi
  4214. echo 'configure_email' >> $COMPLETION_FILE
  4215. }
  4216. function create_procmail {
  4217. if [[ $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_NONMAILBOX" || $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  4218. return
  4219. fi
  4220. if grep -Fxq "create_procmail" $COMPLETION_FILE; then
  4221. return
  4222. fi
  4223. if [ ! -f /home/$MY_USERNAME/.procmailrc ]; then
  4224. echo 'MAILDIR=$HOME/Maildir' > /home/$MY_USERNAME/.procmailrc
  4225. echo 'DEFAULT=$MAILDIR/' >> /home/$MY_USERNAME/.procmailrc
  4226. echo 'LOGFILE=$HOME/log/procmail.log' >> /home/$MY_USERNAME/.procmailrc
  4227. echo 'LOGABSTRACT=all' >> /home/$MY_USERNAME/.procmailrc
  4228. echo '' >> /home/$MY_USERNAME/.procmailrc
  4229. echo $"# Tripwire reports which have no violations don't need to be logged" >> /home/$MY_USERNAME/.procmailrc
  4230. echo ':0 BD:' >> /home/$MY_USERNAME/.procmailrc
  4231. TRIPWIRE_VIOLATIONS_STR=$'Total violations found: 0'
  4232. echo " * .*$TRIPWIRE_VIOLATIONS_STR" >> /home/$MY_USERNAME/.procmailrc
  4233. echo '/dev/null' >> /home/$MY_USERNAME/.procmailrc
  4234. echo '' >> /home/$MY_USERNAME/.procmailrc
  4235. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.procmailrc
  4236. fi
  4237. mkdir -p /home/$MY_USERNAME/Maildir/admin/new
  4238. mkdir -p /home/$MY_USERNAME/Maildir/admin/cur
  4239. chown -R $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/Maildir/admin
  4240. if [ ! -f /etc/skel/.procmailrc ]; then
  4241. cp /home/$MY_USERNAME/.procmailrc /etc/skel/.procmailrc
  4242. chown root:root /etc/skel/.procmailrc
  4243. fi
  4244. echo 'create_procmail' >> $COMPLETION_FILE
  4245. }
  4246. function handle_admin_emails {
  4247. # keep emails for root in a separate folder
  4248. if [ -d /home/$MY_USERNAME/Maildir/admin ]; then
  4249. return
  4250. fi
  4251. freedombone-addemail -u $MY_USERNAME -e "root@$DEFAULT_DOMAIN_NAME" -g admin --public no
  4252. }
  4253. function spam_filtering {
  4254. if [[ $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_NONMAILBOX" || $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  4255. return
  4256. fi
  4257. if grep -Fxq "spam_filtering" $COMPLETION_FILE; then
  4258. return
  4259. fi
  4260. apt-get -y install exim4-daemon-heavy
  4261. apt-get -y install spamassassin
  4262. if [ ! -f /etc/default/spamassassin ]; then
  4263. echo 'Spamassassin was not installed'
  4264. exit 72570
  4265. fi
  4266. sa-update -v
  4267. sed -i 's/ENABLED=0/ENABLED=1/g' /etc/default/spamassassin
  4268. sed -i 's/# spamd_address = 127.0.0.1 783/spamd_address = 127.0.0.1 783/g' /etc/exim4/exim4.conf.template
  4269. # This configuration is based on https://wiki.debian.org/DebianSpamAssassin
  4270. sed -i 's/local_parts = postmaster/local_parts = postmaster:abuse/g' /etc/exim4/conf.d/acl/30_exim4-config_check_rcpt
  4271. sed -i '/domains = +local_domains : +relay_to_domains/a\ set acl_m0 = rfcnames' /etc/exim4/conf.d/acl/30_exim4-config_check_rcpt
  4272. sed -i 's/accept/accept condition = ${if eq{$acl_m0}{rfcnames} {1}{0}}/g' /etc/exim4/conf.d/acl/40_exim4-config_check_data
  4273. echo 'warn message = X-Spam-Score: $spam_score ($spam_bar)' >> /etc/exim4/conf.d/acl/40_exim4-config_check_data
  4274. echo ' spam = nobody:true' >> /etc/exim4/conf.d/acl/40_exim4-config_check_data
  4275. echo 'warn message = X-Spam-Flag: YES' >> /etc/exim4/conf.d/acl/40_exim4-config_check_data
  4276. echo ' spam = nobody' >> /etc/exim4/conf.d/acl/40_exim4-config_check_data
  4277. echo 'warn message = X-Spam-Report: $spam_report' >> /etc/exim4/conf.d/acl/40_exim4-config_check_data
  4278. echo ' spam = nobody' >> /etc/exim4/conf.d/acl/40_exim4-config_check_data
  4279. echo '# reject spam at high scores (> 12)' >> /etc/exim4/conf.d/acl/40_exim4-config_check_data
  4280. echo 'deny message = This message scored $spam_score spam points.' >> /etc/exim4/conf.d/acl/40_exim4-config_check_data
  4281. echo ' spam = nobody:true' >> /etc/exim4/conf.d/acl/40_exim4-config_check_data
  4282. echo ' condition = ${if >{$spam_score_int}{120}{1}{0}}' >> /etc/exim4/conf.d/acl/40_exim4-config_check_data
  4283. # procmail configuration
  4284. echo '# get spamassassin to check emails' >> /home/$MY_USERNAME/.procmailrc
  4285. echo ':0fw: .spamassassin.lock' >> /home/$MY_USERNAME/.procmailrc
  4286. echo ' * < 256000' >> /home/$MY_USERNAME/.procmailrc
  4287. echo '| spamc' >> /home/$MY_USERNAME/.procmailrc
  4288. echo '# strong spam are discarded' >> /home/$MY_USERNAME/.procmailrc
  4289. echo ':0' >> /home/$MY_USERNAME/.procmailrc
  4290. echo ' * ^X-Spam-Level: \*\*\*\*\*\*' >> /home/$MY_USERNAME/.procmailrc
  4291. echo '/dev/null' >> /home/$MY_USERNAME/.procmailrc
  4292. echo '# weak spam are kept just in case - clear this out every now and then' >> /home/$MY_USERNAME/.procmailrc
  4293. echo ':0' >> /home/$MY_USERNAME/.procmailrc
  4294. echo ' * ^X-Spam-Level: \*\*\*\*\*' >> /home/$MY_USERNAME/.procmailrc
  4295. echo 'maybe-spam/' >> /home/$MY_USERNAME/.procmailrc
  4296. echo '# otherwise, marginal spam goes here for revision' >> /home/$MY_USERNAME/.procmailrc
  4297. echo ':0' >> /home/$MY_USERNAME/.procmailrc
  4298. echo ' * ^X-Spam-Level: \*\*' >> /home/$MY_USERNAME/.procmailrc
  4299. echo 'spam/' >> /home/$MY_USERNAME/.procmailrc
  4300. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.procmailrc
  4301. echo '# get spamassassin to check emails' >> /etc/skel/.procmailrc
  4302. echo ':0fw: .spamassassin.lock' >> /etc/skel/.procmailrc
  4303. echo ' * < 256000' >> /etc/skel/.procmailrc
  4304. echo '| spamc' >> /etc/skel/.procmailrc
  4305. echo '# strong spam are discarded' >> /etc/skel/.procmailrc
  4306. echo ':0' >> /etc/skel/.procmailrc
  4307. echo ' * ^X-Spam-Level: \*\*\*\*\*\*' >> /etc/skel/.procmailrc
  4308. echo '/dev/null' >> /etc/skel/.procmailrc
  4309. echo '# weak spam are kept just in case - clear this out every now and then' >> /etc/skel/.procmailrc
  4310. echo ':0' >> /etc/skel/.procmailrc
  4311. echo ' * ^X-Spam-Level: \*\*\*\*\*' >> /etc/skel/.procmailrc
  4312. echo 'maybe-spam/' >> /etc/skel/.procmailrc
  4313. echo '# otherwise, marginal spam goes here for revision' >> /etc/skel/.procmailrc
  4314. echo ':0' >> /etc/skel/.procmailrc
  4315. echo ' * ^X-Spam-Level: \*\*' >> /etc/skel/.procmailrc
  4316. echo 'spam/' >> /etc/skel/.procmailrc
  4317. # filtering scripts
  4318. echo '#!/bin/bash' > /usr/bin/filterspam
  4319. echo 'for d in /home/*/ ; do' >> /usr/bin/filterspam
  4320. echo ' USERNAME=$(echo "$d" | awk -F '"'"'/'"'"' '"'"'{print $3}'"'"')' >> /usr/bin/filterspam
  4321. echo ' if [[ $USERNAME != "git" && $USERNAME != "mirrors" ]]; then' >> /usr/bin/filterspam
  4322. echo ' MAILDIR=/home/$USERNAME/Maildir/.learn-spam' >> /usr/bin/filterspam
  4323. echo ' if [ ! -d "$MAILDIR" ]; then' >> /usr/bin/filterspam
  4324. echo ' exit' >> /usr/bin/filterspam
  4325. echo ' fi' >> /usr/bin/filterspam
  4326. echo ' for f in `ls $MAILDIR/cur`' >> /usr/bin/filterspam
  4327. echo ' do' >> /usr/bin/filterspam
  4328. echo ' spamc -L spam < "$MAILDIR/cur/$f" > /dev/null' >> /usr/bin/filterspam
  4329. echo ' rm "$MAILDIR/cur/$f"' >> /usr/bin/filterspam
  4330. echo ' done' >> /usr/bin/filterspam
  4331. echo ' for f in `ls $MAILDIR/new`' >> /usr/bin/filterspam
  4332. echo ' do' >> /usr/bin/filterspam
  4333. echo ' spamc -L spam < "$MAILDIR/new/$f" > /dev/null' >> /usr/bin/filterspam
  4334. echo ' rm "$MAILDIR/new/$f"' >> /usr/bin/filterspam
  4335. echo ' done' >> /usr/bin/filterspam
  4336. echo ' fi' >> /usr/bin/filterspam
  4337. echo 'done' >> /usr/bin/filterspam
  4338. echo 'exit 0' >> /usr/bin/filterspam
  4339. echo '#!/bin/bash' > /usr/bin/filterham
  4340. echo 'for d in /home/*/ ; do' >> /usr/bin/filterham
  4341. echo ' USERNAME=$(echo "$d" | awk -F '"'"'/'"'"' '"'"'{print $3}'"'"')' >> /usr/bin/filterham
  4342. echo ' if [[ $USERNAME != "git" && $USERNAME != "mirrors" ]]; then' >> /usr/bin/filterham
  4343. echo ' MAILDIR=/home/$USERNAME/Maildir/.learn-ham' >> /usr/bin/filterham
  4344. echo ' if [ ! -d "$MAILDIR" ]; then' >> /usr/bin/filterham
  4345. echo ' exit' >> /usr/bin/filterham
  4346. echo ' fi' >> /usr/bin/filterham
  4347. echo ' for f in `ls $MAILDIR/cur`' >> /usr/bin/filterham
  4348. echo ' do' >> /usr/bin/filterham
  4349. echo ' spamc -L ham < "$MAILDIR/cur/$f" > /dev/null' >> /usr/bin/filterham
  4350. echo ' rm "$MAILDIR/cur/$f"' >> /usr/bin/filterham
  4351. echo ' done' >> /usr/bin/filterham
  4352. echo ' for f in `ls $MAILDIR/new`' >> /usr/bin/filterham
  4353. echo ' do' >> /usr/bin/filterham
  4354. echo ' spamc -L ham < "$MAILDIR/new/$f" > /dev/null' >> /usr/bin/filterham
  4355. echo ' rm "$MAILDIR/new/$f"' >> /usr/bin/filterham
  4356. echo ' done' >> /usr/bin/filterham
  4357. echo ' fi' >> /usr/bin/filterham
  4358. echo 'done' >> /usr/bin/filterham
  4359. echo 'exit 0' >> /usr/bin/filterham
  4360. if ! grep -q "filterspam" /etc/crontab; then
  4361. echo "*/3 * * * * root /usr/bin/timeout 120 /usr/bin/filterspam" >> /etc/crontab
  4362. fi
  4363. if ! grep -q "filterham" /etc/crontab; then
  4364. echo "*/3 * * * * root /usr/bin/timeout 120 /usr/bin/filterham" >> /etc/crontab
  4365. fi
  4366. chmod 655 /usr/bin/filterspam /usr/bin/filterham
  4367. sed -i 's/# use_bayes 1/use_bayes 1/g' /etc/mail/spamassassin/local.cf
  4368. sed -i 's/# bayes_auto_learn 1/bayes_auto_learn 1/g' /etc/mail/spamassassin/local.cf
  4369. # user preferences
  4370. if [ ! -d /home/$MY_USERNAME/.spamassassin ]; then
  4371. mkdir /home/$MY_USERNAME/.spamassassin
  4372. echo $'# How many points before a mail is considered spam.' > /home/$MY_USERNAME/.spamassassin/user_prefs
  4373. echo '# required_score 5' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  4374. echo '' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  4375. echo $'# Whitelist and blacklist addresses are now file-glob-style patterns, so' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  4376. echo $'# "friend@somewhere.com", "*@isp.com", or "*.domain.net" will all work.' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  4377. echo '# whitelist_from someone@somewhere.com' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  4378. echo '' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  4379. echo $'# Add your own customised scores for some tests below. The default scores are' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  4380. echo $'# read from the installed spamassassin rules files, but you can override them' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  4381. echo $'# here. To see the list of tests and their default scores, go to' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  4382. echo '# http://spamassassin.apache.org/tests.html .' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  4383. echo '#' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  4384. echo '# score SYMBOLIC_TEST_NAME n.nn' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  4385. echo '' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  4386. echo $'# Speakers of Asian languages, like Chinese, Japanese and Korean, will almost' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  4387. echo $'# definitely want to uncomment the following lines. They will switch off some' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  4388. echo $'# rules that detect 8-bit characters, which commonly trigger on mails using CJK' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  4389. echo $'# character sets, or that assume a western-style charset is in use. ' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  4390. echo '# ' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  4391. echo '# score HTML_COMMENT_8BITS 0' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  4392. echo '# score UPPERCASE_25_50 0' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  4393. echo '# score UPPERCASE_50_75 0' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  4394. echo '# score UPPERCASE_75_100 0' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  4395. echo '# score OBSCURED_EMAIL 0' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  4396. echo '' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  4397. echo $'# Speakers of any language that uses non-English, accented characters may wish' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  4398. echo $'# to uncomment the following lines. They turn off rules that fire on' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  4399. echo $'# misformatted messages generated by common mail apps in contravention of the' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  4400. echo $'# email RFCs.' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  4401. echo '' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  4402. echo '# score SUBJ_ILLEGAL_CHARS 0' >> /home/$MY_USERNAME/.spamassassin/user_prefs
  4403. fi
  4404. # this must be accessible by root
  4405. chown -R $MY_USERNAME:root /home/$MY_USERNAME/.spamassassin
  4406. systemctl restart spamassassin
  4407. systemctl restart exim4
  4408. systemctl restart cron
  4409. echo 'spam_filtering' >> $COMPLETION_FILE
  4410. }
  4411. function configure_imap {
  4412. if [[ $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_NONMAILBOX" || $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  4413. return
  4414. fi
  4415. if grep -Fxq "configure_imap" $COMPLETION_FILE; then
  4416. return
  4417. fi
  4418. dpkg -P dovecot-imapd
  4419. dpkg -P dovecot-core
  4420. apt-get -y install dovecot-imapd
  4421. if [ ! -d /etc/dovecot ]; then
  4422. echo $"ERROR: Dovecot does not appear to have installed. $CHECK_MESSAGE"
  4423. exit 48
  4424. fi
  4425. if [ ! -f /etc/ssl/certs/dovecot.dhparam ]; then
  4426. ${PROJECT_NAME}-addcert -h dovecot --dhkey $DH_KEYLENGTH
  4427. check_certificates dovecot
  4428. fi
  4429. chown root:dovecot /etc/ssl/certs/dovecot.*
  4430. chown root:dovecot /etc/ssl/private/dovecot.*
  4431. if [ ! -f /etc/dovecot/conf.d/10-ssl.conf ]; then
  4432. echo $'Unable to find /etc/dovecot/conf.d/10-ssl.conf'
  4433. exit 83629
  4434. fi
  4435. sed -i 's|#ssl =.*|ssl = required|g' /etc/dovecot/conf.d/10-ssl.conf
  4436. sed -i 's|ssl = no|ssl = required|g' /etc/dovecot/conf.d/10-ssl.conf
  4437. sed -i 's|ssl = yes|ssl = required|g' /etc/dovecot/conf.d/10-ssl.conf
  4438. sed -i 's|#ssl_cert =.*|ssl_cert = </etc/ssl/certs/dovecot.crt|g' /etc/dovecot/conf.d/10-ssl.conf
  4439. sed -i 's|ssl_cert =.*|ssl_cert = </etc/ssl/certs/dovecot.crt|g' /etc/dovecot/conf.d/10-ssl.conf
  4440. sed -i 's|#ssl_key =.*|ssl_key = </etc/ssl/private/dovecot.key|g' /etc/dovecot/conf.d/10-ssl.conf
  4441. sed -i 's|ssl_key =.*|ssl_key = </etc/ssl/private/dovecot.key|g' /etc/dovecot/conf.d/10-ssl.conf
  4442. sed -i 's|#ssl_dh_parameters_length.*|ssl_dh_parameters_length = 2048|g' /etc/dovecot/conf.d/10-ssl.conf
  4443. sed -i 's/#ssl_prefer_server_ciphers.*/ssl_prefer_server_ciphers = yes/g' /etc/dovecot/conf.d/10-ssl.conf
  4444. sed -i "s|#ssl_protocols =.*|ssl_protocols = '$SSL_PROTOCOLS'|g" /etc/dovecot/conf.d/10-ssl.conf
  4445. sed -i "s|ssl_protocols =.*|ssl_protocols = '$SSL_PROTOCOLS'|g" /etc/dovecot/conf.d/10-ssl.conf
  4446. echo "ssl_cipher_list = '$SSL_CIPHERS'" >> /etc/dovecot/conf.d/10-ssl.conf
  4447. if [ ! -f /etc/dovecot/conf.d/10-master.conf ]; then
  4448. echo $'Unable to find /etc/dovecot/conf.d/10-master.conf'
  4449. exit 49259
  4450. fi
  4451. sed -i 's/#process_limit =.*/process_limit = 100/g' /etc/dovecot/conf.d/10-master.conf
  4452. sed -i 's/#default_client_limit.*/default_client_limit = 100/g' /etc/dovecot/conf.d/10-master.conf
  4453. sed -i 's|#default_process_limit =.*|default_process_limit = 100|g' /etc/dovecot/conf.d/10-master.conf
  4454. if [ ! -f /etc/dovecot/conf.d/10-logging.conf ]; then
  4455. echo $'Unable to find /etc/dovecot/conf.d/10-logging.conf'
  4456. exit 48936
  4457. fi
  4458. sed -i 's/#auth_verbose.*/auth_verbose = yes/g' /etc/dovecot/conf.d/10-logging.conf
  4459. if [ ! -f /etc/dovecot/dovecot.conf ]; then
  4460. echo $'Unable to find /etc/dovecot/dovecot.conf'
  4461. exit 43890
  4462. fi
  4463. sed -i 's/#listen =.*/listen = */g' /etc/dovecot/dovecot.conf
  4464. if [ ! -f /etc/dovecot/conf.d/10-auth.conf ]; then
  4465. echo $'Unable to find /etc/dovecot/conf.d/10-auth.conf'
  4466. exit 843256
  4467. fi
  4468. sed -i 's/#disable_plaintext_auth =.*/disable_plaintext_auth = no/g' /etc/dovecot/conf.d/10-auth.conf
  4469. sed -i 's/auth_mechanisms =.*/auth_mechanisms = plain login/g' /etc/dovecot/conf.d/10-auth.conf
  4470. if [ ! -f /etc/dovecot/conf.d/10-mail.conf ]; then
  4471. echo $'Unable to find /etc/dovecot/conf.d/10-mail.conf'
  4472. exit 42036
  4473. fi
  4474. sed -i 's|mail_location =.*|mail_location = maildir:~/Maildir:LAYOUT=fs|g' /etc/dovecot/conf.d/10-mail.conf
  4475. # This long notify interval makes the system more suited for use with
  4476. # battery powered mobile devices
  4477. sed -i 's|#imap_idle_notify_interval =.*|imap_idle_notify_interval = 29|g' /etc/dovecot/conf.d/20-imap.conf
  4478. if [ -f /var/lib/dovecot/ssl-parameters.dat ]; then
  4479. rm /var/lib/dovecot/ssl-parameters.dat
  4480. fi
  4481. systemctl restart dovecot
  4482. echo 'configure_imap' >> $COMPLETION_FILE
  4483. }
  4484. function configure_imap_client_certs {
  4485. if [[ $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_NONMAILBOX" || $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  4486. return
  4487. fi
  4488. if grep -Fxq "configure_imap_client_certs" $COMPLETION_FILE; then
  4489. return
  4490. fi
  4491. # http://strange.systems/certificate-based-auth-with-dovecot-sendmail/
  4492. sed -i 's|#default_process_limit =.*|default_process_limit = 100|g' /etc/dovecot/conf.d/10-master.conf
  4493. sed -i 's/disable_plaintext_auth =.*/disable_plaintext_auth = yes/g' /etc/dovecot/conf.d/10-auth.conf
  4494. sed -i 's|#auth_ssl_require_client_cert =.*|auth_ssl_require_client_cert = yes|g' /etc/dovecot/conf.d/10-auth.conf
  4495. sed -i 's|#auth_ssl_username_from_cert =.*|auth_ssl_username_from_cert = yes|g' /etc/dovecot/conf.d/10-auth.conf
  4496. sed -i "s|#ssl_ca =.*|ssl_ca = /etc/ssl/certs/ca-$DEFAULT_DOMAIN_NAME.crt|g" /etc/dovecot/conf.d/10-ssl.conf
  4497. sed -i 's|#ssl_cert_username_field =.*|ssl_cert_username_field = commonName|g' /etc/dovecot/conf.d/10-ssl.conf
  4498. sed -i 's|#ssl_verify_client_cert =.*|ssl_verify_client_cert = yes|g' /etc/dovecot/conf.d/10-ssl.conf
  4499. if ! grep -q "passdb {" /etc/dovecot/conf.d/10-auth.conf; then
  4500. echo '' >> /etc/dovecot/conf.d/10-auth.conf
  4501. echo 'passdb {' >> /etc/dovecot/conf.d/10-auth.conf
  4502. echo ' driver = passwd-file' >> /etc/dovecot/conf.d/10-auth.conf
  4503. echo ' args = /etc/dovecot/passwd-file' >> /etc/dovecot/conf.d/10-auth.conf
  4504. echo ' deny = no' >> /etc/dovecot/conf.d/10-auth.conf
  4505. echo ' master = no' >> /etc/dovecot/conf.d/10-auth.conf
  4506. echo ' pass = no' >> /etc/dovecot/conf.d/10-auth.conf
  4507. echo '}' >> /etc/dovecot/conf.d/10-auth.conf
  4508. fi
  4509. if [[ $ONION_ONLY == "no" ]]; then
  4510. # make a CA cert
  4511. if [ ! -f /etc/ssl/private/ca-$DEFAULT_DOMAIN_NAME.key ]; then
  4512. if [[ $LETSENCRYPT_ENABLED != "yes" ]]; then
  4513. ${PROJECT_NAME}-addcert -h $DEFAULT_DOMAIN_NAME --ca "" --dhkey $DH_KEYLENGTH
  4514. else
  4515. ${PROJECT_NAME}-addcert -e $DEFAULT_DOMAIN_NAME -s $LETSENCRYPT_SERVER --ca "" --dhkey $DH_KEYLENGTH --email $MY_EMAIL_ADDRESS
  4516. fi
  4517. fi
  4518. fi
  4519. # CA configuration
  4520. echo '[ ca ]' > /etc/ssl/dovecot-ca.cnf
  4521. echo "default_ca = dovecot-ca" >> /etc/ssl/dovecot-ca.cnf
  4522. echo '' >> /etc/ssl/dovecot-ca.cnf
  4523. echo '[ crl_ext ]' >> /etc/ssl/dovecot-ca.cnf
  4524. echo 'authorityKeyIdentifier=keyid:always' >> /etc/ssl/dovecot-ca.cnf
  4525. echo '' >> /etc/ssl/dovecot-ca.cnf
  4526. echo '[ dovecot-ca ]' >> /etc/ssl/dovecot-ca.cnf
  4527. echo 'new_certs_dir = .' >> /etc/ssl/dovecot-ca.cnf
  4528. echo 'unique_subject = no' >> /etc/ssl/dovecot-ca.cnf
  4529. echo "certificate = /etc/ssl/certs/ca-$DEFAULT_DOMAIN_NAME.crt" >> /etc/ssl/dovecot-ca.cnf
  4530. echo 'database = ssldb' >> /etc/ssl/dovecot-ca.cnf
  4531. echo "private_key = /etc/ssl/private/ca-$DEFAULT_DOMAIN_NAME.key" >> /etc/ssl/dovecot-ca.cnf
  4532. echo 'serial = sslserial' >> /etc/ssl/dovecot-ca.cnf
  4533. echo 'default_days = 3650' >> /etc/ssl/dovecot-ca.cnf
  4534. echo 'default_md = sha256' >> /etc/ssl/dovecot-ca.cnf
  4535. echo 'default_bits = 4096' >> /etc/ssl/dovecot-ca.cnf
  4536. echo 'policy = dovecot-ca_policy' >> /etc/ssl/dovecot-ca.cnf
  4537. echo 'x509_extensions = dovecot-ca_extensions' >> /etc/ssl/dovecot-ca.cnf
  4538. echo '' >> /etc/ssl/dovecot-ca.cnf
  4539. echo '[ dovecot-ca_policy ]' >> /etc/ssl/dovecot-ca.cnf
  4540. echo 'commonName = supplied' >> /etc/ssl/dovecot-ca.cnf
  4541. echo 'stateOrProvinceName = supplied' >> /etc/ssl/dovecot-ca.cnf
  4542. echo 'countryName = supplied' >> /etc/ssl/dovecot-ca.cnf
  4543. echo 'emailAddress = optional' >> /etc/ssl/dovecot-ca.cnf
  4544. echo 'organizationName = supplied' >> /etc/ssl/dovecot-ca.cnf
  4545. echo 'organizationalUnitName = optional' >> /etc/ssl/dovecot-ca.cnf
  4546. echo '' >> /etc/ssl/dovecot-ca.cnf
  4547. echo '[ dovecot-ca_extensions ]' >> /etc/ssl/dovecot-ca.cnf
  4548. echo 'basicConstraints = CA:false' >> /etc/ssl/dovecot-ca.cnf
  4549. echo 'subjectKeyIdentifier = hash' >> /etc/ssl/dovecot-ca.cnf
  4550. echo 'authorityKeyIdentifier = keyid:always' >> /etc/ssl/dovecot-ca.cnf
  4551. echo 'keyUsage = digitalSignature,keyEncipherment' >> /etc/ssl/dovecot-ca.cnf
  4552. echo 'extendedKeyUsage = clientAuth' >> /etc/ssl/dovecot-ca.cnf
  4553. if [ -f /etc/ssl/ssldb ]; then
  4554. rm /etc/ssl/ssldb
  4555. fi
  4556. if [ -f /etc/ssl/sslserial ]; then
  4557. rm /etc/ssl/sslserial
  4558. fi
  4559. touch /etc/ssl/ssldb
  4560. echo 0001 > /etc/ssl/sslserial
  4561. #${PROJECT_NAME}-clientcert -u $MY_USERNAME
  4562. systemctl restart dovecot
  4563. echo 'configure_imap_client_certs' >> $COMPLETION_FILE
  4564. }
  4565. function create_gpg_subkey {
  4566. if [[ $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_NONMAILBOX" || $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  4567. return
  4568. fi
  4569. if grep -Fxq "create_gpg_subkey" $COMPLETION_FILE; then
  4570. return
  4571. fi
  4572. apt-get -y install gnupg
  4573. GPG_KEY_USAGE=$1
  4574. if [[ $GPG_KEY_USAGE != "sign" && $GPG_KEY_USAGE != "auth" && $GPG_KEY_USAGE != "encrypt" ]]; then
  4575. echo $"Unknown subkey usage: $GPG_KEY_USAGE"
  4576. echo $'Available types: sign|auth|encrypt'
  4577. exit 14783
  4578. fi
  4579. KEYGRIP=$(gpg --fingerprint --fingerprint $MY_EMAIL_ADDRESS | grep fingerprint | tail -1 | cut -d= -f2 | sed -e 's/ //g')
  4580. # Generate a GPG subkey
  4581. # Here a 2048bit length is used to be compatible with yubikey
  4582. echo 'Key-Type: 1' > /home/$MY_USERNAME/gpg-genkey.conf
  4583. echo "Key-Grip: $KEYGRIP" > /home/$MY_USERNAME/gpg-genkey.conf
  4584. echo 'Subkey-Type: 1' >> /home/$MY_USERNAME/gpg-genkey.conf
  4585. echo 'Subkey-Length: 2048' >> /home/$MY_USERNAME/gpg-genkey.conf
  4586. echo "subkey-Usage: $GPG_KEY_USAGE" > /home/$MY_USERNAME/gpg-genkey.conf
  4587. echo "Name-Real: $MY_NAME" >> /home/$MY_USERNAME/gpg-genkey.conf
  4588. echo "Name-Email: $MY_EMAIL_ADDRESS" >> /home/$MY_USERNAME/gpg-genkey.conf
  4589. echo "Name-Comment: $GPG_KEY_USAGE" >> /home/$MY_USERNAME/gpg-genkey.conf
  4590. echo 'Expire-Date: 0' >> /home/$MY_USERNAME/gpg-genkey.conf
  4591. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/gpg-genkey.conf
  4592. su -c "gpg --batch --gen-key /home/$MY_USERNAME/gpg-genkey.conf" - $MY_USERNAME
  4593. shred -zu /home/$MY_USERNAME/gpg-genkey.conf
  4594. MY_GPG_SUBKEY_ID=$(su -c "gpg --list-keys $MY_EMAIL_ADDRESS | grep 'pub '" - $MY_USERNAME | awk -F ' ' '{print $2}' | awk -F '/' '{print $2}')
  4595. echo 'create_gpg_subkey' >> $COMPLETION_FILE
  4596. }
  4597. function gpg_key_exists {
  4598. key_owner_username=$1
  4599. key_search_text=$2
  4600. if [[ $key_owner_username != "root" ]]; then
  4601. KEY_EXISTS=$(su -c "gpg --list-keys \"${key_search_text}\"" - $key_owner_username)
  4602. else
  4603. KEY_EXISTS=$(gpg --list-keys "${key_search_text}")
  4604. fi
  4605. if [ ! "$KEY_EXISTS" ]; then
  4606. echo "no"
  4607. return
  4608. fi
  4609. if [ "$KEY_EXISTS" == *"error"* ]; then
  4610. echo "no"
  4611. return
  4612. fi
  4613. echo "yes"
  4614. }
  4615. function gpg_pubkey_from_email {
  4616. key_owner_username=$1
  4617. key_email_address=$2
  4618. key_id=
  4619. if [[ $key_owner_username != "root" ]]; then
  4620. key_id=$(su -c "gpg --list-keys $key_email_address | grep 'pub '" - $key_owner_username | awk -F ' ' '{print $2}' | awk -F '/' '{print $2}')
  4621. else
  4622. key_id=$(gpg --list-keys $key_email_address | grep 'pub ' | awk -F ' ' '{print $2}' | awk -F '/' '{print $2}')
  4623. fi
  4624. echo $key_id
  4625. }
  4626. function configure_gpg {
  4627. if [[ $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_NONMAILBOX" || $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  4628. return
  4629. fi
  4630. if grep -Fxq "configure_gpg" $COMPLETION_FILE; then
  4631. return
  4632. fi
  4633. apt-get -y install gnupg
  4634. gpg_dir=/home/$MY_USERNAME/.gnupg
  4635. # if gpg keys directory was previously imported from usb
  4636. if [[ $GPG_KEYS_IMPORTED == "yes" && -d $gpg_dir ]]; then
  4637. echo $'GPG keys were imported'
  4638. sed -i "s|keyserver hkp://keys.gnupg.net|keyserver $GPG_KEYSERVER|g" $gpg_dir/gpg.conf
  4639. MY_GPG_PUBLIC_KEY_ID=$(gpg_pubkey_from_email "$MY_USERNAME" "$MY_EMAIL_ADDRESS")
  4640. if [ ${#MY_GPG_PUBLIC_KEY_ID} -lt 4 ]; then
  4641. echo $'GPG public key ID could not be obtained'
  4642. fi
  4643. chown -R $MY_USERNAME:$MY_USERNAME $gpg_dir
  4644. chmod 700 $gpg_dir
  4645. chmod 600 $gpg_dir/*
  4646. echo 'configure_gpg' >> $COMPLETION_FILE
  4647. return
  4648. fi
  4649. if [ ! -d $gpg_dir ]; then
  4650. mkdir $gpg_dir
  4651. echo "keyserver $GPG_KEYSERVER" >> $gpg_dir/gpg.conf
  4652. echo 'keyserver-options auto-key-retrieve' >> $gpg_dir/gpg.conf
  4653. fi
  4654. sed -i "s|keyserver hkp://keys.gnupg.net|keyserver $GPG_KEYSERVER|g" $gpg_dir/gpg.conf
  4655. if ! grep -q "# default preferences" $gpg_dir/gpg.conf; then
  4656. echo '' >> $gpg_dir/gpg.conf
  4657. echo '# default preferences' >> $gpg_dir/gpg.conf
  4658. echo 'personal-digest-preferences SHA256' >> $gpg_dir/gpg.conf
  4659. echo 'cert-digest-algo SHA256' >> $gpg_dir/gpg.conf
  4660. echo 'default-preference-list SHA512 SHA384 SHA256 SHA224 AES256 AES192 AES CAST5 ZLIB BZIP2 ZIP Uncompressed' >> $gpg_dir/gpg.conf
  4661. fi
  4662. chown -R $MY_USERNAME:$MY_USERNAME $gpg_dir
  4663. chmod 700 $gpg_dir
  4664. chmod 600 $gpg_dir/*
  4665. if [[ $MY_GPG_PUBLIC_KEY && $MY_GPG_PRIVATE_KEY ]]; then
  4666. echo $'Importing GPG keys from file'
  4667. echo $"Public key: $MY_GPG_PUBLIC_KEY"
  4668. echo $"Private key: $MY_GPG_PRIVATE_KEY"
  4669. # use your existing GPG keys which were exported
  4670. if [ ! -f $MY_GPG_PUBLIC_KEY ]; then
  4671. echo $"GPG public key file $MY_GPG_PUBLIC_KEY was not found"
  4672. exit 2483
  4673. fi
  4674. if [ ! -f $MY_GPG_PRIVATE_KEY ]; then
  4675. echo $"GPG private key file $MY_GPG_PRIVATE_KEY was not found"
  4676. exit 5383
  4677. fi
  4678. su -c "gpg --import $MY_GPG_PUBLIC_KEY" - $MY_USERNAME
  4679. su -c "gpg --allow-secret-key-import --import $MY_GPG_PRIVATE_KEY" - $MY_USERNAME
  4680. KEY_EXISTS=$(gpg_key_exists "$MY_USERNAME" "$MY_EMAIL_ADDRESS")
  4681. if [[ $KEY_EXISTS == "no" ]]; then
  4682. echo $"The GPG key for $MY_EMAIL_ADDRESS could not be imported"
  4683. exit 13821
  4684. fi
  4685. # for security ensure that the private key file doesn't linger around
  4686. shred -zu $MY_GPG_PRIVATE_KEY
  4687. MY_GPG_PUBLIC_KEY_ID=$(gpg_pubkey_from_email "$MY_USERNAME" "$MY_EMAIL_ADDRESS")
  4688. if [ ${#MY_GPG_PUBLIC_KEY_ID} -lt 4 ]; then
  4689. echo $'GPG public key ID could not be obtained'
  4690. fi
  4691. else
  4692. # Generate a GPG key
  4693. echo 'Key-Type: 1' > /home/$MY_USERNAME/gpg-genkey.conf
  4694. echo 'Key-Length: 4096' >> /home/$MY_USERNAME/gpg-genkey.conf
  4695. echo 'Subkey-Type: 1' >> /home/$MY_USERNAME/gpg-genkey.conf
  4696. echo 'Subkey-Length: 4096' >> /home/$MY_USERNAME/gpg-genkey.conf
  4697. echo "Name-Real: $MY_NAME" >> /home/$MY_USERNAME/gpg-genkey.conf
  4698. echo "Name-Email: $MY_EMAIL_ADDRESS" >> /home/$MY_USERNAME/gpg-genkey.conf
  4699. echo 'Expire-Date: 0' >> /home/$MY_USERNAME/gpg-genkey.conf
  4700. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/gpg-genkey.conf
  4701. echo $'Generating a new GPG key'
  4702. su -c "gpg --batch --gen-key /home/$MY_USERNAME/gpg-genkey.conf" - $MY_USERNAME
  4703. KEY_EXISTS=$(gpg_key_exists "$MY_USERNAME" "$MY_EMAIL_ADDRESS")
  4704. if [[ $KEY_EXISTS == "no" ]]; then
  4705. echo $"A GPG key for $MY_EMAIL_ADDRESS could not be created"
  4706. exit 6362
  4707. fi
  4708. shred -zu /home/$MY_USERNAME/gpg-genkey.conf
  4709. MY_GPG_PUBLIC_KEY_ID=$(gpg_pubkey_from_email "$MY_USERNAME" "$MY_EMAIL_ADDRESS")
  4710. if [ ${#MY_GPG_PUBLIC_KEY_ID} -lt 4 ]; then
  4711. echo $'GPG public key ID could not be obtained'
  4712. fi
  4713. MY_GPG_PUBLIC_KEY=/tmp/public_key.gpg
  4714. su -c "gpg --output $MY_GPG_PUBLIC_KEY --armor --export $MY_GPG_PUBLIC_KEY_ID" - $MY_USERNAME
  4715. if grep -q "configure_email" $COMPLETION_FILE; then
  4716. if ! grep -q $"Change your GPG password" /home/$MY_USERNAME/README; then
  4717. echo '' >> /home/$MY_USERNAME/README
  4718. echo '' >> /home/$MY_USERNAME/README
  4719. echo $'Change your GPG password' >> /home/$MY_USERNAME/README
  4720. echo '========================' >> /home/$MY_USERNAME/README
  4721. echo $"It's very important to add a password to your GPG key so that" >> /home/$MY_USERNAME/README
  4722. echo $"if anyone does get access to your email they still won't be able" >> /home/$MY_USERNAME/README
  4723. echo $'to read them without knowning the GPG password.' >> /home/$MY_USERNAME/README
  4724. echo $'You can change the it with:' >> /home/$MY_USERNAME/README
  4725. echo '' >> /home/$MY_USERNAME/README
  4726. echo " gpg --edit-key $MY_GPG_PUBLIC_KEY_ID" >> /home/$MY_USERNAME/README
  4727. echo ' passwd' >> /home/$MY_USERNAME/README
  4728. echo ' save' >> /home/$MY_USERNAME/README
  4729. echo ' quit' >> /home/$MY_USERNAME/README
  4730. fi
  4731. if ! grep -q $"Publish your GPG public key" /home/$MY_USERNAME/README; then
  4732. echo '' >> /home/$MY_USERNAME/README
  4733. echo '' >> /home/$MY_USERNAME/README
  4734. echo $'Publish your GPG public key' >> /home/$MY_USERNAME/README
  4735. echo '===========================' >> /home/$MY_USERNAME/README
  4736. echo $'So that others can send emails to you securely you should' >> /home/$MY_USERNAME/README
  4737. echo $'publish your GPG public key with the command:' >> /home/$MY_USERNAME/README
  4738. echo '' >> /home/$MY_USERNAME/README
  4739. echo " gpg --send-keys $MY_GPG_PUBLIC_KEY_ID" >> /home/$MY_USERNAME/README
  4740. fi
  4741. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
  4742. chmod 600 /home/$MY_USERNAME/README
  4743. fi
  4744. fi
  4745. echo 'configure_gpg' >> $COMPLETION_FILE
  4746. }
  4747. function configure_backup_key {
  4748. if grep -Fxq "configure_backup_key" $COMPLETION_FILE; then
  4749. return
  4750. fi
  4751. apt-get -y install gnupg
  4752. BACKUP_KEY_EXISTS=$(gpg_key_exists "root" "$MY_NAME (backup key)")
  4753. if [[ $BACKUP_KEY_EXISTS == "yes" ]]; then
  4754. return
  4755. fi
  4756. # Generate a GPG key for backups
  4757. BACKUP_KEY_EXISTS=$(gpg_key_exists "$MY_USERNAME" "$MY_NAME (backup key)")
  4758. if [[ $BACKUP_KEY_EXISTS == "no" ]]; then
  4759. echo 'Key-Type: 1' > /home/$MY_USERNAME/gpg-genkey.conf
  4760. echo 'Key-Length: 4096' >> /home/$MY_USERNAME/gpg-genkey.conf
  4761. echo 'Subkey-Type: 1' >> /home/$MY_USERNAME/gpg-genkey.conf
  4762. echo 'Subkey-Length: 4096' >> /home/$MY_USERNAME/gpg-genkey.conf
  4763. echo "Name-Real: $MY_NAME" >> /home/$MY_USERNAME/gpg-genkey.conf
  4764. echo "Name-Email: $MY_EMAIL_ADDRESS" >> /home/$MY_USERNAME/gpg-genkey.conf
  4765. echo "Name-Comment: backup key" >> /home/$MY_USERNAME/gpg-genkey.conf
  4766. echo 'Expire-Date: 0' >> /home/$MY_USERNAME/gpg-genkey.conf
  4767. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/gpg-genkey.conf
  4768. echo $'Backup key does not exist. Creating it.'
  4769. su -c "gpg --batch --gen-key /home/$MY_USERNAME/gpg-genkey.conf" - $MY_USERNAME
  4770. shred -zu /home/$MY_USERNAME/gpg-genkey.conf
  4771. echo $'Checking that the Backup key was created'
  4772. BACKUP_KEY_EXISTS=$(gpg_key_exists "$MY_USERNAME" "$MY_NAME (backup key)")
  4773. if [[ $BACKUP_KEY_EXISTS == "no" ]]; then
  4774. echo $'Backup key could not be created'
  4775. exit 43382
  4776. fi
  4777. fi
  4778. 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}')
  4779. echo "Backup key: $MY_BACKUP_KEY_ID"
  4780. MY_BACKUP_KEY=/home/$MY_USERNAME/backup_key
  4781. su -c "gpg --output ${MY_BACKUP_KEY}_public.asc --armor --export $MY_BACKUP_KEY_ID" - $MY_USERNAME
  4782. su -c "gpg --output ${MY_BACKUP_KEY}_private.asc --armor --export-secret-key $MY_BACKUP_KEY_ID" - $MY_USERNAME
  4783. if [ ! -f ${MY_BACKUP_KEY}_public.asc ]; then
  4784. echo 'Public backup key could not be exported'
  4785. exit 36829
  4786. fi
  4787. if [ ! -f ${MY_BACKUP_KEY}_private.asc ]; then
  4788. echo 'Private backup key could not be exported'
  4789. exit 29235
  4790. fi
  4791. # import backup key to root user
  4792. gpg --import --import ${MY_BACKUP_KEY}_public.asc
  4793. gpg --allow-secret-key-import --import ${MY_BACKUP_KEY}_private.asc
  4794. shred -zu ${MY_BACKUP_KEY}_public.asc
  4795. shred -zu ${MY_BACKUP_KEY}_private.asc
  4796. echo 'configure_backup_key' >> $COMPLETION_FILE
  4797. }
  4798. function encrypt_incoming_email {
  4799. # encrypts incoming mail using your GPG public key
  4800. # so even if an attacker gains access to the data at rest they still need
  4801. # to know your GPG key password to be able to read anything
  4802. if [[ $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_NONMAILBOX" || $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  4803. return
  4804. fi
  4805. # update to the next commit
  4806. set_repo_commit $INSTALL_DIR/gpgit "gpgit commit" "$GPGIT_COMMIT" $GPGIT_REPO
  4807. if grep -Fxq "encrypt_incoming_email" $COMPLETION_FILE; then
  4808. return
  4809. fi
  4810. if [[ $GPG_ENCRYPT_STORED_EMAIL != "yes" ]]; then
  4811. return
  4812. fi
  4813. if [ ! -f /usr/bin/gpgit.pl ]; then
  4814. apt-get -y install git libmail-gnupg-perl
  4815. cd $INSTALL_DIR
  4816. git_clone $GPGIT_REPO $INSTALL_DIR/gpgit
  4817. cd $INSTALL_DIR/gpgit
  4818. git checkout $GPGIT_COMMIT -b $GPGIT_COMMIT
  4819. if ! grep -q "gpgit commit" $COMPLETION_FILE; then
  4820. echo "gpgit commit:$GPGIT_COMMIT" >> $COMPLETION_FILE
  4821. else
  4822. sed -i "s/gpgit commit.*/gpgit commit:$GPGIT_COMMIT/g" $COMPLETION_FILE
  4823. fi
  4824. cp gpgit.pl /usr/bin
  4825. fi
  4826. # add a procmail rule
  4827. if ! grep -q "/usr/bin/gpgit.pl" /home/$MY_USERNAME/.procmailrc; then
  4828. echo '' >> /home/$MY_USERNAME/.procmailrc
  4829. echo ':0 f' >> /home/$MY_USERNAME/.procmailrc
  4830. echo "| /usr/bin/gpgit.pl --encrypt-mode prefer-inline --inline-flatten $MY_EMAIL_ADDRESS" >> /home/$MY_USERNAME/.procmailrc
  4831. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.procmailrc
  4832. echo '' >> /etc/skel/.procmailrc
  4833. echo ':0 f' >> /etc/skel/.procmailrc
  4834. echo -n '| /usr/bin/gpgit.pl --encrypt-mode prefer-inline --inline-flatten $USER@' >> /etc/skel/.procmailrc
  4835. echo "$DEFAULT_DOMAIN_NAME" >> /etc/skel/.procmailrc
  4836. fi
  4837. echo 'encrypt_incoming_email' >> $COMPLETION_FILE
  4838. }
  4839. function encrypt_outgoing_email {
  4840. # encrypts outgoing mail using your GPG public key
  4841. # so even if an attacker gains access to the data at rest they still need
  4842. # to know your GPG key password to be able to read sent mail
  4843. if [[ $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_NONMAILBOX" || $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  4844. return
  4845. fi
  4846. if grep -Fxq "encrypt_outgoing_email" $COMPLETION_FILE; then
  4847. return
  4848. fi
  4849. if [[ $GPG_ENCRYPT_STORED_EMAIL != "yes" ]]; then
  4850. return
  4851. fi
  4852. if [ ! -d /home/$MY_USERNAME/.gnupg ]; then
  4853. return
  4854. fi
  4855. if [ ! -f /home/$MY_USERNAME/.muttrc ]; then
  4856. return
  4857. fi
  4858. # obtain your public key ID
  4859. if [ ! $MY_GPG_PUBLIC_KEY_ID ]; then
  4860. MY_GPG_PUBLIC_KEY_ID=$(gpg_pubkey_from_email "$MY_USERNAME" "$MY_EMAIL_ADDRESS")
  4861. if [ ! "$MY_GPG_PUBLIC_KEY_ID" ]; then
  4862. return
  4863. fi
  4864. if [ ${#MY_GPG_PUBLIC_KEY_ID} -lt 4 ]; then
  4865. return
  4866. fi
  4867. fi
  4868. if ! grep -q "pgp_encrypt_only_command" /home/$MY_USERNAME/.muttrc; then
  4869. echo '' >> /home/$MY_USERNAME/.muttrc
  4870. echo $'# Encrypt items in the Sent folder' >> /home/$MY_USERNAME/.muttrc
  4871. 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
  4872. else
  4873. 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
  4874. fi
  4875. if ! grep -q "pgp_encrypt_sign_command" /home/$MY_USERNAME/.muttrc; then
  4876. 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
  4877. else
  4878. 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
  4879. fi
  4880. echo 'encrypt_outgoing_email' >> $COMPLETION_FILE
  4881. }
  4882. function encrypt_all_email {
  4883. if [[ $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_NONMAILBOX" || $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  4884. return
  4885. fi
  4886. if [[ $GPG_ENCRYPT_STORED_EMAIL != "yes" ]]; then
  4887. return
  4888. fi
  4889. if [ -f /usr/local/bin/${PROJECT_NAME}-encrypt-mail ]; then
  4890. cp /usr/local/bin/${PROJECT_NAME}-encrypt-mail /usr/bin/encmaildir
  4891. else
  4892. cp /usr/bin/${PROJECT_NAME}-encrypt-mail /usr/bin/encmaildir
  4893. fi
  4894. chmod +x /usr/bin/encmaildir
  4895. if grep -Fxq "encrypt_all_email" $COMPLETION_FILE; then
  4896. return
  4897. fi
  4898. if [ ! /home/$MY_USERNAME/README ]; then
  4899. touch /home/$MY_USERNAME/README
  4900. fi
  4901. if ! grep -q $"If you have imported legacy email which is not encrypted" /home/$MY_USERNAME/README; then
  4902. echo '' >> /home/$MY_USERNAME/README
  4903. echo '' >> /home/$MY_USERNAME/README
  4904. echo $'Encrypting legacy email' >> /home/$MY_USERNAME/README
  4905. echo '=======================' >> /home/$MY_USERNAME/README
  4906. echo $'If you have imported legacy email which is not encrypted' >> /home/$MY_USERNAME/README
  4907. echo $'then it can be encrypted with the command:' >> /home/$MY_USERNAME/README
  4908. echo '' >> /home/$MY_USERNAME/README
  4909. echo ' encmaildir' >> /home/$MY_USERNAME/README
  4910. echo '' >> /home/$MY_USERNAME/README
  4911. echo $'But be warned that depending upon how much email you have' >> /home/$MY_USERNAME/README
  4912. echo $'this could take a seriously LONG time on the Beaglebone' >> /home/$MY_USERNAME/README
  4913. echo $'and may be better done on a faster machine.' >> /home/$MY_USERNAME/README
  4914. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
  4915. chmod 600 /home/$MY_USERNAME/README
  4916. fi
  4917. echo 'encrypt_all_email' >> $COMPLETION_FILE
  4918. }
  4919. function email_client {
  4920. if [[ $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_NONMAILBOX" || $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  4921. return
  4922. fi
  4923. if grep -Fxq "email_client" $COMPLETION_FILE; then
  4924. return
  4925. fi
  4926. apt-get -y install mutt-patched lynx abook
  4927. if [ ! -f /etc/Muttrc ]; then
  4928. echo $"ERROR: Mutt does not appear to have installed. $CHECK_MESSAGE"
  4929. exit 49
  4930. fi
  4931. if [ ! -d /home/$MY_USERNAME/.mutt ]; then
  4932. mkdir /home/$MY_USERNAME/.mutt
  4933. fi
  4934. echo "text/html; lynx -dump -width=78 -nolist %s | sed ‘s/^ //’; copiousoutput; needsterminal; nametemplate=%s.html" > /home/$MY_USERNAME/.mutt/mailcap
  4935. cp /home/$MY_USERNAME/.mutt/mailcap /etc/skel/.mutt
  4936. chown -R $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.mutt
  4937. chown -R root:root /etc/skel/.mutt
  4938. echo 'set mbox_type=Maildir' >> /etc/Muttrc
  4939. echo 'set folder="~/Maildir"' >> /etc/Muttrc
  4940. echo 'set mask="!^\\.[^.]"' >> /etc/Muttrc
  4941. echo 'set mbox="~/Maildir"' >> /etc/Muttrc
  4942. echo 'set record="+Sent"' >> /etc/Muttrc
  4943. echo 'set postponed="+Drafts"' >> /etc/Muttrc
  4944. echo 'set trash="+Trash"' >> /etc/Muttrc
  4945. echo 'set spoolfile="~/Maildir"' >> /etc/Muttrc
  4946. echo 'auto_view text/x-vcard text/html text/enriched' >> /etc/Muttrc
  4947. echo 'set editor="emacs -q --load ~/.emacs-mutt"' >> /etc/Muttrc
  4948. echo 'set header_cache="+.cache"' >> /etc/Muttrc
  4949. echo '' >> /etc/Muttrc
  4950. echo 'macro index S "<tag-prefix><decode-save>=.learn-spam<enter>" "move to learn-spam"' >> /etc/Muttrc
  4951. echo 'macro pager S "<decode-save>=.learn-spam<enter>" "move to learn-spam"' >> /etc/Muttrc
  4952. echo 'macro index H "<tag-prefix><decode-copy>=.learn-ham<enter>" "copy to learn-ham"' >> /etc/Muttrc
  4953. echo 'macro pager H "<decode-copy>=.learn-ham<enter>" "copy to learn-ham"' >> /etc/Muttrc
  4954. echo '' >> /etc/Muttrc
  4955. echo '# set up the sidebar' >> /etc/Muttrc
  4956. echo 'set sidebar_width=22' >> /etc/Muttrc
  4957. echo 'set sidebar_visible=yes' >> /etc/Muttrc
  4958. echo "set sidebar_delim='|'" >> /etc/Muttrc
  4959. echo 'set sidebar_sort=yes' >> /etc/Muttrc
  4960. echo '' >> /etc/Muttrc
  4961. echo 'set rfc2047_parameters' >> /etc/Muttrc
  4962. echo '' >> /etc/Muttrc
  4963. echo '# Show inbox and sent items' >> /etc/Muttrc
  4964. echo 'mailboxes = =Sent =maybe-spam =spam' >> /etc/Muttrc
  4965. echo '' >> /etc/Muttrc
  4966. echo '# Alter these colours as needed for maximum bling' >> /etc/Muttrc
  4967. echo 'color sidebar_new yellow default' >> /etc/Muttrc
  4968. echo 'color normal white default' >> /etc/Muttrc
  4969. echo 'color hdrdefault brightcyan default' >> /etc/Muttrc
  4970. echo 'color signature green default' >> /etc/Muttrc
  4971. echo 'color attachment brightyellow default' >> /etc/Muttrc
  4972. echo 'color quoted green default' >> /etc/Muttrc
  4973. echo 'color quoted1 white default' >> /etc/Muttrc
  4974. echo 'color tilde blue default' >> /etc/Muttrc
  4975. echo '' >> /etc/Muttrc
  4976. echo '# ctrl-n, ctrl-p to select next, prev folder' >> /etc/Muttrc
  4977. echo '# ctrl-o to open selected folder' >> /etc/Muttrc
  4978. echo 'bind index \Cp sidebar-prev' >> /etc/Muttrc
  4979. echo 'bind index \Cn sidebar-next' >> /etc/Muttrc
  4980. echo 'bind index \Co sidebar-open' >> /etc/Muttrc
  4981. echo 'bind pager \Cp sidebar-prev' >> /etc/Muttrc
  4982. echo 'bind pager \Cn sidebar-next' >> /etc/Muttrc
  4983. echo 'bind pager \Co sidebar-open' >> /etc/Muttrc
  4984. echo '' >> /etc/Muttrc
  4985. echo '# ctrl-b toggles sidebar visibility' >> /etc/Muttrc
  4986. echo "macro index,pager \Cb '<enter-command>toggle sidebar_visible<enter><redraw-screen>' 'toggle sidebar'" >> /etc/Muttrc
  4987. echo '' >> /etc/Muttrc
  4988. echo '# esc-m Mark new messages as read' >> /etc/Muttrc
  4989. echo 'macro index <esc>m "T~N<enter>;WNT~O<enter>;WO\CT~T<enter>" "mark all messages read"' >> /etc/Muttrc
  4990. echo '' >> /etc/Muttrc
  4991. echo '# Collapsing threads' >> /etc/Muttrc
  4992. echo 'macro index [ "<collapse-thread>" "collapse/uncollapse thread"' >> /etc/Muttrc
  4993. echo 'macro index ] "<collapse-all>" "collapse/uncollapse all threads"' >> /etc/Muttrc
  4994. echo '' >> /etc/Muttrc
  4995. echo '# threads containing new messages' >> /etc/Muttrc
  4996. echo 'uncolor index "~(~N)"' >> /etc/Muttrc
  4997. echo 'color index brightblue default "~(~N)"' >> /etc/Muttrc
  4998. echo '' >> /etc/Muttrc
  4999. echo '# new messages themselves' >> /etc/Muttrc
  5000. echo 'uncolor index "~N"' >> /etc/Muttrc
  5001. echo 'color index brightyellow default "~N"' >> /etc/Muttrc
  5002. echo '' >> /etc/Muttrc
  5003. echo '# GPG/PGP integration' >> /etc/Muttrc
  5004. echo '# this set the number of seconds to keep in memory the passphrase used to encrypt/sign' >> /etc/Muttrc
  5005. echo 'set pgp_timeout=1800' >> /etc/Muttrc
  5006. echo '' >> /etc/Muttrc
  5007. echo '# automatically sign and encrypt with PGP/MIME' >> /etc/Muttrc
  5008. echo 'set pgp_autosign # autosign all outgoing mails' >> /etc/Muttrc
  5009. echo 'set pgp_autoencrypt # Try to encrypt automatically' >> /etc/Muttrc
  5010. echo 'set pgp_replyencrypt # autocrypt replies to crypted' >> /etc/Muttrc
  5011. echo 'set pgp_replysign # autosign replies to signed' >> /etc/Muttrc
  5012. echo 'set pgp_auto_decode=yes # decode attachments' >> /etc/Muttrc
  5013. echo 'set fcc_clear=no # Keep encrypted copy of sent encrypted mail' >> /etc/Muttrc
  5014. echo 'unset smime_is_default' >> /etc/Muttrc
  5015. echo '' >> /etc/Muttrc
  5016. echo 'set alias_file=~/.mutt-alias' >> /etc/Muttrc
  5017. echo 'source ~/.mutt-alias' >> /etc/Muttrc
  5018. echo 'set query_command= "abook --mutt-query \"%s\""' >> /etc/Muttrc
  5019. echo 'macro index,pager A "<pipe-message>abook --add-email-quiet<return>" "add the sender address to abook"' >> /etc/Muttrc
  5020. echo '' >> /etc/Muttrc
  5021. echo '# Optional relay of SMTP via ISP' >> /etc/Muttrc
  5022. echo '#set smtp_url="smtps://username:password@isp_mail_domain:465/"' >> /etc/Muttrc
  5023. # create an Emacs configuration specifically for use with Mutt, which
  5024. # has word wrap and spell checking on by default
  5025. echo "(add-hook 'before-save-hook 'delete-trailing-whitespace)" > /home/$MY_USERNAME/.emacs-mutt
  5026. echo '(setq org-support-shift-select t)' >> /home/$MY_USERNAME/.emacs-mutt
  5027. echo '(setq standard-indent 4)' >> /home/$MY_USERNAME/.emacs-mutt
  5028. echo '(setq-default tab-width 4)' >> /home/$MY_USERNAME/.emacs-mutt
  5029. echo '(setq c-basic-offset 4)' >> /home/$MY_USERNAME/.emacs-mutt
  5030. echo '(mouse-wheel-mode t)' >> /home/$MY_USERNAME/.emacs-mutt
  5031. echo '(setq make-backup-files t)' >> /home/$MY_USERNAME/.emacs-mutt
  5032. echo '(setq version-control t)' >> /home/$MY_USERNAME/.emacs-mutt
  5033. echo '(setq backup-directory-alist (quote ((".*" . "~/.emacs_backups/"))))' >> /home/$MY_USERNAME/.emacs-mutt
  5034. echo "(setq default-major-mode 'text-mode)" >> /home/$MY_USERNAME/.emacs-mutt
  5035. echo "(dolist (hook '(text-mode-hook))" >> /home/$MY_USERNAME/.emacs-mutt
  5036. echo ' (add-hook hook (lambda () (flyspell-mode 1))))' >> /home/$MY_USERNAME/.emacs-mutt
  5037. echo '(setq-default fill-column 72)' >> /home/$MY_USERNAME/.emacs-mutt
  5038. echo '(setq auto-fill-mode 0)' >> /home/$MY_USERNAME/.emacs-mutt
  5039. echo "(add-hook 'text-mode-hook 'turn-on-auto-fill)" >> /home/$MY_USERNAME/.emacs-mutt
  5040. echo "(setq-default auto-fill-function 'do-auto-fill)" >> /home/$MY_USERNAME/.emacs-mutt
  5041. # add the emacs mutt configuration to the user profile skeleton
  5042. if [ ! -f /etc/skel/.emacs-mutt ]; then
  5043. cp /home/$MY_USERNAME/.emacs-mutt /etc/skel/.emacs-mutt
  5044. chown root:root /etc/skel/.emacs-mutt
  5045. fi
  5046. cp -f /etc/Muttrc /home/$MY_USERNAME/.muttrc
  5047. cp -f /etc/Muttrc /etc/skel/.muttrc
  5048. touch /home/$MY_USERNAME/.mutt-alias
  5049. cp /home/$MY_USERNAME/.mutt-alias /etc/skel/.mutt-alias
  5050. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.emacs-mutt
  5051. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.muttrc
  5052. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.mutt-alias
  5053. # default user on generic images
  5054. if [ -d /home/${GENERIC_IMAGE_USERNAME} ]; then
  5055. cp -f /etc/Muttrc /home/${GENERIC_IMAGE_USERNAME}/.muttrc
  5056. chown ${GENERIC_IMAGE_USERNAME}:${GENERIC_IMAGE_USERNAME} /home/${GENERIC_IMAGE_USERNAME}/.muttrc
  5057. touch /home/${GENERIC_IMAGE_USERNAME}/.mutt-alias
  5058. chown ${GENERIC_IMAGE_USERNAME}:${GENERIC_IMAGE_USERNAME} /home/${GENERIC_IMAGE_USERNAME}/.mutt-alias
  5059. cp /etc/skel/.emacs-mutt /home/${GENERIC_IMAGE_USERNAME}/.emacs-mutt
  5060. chown ${GENERIC_IMAGE_USERNAME}:${GENERIC_IMAGE_USERNAME} /home/${GENERIC_IMAGE_USERNAME}/.emacs-mutt
  5061. fi
  5062. echo 'email_client' >> $COMPLETION_FILE
  5063. }
  5064. function email_archiving {
  5065. if [[ $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_NONMAILBOX" || $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  5066. return
  5067. fi
  5068. # ensure that the mail archive script is up to date
  5069. if [ -f /usr/local/bin/${PROJECT_NAME}-archive-mail ]; then
  5070. cp /usr/local/bin/${PROJECT_NAME}-archive-mail /etc/cron.daily/archivemail
  5071. else
  5072. if [ -f /usr/bin/${PROJECT_NAME}-archive-mail ]; then
  5073. cp /usr/bin/${PROJECT_NAME}-archive-mail /etc/cron.daily/archivemail
  5074. else
  5075. echo "/usr/bin/${PROJECT_NAME}-archive-mail was not found. ${PROJECT_NAME} might not have fully installed."
  5076. exit 62379
  5077. fi
  5078. fi
  5079. chmod +x /etc/cron.daily/archivemail
  5080. # update to the next commit
  5081. set_repo_commit $INSTALL_DIR/cleanup-maildir "cleanup-maildir commit" "$CLEANUP_MAILDIR_COMMIT" $CLEANUP_MAILDIR_REPO
  5082. if grep -Fxq "email_archiving" $COMPLETION_FILE; then
  5083. return
  5084. fi
  5085. if [ ! -d $INSTALL_DIR ]; then
  5086. mkdir $INSTALL_DIR
  5087. fi
  5088. cd $INSTALL_DIR
  5089. git_clone $CLEANUP_MAILDIR_REPO $INSTALL_DIR/cleanup-maildir
  5090. cd $INSTALL_DIR/cleanup-maildir
  5091. git checkout $CLEANUP_MAILDIR_COMMIT -b $CLEANUP_MAILDIR_COMMIT
  5092. if ! grep -q "cleanup-maildir commit" $COMPLETION_FILE; then
  5093. echo "cleanup-maildir commit:$CLEANUP_MAILDIR_COMMIT" >> $COMPLETION_FILE
  5094. else
  5095. sed -i "s/cleanup-maildir commit.*/cleanup-maildir commit:$CLEANUP_MAILDIR_COMMIT/g" $COMPLETION_FILE
  5096. fi
  5097. cp $INSTALL_DIR/cleanup-maildir/cleanup-maildir /usr/bin
  5098. echo 'email_archiving' >> $COMPLETION_FILE
  5099. }
  5100. # Ensure that the from field is correct when sending email from Mutt
  5101. function email_from_address {
  5102. if grep -Fxq "email_from_address" $COMPLETION_FILE; then
  5103. return
  5104. fi
  5105. if [ ! -f /home/$MY_USERNAME/.muttrc ]; then
  5106. return
  5107. fi
  5108. if grep -q "set from=" /home/$MY_USERNAME/.muttrc; then
  5109. sed -i "s|set from=.*|set from='$MY_NAME <$MY_EMAIL_ADDRESS>'|g" /home/$MY_USERNAME/.muttrc
  5110. else
  5111. echo "set from='$MY_NAME <$MY_EMAIL_ADDRESS>'" >> /home/$MY_USERNAME/.muttrc
  5112. fi
  5113. echo 'email_from_address' >> $COMPLETION_FILE
  5114. }
  5115. function create_public_mailing_list {
  5116. if [[ $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_NONMAILBOX" || $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  5117. return
  5118. fi
  5119. if grep -Fxq "create_public_mailing_list" $COMPLETION_FILE; then
  5120. return
  5121. fi
  5122. if [ ! $PUBLIC_MAILING_LIST ]; then
  5123. return
  5124. fi
  5125. # does the mailing list have a separate domain name?
  5126. if [ ! $PUBLIC_MAILING_LIST_DOMAIN_NAME ]; then
  5127. PUBLIC_MAILING_LIST_DOMAIN_NAME=$DEFAULT_DOMAIN_NAME
  5128. fi
  5129. PUBLIC_MAILING_LIST_USER="mlmmj"
  5130. apt-get -y install mlmmj
  5131. adduser --system $PUBLIC_MAILING_LIST_USER
  5132. addgroup $PUBLIC_MAILING_LIST_USER
  5133. adduser $PUBLIC_MAILING_LIST_USER $PUBLIC_MAILING_LIST_USER
  5134. echo ''
  5135. echo $"Creating the $PUBLIC_MAILING_LIST mailing list"
  5136. echo ''
  5137. # create the list
  5138. mlmmj-make-ml -a -L "$PUBLIC_MAILING_LIST" -c $PUBLIC_MAILING_LIST_USER
  5139. echo 'SYSTEM_ALIASES_PIPE_TRANSPORT = address_pipe' > /etc/exim4/conf.d/main/000_localmacros
  5140. echo "SYSTEM_ALIASES_USER = $PUBLIC_MAILING_LIST_USER" >> /etc/exim4/conf.d/main/000_localmacros
  5141. echo "SYSTEM_ALIASES_GROUP = $PUBLIC_MAILING_LIST_USER" >> /etc/exim4/conf.d/main/000_localmacros
  5142. # router
  5143. echo 'mlmmj_router:' > /etc/exim4/conf.d/router/750_exim4-config_mlmmj
  5144. echo ' debug_print = "R: mlmmj_router for $local_part@$domain"' >> /etc/exim4/conf.d/router/750_exim4-config_mlmmj
  5145. echo ' driver = accept' >> /etc/exim4/conf.d/router/750_exim4-config_mlmmj
  5146. echo ' domains = +mlmmj_domains' >> /etc/exim4/conf.d/router/750_exim4-config_mlmmj
  5147. echo ' #require_files = MLMMJ_HOME/${lc::$local_part}' >> /etc/exim4/conf.d/router/750_exim4-config_mlmmj
  5148. 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
  5149. echo ' # Exim will then spawn a new process running under the UID of "mlmmj".' >> /etc/exim4/conf.d/router/750_exim4-config_mlmmj
  5150. echo ' require_files = mlmmj:MLMMJ_HOME/${lc::$local_part}' >> /etc/exim4/conf.d/router/750_exim4-config_mlmmj
  5151. echo ' local_part_suffix = +*' >> /etc/exim4/conf.d/router/750_exim4-config_mlmmj
  5152. echo ' local_part_suffix_optional' >> /etc/exim4/conf.d/router/750_exim4-config_mlmmj
  5153. echo ' headers_remove = Delivered-To' >> /etc/exim4/conf.d/router/750_exim4-config_mlmmj
  5154. echo ' headers_add = Delivered-To: $local_part$local_part_suffix@$domain' >> /etc/exim4/conf.d/router/750_exim4-config_mlmmj
  5155. echo ' transport = mlmmj_transport' >> /etc/exim4/conf.d/router/750_exim4-config_mlmmj
  5156. # transport
  5157. echo 'mlmmj_transport:' > /etc/exim4/conf.d/transport/40_exim4-config_mlmmj
  5158. echo ' debug_print = "T: mlmmj_transport for $local_part@$domain"' >> /etc/exim4/conf.d/transport/40_exim4-config_mlmmj
  5159. echo ' driver = pipe' >> /etc/exim4/conf.d/transport/40_exim4-config_mlmmj
  5160. echo ' return_path_add' >> /etc/exim4/conf.d/transport/40_exim4-config_mlmmj
  5161. echo ' user = mlmmj' >> /etc/exim4/conf.d/transport/40_exim4-config_mlmmj
  5162. echo ' group = mlmmj' >> /etc/exim4/conf.d/transport/40_exim4-config_mlmmj
  5163. echo ' home_directory = MLMMJ_HOME' >> /etc/exim4/conf.d/transport/40_exim4-config_mlmmj
  5164. echo ' current_directory = MLMMJ_HOME' >> /etc/exim4/conf.d/transport/40_exim4-config_mlmmj
  5165. echo ' command = /usr/bin/mlmmj-receive -F -L MLMMJ_HOME/${lc:$local_part}' >> /etc/exim4/conf.d/transport/40_exim4-config_mlmmj
  5166. if ! grep -q "MLMMJ_HOME=/var/spool/mlmmj" /etc/exim4/conf.d/main/01_exim4-config_listmacrosdefs; then
  5167. sed -i '/MAIN CONFIGURATION SETTINGS/a\MLMMJ_HOME=/var/spool/mlmmj' /etc/exim4/conf.d/main/01_exim4-config_listmacrosdefs
  5168. fi
  5169. if ! grep -q "domainlist mlmmj_domains =" /etc/exim4/conf.d/main/01_exim4-config_listmacrosdefs; then
  5170. sed -i "/MLMMJ_HOME/a\domainlist mlmmj_domains = $PUBLIC_MAILING_LIST_DOMAIN_NAME" /etc/exim4/conf.d/main/01_exim4-config_listmacrosdefs
  5171. fi
  5172. if ! grep -q "delay_warning_condition =" /etc/exim4/conf.d/main/01_exim4-config_listmacrosdefs; then
  5173. 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
  5174. fi
  5175. if ! grep -q ": +mlmmj_domains" /etc/exim4/conf.d/main/01_exim4-config_listmacrosdefs; then
  5176. 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
  5177. fi
  5178. if ! grep -q "! +mlmmj_domains" /etc/exim4/conf.d/router/200_exim4-config_primary; then
  5179. sed -i 's/domains = ! +local_domains/domains = ! +mlmmj_domains : ! +local_domains/g' /etc/exim4/conf.d/router/200_exim4-config_primary
  5180. fi
  5181. newaliases
  5182. update-exim4.conf.template -r
  5183. update-exim4.conf
  5184. systemctl restart exim4
  5185. if ! grep -q $"$PUBLIC_MAILING_LIST mailing list" /home/$MY_USERNAME/README; then
  5186. echo '' >> /home/$MY_USERNAME/README
  5187. echo '' >> /home/$MY_USERNAME/README
  5188. echo $"$PUBLIC_MAILING_LIST mailing list" >> /home/$MY_USERNAME/README
  5189. echo '=================================' >> /home/$MY_USERNAME/README
  5190. echo $"To subscribe to the $PUBLIC_MAILING_LIST mailing list send a" >> /home/$MY_USERNAME/README
  5191. echo $"cleartext email to $PUBLIC_MAILING_LIST+subscribe@$DEFAULT_DOMAIN_NAME" >> /home/$MY_USERNAME/README
  5192. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
  5193. chmod 600 /home/$MY_USERNAME/README
  5194. fi
  5195. ${PROJECT_NAME}-addlist -u $MY_USERNAME -l "$PUBLIC_MAILING_LIST" -s "$PUBLIC_MAILING_LIST"
  5196. echo 'create_public_mailing_list' >> $COMPLETION_FILE
  5197. }
  5198. function create_private_mailing_list {
  5199. if [[ $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_NONMAILBOX" || $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  5200. return
  5201. fi
  5202. # This installation doesn't work, results in ruby errors
  5203. # There is currently no schleuder package for Debian jessie
  5204. if grep -Fxq "create_private_mailing_list" $COMPLETION_FILE; then
  5205. return
  5206. fi
  5207. if [ ! $PRIVATE_MAILING_LIST ]; then
  5208. return
  5209. fi
  5210. if [[ $PRIVATE_MAILING_LIST == $MY_USERNAME ]]; then
  5211. echo $'The name of the private mailing list should not be the same as your username'
  5212. exit 10
  5213. fi
  5214. if [ ! $MY_GPG_PUBLIC_KEY ]; then
  5215. echo $'To create a private mailing list you need to specify a file'
  5216. echo $'containing your exported GPG key within MY_GPG_PUBLIC_KEY at'
  5217. echo $'the top of the script'
  5218. exit 11
  5219. fi
  5220. apt-get -y install ruby ruby-dev ruby-gpgme libgpgme11-dev libmagic-dev
  5221. gem install schleuder
  5222. schleuder-fix-gem-dependencies
  5223. schleuder-init-setup --gem
  5224. # NOTE: this is version number sensitive and so might need changing
  5225. ln -s /var/lib/gems/2.1.0/gems/schleuder-2.2.4 /var/lib/schleuder
  5226. sed -i 's/#smtp_port: 25/smtp_port: 465/g' /etc/schleuder/schleuder.conf
  5227. sed -i 's/#superadminaddr: root@localhost/superadminaddr: root@localhost' /etc/schleuder/schleuder.conf
  5228. 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
  5229. ${PROJECT_NAME}-addemail -u $MY_USERNAME -e $PRIVATE_MAILING_LIST@$DEFAULT_DOMAIN_NAME -l $PRIVATE_MAILING_LIST
  5230. echo 'schleuder:' > /etc/exim4/conf.d/router/550_exim4-config_schleuder
  5231. echo ' debug_print = "R: schleuder for $local_part@$domain"' >> /etc/exim4/conf.d/router/550_exim4-config_schleuder
  5232. echo ' driver = accept' >> /etc/exim4/conf.d/router/550_exim4-config_schleuder
  5233. echo ' local_part_suffix_optional' >> /etc/exim4/conf.d/router/550_exim4-config_schleuder
  5234. echo ' local_part_suffix = +* : -bounce : -sendkey' >> /etc/exim4/conf.d/router/550_exim4-config_schleuder
  5235. echo ' domains = +local_domains' >> /etc/exim4/conf.d/router/550_exim4-config_schleuder
  5236. echo ' user = schleuder' >> /etc/exim4/conf.d/router/550_exim4-config_schleuder
  5237. echo ' group = schleuder' >> /etc/exim4/conf.d/router/550_exim4-config_schleuder
  5238. echo ' require_files = schleuder:+/var/lib/schleuder/$domain/${local_part}' >> /etc/exim4/conf.d/router/550_exim4-config_schleuder
  5239. echo ' transport = schleuder_transport' >> /etc/exim4/conf.d/router/550_exim4-config_schleuder
  5240. echo 'schleuder_transport:' > /etc/exim4/conf.d/transport/30_exim4-config_schleuder
  5241. echo ' debug_print = "T: schleuder_transport for $local_part@$domain"' >> /etc/exim4/conf.d/transport/30_exim4-config_schleuder
  5242. echo ' driver = pipe' >> /etc/exim4/conf.d/transport/30_exim4-config_schleuder
  5243. echo ' home_directory = "/var/lib/schleuder/$domain/$local_part"' >> /etc/exim4/conf.d/transport/30_exim4-config_schleuder
  5244. echo ' command = "/usr/bin/schleuder $local_part@$domain"' >> /etc/exim4/conf.d/transport/30_exim4-config_schleuder
  5245. chown -R schleuder:schleuder /var/lib/schleuder
  5246. update-exim4.conf.template -r
  5247. update-exim4.conf
  5248. systemctl restart exim4
  5249. useradd -d /var/schleuderlists -s /bin/false schleuder
  5250. adduser Debian-exim schleuder
  5251. usermod -a -G mail schleuder
  5252. #exim -d -bt $PRIVATE_MAILING_LIST@$DEFAULT_DOMAIN_NAME
  5253. echo 'create_private_mailing_list' >> $COMPLETION_FILE
  5254. }
  5255. function split_gpg_key_into_fragments {
  5256. # split the gpg key into fragments if social key management is enabled
  5257. if [[ $ENABLE_SOCIAL_KEY_MANAGEMENT == "yes" ]]; then
  5258. echo 'Splitting GPG key. You may need to enter your passphrase.'
  5259. ${PROJECT_NAME}-splitkey -u $MY_USERNAME -e $MY_EMAIL_ADDRESS --fullname "$MY_NAME"
  5260. if [ ! -d /home/$MY_USERNAME/.gnupg_fragments ]; then
  5261. echo 'Yhe GPG key could not be split'
  5262. exit 86548
  5263. fi
  5264. fi
  5265. }
  5266. function import_email {
  5267. if [[ $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_NONMAILBOX" || $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  5268. return
  5269. fi
  5270. EMAIL_COMPLETE_MSG=$"
  5271. *** ${PROJECT_NAME} mailbox installation is complete ***
  5272. Now on your internet router forward ports
  5273. 25, 587, 465, 993 and 2222 to the ${PROJECT_NAME}
  5274. "
  5275. if grep -Fxq "import_email" $COMPLETION_FILE; then
  5276. if [[ $SYSTEM_TYPE == "$VARIANT_MAILBOX" ]]; then
  5277. backup_to_friends_servers
  5278. intrusion_detection
  5279. split_gpg_key_into_fragments
  5280. clear
  5281. echo ''
  5282. echo "$EMAIL_COMPLETE_MSG"
  5283. if [ -d $USB_MOUNT ]; then
  5284. umount $USB_MOUNT
  5285. rm -rf $USB_MOUNT
  5286. echo $' You can now remove the USB drive'
  5287. fi
  5288. exit 0
  5289. fi
  5290. return
  5291. fi
  5292. if [ $IMPORT_MAILDIR ]; then
  5293. if [ -d $IMPORT_MAILDIR ]; then
  5294. echo $'Transfering email files'
  5295. cp -r $IMPORT_MAILDIR /home/$MY_USERNAME
  5296. chown -R $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/Maildir
  5297. else
  5298. echo $"Email import directory $IMPORT_MAILDIR not found"
  5299. exit 9
  5300. fi
  5301. fi
  5302. echo 'import_email' >> $COMPLETION_FILE
  5303. if [[ $SYSTEM_TYPE == "$VARIANT_MAILBOX" ]]; then
  5304. backup_to_friends_servers
  5305. intrusion_detection
  5306. split_gpg_key_into_fragments
  5307. # unmount any attached usb drive
  5308. clear
  5309. echo ''
  5310. echo "$EMAIL_COMPLETE_MSG"
  5311. echo ''
  5312. if [ -d $USB_MOUNT ]; then
  5313. umount $USB_MOUNT
  5314. rm -rf $USB_MOUNT
  5315. echo $' You can now remove the USB drive'
  5316. fi
  5317. exit 0
  5318. fi
  5319. }
  5320. function install_web_server {
  5321. if [[ $SYSTEM_TYPE == "$VARIANT_CHAT" ]]; then
  5322. return
  5323. fi
  5324. # update to the next commit
  5325. set_repo_commit $INSTALL_DIR/nginx_ensite "Nginx-ensite commit" "$NGINX_ENSITE_COMMIT" $NGINX_ENSITE_REPO
  5326. if grep -Fxq "install_web_server" $COMPLETION_FILE; then
  5327. return
  5328. fi
  5329. # remove apache
  5330. apt-get -y remove --purge apache2
  5331. if [ -d /etc/apache2 ]; then
  5332. rm -rf /etc/apache2
  5333. fi
  5334. # install nginx
  5335. apt-get -y install nginx php5-fpm git
  5336. # limit the number of php processes
  5337. sed -i 's/; process.max =.*/process.max = 32/g' /etc/php5/fpm/php-fpm.conf
  5338. sed -i 's/;process_control_timeout =.*/process_control_timeout = 300/g' /etc/php5/fpm/php-fpm.conf
  5339. if ! grep -q "pm.max_children" /etc/php5/fpm/php-fpm.conf; then
  5340. echo 'pm.max_children = 10' >> /etc/php5/fpm/php-fpm.conf
  5341. echo 'pm.start_servers = 2' >> /etc/php5/fpm/php-fpm.conf
  5342. echo 'pm.min_spare_servers = 2' >> /etc/php5/fpm/php-fpm.conf
  5343. echo 'pm.max_spare_servers = 5' >> /etc/php5/fpm/php-fpm.conf
  5344. echo 'pm.max_requests = 50' >> /etc/php5/fpm/php-fpm.conf
  5345. fi
  5346. if [ ! -d /etc/nginx ]; then
  5347. echo $"ERROR: nginx does not appear to have installed. $CHECK_MESSAGE"
  5348. exit 51
  5349. fi
  5350. # Nginx settings
  5351. echo 'user www-data;' > /etc/nginx/nginx.conf
  5352. #echo "worker_processes; $CPU_CORES" >> /etc/nginx/nginx.conf
  5353. echo 'pid /run/nginx.pid;' >> /etc/nginx/nginx.conf
  5354. echo '' >> /etc/nginx/nginx.conf
  5355. echo 'events {' >> /etc/nginx/nginx.conf
  5356. echo ' worker_connections 50;' >> /etc/nginx/nginx.conf
  5357. echo ' # multi_accept on;' >> /etc/nginx/nginx.conf
  5358. echo '}' >> /etc/nginx/nginx.conf
  5359. echo '' >> /etc/nginx/nginx.conf
  5360. echo 'http {' >> /etc/nginx/nginx.conf
  5361. echo ' # limit the number of connections per single IP' >> /etc/nginx/nginx.conf
  5362. echo ' limit_conn_zone $binary_remote_addr zone=conn_limit_per_ip:10m;' >> /etc/nginx/nginx.conf
  5363. echo '' >> /etc/nginx/nginx.conf
  5364. echo ' # limit the number of requests for a given session' >> /etc/nginx/nginx.conf
  5365. echo ' # Note that the Owncloud web interface seems to require a rate of around 140r/s' >> /etc/nginx/nginx.conf
  5366. echo ' limit_req_zone $binary_remote_addr zone=req_limit_per_ip:10m rate=140r/s;' >> /etc/nginx/nginx.conf
  5367. echo '' >> /etc/nginx/nginx.conf
  5368. 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
  5369. echo ' client_body_buffer_size 128k;' >> /etc/nginx/nginx.conf
  5370. echo '' >> /etc/nginx/nginx.conf
  5371. echo ' # headerbuffer size for the request header from client, its set for testing purpose' >> /etc/nginx/nginx.conf
  5372. echo ' client_header_buffer_size 3m;' >> /etc/nginx/nginx.conf
  5373. echo '' >> /etc/nginx/nginx.conf
  5374. echo ' # maximum number and size of buffers for large headers to read from client request' >> /etc/nginx/nginx.conf
  5375. echo ' large_client_header_buffers 4 256k;' >> /etc/nginx/nginx.conf
  5376. echo '' >> /etc/nginx/nginx.conf
  5377. echo ' # read timeout for the request body from client, its set for testing purpose' >> /etc/nginx/nginx.conf
  5378. echo ' client_body_timeout 3m;' >> /etc/nginx/nginx.conf
  5379. echo '' >> /etc/nginx/nginx.conf
  5380. echo ' # how long to wait for the client to send a request header, its set for testing purpose' >> /etc/nginx/nginx.conf
  5381. echo ' client_header_timeout 3m;' >> /etc/nginx/nginx.conf
  5382. echo '' >> /etc/nginx/nginx.conf
  5383. echo ' ##' >> /etc/nginx/nginx.conf
  5384. echo ' # Basic Settings' >> /etc/nginx/nginx.conf
  5385. echo ' ##' >> /etc/nginx/nginx.conf
  5386. echo '' >> /etc/nginx/nginx.conf
  5387. echo ' sendfile on;' >> /etc/nginx/nginx.conf
  5388. echo ' tcp_nopush on;' >> /etc/nginx/nginx.conf
  5389. echo ' tcp_nodelay on;' >> /etc/nginx/nginx.conf
  5390. echo ' keepalive_timeout 65;' >> /etc/nginx/nginx.conf
  5391. echo ' types_hash_max_size 2048;' >> /etc/nginx/nginx.conf
  5392. echo ' server_tokens off;' >> /etc/nginx/nginx.conf
  5393. echo '' >> /etc/nginx/nginx.conf
  5394. echo ' # server_names_hash_bucket_size 64;' >> /etc/nginx/nginx.conf
  5395. echo ' # server_name_in_redirect off;' >> /etc/nginx/nginx.conf
  5396. echo '' >> /etc/nginx/nginx.conf
  5397. echo ' include /etc/nginx/mime.types;' >> /etc/nginx/nginx.conf
  5398. echo ' default_type application/octet-stream;' >> /etc/nginx/nginx.conf
  5399. echo '' >> /etc/nginx/nginx.conf
  5400. echo ' ##' >> /etc/nginx/nginx.conf
  5401. echo ' # Logging Settings' >> /etc/nginx/nginx.conf
  5402. echo ' ##' >> /etc/nginx/nginx.conf
  5403. echo '' >> /etc/nginx/nginx.conf
  5404. echo ' access_log /var/log/nginx/access.log;' >> /etc/nginx/nginx.conf
  5405. echo ' error_log /var/log/nginx/error.log;' >> /etc/nginx/nginx.conf
  5406. echo '' >> /etc/nginx/nginx.conf
  5407. echo ' ###' >> /etc/nginx/nginx.conf
  5408. echo ' # Gzip Settings' >> /etc/nginx/nginx.conf
  5409. echo ' ##' >> /etc/nginx/nginx.conf
  5410. echo ' gzip on;' >> /etc/nginx/nginx.conf
  5411. echo ' gzip_disable "msie6";' >> /etc/nginx/nginx.conf
  5412. echo '' >> /etc/nginx/nginx.conf
  5413. echo ' # gzip_vary on;' >> /etc/nginx/nginx.conf
  5414. echo ' # gzip_proxied any;' >> /etc/nginx/nginx.conf
  5415. echo ' # gzip_comp_level 6;' >> /etc/nginx/nginx.conf
  5416. echo ' # gzip_buffers 16 8k;' >> /etc/nginx/nginx.conf
  5417. echo ' # gzip_http_version 1.1;' >> /etc/nginx/nginx.conf
  5418. echo ' # gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;' >> /etc/nginx/nginx.conf
  5419. echo '' >> /etc/nginx/nginx.conf
  5420. echo ' ##' >> /etc/nginx/nginx.conf
  5421. echo ' # Virtual Host Configs' >> /etc/nginx/nginx.conf
  5422. echo ' ##' >> /etc/nginx/nginx.conf
  5423. echo '' >> /etc/nginx/nginx.conf
  5424. echo ' include /etc/nginx/conf.d/*.conf;' >> /etc/nginx/nginx.conf
  5425. echo ' include /etc/nginx/sites-enabled/*;' >> /etc/nginx/nginx.conf
  5426. echo '}' >> /etc/nginx/nginx.conf
  5427. # install a script to easily enable and disable nginx virtual hosts
  5428. if [ ! -d $INSTALL_DIR ]; then
  5429. mkdir $INSTALL_DIR
  5430. fi
  5431. cd $INSTALL_DIR
  5432. git_clone $NGINX_ENSITE_REPO $INSTALL_DIR/nginx_ensite
  5433. cd $INSTALL_DIR/nginx_ensite
  5434. git checkout $NGINX_ENSITE_COMMIT -b $NGINX_ENSITE_COMMIT
  5435. if ! grep -q "Nginx-ensite commit" $COMPLETION_FILE; then
  5436. echo "Nginx-ensite commit:$NGINX_ENSITE_COMMIT" >> $COMPLETION_FILE
  5437. else
  5438. sed -i "s/Nginx-ensite commit.*/Nginx-ensite commit:$NGINX_ENSITE_COMMIT/g" $COMPLETION_FILE
  5439. fi
  5440. make install
  5441. nginx_dissite default
  5442. echo 'install_web_server' >> $COMPLETION_FILE
  5443. }
  5444. function install_web_server_access_control {
  5445. if [ ! -f /etc/pam.d/nginx ]; then
  5446. echo '#%PAM-1.0' > /etc/pam.d/nginx
  5447. echo '@include common-auth' >> /etc/pam.d/nginx
  5448. echo '@include common-account' >> /etc/pam.d/nginx
  5449. echo '@include common-session' >> /etc/pam.d/nginx
  5450. fi
  5451. }
  5452. function configure_php {
  5453. sed -i "s/memory_limit = 128M/memory_limit = ${MAX_PHP_MEMORY}M/g" /etc/php5/fpm/php.ini
  5454. sed -i 's/;cgi.fix_pathinfo=1/cgi.fix_pathinfo=0/g' /etc/php5/fpm/php.ini
  5455. sed -i "s/memory_limit = -1/memory_limit = ${MAX_PHP_MEMORY}M/g" /etc/php5/cli/php.ini
  5456. sed -i "s/upload_max_filesize = 2M/upload_max_filesize = 50M/g" /etc/php5/fpm/php.ini
  5457. sed -i "s/post_max_size = 8M/post_max_size = 50M/g" /etc/php5/fpm/php.ini
  5458. }
  5459. function install_mariadb {
  5460. if grep -Fxq "install_mariadb" $COMPLETION_FILE; then
  5461. return
  5462. fi
  5463. apt-get -y install python-software-properties debconf-utils
  5464. apt-get -y install software-properties-common
  5465. apt-get -y update
  5466. get_mariadb_password
  5467. if [ ! $MARIADB_PASSWORD ]; then
  5468. if [ -f $IMAGE_PASSWORD_FILE ]; then
  5469. MARIADB_PASSWORD="$(printf `cat $IMAGE_PASSWORD_FILE`)"
  5470. else
  5471. MARIADB_PASSWORD="$(openssl rand -base64 32 | cut -c1-30)"
  5472. fi
  5473. echo "$MARIADB_PASSWORD" > $DATABASE_PASSWORD_FILE
  5474. chmod 600 $DATABASE_PASSWORD_FILE
  5475. echo '' >> /home/$MY_USERNAME/README
  5476. echo '' >> /home/$MY_USERNAME/README
  5477. echo 'MariaDB / MySql' >> /home/$MY_USERNAME/README
  5478. echo '===============' >> /home/$MY_USERNAME/README
  5479. echo $"Your MariaDB password is: $MARIADB_PASSWORD" >> /home/$MY_USERNAME/README
  5480. echo '' >> /home/$MY_USERNAME/README
  5481. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
  5482. chmod 600 /home/$MY_USERNAME/README
  5483. fi
  5484. debconf-set-selections <<< "mariadb-server mariadb-server/root_password password $MARIADB_PASSWORD"
  5485. debconf-set-selections <<< "mariadb-server mariadb-server/root_password_again password $MARIADB_PASSWORD"
  5486. apt-get -y install mariadb-server
  5487. apt-get -y remove --purge apache*
  5488. if [ -d /etc/apache2 ]; then
  5489. rm -rf /etc/apache2
  5490. echo $'Removed Apache installation after MariaDB install'
  5491. fi
  5492. if [ ! -d /etc/mysql ]; then
  5493. echo $"ERROR: mariadb-server does not appear to have installed. $CHECK_MESSAGE"
  5494. exit 54
  5495. fi
  5496. mysqladmin -u root password "$MARIADB_PASSWORD"
  5497. echo 'install_mariadb' >> $COMPLETION_FILE
  5498. }
  5499. function backup_databases_script_header {
  5500. if [ ! -f /usr/bin/backupdatabases ]; then
  5501. # daily
  5502. echo '#!/bin/sh' > /usr/bin/backupdatabases
  5503. echo '' >> /usr/bin/backupdatabases
  5504. echo "EMAIL='$MY_EMAIL_ADDRESS'" >> /usr/bin/backupdatabases
  5505. echo '' >> /usr/bin/backupdatabases
  5506. echo -n 'MYSQL_PASSWORD=$(cat ' >> /usr/bin/backupdatabases
  5507. echo "$DATABASE_PASSWORD_FILE)" >> /usr/bin/backupdatabases
  5508. echo 'umask 0077' >> /usr/bin/backupdatabases
  5509. echo '' >> /usr/bin/backupdatabases
  5510. echo '# exit if we are backing up to friends servers' >> /usr/bin/backupdatabases
  5511. echo "if [ -f $FRIENDS_SERVERS_LIST ]; then" >> /usr/bin/backupdatabases
  5512. echo ' exit 1' >> /usr/bin/backupdatabases
  5513. echo 'fi' >> /usr/bin/backupdatabases
  5514. chmod 600 /usr/bin/backupdatabases
  5515. chmod +x /usr/bin/backupdatabases
  5516. echo '#!/bin/sh' > /etc/cron.daily/backupdatabasesdaily
  5517. echo '/usr/bin/backupdatabases' >> /etc/cron.daily/backupdatabasesdaily
  5518. chmod 600 /etc/cron.daily/backupdatabasesdaily
  5519. chmod +x /etc/cron.daily/backupdatabasesdaily
  5520. # weekly
  5521. echo '#!/bin/sh' > /etc/cron.weekly/backupdatabasesweekly
  5522. echo '' >> /etc/cron.weekly/backupdatabasesweekly
  5523. echo 'umask 0077' >> /etc/cron.weekly/backupdatabasesweekly
  5524. chmod 600 /etc/cron.weekly/backupdatabasesweekly
  5525. chmod +x /etc/cron.weekly/backupdatabasesweekly
  5526. # monthly
  5527. echo '#!/bin/sh' > /etc/cron.monthly/backupdatabasesmonthly
  5528. echo '' >> /etc/cron.monthly/backupdatabasesmonthly
  5529. echo 'umask 0077' >> /etc/cron.monthly/backupdatabasesmonthly
  5530. chmod 600 /etc/cron.monthly/backupdatabasesmonthly
  5531. chmod +x /etc/cron.monthly/backupdatabasesmonthly
  5532. fi
  5533. }
  5534. function repair_databases_script {
  5535. if [ -f /etc/cron.hourly/repair ]; then
  5536. sed -i "s|/usr/bin/repairdatabase|${PROJECT_NAME}-repair-database|g" /etc/cron.hourly/repair
  5537. fi
  5538. if grep -Fxq "repair_databases_script" $COMPLETION_FILE; then
  5539. return
  5540. fi
  5541. if [ ! -f $DATABASE_PASSWORD_FILE ]; then
  5542. return
  5543. fi
  5544. echo '#!/bin/bash' > /etc/cron.hourly/repair
  5545. echo '' >> /etc/cron.hourly/repair
  5546. chmod 600 /etc/cron.hourly/repair
  5547. chmod +x /etc/cron.hourly/repair
  5548. echo 'repair_databases_script' >> $COMPLETION_FILE
  5549. }
  5550. function add_ddns_domain {
  5551. if [ ! $1 ]; then
  5552. echo $'ddns domain not specified'
  5553. exit 5638
  5554. fi
  5555. CURRENT_DDNS_DOMAIN="$1"
  5556. if [[ $ONION_ONLY != "no" ]]; then
  5557. return
  5558. fi
  5559. if [ ! -f /etc/inadyn.conf ]; then
  5560. echo $'Unable to find inadyn configuration file /etc/inadyn.conf'
  5561. exit 5745
  5562. fi
  5563. if ! grep -q "$DDNS_PROVIDER" /etc/inadyn.conf; then
  5564. echo '' >> /etc/inadyn.conf
  5565. echo "system $DDNS_PROVIDER" >> /etc/inadyn.conf
  5566. echo ' ssl' >> /etc/inadyn.conf
  5567. echo " checkip-url $GET_IP_ADDRESS_URL /" >> /etc/inadyn.conf
  5568. if [ $DDNS_USERNAME ]; then
  5569. echo " username $DDNS_USERNAME" >> /etc/inadyn.conf
  5570. fi
  5571. if [ $DDNS_PASSWORD ]; then
  5572. echo " password $DDNS_PASSWORD" >> /etc/inadyn.conf
  5573. fi
  5574. fi
  5575. if ! grep -q "$CURRENT_DDNS_DOMAIN" /etc/inadyn.conf; then
  5576. echo " alias $CURRENT_DDNS_DOMAIN" >> /etc/inadyn.conf
  5577. fi
  5578. chmod 600 /etc/inadyn.conf
  5579. systemctl restart inadyn
  5580. systemctl daemon-reload
  5581. }
  5582. function upgrade_owncloud_start {
  5583. # copies data and config directories to a temporary upgrade directory
  5584. if [ ! -d /etc/owncloud ]; then
  5585. return
  5586. fi
  5587. echo $'Starting upgrade of Owncloud'
  5588. # remove any owncloud entries from completion
  5589. sed -i '/install_owncloud/d' $COMPLETION_FILE
  5590. sed -i '/owncloud/d' $COMPLETION_FILE
  5591. sed -i '/Owncloud/d' $COMPLETION_FILE
  5592. # create directories
  5593. if [ ! -d $OWNCLOUD_UPGRADE_PATH/data ]; then
  5594. mkdir -p $OWNCLOUD_UPGRADE_PATH/data
  5595. fi
  5596. if [ ! -d $OWNCLOUD_UPGRADE_PATH/config ]; then
  5597. mkdir -p $OWNCLOUD_UPGRADE_PATH/config
  5598. fi
  5599. # copy data to the temporary directory
  5600. if [ -d /var/lib/owncloud/data ]; then
  5601. cp -rf /var/lib/owncloud/data/* $OWNCLOUD_UPGRADE_PATH/data/
  5602. fi
  5603. # copy the config files to the temporary directory
  5604. if [ -d /etc/owncloud ]; then
  5605. cp -rf /etc/owncloud/* $OWNCLOUD_UPGRADE_PATH/config/
  5606. fi
  5607. # remove the previous owncloud install
  5608. apt-get -y remove --purge owncloud
  5609. # ensure directories do not exist
  5610. rm -rf /etc/owncloud
  5611. if [ -d /var/lib/owncloud ]; then
  5612. rm -rf /var/lib/owncloud
  5613. fi
  5614. }
  5615. function upgrade_owncloud_finish {
  5616. # copies data from a temporary upgrade directory to the new
  5617. # owncloud install
  5618. if [ ! -d $OWNCLOUD_PATH ]; then
  5619. return
  5620. fi
  5621. if [ ! -d $OWNCLOUD_UPGRADE_PATH ]; then
  5622. return
  5623. fi
  5624. echo $'Finishing upgrade of Owncloud'
  5625. if [ ! -d $OWNCLOUD_PATH/data ]; then
  5626. mkdir $OWNCLOUD_PATH/data
  5627. fi
  5628. cp -r $OWNCLOUD_UPGRADE_PATH/data/* $OWNCLOUD_PATH/data/
  5629. chown -R www-data:www-data $OWNCLOUD_PATH/data
  5630. # remove the temporary upgrade
  5631. rm -rf $OWNCLOUD_UPGRADE_PATH
  5632. }
  5633. function install_owncloud_official_deb {
  5634. # new version not based on debian package
  5635. 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
  5636. return
  5637. fi
  5638. # if this is exclusively a cloud setup
  5639. if [[ $SYSTEM_TYPE == "$VARIANT_CLOUD" ]]; then
  5640. if [ ! $DEFAULT_DOMAIN_NAME ]; then
  5641. echo $'No default domain name when installing cloud variant'
  5642. exit 5380
  5643. fi
  5644. fi
  5645. if [ ! $OWNCLOUD_DOMAIN_NAME ]; then
  5646. echo $'No Owncloud domain name was specified'
  5647. exit 3095
  5648. fi
  5649. if [[ $SYSTEM_TYPE != "$VARIANT_CLOUD" ]]; then
  5650. if [[ $SYSTEM_TYPE != "$VARIANT_FULL" ]]; then
  5651. echo $"Owncloud install did not recognise the system type $SYSTEM_TYPE"
  5652. exit 6746
  5653. fi
  5654. fi
  5655. UPGRADING_OWNCLOUD=
  5656. if [ -d /etc/owncloud ]; then
  5657. UPGRADING_OWNCLOUD='yes'
  5658. fi
  5659. # begin doing an upgrade if needed
  5660. upgrade_owncloud_start
  5661. OWNCLOUD_COMPLETION_MSG1=$" *** ${PROJECT_NAME} $SYSTEM_TYPE is now installed ***"
  5662. OWNCLOUD_COMPLETION_MSG2=$"Open $OWNCLOUD_DOMAIN_NAME in a web browser to complete the setup"
  5663. if grep -Fxq "install_owncloud_official_deb" $COMPLETION_FILE; then
  5664. if [[ $SYSTEM_TYPE == "$VARIANT_CLOUD" ]]; then
  5665. backup_to_friends_servers
  5666. intrusion_detection
  5667. split_gpg_key_into_fragments
  5668. # unmount any attached usb drive
  5669. if [ -d $USB_MOUNT ]; then
  5670. umount $USB_MOUNT
  5671. rm -rf $USB_MOUNT
  5672. fi
  5673. echo ''
  5674. echo "$OWNCLOUD_COMPLETION_MSG1"
  5675. echo "$OWNCLOUD_COMPLETION_MSG2"
  5676. exit 0
  5677. fi
  5678. return
  5679. fi
  5680. apt-get -y install fonts-linuxlibertine fonts-sil-gentium-basic fonts-way-microhei
  5681. apt-get -y install libjs-twitter-bootstrap
  5682. # ensure that apache hasn't been inadvertantly installed
  5683. apt-get -y remove --purge apache*
  5684. if [ -d /etc/apache2 ]; then
  5685. rm -rf /etc/apache2
  5686. echo $'Removed Apache installation after Owncloud install'
  5687. fi
  5688. # get the official owncloud deb package. Note that this is not the same as the one
  5689. # from the debian repos, and doesn't follow the debian packaging guidelines
  5690. if [ ! -d $INSTALL_DIR ]; then
  5691. mkdir $INSTALL_DIR
  5692. fi
  5693. cd $INSTALL_DIR
  5694. wget -nv https://download.owncloud.org/download/repositories/stable/Debian_8.0/Release.key -O owncloud.key
  5695. apt-key add - < owncloud.key
  5696. if [ ! -f /etc/apt/sources.list.d/owncloud.list ]; then
  5697. echo 'deb http://download.owncloud.org/download/repositories/stable/Debian_8.0/ /' >> /etc/apt/sources.list.d/owncloud.list
  5698. fi
  5699. apt-get update
  5700. apt-get -y install owncloud
  5701. install_mariadb
  5702. get_mariadb_password
  5703. if [ ! -d $OWNCLOUD_PATH ]; then
  5704. echo $'Owncloud was not installed'
  5705. exit 82584
  5706. fi
  5707. get_mariadb_owncloud_admin_password
  5708. if [ ! $OWNCLOUD_ADMIN_PASSWORD ]; then
  5709. if [ -f $IMAGE_PASSWORD_FILE ]; then
  5710. OWNCLOUD_ADMIN_PASSWORD="$(printf `cat $IMAGE_PASSWORD_FILE`)"
  5711. else
  5712. OWNCLOUD_ADMIN_PASSWORD="$(openssl rand -base64 32 | cut -c1-30)"
  5713. fi
  5714. fi
  5715. if ! grep -q "Owncloud database user" /home/$MY_USERNAME/README; then
  5716. echo '' >> /home/$MY_USERNAME/README
  5717. echo '' >> /home/$MY_USERNAME/README
  5718. echo 'Owncloud' >> /home/$MY_USERNAME/README
  5719. echo '========' >> /home/$MY_USERNAME/README
  5720. echo $'Owncloud database user: owncloudadmin' >> /home/$MY_USERNAME/README
  5721. echo $"Owncloud database password: $OWNCLOUD_ADMIN_PASSWORD" >> /home/$MY_USERNAME/README
  5722. echo $'Owncloud database name: owncloud' >> /home/$MY_USERNAME/README
  5723. echo '' >> /home/$MY_USERNAME/README
  5724. echo $'After creating an administrator account then create a user account via' >> /home/$MY_USERNAME/README
  5725. echo $"the Users dropdown menu entry. The username should be '$MY_USERNAME'." >> /home/$MY_USERNAME/README
  5726. echo '' >> /home/$MY_USERNAME/README
  5727. echo $'On mobile devices you can download the Owncloud client via F-Droid.' >> /home/$MY_USERNAME/README
  5728. echo '' >> /home/$MY_USERNAME/README
  5729. echo $'To synchronise calendar entries with Android "install CalDAV Sync Adapter"' >> /home/$MY_USERNAME/README
  5730. echo $'using F-Droid then go to settings/accounts and add a CalDav account with' >> /home/$MY_USERNAME/README
  5731. echo $"the URL https://$OWNCLOUD_DOMAIN_NAME/remote.php/caldav/principals/$MY_USERNAME" >> /home/$MY_USERNAME/README
  5732. echo $'and the username and password shown above.' >> /home/$MY_USERNAME/README
  5733. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
  5734. chmod 600 /home/$MY_USERNAME/README
  5735. fi
  5736. if [ $UPGRADING_OWNCLOUD ]; then
  5737. remove_database owncloud
  5738. fi
  5739. create_database owncloud "$OWNCLOUD_ADMIN_PASSWORD"
  5740. if [[ $ONION_ONLY == "no" ]]; then
  5741. nginx_http_redirect $OWNCLOUD_DOMAIN_NAME
  5742. echo 'server {' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5743. echo ' listen 443 ssl;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5744. echo " root $OWNCLOUD_PATH;" >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5745. echo " server_name $OWNCLOUD_DOMAIN_NAME;" >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5746. echo ' access_log off;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5747. echo " error_log /var/log/nginx/${OWNCLOUD_DOMAIN_NAME}_error.log $WEBSERVER_LOG_LEVEL;" >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5748. echo '' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5749. nginx_limits $OWNCLOUD_DOMAIN_NAME '10G'
  5750. echo '' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5751. nginx_ssl $OWNCLOUD_DOMAIN_NAME
  5752. nginx_disable_sniffing $OWNCLOUD_DOMAIN_NAME
  5753. echo ' add_header Strict-Transport-Security max-age=15768000;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5754. echo ' # if you want to be able to access the site via HTTP' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5755. echo ' # then replace the above with the following:' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5756. echo ' # add_header Strict-Transport-Security "max-age=0;";' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5757. echo " # make sure webfinger and other well known services aren't blocked" >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5758. echo ' # by denying dot files and rewrite request to the front controller' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5759. echo ' location ^~ /.well-known/ {' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5760. echo ' allow all;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5761. echo ' }' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5762. echo '' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5763. echo ' fastcgi_buffers 64 4K;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5764. echo '' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5765. echo ' rewrite ^/caldav(.*)$ /remote.php/caldav$1 redirect;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5766. echo ' rewrite ^/carddav(.*)$ /remote.php/carddav$1 redirect;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5767. echo ' rewrite ^/webdav(.*)$ /remote.php/webdav$1 redirect;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5768. echo '' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5769. echo ' index index.php;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5770. echo ' error_page 403 /core/templates/403.php;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5771. echo ' error_page 404 /core/templates/404.php;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5772. echo '' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5773. echo ' location = /robots.txt {' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5774. echo ' allow all;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5775. echo ' log_not_found off;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5776. echo ' access_log off;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5777. echo ' }' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5778. echo '' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5779. echo ' location ~ ^/(data|config|\.ht|db_structure\.xml|README) {' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5780. echo ' deny all;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5781. echo ' }' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5782. echo '' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5783. echo ' location / {' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5784. echo ' # The following 2 rules are only needed with webfinger' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5785. echo ' rewrite ^/.well-known/host-meta /public.php?service=host-meta last;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5786. echo ' rewrite ^/.well-known/host-meta.json /public.php?service=host-meta-json last;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5787. echo ' rewrite ^/.well-known/carddav /remote.php/carddav/ redirect;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5788. echo ' rewrite ^/.well-known/caldav /remote.php/caldav/ redirect;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5789. echo ' rewrite ^(/core/doc/[^\/]+/)$ $1/index.html;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5790. echo ' try_files $uri $uri/ index.php;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5791. echo ' }' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5792. echo '' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5793. echo ' location ~ ^(.+?\.php)(/.*)?$ {' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5794. echo ' try_files $1 =404;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5795. echo ' fastcgi_split_path_info ^(.+\.php)(/.+)$;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5796. echo ' fastcgi_pass unix:/var/run/php5-fpm.sock;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5797. echo ' fastcgi_index index.php;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5798. echo ' include fastcgi_params;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5799. echo ' fastcgi_param SCRIPT_FILENAME $document_root$1;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5800. echo ' fastcgi_param PATH_INFO $2;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5801. echo ' fastcgi_param HTTPS on;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5802. echo ' }' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5803. echo '' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5804. echo ' # Optional: set long EXPIRES header on static assets' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5805. echo ' location ~* ^.+\.(jpg|jpeg|gif|bmp|ico|png|css|js|swf)$ {' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5806. echo ' expires 30d;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5807. echo " # Optional: Don't log access to assets" >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5808. echo ' access_log off;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5809. echo ' }' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5810. echo '}' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5811. echo '' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5812. else
  5813. echo -n '' > /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5814. fi
  5815. echo 'server {' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5816. echo " listen 127.0.0.1:${OWNCLOUD_ONION_PORT} default_server;" >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5817. echo " root $OWNCLOUD_PATH;" >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5818. echo " server_name $OWNCLOUD_DOMAIN_NAME;" >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5819. echo ' access_log off;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5820. echo " error_log /var/log/nginx/${OWNCLOUD_DOMAIN_NAME}_error.log $WEBSERVER_LOG_LEVEL;" >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5821. echo '' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5822. nginx_limits $OWNCLOUD_DOMAIN_NAME '10G'
  5823. nginx_disable_sniffing $OWNCLOUD_DOMAIN_NAME
  5824. echo ' add_header Strict-Transport-Security max-age=15768000;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5825. echo ' # if you want to be able to access the site via HTTP' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5826. echo ' # then replace the above with the following:' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5827. echo ' # add_header Strict-Transport-Security "max-age=0;";' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5828. echo " # make sure webfinger and other well known services aren't blocked" >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5829. echo ' # by denying dot files and rewrite request to the front controller' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5830. echo ' location ^~ /.well-known/ {' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5831. echo ' allow all;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5832. echo ' }' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5833. echo '' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5834. echo ' fastcgi_buffers 64 4K;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5835. echo '' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5836. echo ' rewrite ^/caldav(.*)$ /remote.php/caldav$1 redirect;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5837. echo ' rewrite ^/carddav(.*)$ /remote.php/carddav$1 redirect;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5838. echo ' rewrite ^/webdav(.*)$ /remote.php/webdav$1 redirect;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5839. echo '' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5840. echo ' index index.php;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5841. echo ' error_page 403 /core/templates/403.php;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5842. echo ' error_page 404 /core/templates/404.php;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5843. echo '' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5844. echo ' location = /robots.txt {' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5845. echo ' allow all;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5846. echo ' log_not_found off;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5847. echo ' access_log off;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5848. echo ' }' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5849. echo '' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5850. echo ' location ~ ^/(data|config|\.ht|db_structure\.xml|README) {' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5851. echo ' deny all;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5852. echo ' }' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5853. echo '' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5854. echo ' location / {' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5855. echo ' # The following 2 rules are only needed with webfinger' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5856. echo ' rewrite ^/.well-known/host-meta /public.php?service=host-meta last;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5857. echo ' rewrite ^/.well-known/host-meta.json /public.php?service=host-meta-json last;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5858. echo ' rewrite ^/.well-known/carddav /remote.php/carddav/ redirect;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5859. echo ' rewrite ^/.well-known/caldav /remote.php/caldav/ redirect;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5860. echo ' rewrite ^(/core/doc/[^\/]+/)$ $1/index.html;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5861. echo ' try_files $uri $uri/ index.php;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5862. echo ' }' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5863. echo '' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5864. echo ' location ~ ^(.+?\.php)(/.*)?$ {' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5865. echo ' try_files $1 =404;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5866. echo ' fastcgi_split_path_info ^(.+\.php)(/.+)$;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5867. echo ' fastcgi_pass unix:/var/run/php5-fpm.sock;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5868. echo ' fastcgi_index index.php;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5869. echo ' include fastcgi_params;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5870. echo ' fastcgi_param SCRIPT_FILENAME $document_root$1;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5871. echo ' fastcgi_param PATH_INFO $2;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5872. echo ' fastcgi_param HTTPS off;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5873. echo ' }' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5874. echo '' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5875. echo ' # Optional: set long EXPIRES header on static assets' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5876. echo ' location ~* ^.+\.(jpg|jpeg|gif|bmp|ico|png|css|js|swf)$ {' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5877. echo ' expires 30d;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5878. echo " # Optional: Don't log access to assets" >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5879. echo ' access_log off;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5880. echo ' }' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5881. echo '}' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  5882. configure_php
  5883. create_site_certificate $OWNCLOUD_DOMAIN_NAME
  5884. # Ensure that the database gets backed up locally, if remote
  5885. # backups are not being used
  5886. backup_databases_script_header
  5887. backup_database_local owncloud
  5888. nginx_ensite $OWNCLOUD_DOMAIN_NAME
  5889. OWNCLOUD_ONION_HOSTNAME=$(add_onion_service owncloud 80 ${OWNCLOUD_ONION_PORT})
  5890. systemctl restart php5-fpm
  5891. systemctl restart nginx
  5892. if ! grep -q "Owncloud onion domain" /home/$MY_USERNAME/README; then
  5893. echo "Owncloud onion domain: ${OWNCLOUD_ONION_HOSTNAME}" >> /home/$MY_USERNAME/README
  5894. echo '' >> /home/$MY_USERNAME/README
  5895. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
  5896. chmod 600 /home/$MY_USERNAME/README
  5897. fi
  5898. if ! grep -q "Owncloud onion domain" $COMPLETION_FILE; then
  5899. echo "Owncloud onion domain:${OWNCLOUD_ONION_HOSTNAME}" >> $COMPLETION_FILE
  5900. fi
  5901. add_ddns_domain $OWNCLOUD_DOMAIN_NAME
  5902. if ! grep -q "Owncloud domain" $COMPLETION_FILE; then
  5903. echo "Owncloud domain:$OWNCLOUD_DOMAIN_NAME" >> $COMPLETION_FILE
  5904. fi
  5905. upgrade_owncloud_finish
  5906. echo "<?php
  5907. \$AUTOCONFIG = array(
  5908. \"dbtype\" => \"mysql\",
  5909. \"dbname\" => \"owncloud\",
  5910. \"dbuser\" => \"root\",
  5911. \"dbpass\" => \"$MARIADB_PASSWORD\",
  5912. \"dbhost\" => \"localhost\",
  5913. \"dbtableprefix\" => \"\",
  5914. \"adminlogin\" => \"${MY_USERNAME}\",
  5915. \"adminpass\" => \"${OWNCLOUD_ADMIN_PASSWORD}\",
  5916. \"trusted_domains\" =>
  5917. array (
  5918. '${OWNCLOUD_DOMAIN_NAME}',
  5919. '${OWNCLOUD_ONION_HOSTNAME}',
  5920. ),
  5921. );" > $OWNCLOUD_PATH/config/autoconfig.php
  5922. echo 'install_owncloud_official_deb' >> $COMPLETION_FILE
  5923. if [[ $SYSTEM_TYPE == "$VARIANT_CLOUD" ]]; then
  5924. backup_to_friends_servers
  5925. intrusion_detection
  5926. split_gpg_key_into_fragments
  5927. # unmount any attached usb drive
  5928. if [ -d $USB_MOUNT ]; then
  5929. umount $USB_MOUNT
  5930. rm -rf $USB_MOUNT
  5931. fi
  5932. echo ''
  5933. echo "$OWNCLOUD_COMPLETION_MSG1"
  5934. echo "$OWNCLOUD_COMPLETION_MSG2"
  5935. exit 0
  5936. fi
  5937. }
  5938. function upgrade_golang {
  5939. 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
  5940. return
  5941. fi
  5942. # NOTE: this is annoyingly hacky and going in the opposite
  5943. # direction of a pure blend, but it's necessary if you want
  5944. # to run the latest version of gogs
  5945. # update to the next commit
  5946. set_repo_commit $INSTALL_DIR/gvm "gvm commit" "$GVM_COMMIT" $GVM_REPO
  5947. if grep -Fxq "upgrade_golang" $COMPLETION_FILE; then
  5948. return
  5949. fi
  5950. apt-get -y install curl git mercurial make binutils bison gcc build-essential
  5951. if [ ! -d $INSTALL_DIR ]; then
  5952. mkdir $INSTALL_DIR
  5953. fi
  5954. cd $INSTALL_DIR
  5955. git_clone $GVM_REPO gvm
  5956. cd $INSTALL_DIR/gvm
  5957. git checkout $GVM_COMMIT -b $GVM_COMMIT
  5958. if [ ! -f binscripts/gvm-installer ]; then
  5959. echo $'gvm installer not found'
  5960. fi
  5961. chmod +x binscripts/gvm-installer
  5962. # TODO: this script is all over the place
  5963. # and contains hardcoded github. See if you can do better
  5964. ./binscripts/gvm-installer
  5965. [[ -s "$HOME/.gvm/scripts/gvm" ]] && source "$HOME/.gvm/scripts/gvm"
  5966. gvm install go1.4
  5967. gvm use go1.4
  5968. export GOROOT_BOOTSTRAP=$GOROOT
  5969. gvm install go1.5
  5970. if [ ! "$?" = "0" ]; then
  5971. echo $'Unable to upgrade golang'
  5972. exit 529252
  5973. fi
  5974. gvm use go1.5 --default
  5975. if ! grep -q "gvm commit" $COMPLETION_FILE; then
  5976. echo "gvm commit:$GVM_COMMIT" >> $COMPLETION_FILE
  5977. else
  5978. sed -i "s/gvm commit.*/gvm commit:$GVM_COMMIT/g" $COMPLETION_FILE
  5979. fi
  5980. echo 'upgrade_golang' >> $COMPLETION_FILE
  5981. }
  5982. function install_gogs {
  5983. 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
  5984. return
  5985. fi
  5986. if [ ! $GIT_DOMAIN_NAME ]; then
  5987. return
  5988. fi
  5989. export GOPATH=/home/git/go
  5990. systemctl set-environment GOPATH=/home/git/go
  5991. # update to the next commit
  5992. set_repo_commit $GOPATH/src/github.com/gogits/gogs "Gogs commit" "$GOGS_COMMIT" $GIT_DOMAIN_REPO
  5993. if grep -Fxq "install_gogs" $COMPLETION_FILE; then
  5994. return
  5995. fi
  5996. # http://gogs.io/docs/installation/install_from_source.md
  5997. # add a gogs user account
  5998. adduser --disabled-login --gecos 'Gogs' git
  5999. # install Go
  6000. apt-get -y install golang libpam0g-dev
  6001. if ! grep -q "export GOPATH=/home/git/go" ~/.bashrc; then
  6002. echo 'export GOPATH=/home/git/go' >> ~/.bashrc
  6003. echo 'systemctl set-environment GOPATH=/home/git/go' >> ~/.bashrc
  6004. fi
  6005. if [ ! -d $GOPATH ]; then
  6006. mkdir -p $GOPATH
  6007. fi
  6008. GO_PACKAGE_MANAGER_REPO2=$(echo "$GO_PACKAGE_MANAGER_REPO" | sed 's|https://||g')
  6009. go get -u $GO_PACKAGE_MANAGER_REPO2
  6010. if [ ! "$?" = "0" ]; then
  6011. echo $'install_gogs: go get failed'
  6012. exit 479832
  6013. fi
  6014. # clone the repo
  6015. if [ ! -d $GOPATH/src/github.com/gogits ]; then
  6016. mkdir -p $GOPATH/src/github.com/gogits
  6017. fi
  6018. git_clone $GIT_DOMAIN_REPO $GOPATH/src/github.com/gogits/gogs
  6019. if [ ! -d $GOPATH/src/github.com/gogits/gogs ]; then
  6020. echo $"Unable to clone repo $GOPATH/src/github.com/gogits/gogs"
  6021. exit 85482
  6022. fi
  6023. cd $GOPATH/src/github.com/gogits/gogs
  6024. # install
  6025. go get -u ./...
  6026. git checkout $GOGS_COMMIT -b $GOGS_COMMIT
  6027. if ! grep -q "Gogs commit" $COMPLETION_FILE; then
  6028. echo "Gogs commit:$GOGS_COMMIT" >> $COMPLETION_FILE
  6029. else
  6030. sed -i "s/Gogs commit.*/Gogs commit:$GOGS_COMMIT/g" $COMPLETION_FILE
  6031. fi
  6032. go build
  6033. if [ ! "$?" = "0" ]; then
  6034. echo $'install_gogs: go build failed'
  6035. exit 546750
  6036. fi
  6037. install_mariadb
  6038. get_mariadb_password
  6039. get_mariadb_git_admin_password
  6040. if [ ! $GIT_ADMIN_PASSWORD ]; then
  6041. if [ -f $IMAGE_PASSWORD_FILE ]; then
  6042. GIT_ADMIN_PASSWORD="$(printf `cat $IMAGE_PASSWORD_FILE`)"
  6043. else
  6044. GIT_ADMIN_PASSWORD="$(openssl rand -base64 32 | cut -c1-30)"
  6045. fi
  6046. fi
  6047. if ! grep -q $"Gogs admin user password" /home/$MY_USERNAME/README; then
  6048. echo '' >> /home/$MY_USERNAME/README
  6049. echo '' >> /home/$MY_USERNAME/README
  6050. echo 'Gogs' >> /home/$MY_USERNAME/README
  6051. echo '====' >> /home/$MY_USERNAME/README
  6052. echo $'Database type: MySql' >> /home/$MY_USERNAME/README
  6053. echo $'Database host: 127.0.0.1:3306' >> /home/$MY_USERNAME/README
  6054. echo $'Database user: root' >> /home/$MY_USERNAME/README
  6055. echo $"Database password: $MARIADB_PASSWORD" >> /home/$MY_USERNAME/README
  6056. echo $'Database name: gogs' >> /home/$MY_USERNAME/README
  6057. echo $'Gogs admin user: gogsadmin' >> /home/$MY_USERNAME/README
  6058. echo $"Gogs admin user password: $GIT_ADMIN_PASSWORD" >> /home/$MY_USERNAME/README
  6059. echo $"Gogs admin user email: $MY_EMAIL_ADDRESS" >> /home/$MY_USERNAME/README
  6060. echo '' >> /home/$MY_USERNAME/README
  6061. echo $'Install Steps For First-time Run:' >> /home/$MY_USERNAME/README
  6062. echo $'Leave email service settings empty' >> /home/$MY_USERNAME/README
  6063. echo $'Check "Enable Register Confirmation"' >> /home/$MY_USERNAME/README
  6064. echo $'Check "Enable Mail Notification"' >> /home/$MY_USERNAME/README
  6065. echo '' >> /home/$MY_USERNAME/README
  6066. echo $'After the initial install edit /home/git/go/src/github.com/gogits/gogs/custom/conf/app.ini' >> /home/$MY_USERNAME/README
  6067. echo $'and within the [server] section set:' >> /home/$MY_USERNAME/README
  6068. echo " DOMAIN = $GIT_DOMAIN_NAME" >> /home/$MY_USERNAME/README
  6069. echo " ROOT_URL = http://$GIT_DOMAIN_NAME/" >> /home/$MY_USERNAME/README
  6070. echo " SSH_PORT = $SSH_PORT" >> /home/$MY_USERNAME/README
  6071. echo $'If you want to disable new account registrations then append the following:' >> /home/$MY_USERNAME/README
  6072. echo ' [service]' >> /home/$MY_USERNAME/README
  6073. echo ' DISABLE_REGISTRATION = true' >> /home/$MY_USERNAME/README
  6074. echo $'Then restart with:' >> /home/$MY_USERNAME/README
  6075. echo ' systemctl restart gogs' >> /home/$MY_USERNAME/README
  6076. echo '' >> /home/$MY_USERNAME/README
  6077. echo $"Note that there's a usability/security trade-off made here." >> /home/$MY_USERNAME/README
  6078. echo $"In order to allow git clone via http we don't redirect everything" >> /home/$MY_USERNAME/README
  6079. echo $'over https. Instead only critical things such as user login,' >> /home/$MY_USERNAME/README
  6080. echo $'settings and admin are encrypted.' >> /home/$MY_USERNAME/README
  6081. echo $'There are also potential security issues with cloning/pulling/pushing' >> /home/$MY_USERNAME/README
  6082. echo $'code over http, since a determined adversary could inject malware' >> /home/$MY_USERNAME/README
  6083. echo $'into the stream as it passes, so beware.' >> /home/$MY_USERNAME/README
  6084. echo $'If you have a bought domain and a non-self signed cert then you' >> /home/$MY_USERNAME/README
  6085. echo $"should change /etc/nginx/sites-available/$GIT_DOMAIN_NAME to redirect everything over https." >> /home/$MY_USERNAME/README
  6086. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
  6087. chmod 600 /home/$MY_USERNAME/README
  6088. fi
  6089. create_database gogs "$GOGS_ADMIN_PASSWORD"
  6090. chmod 600 /home/git/go/src/github.com/gogits/gogs/custom/conf/app.ini
  6091. chown -R git:git /home/git
  6092. cp $GOPATH/src/github.com/gogits/gogs/scripts/systemd/gogs.service /etc/systemd/system
  6093. sed -i 's|#After=mysqld.service|After=mysqld.service|g' /etc/systemd/system/gogs.service
  6094. sed -i "s|WorkingDirectory=.*|WorkingDirectory=$GOPATH/src/github.com/gogits/gogs|g" /etc/systemd/system/gogs.service
  6095. sed -i "s|ExecStart=.*|ExecStart=$GOPATH/src/github.com/gogits/gogs/gogs web|g" /etc/systemd/system/gogs.service
  6096. sed -i "s|Environment.*|Environment=\"USER=git\" \"HOME=/home/git\" \"GOPATH=/home/git/go\"|g" /etc/systemd/system/gogs.service
  6097. systemctl enable gogs
  6098. systemctl daemon-reload
  6099. systemctl restart gogs
  6100. if [ ! -d /var/www/$GIT_DOMAIN_NAME ]; then
  6101. mkdir /var/www/$GIT_DOMAIN_NAME
  6102. fi
  6103. if [ -d /var/www/$GIT_DOMAIN_NAME/htdocs ]; then
  6104. rm -rf /var/www/$GIT_DOMAIN_NAME/htdocs
  6105. fi
  6106. if [[ $ONION_ONLY == "no" ]]; then
  6107. echo 'server {' > /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6108. echo ' listen 80;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6109. echo " server_name $GIT_DOMAIN_NAME;" >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6110. echo ' access_log off;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6111. echo " error_log /var/log/nginx/${GIT_DOMAIN_NAME}_error.log $WEBSERVER_LOG_LEVEL;" >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6112. nginx_disable_sniffing $GIT_DOMAIN_NAME
  6113. nginx_limits $GIT_DOMAIN_NAME
  6114. echo ' location / {' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6115. echo ' proxy_pass http://localhost:3000;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6116. echo ' }' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6117. echo ' location ^~ /user/ {' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6118. echo ' rewrite ^ https://$server_name$request_uri?;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6119. echo ' }' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6120. echo ' location ^~ /admin/ {' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6121. echo ' rewrite ^ https://$server_name$request_uri?;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6122. echo ' }' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6123. echo '}' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6124. echo '' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6125. echo 'server {' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6126. echo ' listen 443 ssl;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6127. echo " root /var/www/$GIT_DOMAIN_NAME/htdocs;" >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6128. echo " server_name $GIT_DOMAIN_NAME;" >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6129. echo ' access_log off;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6130. echo " error_log /var/log/nginx/${GIT_DOMAIN_NAME}_error.log $WEBSERVER_LOG_LEVEL;" >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6131. echo '' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6132. nginx_limits $GIT_DOMAIN_NAME '10G'
  6133. nginx_ssl $GIT_DOMAIN_NAME
  6134. nginx_disable_sniffing $GIT_DOMAIN_NAME
  6135. echo ' add_header Strict-Transport-Security max-age=0;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6136. echo '' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6137. echo ' location / {' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6138. echo ' proxy_pass http://localhost:3000;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6139. echo ' }' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6140. echo '' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6141. echo ' fastcgi_buffers 64 4K;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6142. echo '' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6143. echo ' error_page 403 /core/templates/403.php;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6144. echo ' error_page 404 /core/templates/404.php;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6145. echo '' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6146. echo ' location = /robots.txt {' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6147. echo ' allow all;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6148. echo ' log_not_found off;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6149. echo ' access_log off;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6150. echo ' }' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6151. echo '}' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6152. echo '' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6153. else
  6154. echo -n '' > /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6155. fi
  6156. echo 'server {' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6157. echo " listen 127.0.0.1:${GIT_ONION_PORT} default_server;" >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6158. echo " root /var/www/$GIT_DOMAIN_NAME/htdocs;" >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6159. echo " server_name $GIT_DOMAIN_NAME;" >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6160. echo ' access_log off;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6161. echo " error_log /var/log/nginx/${GIT_DOMAIN_NAME}_error.log $WEBSERVER_LOG_LEVEL;" >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6162. echo '' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6163. nginx_limits $GIT_DOMAIN_NAME '10G'
  6164. nginx_disable_sniffing $GIT_DOMAIN_NAME
  6165. echo ' add_header Strict-Transport-Security max-age=0;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6166. echo '' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6167. echo ' location / {' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6168. echo ' proxy_pass http://localhost:3000;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6169. echo ' }' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6170. echo '' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6171. echo ' fastcgi_buffers 64 4K;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6172. echo '' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6173. echo ' error_page 403 /core/templates/403.php;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6174. echo ' error_page 404 /core/templates/404.php;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6175. echo '' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6176. echo ' location = /robots.txt {' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6177. echo ' allow all;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6178. echo ' log_not_found off;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6179. echo ' access_log off;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6180. echo ' }' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6181. echo '}' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
  6182. configure_php
  6183. create_site_certificate $GIT_DOMAIN_NAME
  6184. nginx_ensite $GIT_DOMAIN_NAME
  6185. if [ ! -d /var/lib/tor ]; then
  6186. echo $'No Tor installation found. Gogs onion site cannot be configured.'
  6187. exit 877367
  6188. fi
  6189. if ! grep -q "hidden_service_gogs" /etc/tor/torrc; then
  6190. echo 'HiddenServiceDir /var/lib/tor/hidden_service_gogs/' >> /etc/tor/torrc
  6191. echo "HiddenServicePort 80 127.0.0.1:${GIT_ONION_PORT}" >> /etc/tor/torrc
  6192. echo "HiddenServicePort 9418 127.0.0.1:9418" >> /etc/tor/torrc
  6193. echo $'Added onion site for Gogs'
  6194. fi
  6195. systemctl restart tor
  6196. wait_for_onion_service 'gogs'
  6197. GIT_ONION_HOSTNAME=$(cat /var/lib/tor/hidden_service_gogs/hostname)
  6198. systemctl restart php5-fpm
  6199. systemctl restart nginx
  6200. if ! grep -q "Gogs onion domain" /home/$MY_USERNAME/README; then
  6201. echo "Gogs onion domain: ${GIT_ONION_HOSTNAME}" >> /home/$MY_USERNAME/README
  6202. echo '' >> /home/$MY_USERNAME/README
  6203. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
  6204. chmod 600 /home/$MY_USERNAME/README
  6205. fi
  6206. if ! grep -q "Gogs onion domain" $COMPLETION_FILE; then
  6207. echo "Gogs onion domain:${GIT_ONION_HOSTNAME}" >> $COMPLETION_FILE
  6208. fi
  6209. add_ddns_domain $GIT_DOMAIN_NAME
  6210. echo "Gogs domain:$GIT_DOMAIN_NAME" >> $COMPLETION_FILE
  6211. echo 'install_gogs' >> $COMPLETION_FILE
  6212. }
  6213. function tox_avahi {
  6214. if [[ $SYSTEM_TYPE != "$VARIANT_MESH" ]]; then
  6215. return
  6216. fi
  6217. if grep -Fxq "tox_avahi" $COMPLETION_FILE; then
  6218. return
  6219. fi
  6220. if [ ! -d /etc/avahi ]; then
  6221. echo $'tox_avahi: avahi is not installed'
  6222. exit 87359
  6223. fi
  6224. # install a command to obtain the Tox ID
  6225. cd $INSTALL_DIR
  6226. git_clone $TOXID_REPO $INSTALL_DIR/toxid
  6227. if [ ! -d $INSTALL_DIR/toxid ]; then
  6228. exit 63921
  6229. fi
  6230. cd $INSTALL_DIR/toxid
  6231. make
  6232. if [ ! "$?" = "0" ]; then
  6233. exit 58432
  6234. fi
  6235. make install
  6236. toxavahi
  6237. # publish regularly
  6238. if ! grep -q "toxavahi" /etc/crontab; then
  6239. echo "* * * * * root toxavahi > /dev/null" >> /etc/crontab
  6240. fi
  6241. systemctl restart avahi-daemon
  6242. echo 'tox_avahi' >> $COMPLETION_FILE
  6243. }
  6244. function install_tox_node {
  6245. 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
  6246. return
  6247. fi
  6248. # update to the next commit
  6249. set_repo_commit $INSTALL_DIR/toxcore "toxcore commit" "$TOX_COMMIT" $TOX_REPO
  6250. if grep -Fxq "install_tox_node" $COMPLETION_FILE; then
  6251. return
  6252. fi
  6253. ${PROJECT_NAME}-mesh-install -f tox_node
  6254. TOX_ONION_HOSTNAME=$(add_onion_service tox ${TOX_PORT} ${TOX_PORT})
  6255. if ! grep -q "tox onion domain" $COMPLETION_FILE; then
  6256. echo "tox onion domain:${TOX_ONION_HOSTNAME}" >> $COMPLETION_FILE
  6257. else
  6258. sed -i "s|tox onion domain.*|tox onion domain:${TOX_ONION_HOSTNAME}|g" $COMPLETION_FILE
  6259. fi
  6260. systemctl restart tox-bootstrapd.service
  6261. TOX_PUBLIC_KEY=$(cat /var/log/syslog | grep tox | grep "Public Key" | awk -F ' ' '{print $8}' | tail -1)
  6262. if [ ${#TOX_PUBLIC_KEY} -lt 30 ]; then
  6263. echo $'Could not obtain the tox node public key'
  6264. exit 6529
  6265. fi
  6266. # save the public key for later reference
  6267. echo "$TOX_PUBLIC_KEY" > $TOX_BOOTSTRAP_ID_FILE
  6268. configure_firewall_for_tox
  6269. if ! grep -q $"Your Tox node public key is" /home/$MY_USERNAME/README; then
  6270. echo '' >> /home/$MY_USERNAME/README
  6271. echo '' >> /home/$MY_USERNAME/README
  6272. echo 'Tox' >> /home/$MY_USERNAME/README
  6273. echo '===' >> /home/$MY_USERNAME/README
  6274. echo $"tox onion domain: ${TOX_ONION_HOSTNAME}" >> /home/$MY_USERNAME/README
  6275. echo $"Your Tox node public key is: $TOX_PUBLIC_KEY" >> /home/$MY_USERNAME/README
  6276. echo $'In the Toxic client you can connect to it with:' >> /home/$MY_USERNAME/README
  6277. echo " /connect $DEFAULT_DOMAIN_NAME.local $TOX_PORT $TOX_PUBLIC_KEY" >> /home/$MY_USERNAME/README
  6278. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
  6279. chmod 600 /home/$MY_USERNAME/README
  6280. fi
  6281. echo 'install_tox_node' >> $COMPLETION_FILE
  6282. }
  6283. function install_tox_client {
  6284. 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
  6285. return
  6286. fi
  6287. # update to the next commit
  6288. set_repo_commit $INSTALL_DIR/toxic "Toxic commit" "$TOXIC_COMMIT" $TOXIC_REPO
  6289. if grep -Fxq "install_tox_client" $COMPLETION_FILE; then
  6290. return
  6291. fi
  6292. ${PROJECT_NAME}-mesh-install tox_client
  6293. # initial setup of username
  6294. su -c "echo 'n
  6295. /nick $MY_USERNAME
  6296. /exit
  6297. ' | /usr/bin/toxic -d" - $MY_USERNAME
  6298. echo 'install_tox_client' >> $COMPLETION_FILE
  6299. }
  6300. function install_xmpp {
  6301. 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
  6302. return
  6303. fi
  6304. if grep -Fxq "install_xmpp" $COMPLETION_FILE; then
  6305. return
  6306. fi
  6307. apt-get -y install lua-sec lua-bitop
  6308. apt-get -y install prosody prosody-modules mercurial
  6309. if [ ! -d /etc/prosody ]; then
  6310. echo $"ERROR: prosody does not appear to have installed. $CHECK_MESSAGE"
  6311. exit 52
  6312. fi
  6313. # obtain the prosody modules
  6314. cd $INSTALL_DIR
  6315. hg clone https://hg.prosody.im/prosody-modules/ prosody-modules
  6316. if [ ! -d $INSTALL_DIR/prosody-modules/mod_onions ]; then
  6317. echo $'mod_onions prosody module could not be found'
  6318. exit 73254
  6319. fi
  6320. # install the onions module
  6321. cp $INSTALL_DIR/prosody-modules/mod_onions/mod_onions.lua /usr/lib/prosody/modules/mod_onions.lua
  6322. if [ ! -f /usr/lib/prosody/modules/mod_onions.lua ]; then
  6323. echo $'mod_onions.lua could not be copied to the prosody modules directory'
  6324. exit 63952
  6325. fi
  6326. # create a certificate
  6327. if [ ! -f /etc/ssl/certs/xmpp.dhparam ]; then
  6328. ${PROJECT_NAME}-addcert -h xmpp --dhkey $DH_KEYLENGTH
  6329. check_certificates xmpp
  6330. fi
  6331. chown prosody:prosody /etc/ssl/private/xmpp.key
  6332. chown prosody:prosody /etc/ssl/certs/xmpp.*
  6333. cp -a /etc/prosody/conf.avail/example.com.cfg.lua /etc/prosody/conf.avail/xmpp.cfg.lua
  6334. sed -i 's|/etc/prosody/certs/example.com.key|/etc/ssl/private/xmpp.key|g' /etc/prosody/conf.avail/xmpp.cfg.lua
  6335. sed -i 's|/etc/prosody/certs/example.com.crt|/etc/ssl/certs/xmpp.crt|g' /etc/prosody/conf.avail/xmpp.cfg.lua
  6336. if ! grep -q "xmpp.dhparam" /etc/prosody/conf.avail/xmpp.cfg.lua; then
  6337. sed -i '/certificate =/a\ dhparam = "/etc/ssl/certs/xmpp.dhparam";' /etc/prosody/conf.avail/xmpp.cfg.lua
  6338. fi
  6339. if ! grep -q 'options = {"no_sslv2", "no_sslv3" }' /etc/prosody/conf.avail/xmpp.cfg.lua; then
  6340. sed -i '/certificate =/a\ options = {"no_sslv2", "no_sslv3" };' /etc/prosody/conf.avail/xmpp.cfg.lua
  6341. fi
  6342. if ! grep -q 'ciphers =' /etc/prosody/conf.avail/xmpp.cfg.lua; then
  6343. sed -i "/certificate =/a\ ciphers = $XMPP_CIPHERS;" /etc/prosody/conf.avail/xmpp.cfg.lua
  6344. fi
  6345. if ! grep -q 'depth = "1";' /etc/prosody/conf.avail/xmpp.cfg.lua; then
  6346. sed -i '/certificate =/a\ depth = "1";' /etc/prosody/conf.avail/xmpp.cfg.lua
  6347. fi
  6348. if ! grep -q 'curve =' /etc/prosody/conf.avail/xmpp.cfg.lua; then
  6349. sed -i "/certificate =/a\ curve = $XMPP_ECC_CURVE;" /etc/prosody/conf.avail/xmpp.cfg.lua
  6350. fi
  6351. sed -i "s/example.com/$DEFAULT_DOMAIN_NAME/g" /etc/prosody/conf.avail/xmpp.cfg.lua
  6352. sed -i 's/enabled = false -- Remove this line to enable this host//g' /etc/prosody/conf.avail/xmpp.cfg.lua
  6353. if ! grep -q "modules_enabled" /etc/prosody/conf.avail/xmpp.cfg.lua; then
  6354. echo '' >> /etc/prosody/conf.avail/xmpp.cfg.lua
  6355. echo 'modules_enabled = {' >> /etc/prosody/conf.avail/xmpp.cfg.lua
  6356. echo ' "bosh"; -- Enable mod_bosh' >> /etc/prosody/conf.avail/xmpp.cfg.lua
  6357. echo ' "tls"; -- Enable mod_tls' >> /etc/prosody/conf.avail/xmpp.cfg.lua
  6358. echo ' "saslauth"; -- Enable mod_saslauth' >> /etc/prosody/conf.avail/xmpp.cfg.lua
  6359. echo ' "onions"; -- Enable chat via onion service' >> /etc/prosody/conf.avail/xmpp.cfg.lua
  6360. echo '}' >> /etc/prosody/conf.avail/xmpp.cfg.lua
  6361. echo '' >> /etc/prosody/conf.avail/xmpp.cfg.lua
  6362. echo 'c2s_require_encryption = true' >> /etc/prosody/conf.avail/xmpp.cfg.lua
  6363. echo 's2s_require_encryption = true' >> /etc/prosody/conf.avail/xmpp.cfg.lua
  6364. echo 'allow_unencrypted_plain_auth = false' >> /etc/prosody/conf.avail/xmpp.cfg.lua
  6365. fi
  6366. ln -sf /etc/prosody/conf.avail/xmpp.cfg.lua /etc/prosody/conf.d/xmpp.cfg.lua
  6367. sed -i 's|/etc/prosody/certs/localhost.key|/etc/ssl/private/xmpp.key|g' /etc/prosody/prosody.cfg.lua
  6368. sed -i 's|/etc/prosody/certs/localhost.crt|/etc/ssl/certs/xmpp.crt|g' /etc/prosody/prosody.cfg.lua
  6369. if ! grep -q "xmpp.dhparam" /etc/prosody/prosody.cfg.lua; then
  6370. sed -i '/certificate =/a\ dhparam = "/etc/ssl/certs/xmpp.dhparam";' /etc/prosody/prosody.cfg.lua
  6371. fi
  6372. if ! grep -q 'options = {"no_sslv2", "no_sslv3" }' /etc/prosody/prosody.cfg.lua; then
  6373. sed -i '/certificate =/a\ options = {"no_sslv2", "no_sslv3" };' /etc/prosody/prosody.cfg.lua
  6374. fi
  6375. if ! grep -q 'ciphers =' /etc/prosody/prosody.cfg.lua; then
  6376. sed -i "/certificate =/a\ ciphers = $XMPP_CIPHERS;" /etc/prosody/prosody.cfg.lua
  6377. fi
  6378. if ! grep -q 'depth = "1";' /etc/prosody/prosody.cfg.lua; then
  6379. sed -i '/certificate =/a\ depth = "1";' /etc/prosody/prosody.cfg.lua
  6380. fi
  6381. if ! grep -q 'curve =' /etc/prosody/prosody.cfg.lua; then
  6382. sed -i "/certificate =/a\ curve = $XMPP_ECC_CURVE;" /etc/prosody/prosody.cfg.lua
  6383. fi
  6384. sed -i 's/c2s_require_encryption = false/c2s_require_encryption = true/g' /etc/prosody/prosody.cfg.lua
  6385. if ! grep -q "s2s_require_encryption" /etc/prosody/prosody.cfg.lua; then
  6386. sed -i '/c2s_require_encryption/a\s2s_require_encryption = true' /etc/prosody/prosody.cfg.lua
  6387. fi
  6388. if ! grep -q "allow_unencrypted_plain_auth" /etc/prosody/prosody.cfg.lua; then
  6389. echo 'allow_unencrypted_plain_auth = false' >> /etc/prosody/conf.avail/xmpp.cfg.lua
  6390. fi
  6391. sed -i 's/--"bosh";/"bosh";/g' /etc/prosody/prosody.cfg.lua
  6392. sed -i 's/authentication = "internal_plain"/authentication = "internal_hashed"/g' /etc/prosody/prosody.cfg.lua
  6393. sed -i 's/enabled = false -- Remove this line to enable this host//g' /etc/prosody/prosody.cfg.lua
  6394. sed -i 's|key = "/etc/prosody/certs/example.com.key"|key = "/etc/ssl/private/xmpp.key"|g' /etc/prosody/prosody.cfg.lua
  6395. sed -i 's|certificate = "/etc/prosody/certs/example.com.crt"|certificate = "/etc/ssl/certs/xmpp.crt"|g' /etc/prosody/prosody.cfg.lua
  6396. sed -i "s/example.com/$DEFAULT_DOMAIN_NAME/g" /etc/prosody/prosody.cfg.lua
  6397. systemctl restart prosody
  6398. touch /home/$MY_USERNAME/README
  6399. if [ ! -d /var/lib/tor ]; then
  6400. echo $'No Tor installation found. XMPP onion site cannot be configured.'
  6401. exit 877367
  6402. fi
  6403. if ! grep -q "hidden_service_xmpp" /etc/tor/torrc; then
  6404. echo 'HiddenServiceDir /var/lib/tor/hidden_service_xmpp/' >> /etc/tor/torrc
  6405. echo "HiddenServicePort 5222 127.0.0.1:5222" >> /etc/tor/torrc
  6406. echo "HiddenServicePort 5269 127.0.0.1:5269" >> /etc/tor/torrc
  6407. echo $'Added onion site for XMPP chat'
  6408. fi
  6409. systemctl restart tor
  6410. wait_for_onion_service 'xmpp'
  6411. if [ ! -f /var/lib/tor/hidden_service_xmpp/hostname ]; then
  6412. echo $'XMPP onion site hostname not found'
  6413. exit 65349
  6414. fi
  6415. XMPP_ONION_HOSTNAME=$(cat /var/lib/tor/hidden_service_xmpp/hostname)
  6416. if ! grep -q "${XMPP_ONION_HOSTNAME}" /etc/prosody/conf.avail/xmpp.cfg.lua; then
  6417. echo '' >> /etc/prosody/conf.avail/xmpp.cfg.lua
  6418. echo "VirtualHost \"${XMPP_ONION_HOSTNAME}\"" >> /etc/prosody/conf.avail/xmpp.cfg.lua
  6419. echo ' modules_enabled = { "onions" };' >> /etc/prosody/conf.avail/xmpp.cfg.lua
  6420. fi
  6421. if ! grep -q "XMPP onion domain" $COMPLETION_FILE; then
  6422. echo "XMPP onion domain:${XMPP_ONION_HOSTNAME}" >> $COMPLETION_FILE
  6423. else
  6424. sed -i "s|XMPP onion domain.*|XMPP onion domain:${XMPP_ONION_HOSTNAME}|g" $COMPLETION_FILE
  6425. fi
  6426. if ! grep -q "Your XMPP password is" /home/$MY_USERNAME/README; then
  6427. if [ ${#XMPP_PASSWORD} -lt 8 ]; then
  6428. if [ -f $IMAGE_PASSWORD_FILE ]; then
  6429. XMPP_PASSWORD="$(printf `cat $IMAGE_PASSWORD_FILE`)"
  6430. else
  6431. XMPP_PASSWORD="$(openssl rand -base64 10 | cut -c1-8)"
  6432. fi
  6433. fi
  6434. prosodyctl register $MY_USERNAME $DEFAULT_DOMAIN_NAME $XMPP_PASSWORD
  6435. echo '' >> /home/$MY_USERNAME/README
  6436. echo '' >> /home/$MY_USERNAME/README
  6437. echo $'XMPP' >> /home/$MY_USERNAME/README
  6438. echo '====' >> /home/$MY_USERNAME/README
  6439. echo $"XMPP onion domain: ${XMPP_ONION_HOSTNAME}" >> /home/$MY_USERNAME/README
  6440. echo $"Your XMPP password is: $XMPP_PASSWORD" >> /home/$MY_USERNAME/README
  6441. echo $'You can change it with: ' >> /home/$MY_USERNAME/README
  6442. echo '' >> /home/$MY_USERNAME/README
  6443. echo " prosodyctl passwd $MY_EMAIL_ADDRESS" >> /home/$MY_USERNAME/README
  6444. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
  6445. chmod 600 /home/$MY_USERNAME/README
  6446. fi
  6447. echo 'install_xmpp' >> $COMPLETION_FILE
  6448. }
  6449. function install_xmpp_client {
  6450. 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
  6451. return
  6452. fi
  6453. if grep -Fxq "install_xmpp_client" $COMPLETION_FILE; then
  6454. return
  6455. fi
  6456. apt-get -y install profanity
  6457. XMPP_CLIENT_DIR=/home/$MY_USERNAME/.local/share/profanity
  6458. XMPP_CLIENT_ACCOUNTS=$XMPP_CLIENT_DIR/accounts
  6459. if [ ! -d $XMPP_CLIENT_DIR ]; then
  6460. mkdir -p $XMPP_CLIENT_DIR
  6461. fi
  6462. if [[ $ONION_ONLY == 'no' ]]; then
  6463. echo "[${MY_USERNAME}@${DEFAULT_DOMAIN_NAME}]" > $XMPP_CLIENT_ACCOUNTS
  6464. echo 'enabled=true' >> $XMPP_CLIENT_ACCOUNTS
  6465. echo "jid=${MY_USERNAME}@${DEFAULT_DOMAIN_NAME}" >> $XMPP_CLIENT_ACCOUNTS
  6466. echo 'resource=profanity' >> $XMPP_CLIENT_ACCOUNTS
  6467. echo "muc.service=conference.${DEFAULT_DOMAIN_NAME}" >> $XMPP_CLIENT_ACCOUNTS
  6468. echo "muc.nick=${MY_USERNAME}" >> $XMPP_CLIENT_ACCOUNTS
  6469. echo 'presence.last=online' >> $XMPP_CLIENT_ACCOUNTS
  6470. echo 'presence.login=online' >> $XMPP_CLIENT_ACCOUNTS
  6471. echo 'priority.online=0' >> $XMPP_CLIENT_ACCOUNTS
  6472. echo 'priority.chat=0' >> $XMPP_CLIENT_ACCOUNTS
  6473. echo 'priority.away=0' >> $XMPP_CLIENT_ACCOUNTS
  6474. echo 'priority.xa=0' >> $XMPP_CLIENT_ACCOUNTS
  6475. echo 'priority.dnd=0' >> $XMPP_CLIENT_ACCOUNTS
  6476. if [ ${#XMPP_PASSWORD} -gt 2 ]; then
  6477. echo "password=$XMPP_PASSWORD" >> $XMPP_CLIENT_ACCOUNTS
  6478. fi
  6479. fi
  6480. if [ -f /var/lib/tor/hidden_service_xmpp/hostname ]; then
  6481. XMPP_ONION_HOSTNAME=$(cat /var/lib/tor/hidden_service_xmpp/hostname)
  6482. echo "[${MY_USERNAME}@${XMPP_ONION_HOSTNAME}]" >> $XMPP_CLIENT_ACCOUNTS
  6483. if [[ $ONION_ONLY == 'no' ]]; then
  6484. echo 'enabled=false' >> $XMPP_CLIENT_ACCOUNTS
  6485. else
  6486. echo 'enabled=true' >> $XMPP_CLIENT_ACCOUNTS
  6487. fi
  6488. echo "jid=${MY_USERNAME}@${XMPP_ONION_HOSTNAME}" >> $XMPP_CLIENT_ACCOUNTS
  6489. echo 'resource=profanity' >> $XMPP_CLIENT_ACCOUNTS
  6490. echo "muc.service=conference.${XMPP_ONION_HOSTNAME}" >> $XMPP_CLIENT_ACCOUNTS
  6491. echo "muc.nick=${MY_USERNAME}" >> $XMPP_CLIENT_ACCOUNTS
  6492. echo 'presence.last=online' >> $XMPP_CLIENT_ACCOUNTS
  6493. echo 'presence.login=online' >> $XMPP_CLIENT_ACCOUNTS
  6494. echo 'priority.online=0' >> $XMPP_CLIENT_ACCOUNTS
  6495. echo 'priority.chat=0' >> $XMPP_CLIENT_ACCOUNTS
  6496. echo 'priority.away=0' >> $XMPP_CLIENT_ACCOUNTS
  6497. echo 'priority.xa=0' >> $XMPP_CLIENT_ACCOUNTS
  6498. echo 'priority.dnd=0' >> $XMPP_CLIENT_ACCOUNTS
  6499. if [ ${#XMPP_PASSWORD} -gt 2 ]; then
  6500. echo "password=$XMPP_PASSWORD" >> $XMPP_CLIENT_ACCOUNTS
  6501. fi
  6502. fi
  6503. if [ ! -d /home/$MY_USERNAME/.config/profanity ]; then
  6504. mkdir /home/$MY_USERNAME/.config/profanity
  6505. fi
  6506. echo '[connection]' > /home/$MY_USERNAME/.config/profanity/profrc
  6507. echo "account=${MY_USERNAME}@${DEFAULT_DOMAIN_NAME}" >> /home/$MY_USERNAME/.config/profanity/profrc
  6508. chown -R $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.local
  6509. chown -R $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.config
  6510. echo 'install_xmpp_client' >> $COMPLETION_FILE
  6511. }
  6512. function install_watchdog_script {
  6513. if grep -Fxq "install_watchdog_script" $COMPLETION_FILE; then
  6514. return
  6515. fi
  6516. echo '#!/bin/bash' > /usr/bin/$WATCHDOG_SCRIPT_NAME
  6517. echo 'LOGFILE=/var/log/keepon.log' >> /usr/bin/$WATCHDOG_SCRIPT_NAME
  6518. echo 'CURRENT_DATE=$(date)' >> /usr/bin/$WATCHDOG_SCRIPT_NAME
  6519. # application specific stuff is added later
  6520. chmod +x /usr/bin/$WATCHDOG_SCRIPT_NAME
  6521. if ! grep -q "/usr/bin/$WATCHDOG_SCRIPT_NAME" /etc/crontab; then
  6522. echo "* * * * * root /usr/bin/$WATCHDOG_SCRIPT_NAME" >> /etc/crontab
  6523. fi
  6524. echo 'install_watchdog_script' >> $COMPLETION_FILE
  6525. }
  6526. function install_irc_client {
  6527. if [[ $SYSTEM_TYPE == "$VARIANT_WRITER" || $SYSTEM_TYPE == "$VARIANT_MAILBOX" || $SYSTEM_TYPE == "$VARIANT_CLOUD" || $SYSTEM_TYPE == "$VARIANT_SOCIAL" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  6528. return
  6529. fi
  6530. if grep -Fxq "install_irc_client" $COMPLETION_FILE; then
  6531. return
  6532. fi
  6533. apt-get -y install irssi
  6534. if [ ! -d /home/$MY_USERNAME/.irssi ]; then
  6535. mkdir /home/$MY_USERNAME/.irssi
  6536. fi
  6537. echo 'servers = (' > /home/$MY_USERNAME/.irssi/config
  6538. echo ' {' >> /home/$MY_USERNAME/.irssi/config
  6539. echo ' address = "chat.freenode.net";' >> /home/$MY_USERNAME/.irssi/config
  6540. echo ' chatnet = "Freenode";' >> /home/$MY_USERNAME/.irssi/config
  6541. echo ' port = "6667";' >> /home/$MY_USERNAME/.irssi/config
  6542. echo ' autoconnect = "no";' >> /home/$MY_USERNAME/.irssi/config
  6543. echo ' },' >> /home/$MY_USERNAME/.irssi/config
  6544. echo ' {' >> /home/$MY_USERNAME/.irssi/config
  6545. echo ' address = "irc.oftc.net";' >> /home/$MY_USERNAME/.irssi/config
  6546. echo ' chatnet = "OFTC";' >> /home/$MY_USERNAME/.irssi/config
  6547. echo ' port = "6667";' >> /home/$MY_USERNAME/.irssi/config
  6548. echo ' autoconnect = "yes";' >> /home/$MY_USERNAME/.irssi/config
  6549. echo ' },' >> /home/$MY_USERNAME/.irssi/config
  6550. echo ' {' >> /home/$MY_USERNAME/.irssi/config
  6551. echo " address = \"${DEFAULT_DOMAIN_NAME}\";" >> /home/$MY_USERNAME/.irssi/config
  6552. echo ' chatnet = "Freedombone";' >> /home/$MY_USERNAME/.irssi/config
  6553. echo " port = \"${IRC_PORT}\";" >> /home/$MY_USERNAME/.irssi/config
  6554. echo ' use_ssl = "yes";' >> /home/$MY_USERNAME/.irssi/config
  6555. echo ' ssl_verify = "no";' >> /home/$MY_USERNAME/.irssi/config
  6556. echo ' autoconnect = "yes";' >> /home/$MY_USERNAME/.irssi/config
  6557. if [ $IRC_PASSWORD ]; then
  6558. echo " password = \"${IRC_PASSWORD}\";" >> /home/$MY_USERNAME/.irssi/config
  6559. fi
  6560. echo ' }' >> /home/$MY_USERNAME/.irssi/config
  6561. echo ');' >> /home/$MY_USERNAME/.irssi/config
  6562. echo '' >> /home/$MY_USERNAME/.irssi/config
  6563. echo 'chatnets = {' >> /home/$MY_USERNAME/.irssi/config
  6564. echo ' Freedombone = {' >> /home/$MY_USERNAME/.irssi/config
  6565. echo ' type = "IRC";' >> /home/$MY_USERNAME/.irssi/config
  6566. echo ' max_kicks = "1";' >> /home/$MY_USERNAME/.irssi/config
  6567. echo ' max_msgs = "4";' >> /home/$MY_USERNAME/.irssi/config
  6568. echo ' max_whois = "1";' >> /home/$MY_USERNAME/.irssi/config
  6569. echo ' };' >> /home/$MY_USERNAME/.irssi/config
  6570. echo ' Freenode = {' >> /home/$MY_USERNAME/.irssi/config
  6571. echo ' type = "IRC";' >> /home/$MY_USERNAME/.irssi/config
  6572. echo ' max_kicks = "1";' >> /home/$MY_USERNAME/.irssi/config
  6573. echo ' max_msgs = "4";' >> /home/$MY_USERNAME/.irssi/config
  6574. echo ' max_whois = "1";' >> /home/$MY_USERNAME/.irssi/config
  6575. echo ' };' >> /home/$MY_USERNAME/.irssi/config
  6576. echo ' OFTC = {' >> /home/$MY_USERNAME/.irssi/config
  6577. echo ' type = "IRC";' >> /home/$MY_USERNAME/.irssi/config
  6578. echo ' max_kicks = "1";' >> /home/$MY_USERNAME/.irssi/config
  6579. echo ' max_msgs = "1";' >> /home/$MY_USERNAME/.irssi/config
  6580. echo ' max_whois = "1";' >> /home/$MY_USERNAME/.irssi/config
  6581. echo ' };' >> /home/$MY_USERNAME/.irssi/config
  6582. echo '};' >> /home/$MY_USERNAME/.irssi/config
  6583. echo '' >> /home/$MY_USERNAME/.irssi/config
  6584. echo 'channels = (' >> /home/$MY_USERNAME/.irssi/config
  6585. echo ' { name = "#freedombone"; chatnet = "Freedombone"; autojoin = "Yes"; },' >> /home/$MY_USERNAME/.irssi/config
  6586. echo ');' >> /home/$MY_USERNAME/.irssi/config
  6587. echo '' >> /home/$MY_USERNAME/.irssi/config
  6588. echo 'settings = {' >> /home/$MY_USERNAME/.irssi/config
  6589. echo " core = { real_name = \"$MY_NAME\"; user_name = \"$MY_USERNAME\"; nick = \"$MY_USERNAME\"; };" >> /home/$MY_USERNAME/.irssi/config
  6590. echo ' "fe-text" = { actlist_sort = "refnum"; };' >> /home/$MY_USERNAME/.irssi/config
  6591. echo '};' >> /home/$MY_USERNAME/.irssi/config
  6592. echo 'ignores = ( { level = "CTCPS"; } );' >> /home/$MY_USERNAME/.irssi/config
  6593. chown -R $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.irssi
  6594. echo 'install_irc_client' >> $COMPLETION_FILE
  6595. }
  6596. function install_irc_server {
  6597. 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
  6598. return
  6599. fi
  6600. if grep -Fxq "install_irc_server" $COMPLETION_FILE; then
  6601. return
  6602. fi
  6603. apt-get -y install ngircd
  6604. if [ ! -d /etc/ngircd ]; then
  6605. echo $"ERROR: ngircd does not appear to have installed. $CHECK_MESSAGE"
  6606. exit 53
  6607. fi
  6608. if [ ! -f /etc/ssl/certs/ngircd.dhparam ]; then
  6609. ${PROJECT_NAME}-addcert -h ngircd --dhkey $DH_KEYLENGTH
  6610. check_certificates ngircd
  6611. fi
  6612. DEFAULTDOMAIN=$DEFAULT_DOMAIN_NAME
  6613. if [[ $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  6614. DEFAULTDOMAIN="${DEFAULT_DOMAIN_NAME}.local"
  6615. fi
  6616. # create a login password if needed
  6617. if [ ! $IRC_PASSWORD ]; then
  6618. IRC_PASSWORD="$(openssl rand -base64 32 | cut -c1-10)"
  6619. fi
  6620. echo '**************************************************' > /etc/ngircd/motd
  6621. echo $'* F R E E D O M B O N E I R C *' >> /etc/ngircd/motd
  6622. echo '* *' >> /etc/ngircd/motd
  6623. echo $'* Freedom in the Cloud *' >> /etc/ngircd/motd
  6624. echo '**************************************************' >> /etc/ngircd/motd
  6625. sed -i 's|MotdFile = /etc/ngircd/ngircd.motd|MotdFile = /etc/ngircd/motd|g' /etc/ngircd/ngircd.conf
  6626. sed -i "s/irc@irc.example.com/$MY_EMAIL_ADDRESS/g" /etc/ngircd/ngircd.conf
  6627. sed -i "s/irc.example.net/$DEFAULTDOMAIN/g" /etc/ngircd/ngircd.conf
  6628. sed -i "s|Yet another IRC Server running on Debian GNU/Linux|IRC Server of $DEFAULTDOMAIN|g" /etc/ngircd/ngircd.conf
  6629. sed -i 's/;Password = wealllikedebian/Password =/g' /etc/ngircd/ngircd.conf
  6630. sed -i 's|;CertFile = /etc/ssl/certs/server.crt|CertFile = /etc/ssl/certs/ngircd.crt|g' /etc/ngircd/ngircd.conf
  6631. sed -i 's|;DHFile = /etc/ngircd/dhparams.pem|DHFile = /etc/ssl/certs/ngircd.dhparam|g' /etc/ngircd/ngircd.conf
  6632. sed -i 's|;KeyFile = /etc/ssl/private/server.key|KeyFile = /etc/ssl/private/ngircd.key|g' /etc/ngircd/ngircd.conf
  6633. sed -i "s/;Ports =.*/Ports = $IRC_PORT/2" /etc/ngircd/ngircd.conf
  6634. if [[ $ONION_ONLY != 'yes' ]]; then
  6635. sed -i "s/;Ports =.*/;Ports = $IRC_PORT, $IRC_ONION_PORT/1" /etc/ngircd/ngircd.conf
  6636. else
  6637. sed -i "s/;Ports =.*/Ports = $IRC_PORT, $IRC_ONION_PORT/1" /etc/ngircd/ngircd.conf
  6638. fi
  6639. sed -i "s/;Name = #ngircd/Name = #${PROJECT_NAME}/g" /etc/ngircd/ngircd.conf
  6640. sed -i "s/;Topic = Our ngircd testing channel/Topic = ${PROJECT_NAME} chat channel/g" /etc/ngircd/ngircd.conf
  6641. sed -i 's/;MaxUsers = 23/MaxUsers = 23/g' /etc/ngircd/ngircd.conf
  6642. sed -i "s|;KeyFile = /etc/ngircd/#chan.key|KeyFile = /etc/ngircd/#${PROJECT_NAME}.key|g" /etc/ngircd/ngircd.conf
  6643. sed -i "s/;CloakHost = cloaked.host/CloakHost = ${PROJECT_NAME}/g" /etc/ngircd/ngircd.conf
  6644. IRC_SALT="$(openssl rand -base64 32 | cut -c1-30)"
  6645. if [ -f $IMAGE_PASSWORD_FILE ]; then
  6646. IRC_OPERATOR_PASSWORD="$(printf `cat $IMAGE_PASSWORD_FILE`)"
  6647. else
  6648. IRC_OPERATOR_PASSWORD="$(openssl rand -base64 10 | cut -c1-8)"
  6649. fi
  6650. sed -i "s|;CloakHostSalt = abcdefghijklmnopqrstuvwxyz|CloakHostSalt = $IRC_SALT|g" /etc/ngircd/ngircd.conf
  6651. sed -i 's/;ConnectIPv4 = yes/ConnectIPv4 = yes/g' /etc/ngircd/ngircd.conf
  6652. sed -i 's/;MorePrivacy = no/MorePrivacy = yes/g' /etc/ngircd/ngircd.conf
  6653. sed -i 's/;RequireAuthPing = no/RequireAuthPing = no/g' /etc/ngircd/ngircd.conf
  6654. sed -i "s/;Name = TheOper/Name = $MY_USERNAME/g" /etc/ngircd/ngircd.conf
  6655. sed -i "s/;Password = ThePwd/Password = $IRC_OPERATOR_PASSWORD/g" /etc/ngircd/ngircd.conf
  6656. sed -i 's|;Listen =.*|Listen = 0.0.0.0,0.0.0.0:9050,127.0.0.1,127.0.0.1:9050|g' /etc/ngircd/ngircd.conf
  6657. if [ $IRC_PASSWORD ]; then
  6658. sed -i "0,/RE/s/Password =.*/Password =$IRC_PASSWORD/" /etc/ngircd/ngircd.conf
  6659. fi
  6660. # If we are on a mesh then DNS is not available
  6661. if [[ $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  6662. sed -i "s/;DNS =.*/DNS = no/g" /etc/ngircd/ngircd.conf
  6663. fi
  6664. # upgrade a cypher
  6665. sed -i 's|SECURE128|SECURE256|g' /etc/ngircd/ngircd.conf
  6666. mkdir /var/run/ircd
  6667. chown -R irc:irc /var/run/ircd
  6668. mkdir /var/run/ngircd
  6669. touch /var/run/ngircd/ngircd.pid
  6670. chown -R irc:irc /var/run/ngircd
  6671. IRC_ONION_HOSTNAME=$(add_onion_service irc ${IRC_PORT} ${IRC_ONION_PORT})
  6672. if ! grep -q $"IRC onion domain" $COMPLETION_FILE; then
  6673. echo "IRC onion domain:$IRC_ONION_HOSTNAME" >> $COMPLETION_FILE
  6674. fi
  6675. systemctl restart ngircd
  6676. # keep the daemon running
  6677. echo '' >> /usr/bin/$WATCHDOG_SCRIPT_NAME
  6678. echo '# keep irc daemon running' >> /usr/bin/$WATCHDOG_SCRIPT_NAME
  6679. echo 'IRC_RUNNING=$(pgrep ngircd > /dev/null && echo Running)' >> /usr/bin/$WATCHDOG_SCRIPT_NAME
  6680. echo 'if [ ! $IRC_RUNNING ]; then' >> /usr/bin/$WATCHDOG_SCRIPT_NAME
  6681. echo ' systemctl start ngircd' >> /usr/bin/$WATCHDOG_SCRIPT_NAME
  6682. echo ' echo -n $CURRENT_DATE >> $LOGFILE' >> /usr/bin/$WATCHDOG_SCRIPT_NAME
  6683. echo ' echo " IRC daemon restarted" >> $LOGFILE' >> /usr/bin/$WATCHDOG_SCRIPT_NAME
  6684. echo 'fi' >> /usr/bin/$WATCHDOG_SCRIPT_NAME
  6685. if ! grep -q $"IRC Server" /home/$MY_USERNAME/README; then
  6686. echo '' >> /home/$MY_USERNAME/README
  6687. echo '' >> /home/$MY_USERNAME/README
  6688. echo $'IRC Server' >> /home/$MY_USERNAME/README
  6689. echo '==========' >> /home/$MY_USERNAME/README
  6690. echo $'To connect to your IRC server in irssi:' >> /home/$MY_USERNAME/README
  6691. echo '' >> /home/$MY_USERNAME/README
  6692. if [[ $ONION_ONLY != 'yes' ]]; then
  6693. echo " irssi" >> /home/$MY_USERNAME/README
  6694. echo " /server add -auto -ssl $DEFAULTDOMAIN $IRC_PORT" >> /home/$MY_USERNAME/README
  6695. echo " /connect $DEFAULT_DOMAIN_NAME" >> /home/$MY_USERNAME/README
  6696. else
  6697. echo " usetorwith irssi" >> /home/$MY_USERNAME/README
  6698. echo " /server add -auto $IRC_ONION_HOSTNAME $IRC_PORT" >> /home/$MY_USERNAME/README
  6699. echo " /connect $IRC_ONION_HOSTNAME" >> /home/$MY_USERNAME/README
  6700. fi
  6701. echo " /join #${PROJECT_NAME}" >> /home/$MY_USERNAME/README
  6702. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
  6703. chmod 600 /home/$MY_USERNAME/README
  6704. fi
  6705. echo 'install_irc_server' >> $COMPLETION_FILE
  6706. }
  6707. function get_wiki_admin_password {
  6708. if [ -f /home/$MY_USERNAME/README ]; then
  6709. if grep -q "Wiki password" /home/$MY_USERNAME/README; then
  6710. WIKI_ADMIN_PASSWORD=$(cat /home/$MY_USERNAME/README | grep "Wiki password:" | awk -F ':' '{print $2}' | sed 's/^ *//')
  6711. fi
  6712. fi
  6713. }
  6714. function install_wiki {
  6715. 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
  6716. return
  6717. fi
  6718. if grep -Fxq "install_wiki" $COMPLETION_FILE; then
  6719. return
  6720. fi
  6721. if [ ! $WIKI_DOMAIN_NAME ]; then
  6722. return
  6723. fi
  6724. apt-get -y install dokuwiki
  6725. apt-get -y remove --purge apache*
  6726. if [ -d /etc/apache2 ]; then
  6727. rm -rf /etc/apache2
  6728. echo $'Removed Apache installation after Dokuwiki install'
  6729. fi
  6730. if [ ! -d /var/www/$WIKI_DOMAIN_NAME ]; then
  6731. mkdir /var/www/$WIKI_DOMAIN_NAME
  6732. fi
  6733. if [ -d /var/www/$WIKI_DOMAIN_NAME/htdocs ]; then
  6734. rm -rf /var/www/$WIKI_DOMAIN_NAME/htdocs
  6735. fi
  6736. ln -s /usr/share/dokuwiki /var/www/$WIKI_DOMAIN_NAME/htdocs
  6737. mkdir /var/lib/dokuwiki/custom
  6738. cp /etc/dokuwiki/local.php.dist /var/lib/dokuwiki/custom/local.php
  6739. ln -s /var/lib/dokuwiki/custom/local.php /etc/dokuwiki/local.php
  6740. chown www-data /var/lib/dokuwiki/custom
  6741. chown www-data /var/lib/dokuwiki/custom/local.php
  6742. chown -R www-data /etc/dokuwiki
  6743. chown -R www-data /usr/share/dokuwiki/lib/
  6744. chmod 600 /var/lib/dokuwiki/custom/local.php
  6745. chmod -R 755 /usr/share/dokuwiki/lib
  6746. sed -i 's|//$conf|$conf|g' /var/lib/dokuwiki/custom/local.php
  6747. sed -i "s|joe|$MY_USERNAME|g" /var/lib/dokuwiki/custom/local.php
  6748. sed -i "s|Debian DokuWiki|$WIKI_TITLE|g" /etc/dokuwiki/local.php
  6749. # set the admin user
  6750. sed -i "s/@admin/$MY_USERNAME/g" /etc/dokuwiki/local.php
  6751. # disallow registration of new users
  6752. if ! grep -q "disableactions" /etc/dokuwiki/local.php; then
  6753. echo "\$conf['disableactions'] = 'register';" >> /etc/dokuwiki/local.php
  6754. fi
  6755. if ! grep -q "disableactions" /var/lib/dokuwiki/custom/local.php; then
  6756. echo "\$conf['disableactions'] = 'register';" >> /var/lib/dokuwiki/custom/local.php
  6757. fi
  6758. if ! grep -q "authtype" /var/lib/dokuwiki/custom/local.php; then
  6759. echo "\$conf['authtype'] = 'authplain';" >> /var/lib/dokuwiki/custom/local.php
  6760. fi
  6761. if ! grep -q "authtype" /etc/dokuwiki/local.php; then
  6762. echo "\$conf['authtype'] = 'authplain';" >> /etc/dokuwiki/local.php
  6763. fi
  6764. get_wiki_admin_password
  6765. if [ ! $WIKI_ADMIN_PASSWORD ]; then
  6766. if [ -f $IMAGE_PASSWORD_FILE ]; then
  6767. WIKI_ADMIN_PASSWORD="$(printf `cat $IMAGE_PASSWORD_FILE`)"
  6768. else
  6769. WIKI_ADMIN_PASSWORD="$(openssl rand -base64 18 | cut -c1-16)"
  6770. fi
  6771. fi
  6772. HASHED_WIKI_PASSWORD=$(echo -n "$WIKI_ADMIN_PASSWORD" | md5sum | awk -F ' ' '{print $1}')
  6773. echo -n "$MY_USERNAME:$HASHED_WIKI_PASSWORD:$MY_NAME:$MY_EMAIL:admin,user,upload" > /var/lib/dokuwiki/acl/users.auth.php
  6774. chmod 640 /var/lib/dokuwiki/acl/users.auth.php
  6775. if ! grep -q "video/ogg" /etc/dokuwiki/mime.conf; then
  6776. echo 'ogv video/ogg' >> /etc/dokuwiki/mime.conf
  6777. fi
  6778. if ! grep -q "video/mp4" /etc/dokuwiki/mime.conf; then
  6779. echo 'mp4 video/mp4' >> /etc/dokuwiki/mime.conf
  6780. fi
  6781. if ! grep -q "video/webm" /etc/dokuwiki/mime.conf; then
  6782. echo 'webm video/webm' >> /etc/dokuwiki/mime.conf
  6783. fi
  6784. WIKI_ONION_HOSTNAME=$(add_onion_service wiki 80 ${WIKI_ONION_PORT})
  6785. if [[ $ONION_ONLY == "no" ]]; then
  6786. echo 'server {' > /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6787. echo ' listen 80;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6788. echo " root /var/www/$WIKI_DOMAIN_NAME/htdocs;" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6789. echo " server_name $WIKI_DOMAIN_NAME;" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6790. echo ' access_log off;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6791. echo " error_log /var/log/nginx/${WIKI_DOMAIN_NAME}_error.log $WEBSERVER_LOG_LEVEL;" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6792. echo ' index index.php;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6793. echo ' charset utf-8;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6794. echo ' proxy_read_timeout 86400s;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6795. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6796. nginx_disable_sniffing $WIKI_DOMAIN_NAME
  6797. nginx_limits $WIKI_DOMAIN_NAME
  6798. echo ' # rewrite to front controller as default rule' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6799. echo ' location / {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6800. echo ' rewrite ^/(.*) /index.php?q=$uri&$args last;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6801. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6802. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6803. echo " # make sure webfinger and other well known services aren't blocked" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6804. echo ' # by denying dot files and rewrite request to the front controller' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6805. echo ' location ^~ /.well-known/ {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6806. echo ' allow all;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6807. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6808. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6809. echo ' # statically serve these file types when possible' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6810. echo ' # otherwise fall back to front controller' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6811. echo ' # allow browser to cache them' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6812. echo ' # added .htm for advanced source code editor library' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6813. echo ' location ~* \.(jpg|jpeg|gif|png|ico|css|js|htm|html|ttf|woff|svg)$ {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6814. echo ' expires 30d;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6815. echo ' try_files $uri /index.php?q=$uri&$args;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6816. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6817. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6818. echo ' # block these file types' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6819. echo ' location ~* \.(tpl|md|tgz|log|out)$ {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6820. echo ' deny all;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6821. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6822. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6823. echo ' # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6824. echo ' # or a unix socket' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6825. echo ' location ~* \.php$ {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6826. echo ' # Zero-day exploit defense.' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6827. echo ' # http://forum.nginx.org/read.php?2,88845,page=3' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6828. echo " # Won't work properly (404 error) if the file is not stored on this" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6829. echo " # server, which is entirely possible with php-fpm/php-fcgi." >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6830. echo " # Comment the 'try_files' line out if you set up php-fpm/php-fcgi on" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6831. echo " # another machine. And then cross your fingers that you won't get hacked." >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6832. echo ' try_files $uri $uri/ /index.php;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6833. echo ' # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6834. echo ' fastcgi_split_path_info ^(.+\.php)(/.+)$;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6835. echo ' # With php5-cgi alone:' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6836. echo ' # fastcgi_pass 127.0.0.1:9000;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6837. echo ' # With php5-fpm:' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6838. echo ' fastcgi_pass unix:/var/run/php5-fpm.sock;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6839. echo ' include fastcgi_params;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6840. echo ' fastcgi_index index.php;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6841. echo ' fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6842. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6843. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6844. echo ' # deny access to all dot files' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6845. echo ' location ~ /\. {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6846. echo ' deny all;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6847. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6848. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6849. echo ' #deny access to store' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6850. echo ' location ~ /store {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6851. echo ' deny all;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6852. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6853. echo ' location ~ /(data|conf|bin|inc)/ {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6854. echo ' deny all;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6855. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6856. echo ' location ~ /\.ht {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6857. echo ' deny all;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6858. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6859. echo '}' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6860. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6861. echo 'server {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6862. echo ' listen 443 ssl;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6863. echo " root /var/www/$WIKI_DOMAIN_NAME/htdocs;" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6864. echo " server_name $WIKI_DOMAIN_NAME;" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6865. echo ' access_log off;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6866. echo " error_log /var/log/nginx/${WIKI_DOMAIN_NAME}_error_ssl.log $WEBSERVER_LOG_LEVEL;" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6867. echo ' index index.php;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6868. echo ' charset utf-8;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6869. echo ' proxy_read_timeout 86400s;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6870. nginx_limits $WIKI_DOMAIN_NAME
  6871. nginx_ssl $WIKI_DOMAIN_NAME
  6872. nginx_disable_sniffing $WIKI_DOMAIN_NAME
  6873. echo ' add_header Strict-Transport-Security "max-age=0;";' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6874. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6875. echo ' # rewrite to front controller as default rule' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6876. echo ' location / {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6877. echo ' rewrite ^/(.*) /index.php?q=$uri&$args last;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6878. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6879. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6880. echo " # make sure webfinger and other well known services aren't blocked" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6881. echo ' # by denying dot files and rewrite request to the front controller' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6882. echo ' location ^~ /.well-known/ {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6883. echo ' allow all;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6884. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6885. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6886. echo ' # statically serve these file types when possible' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6887. echo ' # otherwise fall back to front controller' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6888. echo ' # allow browser to cache them' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6889. echo ' # added .htm for advanced source code editor library' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6890. echo ' location ~* \.(jpg|jpeg|gif|png|ico|css|js|htm|html|ttf|woff|svg)$ {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6891. echo ' expires 30d;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6892. echo ' try_files $uri /index.php?q=$uri&$args;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6893. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6894. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6895. echo ' # block these file types' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6896. echo ' location ~* \.(tpl|md|tgz|log|out)$ {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6897. echo ' deny 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 ' # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6901. echo ' # or a unix socket' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6902. echo ' location ~* \.php$ {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6903. echo ' # Zero-day exploit defense.' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6904. echo ' # http://forum.nginx.org/read.php?2,88845,page=3' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6905. echo " # Won't work properly (404 error) if the file is not stored on this" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6906. echo " # server, which is entirely possible with php-fpm/php-fcgi." >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6907. echo " # Comment the 'try_files' line out if you set up php-fpm/php-fcgi on" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6908. echo " # another machine. And then cross your fingers that you won't get hacked." >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6909. echo ' try_files $uri $uri/ /index.php;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6910. echo ' # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6911. echo ' fastcgi_split_path_info ^(.+\.php)(/.+)$;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6912. echo ' # With php5-cgi alone:' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6913. echo ' # fastcgi_pass 127.0.0.1:9000;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6914. echo ' # With php5-fpm:' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6915. echo ' fastcgi_pass unix:/var/run/php5-fpm.sock;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6916. echo ' include fastcgi_params;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6917. echo ' fastcgi_index index.php;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6918. echo ' fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6919. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6920. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6921. echo ' # deny access to all dot files' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6922. echo ' location ~ /\. {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6923. echo ' deny all;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6924. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6925. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6926. echo ' #deny access to store' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6927. echo ' location ~ /store {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6928. echo ' deny all;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6929. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6930. echo ' location ~ /(data|conf|bin|inc)/ {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6931. echo ' deny all;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6932. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6933. echo ' location ~ /\.ht {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6934. echo ' deny all;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6935. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6936. echo '}' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6937. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6938. else
  6939. echo -n '' > /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6940. fi
  6941. echo 'server {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6942. echo " listen 127.0.0.1:${WIKI_ONION_PORT} default_server;" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6943. echo " root /var/www/$WIKI_DOMAIN_NAME/htdocs;" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6944. echo " server_name $WIKI_ONION_HOSTNAME;" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6945. echo ' access_log off;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6946. echo " error_log /var/log/nginx/${WIKI_DOMAIN_NAME}_error_ssl.log $WEBSERVER_LOG_LEVEL;" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6947. echo ' index index.php;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6948. echo ' charset utf-8;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6949. echo ' proxy_read_timeout 86400s;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6950. nginx_limits $WIKI_DOMAIN_NAME
  6951. nginx_disable_sniffing $WIKI_DOMAIN_NAME
  6952. echo ' add_header Strict-Transport-Security "max-age=0;";' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6953. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6954. echo ' # rewrite to front controller as default rule' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6955. echo ' location / {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6956. echo ' rewrite ^/(.*) /index.php?q=$uri&$args last;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6957. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6958. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6959. echo " # make sure webfinger and other well known services aren't blocked" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6960. echo ' # by denying dot files and rewrite request to the front controller' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6961. echo ' location ^~ /.well-known/ {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6962. echo ' allow all;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6963. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6964. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6965. echo ' # statically serve these file types when possible' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6966. echo ' # otherwise fall back to front controller' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6967. echo ' # allow browser to cache them' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6968. echo ' # added .htm for advanced source code editor library' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6969. echo ' location ~* \.(jpg|jpeg|gif|png|ico|css|js|htm|html|ttf|woff|svg)$ {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6970. echo ' expires 30d;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6971. echo ' try_files $uri /index.php?q=$uri&$args;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6972. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6973. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6974. echo ' # block these file types' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6975. echo ' location ~* \.(tpl|md|tgz|log|out)$ {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6976. echo ' deny all;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6977. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6978. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6979. echo ' # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6980. echo ' # or a unix socket' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6981. echo ' location ~* \.php$ {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6982. echo ' # Zero-day exploit defense.' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6983. echo ' # http://forum.nginx.org/read.php?2,88845,page=3' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6984. echo " # Won't work properly (404 error) if the file is not stored on this" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6985. echo " # server, which is entirely possible with php-fpm/php-fcgi." >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6986. echo " # Comment the 'try_files' line out if you set up php-fpm/php-fcgi on" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6987. echo " # another machine. And then cross your fingers that you won't get hacked." >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6988. echo ' try_files $uri $uri/ /index.php;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6989. echo ' # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6990. echo ' fastcgi_split_path_info ^(.+\.php)(/.+)$;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6991. echo ' # With php5-cgi alone:' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6992. echo ' # fastcgi_pass 127.0.0.1:9000;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6993. echo ' # With php5-fpm:' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6994. echo ' fastcgi_pass unix:/var/run/php5-fpm.sock;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6995. echo ' include fastcgi_params;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6996. echo ' fastcgi_index index.php;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  6997. echo ' fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;' >> /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 ' # deny access to all dot files' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7001. echo ' location ~ /\. {' >> /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 ' #deny access to store' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7006. echo ' location ~ /store {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7007. echo ' deny all;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7008. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7009. echo ' location ~ /(data|conf|bin|inc)/ {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7010. echo ' deny all;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7011. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7012. echo ' location ~ /\.ht {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7013. echo ' deny all;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7014. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7015. echo '}' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  7016. create_site_certificate $WIKI_DOMAIN_NAME
  7017. configure_php
  7018. nginx_ensite $WIKI_DOMAIN_NAME
  7019. systemctl restart php5-fpm
  7020. systemctl restart nginx
  7021. echo "Wiki onion domain:${WIKI_ONION_HOSTNAME}" >> $COMPLETION_FILE
  7022. add_ddns_domain $WIKI_DOMAIN_NAME
  7023. # add some post-install instructions
  7024. if ! grep -q $"Wiki password" /home/$MY_USERNAME/README; then
  7025. echo '' >> /home/$MY_USERNAME/README
  7026. echo '' >> /home/$MY_USERNAME/README
  7027. echo $'Wiki' >> /home/$MY_USERNAME/README
  7028. echo '====' >> /home/$MY_USERNAME/README
  7029. echo $"Wiki onion domain: ${WIKI_ONION_HOSTNAME}" >> /home/$MY_USERNAME/README
  7030. echo $"Wiki username: $MY_USERNAME" >> /home/$MY_USERNAME/README
  7031. echo $"Wiki password: $WIKI_ADMIN_PASSWORD" >> /home/$MY_USERNAME/README
  7032. echo '' >> /home/$MY_USERNAME/README
  7033. echo $'Once you have set up the wiki then remove the install file:' >> /home/$MY_USERNAME/README
  7034. echo '' >> /home/$MY_USERNAME/README
  7035. echo " rm /var/www/$WIKI_DOMAIN_NAME/htdocs/install.php" >> /home/$MY_USERNAME/README
  7036. echo '' >> /home/$MY_USERNAME/README
  7037. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
  7038. chmod 600 /home/$MY_USERNAME/README
  7039. fi
  7040. echo "Wiki domain:$WIKI_DOMAIN_NAME" >> $COMPLETION_FILE
  7041. echo 'install_wiki' >> $COMPLETION_FILE
  7042. }
  7043. function get_blog_admin_password {
  7044. if [ -f /home/$MY_USERNAME/README ]; then
  7045. if grep -q "Your blog password is" /home/$MY_USERNAME/README; then
  7046. FULLBLOG_ADMIN_PASSWORD=$(cat /home/$MY_USERNAME/README | grep "Your blog password is" | awk -F ':' '{print $2}' | sed 's/^ *//')
  7047. fi
  7048. fi
  7049. }
  7050. function install_blog {
  7051. 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
  7052. return
  7053. fi
  7054. if [ ! $FULLBLOG_DOMAIN_NAME ]; then
  7055. echo $'The blog domain name was not specified'
  7056. exit 5062
  7057. fi
  7058. # update to the next commit
  7059. set_repo_commit /var/www/$FULLBLOG_DOMAIN_NAME/htdocs "Blog commit" "$FULLBLOG_COMMIT" $FULLBLOG_REPO
  7060. if grep -Fxq "install_blog" $COMPLETION_FILE; then
  7061. return
  7062. fi
  7063. # for the avatar changing command
  7064. apt-get -y install imagemagick
  7065. if [ ! -d /var/www/$FULLBLOG_DOMAIN_NAME ]; then
  7066. mkdir /var/www/$FULLBLOG_DOMAIN_NAME
  7067. fi
  7068. cd /var/www/$FULLBLOG_DOMAIN_NAME
  7069. git_clone $FULLBLOG_REPO htdocs
  7070. cd htdocs
  7071. git checkout $FULLBLOG_COMMIT -b $FULLBLOG_COMMIT
  7072. if ! grep -q "Blog commit" $COMPLETION_FILE; then
  7073. echo "Blog commit:$FULLBLOG_COMMIT" >> $COMPLETION_FILE
  7074. else
  7075. sed -i "s/Blog commit.*/Blog commit:$FULLBLOG_COMMIT/g" $COMPLETION_FILE
  7076. fi
  7077. cd /var/www/$FULLBLOG_DOMAIN_NAME
  7078. chown -R www-data:www-data /var/www/$FULLBLOG_DOMAIN_NAME/htdocs
  7079. if [[ $ONION_ONLY == "no" ]]; then
  7080. echo 'server {' > /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7081. echo ' listen 80;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7082. echo " root /var/www/$FULLBLOG_DOMAIN_NAME/htdocs;" >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7083. echo " server_name $FULLBLOG_DOMAIN_NAME;" >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7084. echo ' access_log off;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7085. echo " error_log /var/log/nginx/${FULLBLOG_DOMAIN_NAME}_error.log $WEBSERVER_LOG_LEVEL;" >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7086. echo ' index index.php;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7087. echo ' charset utf-8;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7088. echo ' proxy_read_timeout 86400s;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7089. nginx_limits $FULLBLOG_DOMAIN_NAME
  7090. nginx_disable_sniffing $FULLBLOG_DOMAIN_NAME
  7091. echo ' # Always redirect the login page to https' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7092. echo ' location /login {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7093. echo ' rewrite ^ https://$server_name$request_uri?;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7094. echo ' }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7095. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7096. echo ' # rewrite to front controller as default rule' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7097. echo ' location / {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7098. echo ' rewrite ^/(.*) /index.php?q=$uri&$args last;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7099. echo ' }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7100. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7101. echo " # make sure webfinger and other well known services aren't blocked" >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7102. echo ' # by denying dot files and rewrite request to the front controller' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7103. echo ' location ^~ /.well-known/ {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7104. echo ' allow all;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7105. echo ' }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7106. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7107. echo ' # statically serve these file types when possible' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7108. echo ' # otherwise fall back to front controller' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7109. echo ' # allow browser to cache them' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7110. echo ' # added .htm for advanced source code editor library' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7111. echo ' location ~* \.(jpg|jpeg|gif|png|ico|css|js|htm|html|ttf|woff|svg)$ {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7112. echo ' expires 30d;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7113. echo ' try_files $uri /index.php?q=$uri&$args;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7114. echo ' }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7115. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7116. echo ' # block these file types' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7117. echo ' location ~* \.(tpl|md|tgz|log|out)$ {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7118. echo ' deny all;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7119. echo ' }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7120. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7121. echo ' # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7122. echo ' # or a unix socket' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7123. echo ' location ~* \.php$ {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7124. echo ' # Zero-day exploit defense.' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7125. echo ' # http://forum.nginx.org/read.php?2,88845,page=3' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7126. echo " # Won't work properly (404 error) if the file is not stored on this" >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7127. echo " # server, which is entirely possible with php-fpm/php-fcgi." >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7128. echo " # Comment the 'try_files' line out if you set up php-fpm/php-fcgi on" >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7129. echo " # another machine. And then cross your fingers that you won't get hacked." >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7130. echo ' try_files $uri $uri/ /index.php;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7131. echo ' # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7132. echo ' fastcgi_split_path_info ^(.+\.php)(/.+)$;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7133. echo ' # With php5-cgi alone:' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7134. echo ' # fastcgi_pass 127.0.0.1:9000;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7135. echo ' # With php5-fpm:' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7136. echo ' fastcgi_pass unix:/var/run/php5-fpm.sock;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7137. echo ' include fastcgi_params;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7138. echo ' fastcgi_index index.php;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7139. echo ' fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7140. echo ' }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7141. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7142. echo ' # deny access to all dot files' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7143. echo ' location ~ /\. {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7144. echo ' deny all;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7145. echo ' }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7146. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7147. echo ' #deny access to store' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7148. echo ' location ~ /store {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7149. echo ' deny all;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7150. echo ' }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7151. echo ' location ~ /(data|conf|bin|inc)/ {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7152. echo ' deny all;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7153. echo ' }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7154. echo ' location ~ /\.ht {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7155. echo ' deny all;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7156. echo ' }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7157. echo '}' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7158. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7159. echo 'server {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7160. echo ' listen 443 ssl;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7161. echo " root /var/www/$FULLBLOG_DOMAIN_NAME/htdocs;" >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7162. echo " server_name $FULLBLOG_DOMAIN_NAME;" >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7163. echo ' access_log off;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7164. echo " error_log /var/log/nginx/${FULLBLOG_DOMAIN_NAME}_error_ssl.log $WEBSERVER_LOG_LEVEL;" >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7165. echo ' index index.php;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7166. echo ' charset utf-8;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7167. echo ' proxy_read_timeout 86400s;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7168. nginx_limits $FULLBLOG_DOMAIN_NAME
  7169. nginx_ssl $FULLBLOG_DOMAIN_NAME
  7170. nginx_disable_sniffing $FULLBLOG_DOMAIN_NAME
  7171. echo ' add_header Strict-Transport-Security "max-age=0;";' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7172. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7173. echo ' # rewrite to front controller as default rule' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7174. echo ' location / {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7175. echo ' rewrite ^/(.*) /index.php?q=$uri&$args last;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7176. echo ' }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7177. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7178. echo " # make sure webfinger and other well known services aren't blocked" >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7179. echo ' # by denying dot files and rewrite request to the front controller' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7180. echo ' location ^~ /.well-known/ {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7181. echo ' allow all;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7182. echo ' }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7183. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7184. echo ' # statically serve these file types when possible' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7185. echo ' # otherwise fall back to front controller' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7186. echo ' # allow browser to cache them' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7187. echo ' # added .htm for advanced source code editor library' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7188. echo ' location ~* \.(jpg|jpeg|gif|png|ico|css|js|htm|html|ttf|woff|svg)$ {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7189. echo ' expires 30d;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7190. echo ' try_files $uri /index.php?q=$uri&$args;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7191. echo ' }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7192. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7193. echo ' # block these file types' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7194. echo ' location ~* \.(tpl|md|tgz|log|out)$ {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7195. echo ' deny all;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7196. echo ' }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7197. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7198. echo ' # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7199. echo ' # or a unix socket' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7200. echo ' location ~* \.php$ {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7201. echo ' # Zero-day exploit defense.' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7202. echo ' # http://forum.nginx.org/read.php?2,88845,page=3' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7203. echo " # Won't work properly (404 error) if the file is not stored on this" >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7204. echo " # server, which is entirely possible with php-fpm/php-fcgi." >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7205. echo " # Comment the 'try_files' line out if you set up php-fpm/php-fcgi on" >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7206. echo " # another machine. And then cross your fingers that you won't get hacked." >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7207. echo ' try_files $uri $uri/ /index.php;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7208. echo ' # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7209. echo ' fastcgi_split_path_info ^(.+\.php)(/.+)$;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7210. echo ' # With php5-cgi alone:' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7211. echo ' # fastcgi_pass 127.0.0.1:9000;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7212. echo ' # With php5-fpm:' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7213. echo ' fastcgi_pass unix:/var/run/php5-fpm.sock;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7214. echo ' include fastcgi_params;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7215. echo ' fastcgi_index index.php;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7216. echo ' fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7217. echo ' }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7218. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7219. echo ' # deny access to all dot files' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7220. echo ' location ~ /\. {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7221. echo ' deny all;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7222. echo ' }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7223. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7224. echo ' #deny access to store' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7225. echo ' location ~ /store {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7226. echo ' deny all;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7227. echo ' }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7228. echo ' location ~ /(data|conf|bin|inc)/ {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7229. echo ' deny all;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7230. echo ' }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7231. echo ' location ~ /\.ht {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7232. echo ' deny all;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7233. echo ' }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7234. echo '}' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7235. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7236. else
  7237. echo -n '' > /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7238. fi
  7239. echo 'server {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7240. echo " listen 127.0.0.1:${FULLBLOG_ONION_PORT} default_server;" >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7241. echo " root /var/www/$FULLBLOG_DOMAIN_NAME/htdocs;" >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7242. echo " server_name $FULLBLOG_DOMAIN_NAME;" >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7243. echo ' access_log off;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7244. echo " error_log /var/log/nginx/${FULLBLOG_DOMAIN_NAME}_error_ssl.log $WEBSERVER_LOG_LEVEL;" >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7245. echo ' index index.php;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7246. echo ' charset utf-8;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7247. echo ' proxy_read_timeout 86400s;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7248. nginx_limits $FULLBLOG_DOMAIN_NAME
  7249. nginx_disable_sniffing $FULLBLOG_DOMAIN_NAME
  7250. echo ' add_header Strict-Transport-Security "max-age=0;";' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7251. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7252. echo ' # rewrite to front controller as default rule' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7253. echo ' location / {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7254. echo ' rewrite ^/(.*) /index.php?q=$uri&$args last;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7255. echo ' }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7256. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7257. echo " # make sure webfinger and other well known services aren't blocked" >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7258. echo ' # by denying dot files and rewrite request to the front controller' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7259. echo ' location ^~ /.well-known/ {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7260. echo ' allow all;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7261. echo ' }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7262. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7263. echo ' # statically serve these file types when possible' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7264. echo ' # otherwise fall back to front controller' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7265. echo ' # allow browser to cache them' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7266. echo ' # added .htm for advanced source code editor library' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7267. echo ' location ~* \.(jpg|jpeg|gif|png|ico|css|js|htm|html|ttf|woff|svg)$ {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7268. echo ' expires 30d;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7269. echo ' try_files $uri /index.php?q=$uri&$args;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7270. echo ' }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7271. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7272. echo ' # block these file types' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7273. echo ' location ~* \.(tpl|md|tgz|log|out)$ {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7274. echo ' deny all;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7275. echo ' }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7276. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7277. echo ' # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7278. echo ' # or a unix socket' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7279. echo ' location ~* \.php$ {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7280. echo ' # Zero-day exploit defense.' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7281. echo ' # http://forum.nginx.org/read.php?2,88845,page=3' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7282. echo " # Won't work properly (404 error) if the file is not stored on this" >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7283. echo " # server, which is entirely possible with php-fpm/php-fcgi." >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7284. echo " # Comment the 'try_files' line out if you set up php-fpm/php-fcgi on" >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7285. echo " # another machine. And then cross your fingers that you won't get hacked." >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7286. echo ' try_files $uri $uri/ /index.php;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7287. echo ' # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7288. echo ' fastcgi_split_path_info ^(.+\.php)(/.+)$;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7289. echo ' # With php5-cgi alone:' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7290. echo ' # fastcgi_pass 127.0.0.1:9000;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7291. echo ' # With php5-fpm:' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7292. echo ' fastcgi_pass unix:/var/run/php5-fpm.sock;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7293. echo ' include fastcgi_params;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7294. echo ' fastcgi_index index.php;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7295. echo ' fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7296. echo ' }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7297. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7298. echo ' # deny access to all dot files' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7299. echo ' location ~ /\. {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7300. echo ' deny all;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7301. echo ' }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7302. echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7303. echo ' #deny access to store' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7304. echo ' location ~ /store {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7305. echo ' deny all;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7306. echo ' }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7307. echo ' location ~ /(data|conf|bin|inc)/ {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7308. echo ' deny all;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7309. echo ' }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7310. echo ' location ~ /\.ht {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7311. echo ' deny all;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7312. echo ' }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7313. echo '}' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
  7314. create_site_certificate $FULLBLOG_DOMAIN_NAME
  7315. configure_php
  7316. # blog settings
  7317. cp /var/www/$FULLBLOG_DOMAIN_NAME/htdocs/config/config.ini.example /var/www/$FULLBLOG_DOMAIN_NAME/htdocs/config/config.ini
  7318. sed -i "s|site.url.*|site.url = '/'|g" /var/www/$FULLBLOG_DOMAIN_NAME/htdocs/config/config.ini
  7319. sed -i "s|blog.title.*|blog.title = '$MY_BLOG_TITLE'|g" /var/www/$FULLBLOG_DOMAIN_NAME/htdocs/config/config.ini
  7320. sed -i "s|blog.tagline.*|blog.tagline = '$MY_BLOG_SUBTITLE'|g" /var/www/$FULLBLOG_DOMAIN_NAME/htdocs/config/config.ini
  7321. sed -i 's|timezone.*|timezone = "Europe/London"|g' /var/www/$FULLBLOG_DOMAIN_NAME/htdocs/config/config.ini
  7322. sed -i "s|Your name|$MY_NAME|g" /var/www/$FULLBLOG_DOMAIN_NAME/htdocs/config/config.ini
  7323. # set social networks
  7324. if grep -q "social.hubzilla" /var/www/$FULLBLOG_DOMAIN_NAME/htdocs/config/config.ini; then
  7325. sed -i "s|;social.hubzilla|social.hubzilla|g" /var/www/$FULLBLOG_DOMAIN_NAME/htdocs/config/config.ini
  7326. sed -i "s|social.hubzilla.*|social.hubzilla = \"$HUBZILLA_DOMAIN_NAME\"|g" /var/www/$FULLBLOG_DOMAIN_NAME/htdocs/config/config.ini
  7327. fi
  7328. if grep -q "social.gnusocial" /var/www/$FULLBLOG_DOMAIN_NAME/htdocs/config/config.ini; then
  7329. sed -i "s|;social.gnusocial|social.gnusocial|g" /var/www/$FULLBLOG_DOMAIN_NAME/htdocs/config/config.ini
  7330. sed -i "s|social.gnusocial.*|social.gnusocial = \"$MICROBLOG_DOMAIN_NAME\"|g" /var/www/$FULLBLOG_DOMAIN_NAME/htdocs/config/config.ini
  7331. fi
  7332. # clear proprietary social network strings
  7333. sed -i 's|social.facebook.*|social.facebook = ""|g' /var/www/$FULLBLOG_DOMAIN_NAME/htdocs/config/config.ini
  7334. sed -i 's|social.twitter.*|social.twitter = ""|g' /var/www/$FULLBLOG_DOMAIN_NAME/htdocs/config/config.ini
  7335. sed -i 's|social.google.*|social.google = ""|g' /var/www/$FULLBLOG_DOMAIN_NAME/htdocs/config/config.ini
  7336. # create a user password
  7337. get_blog_admin_password
  7338. if [ ! $FULLBLOG_ADMIN_PASSWORD ]; then
  7339. if [ -f $IMAGE_PASSWORD_FILE ]; then
  7340. FULLBLOG_ADMIN_PASSWORD="$(printf `cat $IMAGE_PASSWORD_FILE`)"
  7341. else
  7342. FULLBLOG_ADMIN_PASSWORD="$(openssl rand -base64 18 | cut -c1-16)"
  7343. fi
  7344. echo '' >> /home/$MY_USERNAME/README
  7345. echo '' >> /home/$MY_USERNAME/README
  7346. echo $'HTMLy Blog' >> /home/$MY_USERNAME/README
  7347. echo '==========' >> /home/$MY_USERNAME/README
  7348. echo $"Your blog username: $MY_USERNAME" >> /home/$MY_USERNAME/README
  7349. echo $"Your blog password is: $FULLBLOG_ADMIN_PASSWORD" >> /home/$MY_USERNAME/README
  7350. if [[ $ONION_ONLY == 'no' ]]; then
  7351. echo $"Log into your blog at https://$FULLBLOG_DOMAIN_NAME/login" >> /home/$MY_USERNAME/README
  7352. fi
  7353. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
  7354. chmod 600 /home/$MY_USERNAME/README
  7355. fi
  7356. # create a user
  7357. echo ';Password' > /var/www/$FULLBLOG_DOMAIN_NAME/htdocs/config/users/$MY_USERNAME.ini
  7358. echo "password = '$FULLBLOG_ADMIN_PASSWORD'" >> /var/www/$FULLBLOG_DOMAIN_NAME/htdocs/config/users/$MY_USERNAME.ini
  7359. echo 'encryption = clear' >> /var/www/$FULLBLOG_DOMAIN_NAME/htdocs/config/users/$MY_USERNAME.ini
  7360. echo ';Role' >> /var/www/$FULLBLOG_DOMAIN_NAME/htdocs/config/users/$MY_USERNAME.ini
  7361. echo 'role = admin' >> /var/www/$FULLBLOG_DOMAIN_NAME/htdocs/config/users/$MY_USERNAME.ini
  7362. nginx_ensite $FULLBLOG_DOMAIN_NAME
  7363. FULLBLOG_ONION_HOSTNAME=$(add_onion_service blog 80 ${FULLBLOG_ONION_PORT})
  7364. systemctl restart php5-fpm
  7365. systemctl restart nginx
  7366. if ! grep -q "Blog onion domain" /home/$MY_USERNAME/README; then
  7367. echo $"Blog onion domain: ${FULLBLOG_ONION_HOSTNAME}" >> /home/$MY_USERNAME/README
  7368. echo $"Log into your blog at https://${FULLBLOG_ONION_HOSTNAME}/login" >> /home/$MY_USERNAME/README
  7369. echo '' >> /home/$MY_USERNAME/README
  7370. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
  7371. chmod 600 /home/$MY_USERNAME/README
  7372. fi
  7373. echo "Blog onion domain:${FULLBLOG_ONION_HOSTNAME}" >> $COMPLETION_FILE
  7374. add_ddns_domain $FULLBLOG_DOMAIN_NAME
  7375. echo 'install_blog' >> $COMPLETION_FILE
  7376. }
  7377. function install_rss_reader {
  7378. if [[ $SYSTEM_TYPE == "$VARIANT_MAILBOX" || $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_DEVELOPER" || $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  7379. return
  7380. fi
  7381. # update to the next commit
  7382. set_repo_commit $RSS_READER_PATH "RSS reader commit" "$RSS_READER_COMMIT" $RSS_READER_REPO
  7383. if grep -Fxq "install_rss_reader" $COMPLETION_FILE; then
  7384. return
  7385. fi
  7386. apt-get -y install php-gettext php5-curl php5-gd php5-mysql git curl php-xml-parser
  7387. if [ ! -d /etc/share ]; then
  7388. mkdir /etc/share
  7389. fi
  7390. cd /etc/share
  7391. git_clone $RSS_READER_REPO tt-rss
  7392. if [ ! -d $RSS_READER_PATH ]; then
  7393. echo $'Could not clone RSS reader repo'
  7394. exit 52925
  7395. fi
  7396. cd $RSS_READER_PATH
  7397. git checkout $RSS_READER_COMMIT -b $RSS_READER_COMMIT
  7398. if ! grep -q "RSS reader commit" $COMPLETION_FILE; then
  7399. echo "RSS reader commit:$RSS_READER_COMMIT" >> $COMPLETION_FILE
  7400. fi
  7401. install_mariadb
  7402. get_mariadb_password
  7403. repair_databases_script
  7404. get_mariadb_rss_reader_admin_password
  7405. if [ ! $RSS_READER_ADMIN_PASSWORD ]; then
  7406. if [ -f $IMAGE_PASSWORD_FILE ]; then
  7407. RSS_READER_ADMIN_PASSWORD="$(printf `cat $IMAGE_PASSWORD_FILE`)"
  7408. else
  7409. RSS_READER_ADMIN_PASSWORD="$(openssl rand -base64 32 | cut -c1-30)"
  7410. fi
  7411. fi
  7412. create_database ttrss "$RSS_READER_ADMIN_PASSWORD" $MY_USERNAME
  7413. RSS_READER_ONION_HOSTNAME=$(add_onion_service ttrss 80 ${RSS_READER_ONION_PORT})
  7414. RSS_MOBILE_READER_ONION_HOSTNAME=$(add_onion_service ttrss 80 ${RSS_MOBILE_READER_ONION_PORT})
  7415. echo 'server {' > /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
  7416. echo " listen 127.0.0.1:$RSS_MOBILE_READER_ONION_PORT;" >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
  7417. echo " server_name $RSS_MOBILE_READER_ONION_HOSTNAME;" >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
  7418. echo '' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
  7419. echo ' access_log off;' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
  7420. echo ' error_log off;' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
  7421. echo '' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
  7422. echo ' root /etc/share/ttrss-mobile;' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
  7423. echo ' index index.html index.php;' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
  7424. echo '' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
  7425. echo ' location ~ \.php {' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
  7426. echo ' include snippets/fastcgi-php.conf;' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
  7427. echo ' fastcgi_pass unix:/var/run/php5-fpm.sock;' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
  7428. echo ' }' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
  7429. echo '' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
  7430. echo ' location / {' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
  7431. echo ' try_files $uri $uri/ @ttrss;' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
  7432. echo ' }' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
  7433. echo ' location /tt-rss {' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
  7434. echo ' try_files $uri $uri/ @ttrss_base;' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
  7435. echo ' }' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
  7436. echo '' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
  7437. echo ' location @ttrss {' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
  7438. echo ' rewrite ^(.*)$ /index.html?p=$1 last;' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
  7439. echo ' }' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
  7440. echo ' location @ttrss_base {' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
  7441. echo ' rewrite ^(.*)$ /index.php?p=$1 last;' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
  7442. echo ' }' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
  7443. echo '' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
  7444. echo ' location ~ /\.(git) {' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
  7445. echo ' deny all;' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
  7446. echo ' }' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
  7447. echo '' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
  7448. echo ' add_header X-Frame-Options DENY;' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
  7449. echo ' add_header X-Content-Type-Options nosniff;' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
  7450. echo ' client_max_body_size 15m;' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
  7451. echo '}' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
  7452. echo '' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
  7453. echo 'server {' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
  7454. echo " listen 127.0.0.1:$RSS_READER_ONION_PORT default_server;" >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
  7455. echo " server_name $RSS_READER_ONION_HOSTNAME;" >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
  7456. echo '' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
  7457. echo ' access_log off;' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
  7458. echo ' error_log off;' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
  7459. echo '' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
  7460. echo ' root /etc/share/tt-rss;' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
  7461. echo ' index index.php;' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
  7462. echo '' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
  7463. echo ' location ~ \.php {' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
  7464. echo ' include snippets/fastcgi-php.conf;' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
  7465. echo ' fastcgi_pass unix:/var/run/php5-fpm.sock;' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
  7466. echo ' }' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
  7467. echo '' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
  7468. echo ' set $mobile_rewrite do_not_perform;' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
  7469. echo '' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
  7470. echo ' ## chi http_user_agent for mobile / smart phones ##' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
  7471. echo ' if ($http_user_agent ~* "(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino") {' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
  7472. echo ' set $mobile_rewrite perform;' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
  7473. echo ' }' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
  7474. echo '' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
  7475. echo ' if ($http_user_agent ~* "^(1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-)") {' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
  7476. echo ' set $mobile_rewrite perform;' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
  7477. echo ' }' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
  7478. echo '' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
  7479. echo ' if ($mobile_rewrite = perform) {' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
  7480. echo " rewrite ^/(.*) http://$RSS_MOBILE_READER_ONION_HOSTNAME permanent;" >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
  7481. echo ' break;' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
  7482. echo ' }' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
  7483. echo '' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
  7484. echo ' location ~ \.php {' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
  7485. echo ' include snippets/fastcgi-php.conf;' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
  7486. echo ' fastcgi_pass unix:/var/run/php5-fpm.sock;' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
  7487. echo ' }' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
  7488. echo '' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
  7489. echo ' location / {' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
  7490. echo ' try_files $uri $uri/ @ttrss;' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
  7491. echo ' }' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
  7492. echo '' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
  7493. echo ' location @ttrss {' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
  7494. echo ' rewrite ^(.*)$ /index.php?p=$1 last;' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
  7495. echo ' }' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
  7496. echo '' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
  7497. echo ' location ~ /\.(git) {' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
  7498. echo ' deny all;' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
  7499. echo ' }' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
  7500. echo '' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
  7501. echo ' add_header X-Frame-Options DENY;' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
  7502. echo ' add_header X-Content-Type-Options nosniff;' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
  7503. echo ' client_max_body_size 15m;' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
  7504. echo '}' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
  7505. if [ ! -f $RSS_READER_PATH/config.php ]; then
  7506. # generate a config file
  7507. RSS_FEED_CRYPT_KEY="$(openssl rand -base64 26 | cut -c1-24)"
  7508. echo '<?php' > $RSS_READER_PATH/config.php
  7509. echo " define ('_CURL_HTTP_PROXY', '127.0.0.1:9050');" >> $RSS_READER_PATH/config.php
  7510. echo " define('DB_TYPE', 'mysql');" >> $RSS_READER_PATH/config.php
  7511. echo " define('DB_HOST', 'localhost');" >> $RSS_READER_PATH/config.php
  7512. echo " define('DB_USER', 'root');" >> $RSS_READER_PATH/config.php
  7513. echo " define('DB_NAME', 'ttrss');" >> $RSS_READER_PATH/config.php
  7514. echo " define('DB_PASS', '${MARIADB_PASSWORD}');" >> $RSS_READER_PATH/config.php
  7515. echo " define('DB_PORT', '3306');" >> $RSS_READER_PATH/config.php
  7516. echo " define('MYSQL_CHARSET', 'UTF8');" >> $RSS_READER_PATH/config.php
  7517. echo " define('SELF_URL_PATH', 'http://${RSS_READER_ONION_HOSTNAME}/');" >> $RSS_READER_PATH/config.php
  7518. echo " define('FEED_CRYPT_KEY', '${RSS_FEED_CRYPT_KEY}');" >> $RSS_READER_PATH/config.php
  7519. echo " define('SINGLE_USER_MODE', false);" >> $RSS_READER_PATH/config.php
  7520. echo " define('SIMPLE_UPDATE_MODE', false);" >> $RSS_READER_PATH/config.php
  7521. echo " define('PHP_EXECUTABLE', '/usr/bin/php');" >> $RSS_READER_PATH/config.php
  7522. echo " define('LOCK_DIRECTORY', 'lock');" >> $RSS_READER_PATH/config.php
  7523. echo " define('CACHE_DIR', 'cache');" >> $RSS_READER_PATH/config.php
  7524. echo " define('ICONS_DIR', \"feed-icons\");" >> $RSS_READER_PATH/config.php
  7525. echo " define('ICONS_URL', \"feed-icons\");" >> $RSS_READER_PATH/config.php
  7526. echo " define('AUTH_AUTO_CREATE', true);" >> $RSS_READER_PATH/config.php
  7527. echo " define('AUTH_AUTO_LOGIN', true);" >> $RSS_READER_PATH/config.php
  7528. echo " define('FORCE_ARTICLE_PURGE', 0);" >> $RSS_READER_PATH/config.php
  7529. echo " define('PUBSUBHUBBUB_HUB', '');" >> $RSS_READER_PATH/config.php
  7530. echo " define('PUBSUBHUBBUB_ENABLED', false);" >> $RSS_READER_PATH/config.php
  7531. echo " define('SPHINX_SERVER', 'localhost:9312');" >> $RSS_READER_PATH/config.php
  7532. echo " define('SPHINX_INDEX', 'ttrss, delta');" >> $RSS_READER_PATH/config.php
  7533. echo " define('ENABLE_REGISTRATION', false);" >> $RSS_READER_PATH/config.php
  7534. echo " define('REG_NOTIFY_ADDRESS', '${MY_EMAIL_ADDRESS}');" >> $RSS_READER_PATH/config.php
  7535. echo " define('REG_MAX_USERS', 10);" >> $RSS_READER_PATH/config.php
  7536. echo " define('SESSION_COOKIE_LIFETIME', 86400);" >> $RSS_READER_PATH/config.php
  7537. echo " define('SMTP_FROM_NAME', 'Tiny Tiny RSS');" >> $RSS_READER_PATH/config.php
  7538. echo " define('SMTP_FROM_ADDRESS', 'noreply@${RSS_READER_ONION_HOSTNAME}');" >> $RSS_READER_PATH/config.php
  7539. echo " define('DIGEST_SUBJECT', '[tt-rss] New headlines for last 24 hours');" >> $RSS_READER_PATH/config.php
  7540. echo " define('SMTP_SERVER', '');" >> $RSS_READER_PATH/config.php
  7541. echo " define('SMTP_LOGIN', '');" >> $RSS_READER_PATH/config.php
  7542. echo " define('SMTP_PASSWORD', '');" >> $RSS_READER_PATH/config.php
  7543. echo " define('SMTP_SECURE', '');" >> $RSS_READER_PATH/config.php
  7544. echo " define('CHECK_FOR_UPDATES', true);" >> $RSS_READER_PATH/config.php
  7545. echo " define('ENABLE_GZIP_OUTPUT', false);" >> $RSS_READER_PATH/config.php
  7546. echo " define('PLUGINS', 'auth_internal, note, gnusocial');" >> $RSS_READER_PATH/config.php
  7547. echo " define('LOG_DESTINATION', 'sql');" >> $RSS_READER_PATH/config.php
  7548. echo " define('CONFIG_VERSION', 26);" >> $RSS_READER_PATH/config.php
  7549. fi
  7550. # initialize the database
  7551. if [ ! -f $RSS_READER_PATH/schema/ttrss_schema_mysql.sql ]; then
  7552. echo $'No database schema found for rss reader'
  7553. exit 52926
  7554. fi
  7555. mysql -u root --password="$MARIADB_PASSWORD" -D ttrss < $RSS_READER_PATH/schema/ttrss_schema_mysql.sql
  7556. # change the password from the default
  7557. RSS_READER_ADMIN_PASSWORD_HASH=$(echo -n "${RSS_READER_ADMIN_PASSWORD}" | sha1sum | awk -F ' ' '{print $1}')
  7558. mysql -u root --password="$MARIADB_PASSWORD" -e "update ttrss_users set pwd_hash = 'SHA1:${RSS_READER_ADMIN_PASSWORD_HASH}', salt= '' WHERE login = 'admin';" ttrss
  7559. # ensure that socks5 proxy is used
  7560. if ! grep -q "CURLOPT_PROXYTYPE" $RSS_READER_PATH/plugins/af_unburn/init.php; then
  7561. sed -i '/curl_setopt($ch, CURLOPT_PROXY, _CURL_HTTP_PROXY);/a \\t\t\t\t\tcurl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5);' $RSS_READER_PATH/plugins/af_unburn/init.php
  7562. fi
  7563. if ! grep -q "CURLOPT_PROXYTYPE" $RSS_READER_PATH/include/functions.php; then
  7564. sed -i '/curl_setopt($ch, CURLOPT_PROXY, _CURL_HTTP_PROXY);/a \\t\t\t\tcurl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5);' $RSS_READER_PATH/include/functions.php
  7565. fi
  7566. chown -R www-data:www-data $RSS_READER_PATH
  7567. chmod a+x $RSS_READER_PATH
  7568. configure_php
  7569. nginx_ensite $RSS_READER_DOMAIN_NAME
  7570. systemctl restart php5-fpm
  7571. systemctl restart nginx
  7572. if ! grep -q "RSS reader onion domain" $COMPLETION_FILE; then
  7573. echo "RSS reader onion domain:${RSS_READER_ONION_HOSTNAME}" >> $COMPLETION_FILE
  7574. fi
  7575. if ! grep -q "RSS reader domain" $COMPLETION_FILE; then
  7576. echo "RSS reader domain:${RSS_READER_DOMAIN_NAME}" >> $COMPLETION_FILE
  7577. fi
  7578. # daemon to update feeds
  7579. echo '[Unit]' > /etc/systemd/system/ttrss.service
  7580. echo 'Description=ttrss_backend' >> /etc/systemd/system/ttrss.service
  7581. echo 'After=network.target mysql.service' >> /etc/systemd/system/ttrss.service
  7582. echo '' >> /etc/systemd/system/ttrss.service
  7583. echo '[Service]' >> /etc/systemd/system/ttrss.service
  7584. echo 'User=www-data' >> /etc/systemd/system/ttrss.service
  7585. echo "ExecStart=$RSS_READER_PATH/update_daemon2.php" >> /etc/systemd/system/ttrss.service
  7586. echo '' >> /etc/systemd/system/ttrss.service
  7587. echo '[Install]' >> /etc/systemd/system/ttrss.service
  7588. echo 'WantedBy=multi-user.target' >> /etc/systemd/system/ttrss.service
  7589. systemctl enable ttrss
  7590. systemctl start ttrss
  7591. # some post-install instructions for the user
  7592. if ! grep -q $"RSS Reader" /home/$MY_USERNAME/README; then
  7593. echo '' >> /home/$MY_USERNAME/README
  7594. echo '' >> /home/$MY_USERNAME/README
  7595. echo $'RSS Reader' >> /home/$MY_USERNAME/README
  7596. echo '==========' >> /home/$MY_USERNAME/README
  7597. echo $"RSS reader domain: ${RSS_READER_DOMAIN_NAME}" >> /home/$MY_USERNAME/README
  7598. echo $"RSS reader onion domain: ${RSS_READER_ONION_HOSTNAME}" >> /home/$MY_USERNAME/README
  7599. echo $"RSS reader admin username: admin" >> /home/$MY_USERNAME/README
  7600. echo $"RSS reader admin password: ${RSS_READER_ADMIN_PASSWORD}" >> /home/$MY_USERNAME/README
  7601. echo '' >> /home/$MY_USERNAME/README
  7602. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
  7603. chmod 600 /home/$MY_USERNAME/README
  7604. fi
  7605. echo 'install_rss_reader' >> $COMPLETION_FILE
  7606. }
  7607. function install_rss_reader_gnusocial {
  7608. if [[ $SYSTEM_TYPE == "$VARIANT_MAILBOX" || $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_DEVELOPER" || $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  7609. return
  7610. fi
  7611. if [ ! $MICROBLOG_DOMAIN_NAME ]; then
  7612. return
  7613. fi
  7614. if [ ! $RSS_READER_PATH ]; then
  7615. RSS_READER_PATH=/etc/share/tt-rss
  7616. fi
  7617. RSS_READER_GNUSOCIAL_PATH=${RSS_READER_PATH}/plugins/gnusocial
  7618. # update to the next commit
  7619. set_repo_commit $RSS_READER_GNUSOCIAL_PATH "RSS reader gnusocial commit" "$RSS_READER_GNUSOCIAL_COMMIT" $RSS_READER_GNUSOCIAL_REPO
  7620. chown -R www-data:www-data $RSS_READER_GNUSOCIAL_PATH
  7621. if grep -Fxq "install_rss_reader_gnusocial" $COMPLETION_FILE; then
  7622. return
  7623. fi
  7624. if [ ! -d $INSTALL_DIR ]; then
  7625. mkdir -p $INSTALL_DIR
  7626. fi
  7627. cd $INSTALL_DIR
  7628. git_clone $RSS_READER_GNUSOCIAL_REPO ttrss-gnusocial
  7629. if [ ! -d $INSTALL_DIR/ttrss-gnusocial ]; then
  7630. echo $'Could not clone repo for RSS reader GNU Social plugin'
  7631. exit 52838
  7632. fi
  7633. cp -r $INSTALL_DIR/ttrss-gnusocial $RSS_READER_GNUSOCIAL_PATH
  7634. cd $RSS_READER_GNUSOCIAL_PATH
  7635. git checkout $RSS_READER_GNUSOCIAL_COMMIT -b $RSS_READER_GNUSOCIAL_COMMIT
  7636. if ! grep -q "RSS reader gnusocial commit" $COMPLETION_FILE; then
  7637. echo "RSS reader gnusocial commit:$RSS_READER_GNUSOCIAL_COMMIT" >> $COMPLETION_FILE
  7638. fi
  7639. chown -R www-data:www-data $RSS_READER_GNUSOCIAL_PATH
  7640. echo 'install_rss_reader_gnusocial' >> $COMPLETION_FILE
  7641. }
  7642. function install_rss_mobile_reader {
  7643. if [[ $SYSTEM_TYPE == "$VARIANT_MAILBOX" || $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_DEVELOPER" || $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  7644. return
  7645. fi
  7646. if [ ! $RSS_READER_PATH ]; then
  7647. RSS_READER_PATH=/etc/share/tt-rss
  7648. fi
  7649. if [ ! -d $RSS_READER_PATH ]; then
  7650. echo $'tt-rss is not installed, so the mobile version cannot be installed'
  7651. exit 63452
  7652. fi
  7653. RSS_MOBILE_READER_PATH=/etc/share/ttrss-mobile
  7654. # remove any previous install
  7655. if [ -d $RSS_READER_PATH/g2ttree-mobile ]; then
  7656. if grep -Fxq "install_rss_mobile_reader" $COMPLETION_FILE; then
  7657. sed -i '/install_rss_mobile_reader/d' $COMPLETION_FILE
  7658. sed -i '/RSS mobile reader commit/d' $COMPLETION_FILE
  7659. rm -rf $RSS_READER_PATH/g2ttree-mobile
  7660. fi
  7661. fi
  7662. # update to the next commit
  7663. set_repo_commit $RSS_MOBILE_READER_PATH "RSS mobile reader commit" "$RSS_MOBILE_READER_COMMIT" $RSS_MOBILE_READER_REPO
  7664. if grep -Fxq "install_rss_mobile_reader" $COMPLETION_FILE; then
  7665. return
  7666. fi
  7667. cd /etc/share
  7668. git_clone $RSS_MOBILE_READER_REPO ttrss-mobile
  7669. if [ ! -d $RSS_MOBILE_READER_PATH ]; then
  7670. echo $'Could not clone RSS mobile reader repo'
  7671. exit 24816
  7672. fi
  7673. cd $RSS_MOBILE_READER_PATH
  7674. git checkout $RSS_MOBILE_READER_COMMIT -b $RSS_MOBILE_READER_COMMIT
  7675. if ! grep -q "RSS mobile reader commit" $COMPLETION_FILE; then
  7676. echo "RSS mobile reader commit:$RSS_MOBILE_READER_COMMIT" >> $COMPLETION_FILE
  7677. fi
  7678. echo 'define({' > $RSS_MOBILE_READER_PATH/scripts/conf.js
  7679. echo ' apiPath: "/tt-rss/"' >> $RSS_MOBILE_READER_PATH/scripts/conf.js
  7680. echo '});' >> $RSS_MOBILE_READER_PATH/scripts/conf.js
  7681. # link to the main site
  7682. ln -s $RSS_READER_PATH $RSS_MOBILE_READER_PATH/tt-rss
  7683. chown -R www-data:www-data $RSS_MOBILE_READER_PATH
  7684. chown -R www-data:www-data $RSS_READER_PATH
  7685. chmod a+x $RSS_MOBILE_READER_PATH
  7686. echo 'install_rss_mobile_reader' >> $COMPLETION_FILE
  7687. }
  7688. function install_gnu_social {
  7689. 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
  7690. return
  7691. fi
  7692. if [ ! $MICROBLOG_DOMAIN_NAME ]; then
  7693. echo $'No domain name was given for the microblog'
  7694. exit 7359
  7695. fi
  7696. # update to the next commit
  7697. set_repo_commit /var/www/$MICROBLOG_DOMAIN_NAME/htdocs "GNU Social commit" "$MICROBLOG_COMMIT" $MICROBLOG_REPO
  7698. if grep -Fxq "install_gnu_social" $COMPLETION_FILE; then
  7699. return
  7700. fi
  7701. install_mariadb
  7702. get_mariadb_password
  7703. repair_databases_script
  7704. apt-get -y install php-gettext php5-curl php5-gd php5-mysql git curl php-xml-parser
  7705. if [ ! -d /var/www/$MICROBLOG_DOMAIN_NAME ]; then
  7706. mkdir /var/www/$MICROBLOG_DOMAIN_NAME
  7707. fi
  7708. if [ ! -d /var/www/$MICROBLOG_DOMAIN_NAME/htdocs ]; then
  7709. git_clone $MICROBLOG_REPO /var/www/$MICROBLOG_DOMAIN_NAME/htdocs
  7710. if [ ! -d /var/www/$MICROBLOG_DOMAIN_NAME/htdocs ]; then
  7711. echo $'Unable to clone gnusocial repo'
  7712. exit 87525
  7713. fi
  7714. fi
  7715. cd /var/www/$MICROBLOG_DOMAIN_NAME/htdocs
  7716. git checkout $MICROBLOG_COMMIT -b $MICROBLOG_COMMIT
  7717. if ! grep -q "GNU Social commit" $COMPLETION_FILE; then
  7718. echo "GNU Social commit:$MICROBLOG_COMMIT" >> $COMPLETION_FILE
  7719. else
  7720. sed -i "s/GNU Social commit.*/GNU Social commit:$MICROBLOG_COMMIT/g" $COMPLETION_FILE
  7721. fi
  7722. chmod a+w /var/www/$MICROBLOG_DOMAIN_NAME/htdocs
  7723. chown www-data:www-data /var/www/$MICROBLOG_DOMAIN_NAME/htdocs
  7724. chmod +x /var/www/$MICROBLOG_DOMAIN_NAME/htdocs/scripts/maildaemon.php
  7725. get_mariadb_gnusocial_admin_password
  7726. if [ ! $MICROBLOG_ADMIN_PASSWORD ]; then
  7727. if [ -f $IMAGE_PASSWORD_FILE ]; then
  7728. MICROBLOG_ADMIN_PASSWORD="$(printf `cat $IMAGE_PASSWORD_FILE`)"
  7729. else
  7730. MICROBLOG_ADMIN_PASSWORD="$(openssl rand -base64 32 | cut -c1-30)"
  7731. fi
  7732. fi
  7733. create_database gnusocial "$MICROBLOG_ADMIN_PASSWORD" $MY_USERNAME
  7734. if [ ! -f "/etc/aliases" ]; then
  7735. touch /etc/aliases
  7736. fi
  7737. if ! grep -q "www-data: root" /etc/aliases; then
  7738. echo 'www-data: root' >> /etc/aliases
  7739. fi
  7740. if ! grep -q "/var/www/$MICROBLOG_DOMAIN_NAME/htdocs/scripts/maildaemon.php" /etc/aliases; then
  7741. echo "*: /var/www/$MICROBLOG_DOMAIN_NAME/htdocs/scripts/maildaemon.php" >> /etc/aliases
  7742. fi
  7743. newaliases
  7744. add_ddns_domain $MICROBLOG_DOMAIN_NAME
  7745. microblog_nginx_site=/etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  7746. if [[ $ONION_ONLY == "no" ]]; then
  7747. nginx_http_redirect $MICROBLOG_DOMAIN_NAME
  7748. echo 'server {' >> $microblog_nginx_site
  7749. echo ' listen 443 ssl;' >> $microblog_nginx_site
  7750. echo " server_name $MICROBLOG_DOMAIN_NAME;" >> $microblog_nginx_site
  7751. echo '' >> $microblog_nginx_site
  7752. echo ' # Security' >> $microblog_nginx_site
  7753. nginx_ssl $MICROBLOG_DOMAIN_NAME
  7754. nginx_disable_sniffing $MICROBLOG_DOMAIN_NAME
  7755. nginx_limits $MICROBLOG_DOMAIN_NAME '15m'
  7756. echo ' add_header Strict-Transport-Security max-age=15768000;' >> $microblog_nginx_site
  7757. echo '' >> $microblog_nginx_site
  7758. echo ' # Logs' >> $microblog_nginx_site
  7759. echo ' access_log off;' >> $microblog_nginx_site
  7760. echo ' error_log off;' >> $microblog_nginx_site
  7761. echo '' >> $microblog_nginx_site
  7762. echo ' # Root' >> $microblog_nginx_site
  7763. echo " root /var/www/$MICROBLOG_DOMAIN_NAME/htdocs;" >> $microblog_nginx_site
  7764. echo '' >> $microblog_nginx_site
  7765. echo ' # Index' >> $microblog_nginx_site
  7766. echo ' index index.php;' >> $microblog_nginx_site
  7767. echo '' >> $microblog_nginx_site
  7768. echo ' # PHP' >> $microblog_nginx_site
  7769. echo ' location ~ \.php {' >> $microblog_nginx_site
  7770. echo ' include snippets/fastcgi-php.conf;' >> $microblog_nginx_site
  7771. echo ' fastcgi_pass unix:/var/run/php5-fpm.sock;' >> $microblog_nginx_site
  7772. echo ' }' >> $microblog_nginx_site
  7773. echo '' >> $microblog_nginx_site
  7774. echo ' # Location' >> $microblog_nginx_site
  7775. echo ' location / {' >> $microblog_nginx_site
  7776. echo ' try_files $uri $uri/ @gnusocial;' >> $microblog_nginx_site
  7777. echo ' }' >> $microblog_nginx_site
  7778. echo '' >> $microblog_nginx_site
  7779. echo ' # Fancy URLs' >> $microblog_nginx_site
  7780. echo ' location @gnusocial {' >> $microblog_nginx_site
  7781. echo ' rewrite ^(.*)$ /index.php?p=$1 last;' >> $microblog_nginx_site
  7782. echo ' }' >> $microblog_nginx_site
  7783. echo '' >> $microblog_nginx_site
  7784. echo ' # Restrict access that is unnecessary anyway' >> $microblog_nginx_site
  7785. echo ' location ~ /\.(ht|git) {' >> $microblog_nginx_site
  7786. echo ' deny all;' >> $microblog_nginx_site
  7787. echo ' }' >> $microblog_nginx_site
  7788. echo '}' >> $microblog_nginx_site
  7789. else
  7790. echo -n '' > $microblog_nginx_site
  7791. fi
  7792. echo 'server {' >> $microblog_nginx_site
  7793. echo " listen 127.0.0.1:$MICROBLOG_ONION_PORT default_server;" >> $microblog_nginx_site
  7794. echo " server_name $MICROBLOG_DOMAIN_NAME;" >> $microblog_nginx_site
  7795. echo '' >> $microblog_nginx_site
  7796. echo ' # Logs' >> $microblog_nginx_site
  7797. echo ' access_log off;' >> $microblog_nginx_site
  7798. echo ' error_log off;' >> $microblog_nginx_site
  7799. echo '' >> $microblog_nginx_site
  7800. echo ' # Root' >> $microblog_nginx_site
  7801. echo " root /var/www/$MICROBLOG_DOMAIN_NAME/htdocs;" >> $microblog_nginx_site
  7802. echo '' >> $microblog_nginx_site
  7803. echo ' # Index' >> $microblog_nginx_site
  7804. echo ' index index.php;' >> $microblog_nginx_site
  7805. echo '' >> $microblog_nginx_site
  7806. echo ' # PHP' >> $microblog_nginx_site
  7807. echo ' location ~ \.php {' >> $microblog_nginx_site
  7808. echo ' include snippets/fastcgi-php.conf;' >> $microblog_nginx_site
  7809. echo ' fastcgi_pass unix:/var/run/php5-fpm.sock;' >> $microblog_nginx_site
  7810. echo ' }' >> $microblog_nginx_site
  7811. echo '' >> $microblog_nginx_site
  7812. echo ' # Location' >> $microblog_nginx_site
  7813. echo ' location / {' >> $microblog_nginx_site
  7814. echo ' try_files $uri $uri/ @gnusocial;' >> $microblog_nginx_site
  7815. echo ' }' >> $microblog_nginx_site
  7816. echo '' >> $microblog_nginx_site
  7817. echo ' # Fancy URLs' >> $microblog_nginx_site
  7818. echo ' location @gnusocial {' >> $microblog_nginx_site
  7819. echo ' rewrite ^(.*)$ /index.php?p=$1 last;' >> $microblog_nginx_site
  7820. echo ' }' >> $microblog_nginx_site
  7821. echo '' >> $microblog_nginx_site
  7822. echo ' # Restrict access that is unnecessary anyway' >> $microblog_nginx_site
  7823. echo ' location ~ /\.(ht|git) {' >> $microblog_nginx_site
  7824. echo ' deny all;' >> $microblog_nginx_site
  7825. echo ' }' >> $microblog_nginx_site
  7826. echo '' >> $microblog_nginx_site
  7827. nginx_disable_sniffing $MICROBLOG_DOMAIN_NAME
  7828. nginx_limits $MICROBLOG_DOMAIN_NAME '15m'
  7829. echo '}' >> $microblog_nginx_site
  7830. configure_php
  7831. create_site_certificate $MICROBLOG_DOMAIN_NAME 'yes'
  7832. # Ensure that the database gets backed up locally, if remote
  7833. # backups are not being used
  7834. backup_databases_script_header
  7835. backup_database_local gnusocial
  7836. nginx_ensite $MICROBLOG_DOMAIN_NAME
  7837. # NOTE: For the typical case always enable SSL and only
  7838. # disable it if in onion only mode. This is due to complexities
  7839. # with the way URLs are generated by GNU Social
  7840. gnu_social_ssl='always'
  7841. if [[ $ONION_ONLY != 'no' ]]; then
  7842. gnu_social_ssl='never'
  7843. fi
  7844. MICROBLOG_ONION_HOSTNAME=$(add_onion_service microblog 80 ${MICROBLOG_ONION_PORT})
  7845. MICROBLOG_SERVER=${MICROBLOG_DOMAIN_NAME}
  7846. if [[ $ONION_ONLY != 'no' ]]; then
  7847. MICROBLOG_SERVER=${MICROBLOG_ONION_HOSTNAME}
  7848. fi
  7849. # Create the configuration
  7850. gnu_social_installer=/var/www/${MICROBLOG_DOMAIN_NAME}/htdocs/scripts/install_cli.php
  7851. if [ ! -f $gnu_social_installer ]; then
  7852. echo $'No GNU Social commandline installer found'
  7853. exit 53026
  7854. fi
  7855. ${gnu_social_installer} --server "${MICROBLOG_SERVER}" \
  7856. --host="localhost" --database="gnusocial" \
  7857. --dbtype=mysql --username="root" -v \
  7858. --password="$MARIADB_PASSWORD" \
  7859. --sitename=$"GNU Social" --fancy='yes' \
  7860. --admin-nick="$MY_USERNAME" \
  7861. --admin-pass="$MICROBLOG_ADMIN_PASSWORD" \
  7862. --site-profile="community" \
  7863. --ssl=${gnu_social_ssl}
  7864. # There can be a lot of warnings here so the return value check is disabled
  7865. #if [ ! "$?" = "0" ]; then
  7866. # # failed to install
  7867. # echo $'Could not install GNU Social'
  7868. # exit 72357
  7869. #fi
  7870. # check microblog has a config file
  7871. microblog_config_file=/var/www/$MICROBLOG_DOMAIN_NAME/htdocs/config.php
  7872. if [ ! -f $microblog_config_file ]; then
  7873. echo $'Microblog config.php not found'
  7874. exit 87586
  7875. fi
  7876. # Some useful settings
  7877. if ! grep -q "Recommended GNU social settings" $microblog_config_file; then
  7878. echo "" >> $microblog_config_file
  7879. echo "// Recommended GNU social settings" >> $microblog_config_file
  7880. echo "\$config['thumbnail']['maxsize'] = 3000;" >> $microblog_config_file
  7881. echo "\$config['profile']['delete'] = true;" >> $microblog_config_file
  7882. echo "\$config['profile']['changenick'] = true;" >> $microblog_config_file
  7883. echo "\$config['public']['localonly'] = false;" >> $microblog_config_file
  7884. echo "addPlugin('StoreRemoteMedia');" >> $microblog_config_file
  7885. echo "\$config['queue']['enabled'] = true;" >> $microblog_config_file
  7886. echo "\$config['queue']['daemon'] = true;" >> $microblog_config_file
  7887. fi
  7888. # This improves performance
  7889. sed -i "s|//\$config\['db'\]\['schemacheck'\].*|\$config\['db'\]\['schemacheck'\] = 'script';|g" $microblog_config_file
  7890. systemctl restart php5-fpm
  7891. systemctl restart nginx
  7892. freedombone-addemail -u $MY_USERNAME -e "noreply@$MICROBLOG_DOMAIN_NAME" -g gnusocial --public no
  7893. # some post-install instructions for the user
  7894. if ! grep -q $"Microblog administrator" /home/$MY_USERNAME/README; then
  7895. echo '' >> /home/$MY_USERNAME/README
  7896. echo '' >> /home/$MY_USERNAME/README
  7897. echo $'Microblog' >> /home/$MY_USERNAME/README
  7898. echo '=========' >> /home/$MY_USERNAME/README
  7899. echo $"Microblog administrator nickname: $MY_USERNAME" >> /home/$MY_USERNAME/README
  7900. echo $"Microblog administrator password: $MICROBLOG_ADMIN_PASSWORD" >> /home/$MY_USERNAME/README
  7901. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
  7902. chmod 600 /home/$MY_USERNAME/README
  7903. fi
  7904. if ! grep -q "Microblog onion domain" /home/$MY_USERNAME/README; then
  7905. echo $"Microblog onion domain: ${MICROBLOG_ONION_HOSTNAME}" >> /home/$MY_USERNAME/README
  7906. echo '' >> /home/$MY_USERNAME/README
  7907. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
  7908. chmod 600 /home/$MY_USERNAME/README
  7909. fi
  7910. echo "GNU Social onion domain:${MICROBLOG_ONION_HOSTNAME}" >> $COMPLETION_FILE
  7911. echo "GNU Social domain:$MICROBLOG_DOMAIN_NAME" >> $COMPLETION_FILE
  7912. echo 'install_gnu_social' >> $COMPLETION_FILE
  7913. }
  7914. function expire_gnu_social_posts {
  7915. # To prevent the database size from growing endlessly this script expires posts
  7916. # after a number of months
  7917. 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
  7918. return
  7919. fi
  7920. if [ ! -d /var/www/$MICROBLOG_DOMAIN_NAME/htdocs ]; then
  7921. return
  7922. fi
  7923. gnusocial_expire_script=/usr/bin/gnusocial-expire
  7924. echo '<?php' > $gnusocial_expire_script
  7925. echo '' >> $gnusocial_expire_script
  7926. echo '// GNU Social post expiry script, based on StatExpire by Tony Baldwin' >> $gnusocial_expire_script
  7927. echo '// https://github.com/tonybaldwin/statexpire' >> $gnusocial_expire_script
  7928. echo '' >> $gnusocial_expire_script
  7929. echo '$oldate=date(("Y-m-d"), strtotime("-3 months"));' >> $gnusocial_expire_script
  7930. echo '$username="root";' >> $gnusocial_expire_script
  7931. echo "\$password=trim(file_get_contents(\"$DATABASE_PASSWORD_FILE\"));" >> $gnusocial_expire_script
  7932. echo '$database="gnusocial";' >> $gnusocial_expire_script
  7933. echo '' >> $gnusocial_expire_script
  7934. echo 'if (!$link = mysql_connect("localhost", $username, $password)) {' >> $gnusocial_expire_script
  7935. echo ' echo "Could not connect to mariadb";' >> $gnusocial_expire_script
  7936. echo ' exit;' >> $gnusocial_expire_script
  7937. echo '}' >> $gnusocial_expire_script
  7938. echo '' >> $gnusocial_expire_script
  7939. echo 'if (!mysql_select_db($database, $link)) {' >> $gnusocial_expire_script
  7940. echo ' echo "Could not select gnusocial database";' >> $gnusocial_expire_script
  7941. echo ' exit;' >> $gnusocial_expire_script
  7942. echo '}' >> $gnusocial_expire_script
  7943. echo '' >> $gnusocial_expire_script
  7944. echo "\$notice_query=\"DELETE FROM notice WHERE created <= '\$oldate 01:01:01'\";" >> $gnusocial_expire_script
  7945. echo "\$conversation_query=\"DELETE FROM conversation WHERE created <= '$oldate 01:01:01'\";" >> $gnusocial_expire_script
  7946. echo "\$reply_query=\"DELETE FROM reply WHERE modified <= '\$oldate 01:01:01'\";" >> $gnusocial_expire_script
  7947. echo '' >> $gnusocial_expire_script
  7948. echo 'mysql_query($notice_query);' >> $gnusocial_expire_script
  7949. echo '$rowaff1=mysql_affected_rows();' >> $gnusocial_expire_script
  7950. echo 'mysql_query($conversation_query);' >> $gnusocial_expire_script
  7951. echo '$rowaff2=mysql_affected_rows();' >> $gnusocial_expire_script
  7952. echo 'mysql_query($reply_query);' >> $gnusocial_expire_script
  7953. echo '$rowaff3=mysql_affected_rows();' >> $gnusocial_expire_script
  7954. echo 'mysql_close();' >> $gnusocial_expire_script
  7955. echo '' >> $gnusocial_expire_script
  7956. echo 'echo "Expire GNU Social posts: $rowaff1 notices, $rowaff2 conversations, and $rowaff3 replies deleted from database.\n";' >> $gnusocial_expire_script
  7957. chmod +x $gnusocial_expire_script
  7958. # Add a cron job
  7959. if ! grep -q "$gnusocial_expire_script" /etc/crontab; then
  7960. echo "10 3 5 * * root /usr/bin/timeout 500 /usr/bin/php $gnusocial_expire_script" >> /etc/crontab
  7961. fi
  7962. # remove old expire script
  7963. if [ -f /etc/cron.weekly/clear-microblog-database ]; then
  7964. rm /etc/cron.weekly/clear-microblog-database
  7965. fi
  7966. }
  7967. function install_gnu_social_theme {
  7968. 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
  7969. return
  7970. fi
  7971. # update to the next commit
  7972. set_repo_commit /var/www/$MICROBLOG_DOMAIN_NAME/htdocs/local/plugins/Qvitter "GNU Social theme commit" "$MICROBLOG_THEME_COMMIT" $MICROBLOG_THEME_REPO
  7973. if grep -Fxq "install_gnu_social_theme" $COMPLETION_FILE; then
  7974. return
  7975. fi
  7976. apt-get -y install wget
  7977. if [ ! -d /var/www/$MICROBLOG_DOMAIN_NAME/htdocs/local/plugins ]; then
  7978. mkdir -p /var/www/$MICROBLOG_DOMAIN_NAME/htdocs/local/plugins
  7979. fi
  7980. cd /var/www/$MICROBLOG_DOMAIN_NAME/htdocs/local/plugins
  7981. git_clone $MICROBLOG_THEME_REPO Qvitter
  7982. cd /var/www/$MICROBLOG_DOMAIN_NAME/htdocs/local/plugins/Qvitter
  7983. git checkout $MICROBLOG_THEME_COMMIT -b $MICROBLOG_THEME_COMMIT
  7984. # download a custom background image
  7985. MICROBLOG_BACKGROUND_IMAGE_URL_EXT=
  7986. if [ $MICROBLOG_BACKGROUND_IMAGE_URL ]; then
  7987. if [[ $$MICROBLOG_BACKGROUND_IMAGE_URL == *".jpeg" || $$MICROBLOG_BACKGROUND_IMAGE_URL == *".jpg" ]]; then
  7988. MICROBLOG_BACKGROUND_IMAGE_URL_EXT="jpg"
  7989. fi
  7990. if [[ $$MICROBLOG_BACKGROUND_IMAGE_URL == *".png" ]]; then
  7991. MICROBLOG_BACKGROUND_IMAGE_URL_EXT="png"
  7992. fi
  7993. if [[ $$MICROBLOG_BACKGROUND_IMAGE_URL == *".gif" ]]; then
  7994. MICROBLOG_BACKGROUND_IMAGE_URL_EXT="gif"
  7995. fi
  7996. if [ $MICROBLOG_BACKGROUND_IMAGE_URL_EXT ]; then
  7997. wget $MICROBLOG_BACKGROUND_IMAGE_URL -O img/custom.${MICROBLOG_BACKGROUND_IMAGE_URL_EXT}
  7998. if [ ! -f img/custom.${MICROBLOG_BACKGROUND_IMAGE_URL_EXT} ]; then
  7999. echo "$MICROBLOG_BACKGROUND_IMAGE_URL"
  8000. echo $'Custom background image for microblog could not be downloaded'
  8001. exit 87524
  8002. fi
  8003. fi
  8004. fi
  8005. microblog_config_file=/var/www/$MICROBLOG_DOMAIN_NAME/htdocs/config.php
  8006. if ! grep -q "addPlugin('Qvitter')" $microblog_config_file; then
  8007. MICROBLOG_WELCOME_MESSAGE=$(echo $MICROBLOG_WELCOME_MESSAGE | sed "s|\$MICROBLOG_DOMAIN_NAME|$MICROBLOG_DOMAIN_NAME|g")
  8008. echo "" >> $microblog_config_file
  8009. echo "// Qvitter settings" >> $microblog_config_file
  8010. echo "addPlugin('Qvitter');" >> $microblog_config_file
  8011. echo "\$config['site']['qvitter']['enabledbydefault'] = true;" >> $microblog_config_file
  8012. echo "\$config['site']['qvitter']['defaultbackgroundcolor'] = '#f4f4f4';" >> $microblog_config_file
  8013. echo "\$config['site']['qvitter']['defaultlinkcolor'] = '#0084B4';" >> $microblog_config_file
  8014. echo "\$config['site']['qvitter']['timebetweenpolling'] = 120000; // two minutes" >> $microblog_config_file
  8015. echo "\$config['site']['qvitter']['urlshortenerapiurl'] = 'http://qttr.at/shortener.php';" >> $microblog_config_file
  8016. echo "\$config['site']['qvitter']['urlshortenersignature'] = 'b6afeec983';" >> $microblog_config_file
  8017. if [ $MICROBLOG_BACKGROUND_IMAGE_URL ]; then
  8018. echo "\$config['site']['qvitter']['sitebackground'] = 'img/custom.${MICROBLOG_BACKGROUND_IMAGE_URL_EXT}';" >> $microblog_config_file
  8019. else
  8020. echo "\$config['site']['qvitter']['sitebackground'] = 'img/vagnsmossen.jpg';" >> $microblog_config_file
  8021. fi
  8022. echo "\$config['site']['qvitter']['favicon'] = 'img/favicon.ico?v=4';" >> $microblog_config_file
  8023. echo "\$config['site']['qvitter']['sprite'] = Plugin::staticPath('Qvitter', '').'img/sprite.png?v=40';" >> $microblog_config_file
  8024. echo "\$config['site']['qvitter']['enablewelcometext'] = true;" >> $microblog_config_file
  8025. echo "\$config['site']['qvitter']['customwelcometext']['en'] = '$MICROBLOG_WELCOME_MESSAGE';" >> $microblog_config_file
  8026. echo "\$config['site']['qvitter']['customwelcometext']['de'] = '$MICROBLOG_WELCOME_MESSAGE';" >> $microblog_config_file
  8027. echo "\$config['site']['qvitter']['customwelcometext']['fr'] = '$MICROBLOG_WELCOME_MESSAGE';" >> $microblog_config_file
  8028. echo "\$config['site']['qvitter']['customwelcometext']['es'] = '$MICROBLOG_WELCOME_MESSAGE';" >> $microblog_config_file
  8029. echo "\$config['site']['qvitter']['blocked_ips'] = array();" >> $microblog_config_file
  8030. else
  8031. if [ $MICROBLOG_BACKGROUND_IMAGE_URL_EXT ]; then
  8032. if [ -f img/custom.${MICROBLOG_BACKGROUND_IMAGE_URL_EXT} ]; then
  8033. sed -i "s|\$config['site']['qvitter']['sitebackground'].*|\$config['site']['qvitter']['sitebackground'] = 'img/custom.${MICROBLOG_BACKGROUND_IMAGE_URL_EXT}';|g" $microblog_config_file
  8034. fi
  8035. fi
  8036. fi
  8037. if ! grep -q "GNU Social theme commit" $COMPLETION_FILE; then
  8038. echo "GNU Social theme commit:$MICROBLOG_THEME_COMMIT" >> $COMPLETION_FILE
  8039. fi
  8040. chown -R www-data:www-data /var/www/$MICROBLOG_DOMAIN_NAME/htdocs
  8041. echo 'install_gnu_social_theme' >> $COMPLETION_FILE
  8042. }
  8043. function install_gnu_social_markdown {
  8044. 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
  8045. return
  8046. fi
  8047. MICROBLOG_PATH=/var/www/$MICROBLOG_DOMAIN_NAME/htdocs
  8048. # update to the next commit
  8049. set_repo_commit $MICROBLOG_PATH/local/plugins/Markdown "GNU Social Markdown commit" "$MICROBLOG_MARKDOWN_COMMIT" $MICROBLOG_MARKDOWN_REPO
  8050. if grep -Fxq "install_gnu_social_markdown" $COMPLETION_FILE; then
  8051. return
  8052. fi
  8053. if [ -d $MICROBLOG_PATH/local/plugins/Markdown ]; then
  8054. rm -rf $MICROBLOG_PATH/local/plugins/Markdown
  8055. fi
  8056. if [ ! -d $MICROBLOG_PATH/local/plugins ]; then
  8057. mkdir -p $MICROBLOG_PATH/local/plugins
  8058. fi
  8059. cd $MICROBLOG_PATH/local/plugins
  8060. git_clone $MICROBLOG_MARKDOWN_REPO Markdown
  8061. cd $MICROBLOG_PATH/local/plugins/Markdown
  8062. git checkout $MICROBLOG_MARKDOWN_COMMIT -b $MICROBLOG_MARKDOWN_COMMIT
  8063. microblog_config_file=$MICROBLOG_PATH/config.php
  8064. if ! grep -q "addPlugin('Markdown'" $microblog_config_file; then
  8065. echo "" >> $microblog_config_file
  8066. echo "// Markdown settings" >> $microblog_config_file
  8067. echo "addPlugin('Markdown');" >> $microblog_config_file
  8068. fi
  8069. if ! grep -q "GNU Social Markdown commit" $COMPLETION_FILE; then
  8070. echo "GNU Social Markdown commit:$MICROBLOG_MARKDOWN_COMMIT" >> $COMPLETION_FILE
  8071. fi
  8072. chown -R www-data:www-data $MICROBLOG_PATH
  8073. echo 'install_gnu_social_markdown' >> $COMPLETION_FILE
  8074. }
  8075. function install_search_engine {
  8076. # Note: currently socks5 outgoing proxies to other search engines does not work
  8077. if [[ $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  8078. return
  8079. fi
  8080. if [ ! -d /etc/nginx ]; then
  8081. echo $'Webserver is not installed'
  8082. exit 62429
  8083. fi
  8084. # update to a new commit if needed
  8085. set_repo_commit $SEARCH_ENGINE_PATH/searx "Search engine commit" "$SEARCH_ENGINE_COMMIT" $SEARCH_ENGINE_REPO
  8086. if grep "Search engine key" $COMPLETION_FILE; then
  8087. if [ -f ${SEARCH_ENGINE_PATH}/searx/searx/settings.yml ]; then
  8088. # note: this might change to a --tor option in a later version
  8089. if ! grep 'socks5://127.0.0.1:9050' ${SEARCH_ENGINE_PATH}/searx/searx/settings.yml; then
  8090. echo 'outgoing: # communication with search engines' >> ${SEARCH_ENGINE_PATH}/searx/searx/settings.yml
  8091. echo ' proxies:' >> ${SEARCH_ENGINE_PATH}/searx/searx/settings.yml
  8092. echo ' http : socks5://127.0.0.1:9050' >> ${SEARCH_ENGINE_PATH}/searx/searx/settings.yml
  8093. echo ' https: socks5://127.0.0.1:9050' >> ${SEARCH_ENGINE_PATH}/searx/searx/settings.yml
  8094. fi
  8095. SEARCH_ENGINE_SECRET_KEY=$(cat $COMPLETION_FILE | grep "Search engine key" | awk -F ':' '{print $2}')
  8096. sed -i "s|secret_key.*|secret_key : \"${SEARCH_ENGINE_SECRET_KEY}\"|g" ${SEARCH_ENGINE_PATH}/searx/searx/settings.yml
  8097. if [ -f /var/lib/tor/hidden_service_searx/hostname ]; then
  8098. SEARCH_ENGINE_ONION_HOSTNAME=$(echo /var/lib/tor/hidden_service_searx/hostname)
  8099. sed -i '0,/RE/s/base_url.*/base_url : \"http://${SEARCH_ENGINE_ONION_HOSTNAME}\/' ${SEARCH_ENGINE_PATH}/searx/searx/settings.yml
  8100. fi
  8101. fi
  8102. fi
  8103. if grep -Fxq "install_search_engine" $COMPLETION_FILE; then
  8104. return
  8105. fi
  8106. apt-get -y install python-pip libyaml-dev python-werkzeug python-babel python-lxml apache2-utils
  8107. apt-get -y install git build-essential libxslt-dev python-dev python-virtualenv python-pybabel zlib1g-dev uwsgi uwsgi-plugin-python libapache2-mod-uwsgi
  8108. pip install --upgrade pip
  8109. pip install certifi
  8110. if [ ! "$?" = "0" ]; then
  8111. echo $'Failed to install certifi'
  8112. exit 737692
  8113. fi
  8114. pip install pyyaml
  8115. if [ ! "$?" = "0" ]; then
  8116. echo $'Failed to install pyyaml'
  8117. exit 469242
  8118. fi
  8119. pip install flask --upgrade
  8120. if [ ! "$?" = "0" ]; then
  8121. echo $'Failed to install flask'
  8122. exit 888575
  8123. fi
  8124. pip install flask_restless --upgrade
  8125. if [ ! "$?" = "0" ]; then
  8126. echo $'Failed to install flask_restless'
  8127. exit 54835
  8128. fi
  8129. pip install flask_babel --upgrade
  8130. if [ ! "$?" = "0" ]; then
  8131. echo $'Failed to install flask_babel'
  8132. exit 63738
  8133. fi
  8134. if [ ! -d $SEARCH_ENGINE_PATH ]; then
  8135. mkdir -p $SEARCH_ENGINE_PATH
  8136. fi
  8137. # clone the repo
  8138. cd $SEARCH_ENGINE_PATH
  8139. git_clone $SEARCH_ENGINE_REPO searx
  8140. git checkout $SEARCH_ENGINE_COMMIT -b $SEARCH_ENGINE_COMMIT
  8141. if ! grep -q "Search engine commit" $COMPLETION_FILE; then
  8142. echo "Search engine commit:$SEARCH_ENGINE_COMMIT" >> $COMPLETION_FILE
  8143. else
  8144. sed -i "s/Search engine commit.*/Search engine commit:$SEARCH_ENGINE_COMMIT/g" $COMPLETION_FILE
  8145. fi
  8146. # create an onion service
  8147. SEARCH_ENGINE_ONION_HOSTNAME=$(add_onion_service searx 80 ${SEARCH_ENGINE_ONION_PORT})
  8148. if ! grep "Search engine onion domain" $COMPLETION_FILE; then
  8149. echo "Search engine onion domain:${SEARCH_ENGINE_ONION_HOSTNAME}" >> $COMPLETION_FILE
  8150. else
  8151. sed -i "s|Search engine onion domain.*|Search engine onion domain:${SEARCH_ENGINE_ONION_HOSTNAME}|g" $COMPLETION_FILE
  8152. fi
  8153. # an unprivileged user to run as
  8154. useradd -d ${SEARCH_ENGINE_PATH}/searx/ -s /bin/false searx
  8155. adduser searx debian-tor
  8156. # daemon
  8157. echo '[Unit]' > /etc/systemd/system/searx.service
  8158. echo 'Description=Searx (search engine)' >> /etc/systemd/system/searx.service
  8159. echo 'After=syslog.target' >> /etc/systemd/system/searx.service
  8160. echo 'After=network.target' >> /etc/systemd/system/searx.service
  8161. echo '' >> /etc/systemd/system/searx.service
  8162. echo '[Service]' >> /etc/systemd/system/searx.service
  8163. echo 'Type=simple' >> /etc/systemd/system/searx.service
  8164. echo 'User=searx' >> /etc/systemd/system/searx.service
  8165. echo 'Group=searx' >> /etc/systemd/system/searx.service
  8166. echo "WorkingDirectory=${SEARCH_ENGINE_PATH}/searx" >> /etc/systemd/system/searx.service
  8167. echo "ExecStart=/usr/bin/python ${SEARCH_ENGINE_PATH}/searx/searx/webapp.py" >> /etc/systemd/system/searx.service
  8168. echo 'Restart=always' >> /etc/systemd/system/searx.service
  8169. echo 'Environment="USER=searx"' >> /etc/systemd/system/searx.service
  8170. echo '' >> /etc/systemd/system/searx.service
  8171. echo '[Install]' >> /etc/systemd/system/searx.service
  8172. echo 'WantedBy=multi-user.target' >> /etc/systemd/system/searx.service
  8173. # create a webserver file
  8174. echo 'server {' > /etc/nginx/sites-available/searx
  8175. echo " listen 127.0.0.1:${SEARCH_ENGINE_ONION_PORT} default_server;" >> /etc/nginx/sites-available/searx
  8176. echo " root ${SEARCH_ENGINE_PATH}/searx;" >> /etc/nginx/sites-available/searx
  8177. echo " server_name ${SEARCH_ENGINE_ONION_HOSTNAME};" >> /etc/nginx/sites-available/searx
  8178. echo ' access_log off;' >> /etc/nginx/sites-available/searx
  8179. echo " error_log /var/log/searx_error.log $WEBSERVER_LOG_LEVEL;" >> /etc/nginx/sites-available/searx
  8180. echo '' >> /etc/nginx/sites-available/searx
  8181. nginx_limits searx '1M'
  8182. nginx_disable_sniffing searx
  8183. echo ' add_header Strict-Transport-Security max-age=0;' >> /etc/nginx/sites-available/searx
  8184. echo '' >> /etc/nginx/sites-available/searx
  8185. echo ' location / {' >> /etc/nginx/sites-available/searx
  8186. echo ' proxy_pass http://localhost:8888;' >> /etc/nginx/sites-available/searx
  8187. echo ' proxy_set_header Host $host;' >> /etc/nginx/sites-available/searx
  8188. echo ' proxy_set_header X-Real-IP $remote_addr;' >> /etc/nginx/sites-available/searx
  8189. echo ' proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;' >> /etc/nginx/sites-available/searx
  8190. echo ' proxy_set_header X-Remote-Port $remote_port;' >> /etc/nginx/sites-available/searx
  8191. echo ' proxy_set_header X-Forwarded-Proto $scheme;' >> /etc/nginx/sites-available/searx
  8192. echo ' proxy_redirect off;' >> /etc/nginx/sites-available/searx
  8193. echo " auth_basic \"${SEARCH_ENGINE_LOGIN_TEXT}\";" >> /etc/nginx/sites-available/searx
  8194. echo ' auth_basic_user_file /etc/nginx/.htpasswd;' >> /etc/nginx/sites-available/searx
  8195. echo ' }' >> /etc/nginx/sites-available/searx
  8196. echo '' >> /etc/nginx/sites-available/searx
  8197. echo ' fastcgi_buffers 64 4K;' >> /etc/nginx/sites-available/searx
  8198. echo '' >> /etc/nginx/sites-available/searx
  8199. echo ' error_page 403 /core/templates/403.php;' >> /etc/nginx/sites-available/searx
  8200. echo ' error_page 404 /core/templates/404.php;' >> /etc/nginx/sites-available/searx
  8201. echo '' >> /etc/nginx/sites-available/searx
  8202. echo ' location = /robots.txt {' >> /etc/nginx/sites-available/searx
  8203. echo ' allow all;' >> /etc/nginx/sites-available/searx
  8204. echo ' log_not_found off;' >> /etc/nginx/sites-available/searx
  8205. echo ' access_log off;' >> /etc/nginx/sites-available/searx
  8206. echo ' }' >> /etc/nginx/sites-available/searx
  8207. echo '}' >> /etc/nginx/sites-available/searx
  8208. # replace the secret key
  8209. if ! grep "Search engine key" $COMPLETION_FILE; then
  8210. SEARCH_ENGINE_SECRET_KEY="$(openssl rand -base64 32 | cut -c1-30)"
  8211. echo "Search engine key:${SEARCH_ENGINE_SECRET_KEY}" >> $COMPLETION_FILE
  8212. else
  8213. SEARCH_ENGINE_SECRET_KEY=$(cat $COMPLETION_FILE | grep "Search engine key" | awk -F ':' '{print $2}')
  8214. fi
  8215. sed -i "s|secret_key.*|secret_key : \"${SEARCH_ENGINE_SECRET_KEY}\"|g" ${SEARCH_ENGINE_PATH}/searx/searx/settings.yml
  8216. sed -i "s|secret_key.*|secret_key : \"${SEARCH_ENGINE_SECRET_KEY}\"|g" ${SEARCH_ENGINE_PATH}/searx/searx/settings_robot.yml
  8217. sed -i '0,/RE/s/base_url.*/base_url : \"http://${SEARCH_ENGINE_ONION_HOSTNAME}\/' ${SEARCH_ENGINE_PATH}/searx/searx/settings.yml
  8218. sed -i '0,/RE/s/base_url.*/base_url : \"http://${SEARCH_ENGINE_ONION_HOSTNAME}\/' ${SEARCH_ENGINE_PATH}/searx/searx/settings_robot.yml
  8219. # note: this might change to a --tor option in a later version
  8220. if ! grep 'socks5://127.0.0.1:9050' ${SEARCH_ENGINE_PATH}/searx/searx/settings.yml; then
  8221. echo 'outgoing: # communication with search engines' >> ${SEARCH_ENGINE_PATH}/searx/searx/settings.yml
  8222. echo ' proxies:' >> ${SEARCH_ENGINE_PATH}/searx/searx/settings.yml
  8223. echo ' http : socks5://127.0.0.1:9050' >> ${SEARCH_ENGINE_PATH}/searx/searx/settings.yml
  8224. echo ' https: socks5://127.0.0.1:9050' >> ${SEARCH_ENGINE_PATH}/searx/searx/settings.yml
  8225. fi
  8226. chown -R searx:searx ${SEARCH_ENGINE_PATH}/searx
  8227. # enable the site
  8228. nginx_ensite searx
  8229. # restart the web server
  8230. systemctl restart php5-fpm
  8231. systemctl restart nginx
  8232. # start the daemon
  8233. systemctl enable searx.service
  8234. systemctl daemon-reload
  8235. systemctl start searx.service
  8236. if ! grep -q "Your search engine password is" /home/$MY_USERNAME/README; then
  8237. if [ ${#SEARCH_ENGINE_PASSWORD} -lt 8 ]; then
  8238. if [ -f $IMAGE_PASSWORD_FILE ]; then
  8239. SEARCH_ENGINE_PASSWORD="$(printf `cat $IMAGE_PASSWORD_FILE`)"
  8240. else
  8241. SEARCH_ENGINE_PASSWORD="$(openssl rand -base64 18 | cut -c1-16)"
  8242. fi
  8243. fi
  8244. echo "$SEARCH_ENGINE_PASSWORD" | htpasswd -i -s -c /etc/nginx/.htpasswd $MY_USERNAME
  8245. echo '' >> /home/$MY_USERNAME/README
  8246. echo '' >> /home/$MY_USERNAME/README
  8247. echo $'Search Engine' >> /home/$MY_USERNAME/README
  8248. echo '=============' >> /home/$MY_USERNAME/README
  8249. echo $"Search engine onion domain: ${SEARCH_ENGINE_ONION_HOSTNAME}" >> /home/$MY_USERNAME/README
  8250. echo $"Your search engine password is: $SEARCH_ENGINE_PASSWORD" >> /home/$MY_USERNAME/README
  8251. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
  8252. chmod 600 /home/$MY_USERNAME/README
  8253. fi
  8254. echo 'install_search_engine' >> $COMPLETION_FILE
  8255. }
  8256. function install_hubzilla {
  8257. 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
  8258. return
  8259. fi
  8260. if [ ! $HUBZILLA_DOMAIN_NAME ]; then
  8261. return
  8262. fi
  8263. HUBZILLA_PATH=/var/www/$HUBZILLA_DOMAIN_NAME/htdocs
  8264. # update to a new commit if needed
  8265. set_repo_commit $HUBZILLA_PATH "Hubzilla commit" "$HUBZILLA_COMMIT" $HUBZILLA_REPO
  8266. set_repo_commit $HUBZILLA_PATH "Hubzilla addons commit" "$HUBZILLA_ADDONS_COMMIT" $HUBZILLA_ADDONS_REPO
  8267. if [ -d $HUBZILLA_PATH/redmatrix-themes1 ]; then
  8268. cd $HUBZILLA_PATH/redmatrix-themes1
  8269. git stash
  8270. git pull
  8271. cp -r $HUBZILLA_PATH/redmatrix-themes1/* $HUBZILLA_PATH/view/theme/
  8272. chown -R www-data:www-data $HUBZILLA_PATH
  8273. fi
  8274. if grep -Fxq "install_hubzilla" $COMPLETION_FILE; then
  8275. return
  8276. fi
  8277. install_mariadb
  8278. get_mariadb_password
  8279. repair_databases_script
  8280. apt-get -y install php5-common php5-cli php5-curl php5-gd php5-mysql php5-mcrypt git
  8281. apt-get -y install php5-dev imagemagick php5-imagick
  8282. if [ ! -d /var/www/$HUBZILLA_DOMAIN_NAME ]; then
  8283. mkdir /var/www/$HUBZILLA_DOMAIN_NAME
  8284. fi
  8285. if [ ! -d $HUBZILLA_PATH ]; then
  8286. mkdir $HUBZILLA_PATH
  8287. fi
  8288. if [ ! -f $HUBZILLA_PATH/index.php ]; then
  8289. cd $INSTALL_DIR
  8290. git_clone $HUBZILLA_REPO hubzilla
  8291. git checkout $HUBZILLA_COMMIT -b $HUBZILLA_COMMIT
  8292. if ! grep -q "Hubzilla commit" $COMPLETION_FILE; then
  8293. echo "Hubzilla commit:$HUBZILLA_COMMIT" >> $COMPLETION_FILE
  8294. else
  8295. sed -i "s/Hubzilla commit.*/Hubzilla commit:$HUBZILLA_COMMIT/g" $COMPLETION_FILE
  8296. fi
  8297. rm -rf $HUBZILLA_PATH
  8298. mv hubzilla $HUBZILLA_PATH
  8299. git_clone $HUBZILLA_ADDONS_REPO $HUBZILLA_PATH/addon
  8300. cd $HUBZILLA_PATH/addon
  8301. git checkout $HUBZILLA_ADDONS_COMMIT -b $HUBZILLA_ADDONS_COMMIT
  8302. if ! grep -q "Hubzilla addons commit" $COMPLETION_FILE; then
  8303. echo "Hubzilla addons commit:$HUBZILLA_ADDONS_COMMIT" >> $COMPLETION_FILE
  8304. else
  8305. sed -i "s/Hubzilla addons commit.*/Hubzilla addons commit:$HUBZILLA_ADDONS_COMMIT/g" $COMPLETION_FILE
  8306. fi
  8307. # some extra themes
  8308. git_clone $HUBZILLA_THEMES_REPO $HUBZILLA_PATH/redmatrix-themes1
  8309. cp -r $HUBZILLA_PATH/redmatrix-themes1/* $HUBZILLA_PATH/view/theme/
  8310. chown -R www-data:www-data $HUBZILLA_PATH
  8311. fi
  8312. HUBZILLA_ONION_HOSTNAME=
  8313. if [[ $ONION_ONLY != "no" ]]; then
  8314. HUBZILLA_ONION_HOSTNAME=$(add_onion_service hubzilla 80 ${HUBZILLA_ONION_PORT})
  8315. echo "Hubzilla onion domain:${HUBZILLA_ONION_HOSTNAME}" >> $COMPLETION_FILE
  8316. fi
  8317. get_mariadb_hubzilla_admin_password
  8318. if [ ! $HUBZILLA_ADMIN_PASSWORD ]; then
  8319. if [ -f $IMAGE_PASSWORD_FILE ]; then
  8320. HUBZILLA_ADMIN_PASSWORD="$(printf `cat $IMAGE_PASSWORD_FILE`)"
  8321. else
  8322. HUBZILLA_ADMIN_PASSWORD="$(openssl rand -base64 32 | cut -c1-30)"
  8323. fi
  8324. echo '' >> /home/$MY_USERNAME/README
  8325. echo '' >> /home/$MY_USERNAME/README
  8326. echo 'Hubzilla' >> /home/$MY_USERNAME/README
  8327. echo '========' >> /home/$MY_USERNAME/README
  8328. if [[ $ONION_ONLY == 'no' ]]; then
  8329. echo $"Open https://$HUBZILLA_DOMAIN_NAME and register a new user" >> /home/$MY_USERNAME/README
  8330. else
  8331. echo $"Open http://$HUBZILLA_ONION_HOSTNAME and register a new user" >> /home/$MY_USERNAME/README
  8332. fi
  8333. echo $"Your MariaDB Hubzilla admin password is: $HUBZILLA_ADMIN_PASSWORD" >> /home/$MY_USERNAME/README
  8334. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
  8335. chmod 600 /home/$MY_USERNAME/README
  8336. fi
  8337. create_database hubzilla "$HUBZILLA_ADMIN_PASSWORD"
  8338. if ! grep -q "$HUBZILLA_PATH" /etc/crontab; then
  8339. echo "12,22,32,42,52 * * * * root cd $HUBZILLA_PATH; /usr/bin/timeout 500 /usr/bin/php include/poller.php" >> /etc/crontab
  8340. fi
  8341. add_ddns_domain $HUBZILLA_DOMAIN_NAME
  8342. if [[ $ONION_ONLY == "no" ]]; then
  8343. nginx_http_redirect $HUBZILLA_DOMAIN_NAME
  8344. echo 'server {' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8345. echo ' listen 443 ssl;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8346. echo " root $HUBZILLA_PATH;" >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8347. echo " server_name $HUBZILLA_DOMAIN_NAME;" >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8348. echo " error_log /var/log/nginx/${HUBZILLA_DOMAIN_NAME}_error_ssl.log $WEBSERVER_LOG_LEVEL;" >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8349. echo ' index index.php;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8350. echo ' charset utf-8;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8351. echo ' access_log off;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8352. nginx_limits $HUBZILLA_DOMAIN_NAME
  8353. nginx_ssl $HUBZILLA_DOMAIN_NAME
  8354. nginx_disable_sniffing $HUBZILLA_DOMAIN_NAME
  8355. echo ' add_header Strict-Transport-Security max-age=15768000;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8356. echo '' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8357. echo ' # rewrite to front controller as default rule' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8358. echo ' location / {' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8359. echo ' rewrite ^/(.*) /index.php?q=$uri&$args last;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8360. echo ' }' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8361. echo '' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8362. echo " # make sure webfinger and other well known services aren't blocked" >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8363. echo ' # by denying dot files and rewrite request to the front controller' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8364. echo ' location ^~ /.well-known/ {' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8365. echo ' allow all;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8366. echo ' rewrite ^/(.*) /index.php?q=$uri&$args last;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8367. echo ' }' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8368. echo '' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8369. echo ' # statically serve these file types when possible' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8370. echo ' # otherwise fall back to front controller' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8371. echo ' # allow browser to cache them' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8372. echo ' # added .htm for advanced source code editor library' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8373. echo ' location ~* \.(jpg|jpeg|gif|png|ico|css|js|htm|html|ttf|woff|svg)$ {' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8374. echo ' expires 30d;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8375. echo ' try_files $uri /index.php?q=$uri&$args;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8376. echo ' }' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8377. echo '' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8378. echo ' # block these file types' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8379. echo ' location ~* \.(tpl|md|tgz|log|out)$ {' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8380. echo ' deny all;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8381. echo ' }' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8382. echo '' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8383. echo ' # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8384. echo ' # or a unix socket' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8385. echo ' location ~* \.php$ {' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8386. echo ' # Zero-day exploit defense.' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8387. echo ' # http://forum.nginx.org/read.php?2,88845,page=3' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8388. echo " # Won't work properly (404 error) if the file is not stored on this" >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8389. echo " # server, which is entirely possible with php-fpm/php-fcgi." >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8390. echo " # Comment the 'try_files' line out if you set up php-fpm/php-fcgi on" >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8391. echo " # another machine. And then cross your fingers that you won't get hacked." >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8392. echo ' try_files $uri $uri/ /index.php;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8393. echo ' # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8394. echo ' fastcgi_split_path_info ^(.+\.php)(/.+)$;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8395. echo ' # With php5-cgi alone:' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8396. echo ' # fastcgi_pass 127.0.0.1:9000;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8397. echo ' # With php5-fpm:' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8398. echo ' fastcgi_pass unix:/var/run/php5-fpm.sock;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8399. echo ' include fastcgi_params;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8400. echo ' fastcgi_index index.php;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8401. echo ' fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8402. echo ' fastcgi_read_timeout 300;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8403. echo ' }' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8404. echo '' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8405. echo ' # deny access to all dot files' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8406. echo ' location ~ /\. {' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8407. echo ' deny all;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8408. echo ' }' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8409. echo '' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8410. echo ' location ~ /\.ht {' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8411. echo ' deny all;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8412. echo ' }' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8413. echo '}' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8414. echo '' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8415. else
  8416. echo 'server {' > /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8417. echo " listen 127.0.0.1:${HUBZILLA_ONION_PORT} default_server;" >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8418. echo " root $HUBZILLA_PATH;" >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8419. echo " server_name $HUBZILLA_ONION_HOSTNAME;" >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8420. echo " error_log /var/log/nginx/${HUBZILLA_DOMAIN_NAME}_error_ssl.log $WEBSERVER_LOG_LEVEL;" >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8421. echo ' index index.php;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8422. echo ' charset utf-8;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8423. echo ' access_log off;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8424. nginx_limits $HUBZILLA_DOMAIN_NAME
  8425. nginx_disable_sniffing $HUBZILLA_DOMAIN_NAME
  8426. echo ' add_header Strict-Transport-Security max-age=15768000;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8427. echo '' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8428. echo ' # rewrite to front controller as default rule' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8429. echo ' location / {' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8430. echo ' rewrite ^/(.*) /index.php?q=$uri&$args last;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8431. echo ' }' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8432. echo '' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8433. echo " # make sure webfinger and other well known services aren't blocked" >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8434. echo ' # by denying dot files and rewrite request to the front controller' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8435. echo ' location ^~ /.well-known/ {' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8436. echo ' allow all;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8437. echo ' rewrite ^/(.*) /index.php?q=$uri&$args last;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8438. echo ' }' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8439. echo '' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8440. echo ' # statically serve these file types when possible' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8441. echo ' # otherwise fall back to front controller' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8442. echo ' # allow browser to cache them' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8443. echo ' # added .htm for advanced source code editor library' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8444. echo ' location ~* \.(jpg|jpeg|gif|png|ico|css|js|htm|html|ttf|woff|svg)$ {' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8445. echo ' expires 30d;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8446. echo ' try_files $uri /index.php?q=$uri&$args;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8447. echo ' }' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8448. echo '' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8449. echo ' # block these file types' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8450. echo ' location ~* \.(tpl|md|tgz|log|out)$ {' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8451. echo ' deny all;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8452. echo ' }' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8453. echo '' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8454. echo ' # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8455. echo ' # or a unix socket' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8456. echo ' location ~* \.php$ {' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8457. echo ' # Zero-day exploit defense.' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8458. echo ' # http://forum.nginx.org/read.php?2,88845,page=3' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8459. echo " # Won't work properly (404 error) if the file is not stored on this" >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8460. echo " # server, which is entirely possible with php-fpm/php-fcgi." >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8461. echo " # Comment the 'try_files' line out if you set up php-fpm/php-fcgi on" >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8462. echo " # another machine. And then cross your fingers that you won't get hacked." >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8463. echo ' try_files $uri $uri/ /index.php;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8464. echo ' # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8465. echo ' fastcgi_split_path_info ^(.+\.php)(/.+)$;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8466. echo ' # With php5-cgi alone:' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8467. echo ' # fastcgi_pass 127.0.0.1:9000;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8468. echo ' # With php5-fpm:' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8469. echo ' fastcgi_pass unix:/var/run/php5-fpm.sock;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8470. echo ' include fastcgi_params;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8471. echo ' fastcgi_index index.php;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8472. echo ' fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8473. echo ' fastcgi_read_timeout 300;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8474. echo ' }' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8475. echo '' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8476. echo ' # deny access to all dot files' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8477. echo ' location ~ /\. {' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8478. echo ' deny all;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8479. echo ' }' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8480. echo '' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8481. echo ' location ~ /\.ht {' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8482. echo ' deny all;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8483. echo ' }' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8484. echo '}' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
  8485. fi
  8486. configure_php
  8487. create_site_certificate $HUBZILLA_DOMAIN_NAME 'yes'
  8488. if [ ! -d $HUBZILLA_PATH/view/tpl/smarty3 ]; then
  8489. mkdir $HUBZILLA_PATH/view/tpl/smarty3
  8490. fi
  8491. if [ ! -d "$HUBZILLA_PATH/store" ]; then
  8492. mkdir "$HUBZILLA_PATH/store"
  8493. fi
  8494. if [ ! -d "$HUBZILLA_PATH/store/[data]" ]; then
  8495. mkdir "$HUBZILLA_PATH/store/[data]"
  8496. fi
  8497. if [ ! -d "$HUBZILLA_PATH/store/[data]/smarty3" ]; then
  8498. mkdir "$HUBZILLA_PATH/store/[data]/smarty3"
  8499. chmod 777 "$HUBZILLA_PATH/store/[data]/smarty3"
  8500. fi
  8501. chmod 777 $HUBZILLA_PATH/view/tpl
  8502. chown -R www-data:www-data "$HUBZILLA_PATH/store"
  8503. chmod 777 $HUBZILLA_PATH/view/tpl/smarty3
  8504. # Ensure that the database gets backed up locally, if remote
  8505. # backups are not being used
  8506. backup_databases_script_header
  8507. backup_database_local hubzilla
  8508. chown -R www-data:www-data $HUBZILLA_PATH
  8509. nginx_ensite $HUBZILLA_DOMAIN_NAME
  8510. # initialize the database
  8511. if [ ! -f $HUBZILLA_PATH/install/schema_mysql.sql ]; then
  8512. echo $'No database schema found for hubzilla'
  8513. exit 252782
  8514. fi
  8515. mysql -u root --password="$MARIADB_PASSWORD" -D hubzilla < $HUBZILLA_PATH/install/schema_mysql.sql
  8516. if [ ! "$?" = "0" ]; then
  8517. exit 62952
  8518. fi
  8519. # create the config file
  8520. echo '<?php' > $HUBZILLA_PATH/.htconfig.php
  8521. echo "\$db_host = 'localhost';" >> $HUBZILLA_PATH/.htconfig.php
  8522. echo "\$db_port = '0';" >> $HUBZILLA_PATH/.htconfig.php
  8523. echo "\$db_user = 'root';" >> $HUBZILLA_PATH/.htconfig.php
  8524. echo "\$db_pass = '${MARIADB_PASSWORD}';" >> $HUBZILLA_PATH/.htconfig.php
  8525. echo "\$db_data = 'hubzilla';" >> $HUBZILLA_PATH/.htconfig.php
  8526. echo "\$db_type = '0';" >> $HUBZILLA_PATH/.htconfig.php
  8527. echo "\$default_timezone = 'Europe/London';" >> $HUBZILLA_PATH/.htconfig.php
  8528. if [[ $ONION_ONLY == 'no' ]]; then
  8529. echo "\$a->config['system']['baseurl'] = 'https://${HUBZILLA_DOMAIN_NAME}';" >> $HUBZILLA_PATH/.htconfig.php
  8530. else
  8531. echo "\$a->config['system']['baseurl'] = 'http://${HUBZILLA_ONION_HOSTNAME}';" >> $HUBZILLA_PATH/.htconfig.php
  8532. fi
  8533. echo "\$a->config['system']['sitename'] = \"Hubzilla\";" >> $HUBZILLA_PATH/.htconfig.php
  8534. HUBZILLA_LOCATION_HASH="$(openssl rand -base64 32 | cut -c1-30)"
  8535. echo "\$a->config['system']['location_hash'] = '${HUBZILLA_LOCATION_HASH}';" >> $HUBZILLA_PATH/.htconfig.php
  8536. echo "\$a->config['system']['register_policy'] = REGISTER_OPEN;" >> $HUBZILLA_PATH/.htconfig.php
  8537. echo "\$a->config['system']['register_text'] = '';" >> $HUBZILLA_PATH/.htconfig.php
  8538. echo "\$a->config['system']['admin_email'] = '${MY_EMAIL_ADDRESS}';" >> $HUBZILLA_PATH/.htconfig.php
  8539. echo "\$a->config['system']['verify_email'] = 1;" >> $HUBZILLA_PATH/.htconfig.php
  8540. echo "\$a->config['system']['access_policy'] = ACCESS_PRIVATE;" >> $HUBZILLA_PATH/.htconfig.php
  8541. echo "\$a->config['system']['sellpage'] = '';" >> $HUBZILLA_PATH/.htconfig.php
  8542. echo "\$a->config['system']['max_import_size'] = 200000;" >> $HUBZILLA_PATH/.htconfig.php
  8543. echo "\$a->config['system']['php_path'] = '/usr/bin/php';" >> $HUBZILLA_PATH/.htconfig.php
  8544. echo "\$a->config['system']['directory_mode'] = DIRECTORY_MODE_NORMAL;" >> $HUBZILLA_PATH/.htconfig.php
  8545. echo "\$a->config['system']['theme'] = 'redbasic';" >> $HUBZILLA_PATH/.htconfig.php
  8546. chown www-data:www-data $HUBZILLA_PATH/.htconfig.php
  8547. chmod 755 $HUBZILLA_PATH/.htconfig.php
  8548. systemctl restart php5-fpm
  8549. systemctl restart nginx
  8550. systemctl restart cron
  8551. freedombone-addemail -u $MY_USERNAME -e "noreply@$HUBZILLA_DOMAIN_NAME" -g hubzilla --public no
  8552. echo "Hubzilla domain:${HUBZILLA_DOMAIN_NAME}" >> $COMPLETION_FILE
  8553. echo 'install_hubzilla' >> $COMPLETION_FILE
  8554. }
  8555. function script_for_attaching_usb_drive {
  8556. if grep -Fxq "script_for_attaching_usb_drive" $COMPLETION_FILE; then
  8557. return
  8558. fi
  8559. echo '#!/bin/bash' > /usr/bin/attach-music
  8560. echo 'remove-music' >> /usr/bin/attach-music
  8561. echo "if [ ! -d $USB_MOUNT ]; then" >> /usr/bin/attach-music
  8562. echo " mkdir $USB_MOUNT" >> /usr/bin/attach-music
  8563. echo 'fi' >> /usr/bin/attach-music
  8564. echo "mount /dev/sda1 $USB_MOUNT" >> /usr/bin/attach-music
  8565. echo "chown root:root $USB_MOUNT" >> /usr/bin/attach-music
  8566. echo "chown -R minidlna:minidlna $USB_MOUNT/*" >> /usr/bin/attach-music
  8567. echo 'service minidlna restart' >> /usr/bin/attach-music
  8568. echo 'minidlnad -R' >> /usr/bin/attach-music
  8569. chmod +x /usr/bin/attach-music
  8570. ln -s /usr/bin/attach-music /usr/bin/attach-usb
  8571. ln -s /usr/bin/attach-music /usr/bin/attach-videos
  8572. ln -s /usr/bin/attach-music /usr/bin/attach-pictures
  8573. ln -s /usr/bin/attach-music /usr/bin/attach-media
  8574. echo '#!/bin/bash' > /usr/bin/remove-music
  8575. echo "if [ -d $USB_MOUNT ]; then" >> /usr/bin/remove-music
  8576. echo " umount $USB_MOUNT" >> /usr/bin/remove-music
  8577. echo " rm -rf $USB_MOUNT" >> /usr/bin/remove-music
  8578. echo 'fi' >> /usr/bin/remove-music
  8579. chmod +x /usr/bin/remove-music
  8580. ln -s /usr/bin/remove-music /usr/bin/detach-music
  8581. ln -s /usr/bin/remove-music /usr/bin/detach-usb
  8582. ln -s /usr/bin/remove-music /usr/bin/remove-usb
  8583. ln -s /usr/bin/remove-music /usr/bin/detach-media
  8584. ln -s /usr/bin/remove-music /usr/bin/remove-media
  8585. ln -s /usr/bin/remove-music /usr/bin/detach-videos
  8586. ln -s /usr/bin/remove-music /usr/bin/remove-videos
  8587. ln -s /usr/bin/remove-music /usr/bin/detach-pictures
  8588. ln -s /usr/bin/remove-music /usr/bin/remove-pictures
  8589. echo 'script_for_attaching_usb_drive' >> $COMPLETION_FILE
  8590. }
  8591. function install_dlna_server {
  8592. if grep -Fxq "install_dlna_server" $COMPLETION_FILE; then
  8593. return
  8594. fi
  8595. 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
  8596. return
  8597. fi
  8598. apt-get -y install minidlna
  8599. if [ ! -f /etc/minidlna.conf ]; then
  8600. echo $"ERROR: minidlna does not appear to have installed. $CHECK_MESSAGE"
  8601. exit 55
  8602. fi
  8603. sed -i "s|media_dir=/var/lib/minidlna|media_dir=A,/home/$MY_USERNAME/Music|g" /etc/minidlna.conf
  8604. if ! grep -q "/home/$MY_USERNAME/Pictures" /etc/minidlna.conf; then
  8605. echo "media_dir=P,/home/$MY_USERNAME/Pictures" >> /etc/minidlna.conf
  8606. fi
  8607. if ! grep -q "/home/$MY_USERNAME/Videos" /etc/minidlna.conf; then
  8608. echo "media_dir=V,/home/$MY_USERNAME/Videos" >> /etc/minidlna.conf
  8609. fi
  8610. if ! grep -q "$USB_MOUNT/Music" /etc/minidlna.conf; then
  8611. echo "media_dir=A,$USB_MOUNT/Music" >> /etc/minidlna.conf
  8612. fi
  8613. if ! grep -q "$USB_MOUNT/Pictures" /etc/minidlna.conf; then
  8614. echo "media_dir=P,$USB_MOUNT/Pictures" >> /etc/minidlna.conf
  8615. fi
  8616. if ! grep -q "$USB_MOUNT/Videos" /etc/minidlna.conf; then
  8617. echo "media_dir=V,$USB_MOUNT/Videos" >> /etc/minidlna.conf
  8618. fi
  8619. sed -i 's/#root_container=./root_container=B/g' /etc/minidlna.conf
  8620. if [[ $SYSTEM_TYPE != "$VARIANT_MESH" ]]; then
  8621. sed -i 's/#network_interface=/network_interface=eth0/g' /etc/minidlna.conf
  8622. else
  8623. sed -i 's/#network_interface=/network_interface=$WIFI_INTERFACE/g' /etc/minidlna.conf
  8624. fi
  8625. sed -i "s/#friendly_name=/friendly_name=\"${PROJECT_NAME} Media\"/g" /etc/minidlna.conf
  8626. sed -i 's|#db_dir=/var/cache/minidlna|db_dir=/var/cache/minidlna|g' /etc/minidlna.conf
  8627. sed -i 's/#inotify=yes/inotify=yes/g' /etc/minidlna.conf
  8628. sed -i 's/#notify_interval=895/notify_interval=300/g' /etc/minidlna.conf
  8629. sed -i "s|#presentation_url=/|presentation_url=http://localhost:8200|g" /etc/minidlna.conf
  8630. service minidlna force-reload
  8631. service minidlna reload
  8632. sed -i 's/fs.inotify.max_user_watches*/fs.inotify.max_user_watches=65536/g' /etc/sysctl.conf
  8633. if ! grep -q "max_user_watches" $COMPLETION_FILE; then
  8634. echo 'fs.inotify.max_user_watches=65536' >> /etc/sysctl.conf
  8635. fi
  8636. /sbin/sysctl -p
  8637. echo 'install_dlna_server' >> $COMPLETION_FILE
  8638. }
  8639. function install_mediagoblin {
  8640. 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
  8641. return
  8642. fi
  8643. if [ ! $MEDIAGOBLIN_DOMAIN_NAME ]; then
  8644. return
  8645. fi
  8646. MEDIAGOBLIN_WORKING_DIRECTORY=/var/www/$MEDIAGOBLIN_DOMAIN_NAME/htdocs
  8647. # update to a new commit if needed
  8648. set_repo_commit $MEDIAGOBLIN_WORKING_DIRECTORY "Mediagoblin commit" "$MEDIAGOBLIN_COMMIT" $MEDIAGOBLIN_REPO
  8649. if [ -d $MEDIAGOBLIN_WORKING_DIRECTORY ]; then
  8650. chown -hR mediagoblin:www-data $MEDIAGOBLIN_WORKING_DIRECTORY
  8651. fi
  8652. if grep -Fxq "install_mediagoblin" $COMPLETION_FILE; then
  8653. return
  8654. fi
  8655. apt-get -y install git-core python python-dev python-lxml python-pil
  8656. apt-get -y install python-virtualenv npm nodejs-legacy automake
  8657. apt-get -y install fcgiwrap
  8658. #apt-get -y install postgresql postgresql-client python-psycopg2
  8659. #apt-get -y install python-gst-1.0 libjpeg62-turbo-dev gstreamer1.0-plugins-base python-gobject
  8660. #apt-get -y install gstreamer1.0-plugins-good gstreamer1.0-libav libav-tools gstreamer0.10-tools
  8661. #apt-get -y install python-numpy python-scipy libsndfile1-dev python-gst0.10-dev
  8662. #apt-get -y install gstreamer0.10-plugins-base gstreamer0.10-plugins-good gstreamer1.0-tools
  8663. #su -c "createuser -A -D mediagoblin" - postgres
  8664. #su -c "createdb -E UNICODE -O mediagoblin mediagoblin" - postgres
  8665. useradd -c "GNU MediaGoblin system account" -d /var/lib/mediagoblin -m -r -g www-data mediagoblin
  8666. groupadd mediagoblin
  8667. usermod --append -G mediagoblin mediagoblin
  8668. if [ ! -d $MEDIAGOBLIN_WORKING_DIRECTORY ]; then
  8669. mkdir -p $MEDIAGOBLIN_WORKING_DIRECTORY
  8670. fi
  8671. git_clone $MEDIAGOBLIN_REPO $MEDIAGOBLIN_WORKING_DIRECTORY
  8672. cd $MEDIAGOBLIN_WORKING_DIRECTORY
  8673. git checkout $MEDIAGOBLIN_COMMIT -b $MEDIAGOBLIN_COMMIT
  8674. git submodule init
  8675. git submodule update
  8676. if ! grep -q "Mediagoblin commit" $COMPLETION_FILE; then
  8677. echo "Mediagoblin commit:$MEDIAGOBLIN_COMMIT" >> $COMPLETION_FILE
  8678. else
  8679. sed -i "s/Mediagoblin commit.*/Mediagoblin commit:$MEDIAGOBLIN_COMMIT/g" $COMPLETION_FILE
  8680. fi
  8681. chown -hR mediagoblin:www-data $MEDIAGOBLIN_WORKING_DIRECTORY
  8682. su -c "cd $MEDIAGOBLIN_WORKING_DIRECTORY && ./bootstrap.sh" - mediagoblin
  8683. if [ ! "$?" = "0" ]; then
  8684. exit 278826
  8685. fi
  8686. su -c "cd $MEDIAGOBLIN_WORKING_DIRECTORY && ./configure" - mediagoblin
  8687. if [ ! "$?" = "0" ]; then
  8688. exit 462826
  8689. fi
  8690. su -c "cd $MEDIAGOBLIN_WORKING_DIRECTORY && make" - mediagoblin
  8691. if [ ! "$?" = "0" ]; then
  8692. exit 738229
  8693. fi
  8694. if [ ! -d $MEDIAGOBLIN_WORKING_DIRECTORY/user_dev ]; then
  8695. mkdir $MEDIAGOBLIN_WORKING_DIRECTORY/user_dev
  8696. fi
  8697. chmod 750 $MEDIAGOBLIN_WORKING_DIRECTORY/user_dev
  8698. su -c "cd $MEDIAGOBLIN_WORKING_DIRECTORY && ./bin/easy_install flup==1.0.3.dev-20110405" - mediagoblin
  8699. su -c "cd $MEDIAGOBLIN_WORKING_DIRECTORY && ./bin/easy_install --upgrade billiard" - mediagoblin
  8700. su -c "cd $MEDIAGOBLIN_WORKING_DIRECTORY && ./bin/easy_install --upgrade Paste" - mediagoblin
  8701. su -c "cd $MEDIAGOBLIN_WORKING_DIRECTORY && ./bin/easy_install --upgrade amqp" - mediagoblin
  8702. su -c "cd $MEDIAGOBLIN_WORKING_DIRECTORY && ./bin/easy_install --upgrade anyjson" - mediagoblin
  8703. su -c "cd $MEDIAGOBLIN_WORKING_DIRECTORY && ./bin/easy_install --upgrade py-bcrypt" - mediagoblin
  8704. su -c "cd $MEDIAGOBLIN_WORKING_DIRECTORY && ./bin/easy_install --upgrade wtforms" - mediagoblin
  8705. su -c "cd $MEDIAGOBLIN_WORKING_DIRECTORY && ./bin/easy_install --upgrade python-dateutil" - mediagoblin
  8706. su -c "cd $MEDIAGOBLIN_WORKING_DIRECTORY && ./bin/easy_install --upgrade alembic" - mediagoblin
  8707. su -c "cd $MEDIAGOBLIN_WORKING_DIRECTORY && ./bin/easy_install --upgrade waitress" - mediagoblin
  8708. su -c "cd $MEDIAGOBLIN_WORKING_DIRECTORY && ./bin/easy_install --upgrade imagesize" - mediagoblin
  8709. su -c "cd $MEDIAGOBLIN_WORKING_DIRECTORY && ./bin/easy_install --upgrade alabaster" - mediagoblin
  8710. su -c "cd $MEDIAGOBLIN_WORKING_DIRECTORY && ./bin/easy_install --upgrade snowballstemmer" - mediagoblin
  8711. su -c "cd $MEDIAGOBLIN_WORKING_DIRECTORY && ./bin/easy_install --upgrade docutils" - mediagoblin
  8712. su -c "cd $MEDIAGOBLIN_WORKING_DIRECTORY && ./bin/easy_install --upgrade Pygments" - mediagoblin
  8713. su -c "cd $MEDIAGOBLIN_WORKING_DIRECTORY && ./bin/easy_install --upgrade beautifulsoup4" - mediagoblin
  8714. su -c "cd $MEDIAGOBLIN_WORKING_DIRECTORY && ./bin/easy_install --upgrade WebOb" - mediagoblin
  8715. su -c "cd $MEDIAGOBLIN_WORKING_DIRECTORY && ./bin/easy_install --upgrade py" - mediagoblin
  8716. su -c "cd $MEDIAGOBLIN_WORKING_DIRECTORY && ./bin/easy_install --upgrade execnet" - mediagoblin
  8717. # create some directories
  8718. mkdir /var/log/mediagoblin
  8719. chown -hR mediagoblin:www-data /var/log/mediagoblin
  8720. mkdir /var/run/mediagoblin
  8721. chown -hR mediagoblin:www-data /var/run/mediagoblin
  8722. if [ ! -f $MEDIAGOBLIN_WORKING_DIRECTORY/mediagoblin.ini ]; then
  8723. echo $'mediagoblin.ini not found'
  8724. exit 737529
  8725. fi
  8726. if [ ! -f $MEDIAGOBLIN_WORKING_DIRECTORY/paste.ini ]; then
  8727. echo $'paste.ini not found'
  8728. exit 52762
  8729. fi
  8730. cp -av mediagoblin.ini mediagoblin_local.ini
  8731. cp -av paste.ini paste_local.ini
  8732. chown -hR mediagoblin:www-data $MEDIAGOBLIN_WORKING_DIRECTORY
  8733. # init with systemd
  8734. echo '[Unit]' > /etc/systemd/system/mediagoblin-celeryd.service
  8735. echo 'Description=Mediagoblin Celeryd' >> /etc/systemd/system/mediagoblin-celeryd.service
  8736. echo 'After=syslog.target' >> /etc/systemd/system/mediagoblin-celeryd.service
  8737. echo 'After=network.target' >> /etc/systemd/system/mediagoblin-celeryd.service
  8738. echo '' >> /etc/systemd/system/mediagoblin-celeryd.service
  8739. echo '[Service]' >> /etc/systemd/system/mediagoblin-celeryd.service
  8740. echo 'User=mediagoblin' >> /etc/systemd/system/mediagoblin-celeryd.service
  8741. echo 'Group=mediagoblin' >> /etc/systemd/system/mediagoblin-celeryd.service
  8742. echo 'Type=simple' >> /etc/systemd/system/mediagoblin-celeryd.service
  8743. echo "WorkingDirectory=$MEDIAGOBLIN_WORKING_DIRECTORY" >> /etc/systemd/system/mediagoblin-celeryd.service
  8744. echo "Environment=MEDIAGOBLIN_CONFIG=$MEDIAGOBLIN_WORKING_DIRECTORY/mediagoblin_local.ini \\" >> /etc/systemd/system/mediagoblin-celeryd.service
  8745. echo ' CELERY_CONFIG_MODULE=mediagoblin.init.celery.from_celery' >> /etc/systemd/system/mediagoblin-celeryd.service
  8746. echo "ExecStart=$MEDIAGOBLIN_WORKING_DIRECTORY/bin/celery worker \\" >> /etc/systemd/system/mediagoblin-celeryd.service
  8747. echo ' --logfile=/var/log/mediagoblin/celery.log \' >> /etc/systemd/system/mediagoblin-celeryd.service
  8748. echo ' --loglevel=INFO' >> /etc/systemd/system/mediagoblin-celeryd.service
  8749. echo 'PIDFile=/var/run/mediagoblin/mediagoblin-celeryd.pid' >> /etc/systemd/system/mediagoblin-celeryd.service
  8750. echo '' >> /etc/systemd/system/mediagoblin-celeryd.service
  8751. echo '[Install]' >> /etc/systemd/system/mediagoblin-celeryd.service
  8752. echo 'WantedBy=multi-user.target' >> /etc/systemd/system/mediagoblin-celeryd.service
  8753. echo '[Unit]' > /etc/systemd/system/mediagoblin-paster.service
  8754. echo 'Description=Mediagoblin' >> /etc/systemd/system/mediagoblin-paster.service
  8755. echo 'After=syslog.target' >> /etc/systemd/system/mediagoblin-paster.service
  8756. echo 'After=network.target' >> /etc/systemd/system/mediagoblin-paster.service
  8757. echo '' >> /etc/systemd/system/mediagoblin-paster.service
  8758. echo '[Service]' >> /etc/systemd/system/mediagoblin-paster.service
  8759. echo 'Type=forking' >> /etc/systemd/system/mediagoblin-paster.service
  8760. echo 'User=mediagoblin' >> /etc/systemd/system/mediagoblin-paster.service
  8761. echo 'Group=mediagoblin' >> /etc/systemd/system/mediagoblin-paster.service
  8762. echo 'Environment=CELERY_ALWAYS_EAGER=false' >> /etc/systemd/system/mediagoblin-paster.service
  8763. echo "WorkingDirectory=$MEDIAGOBLIN_WORKING_DIRECTORY" >> /etc/systemd/system/mediagoblin-paster.service
  8764. echo "ExecStart=$MEDIAGOBLIN_WORKING_DIRECTORY/bin/paster serve \\" >> /etc/systemd/system/mediagoblin-paster.service
  8765. echo " $MEDIAGOBLIN_WORKING_DIRECTORY/paste_local.ini \\" >> /etc/systemd/system/mediagoblin-paster.service
  8766. echo ' --pid-file=/var/run/mediagoblin/mediagoblin.pid \' >> /etc/systemd/system/mediagoblin-paster.service
  8767. echo ' --log-file=/var/log/mediagoblin/mediagoblin.log \' >> /etc/systemd/system/mediagoblin-paster.service
  8768. echo ' --daemon \' >> /etc/systemd/system/mediagoblin-paster.service
  8769. echo ' --server-name=fcgi fcgi_host=127.0.0.1 fcgi_port=26543' >> /etc/systemd/system/mediagoblin-paster.service
  8770. echo "ExecStop=$MEDIAGOBLIN_WORKING_DIRECTORY/bin/paster serve \\" >> /etc/systemd/system/mediagoblin-paster.service
  8771. echo ' --pid-file=/var/run/mediagoblin/mediagoblin.pid \' >> /etc/systemd/system/mediagoblin-paster.service
  8772. echo " $MEDIAGOBLIN_WORKING_DIRECTORY/paste_local.ini stop" >> /etc/systemd/system/mediagoblin-paster.service
  8773. echo 'PIDFile=/var/run/mediagoblin/mediagoblin.pid' >> /etc/systemd/system/mediagoblin-paster.service
  8774. echo '' >> /etc/systemd/system/mediagoblin-paster.service
  8775. echo '[Install]' >> /etc/systemd/system/mediagoblin-paster.service
  8776. echo 'WantedBy=multi-user.target' >> /etc/systemd/system/mediagoblin-paster.service
  8777. systemctl daemon-reload
  8778. systemctl enable mediagoblin-celeryd
  8779. systemctl enable mediagoblin-paster
  8780. systemctl daemon-reload
  8781. systemctl start mediagoblin-celeryd
  8782. systemctl start mediagoblin-paster
  8783. MEDIAGOBLIN_ONION_HOSTNAME=$(add_onion_service mediagoblin 80 ${MEDIAGOBLIN_ONION_PORT})
  8784. if ! grep -q "Mediagoblin onion domain" $COMPLETION_FILE; then
  8785. echo "Mediagoblin onion domain:${MEDIAGOBLIN_ONION_HOSTNAME}" >> $COMPLETION_FILE
  8786. else
  8787. sed -i "s|Mediagoblin onion domain.*|Mediagoblin onion domain:${MEDIAGOBLIN_ONION_HOSTNAME}|g" $COMPLETION_FILE
  8788. fi
  8789. if [[ $MEDIAGOBLIN_ONION_HOSTNAME == *"not found"* ]]; then
  8790. echo $'Problem creating onion address for mediagoblin'
  8791. exit 672652
  8792. fi
  8793. # web config
  8794. MEDIAGOBLIN_VIRTUAL_HOST=/etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  8795. nginx_http_redirect $MEDIAGOBLIN_DOMAIN_NAME
  8796. if [[ $ONION_ONLY == 'no' ]]; then
  8797. echo 'server {' >> $MEDIAGOBLIN_VIRTUAL_HOST
  8798. echo ' listen 443 ssl;' >> $MEDIAGOBLIN_VIRTUAL_HOST
  8799. echo ' #################################################' >> $MEDIAGOBLIN_VIRTUAL_HOST
  8800. echo ' # Stock useful config options, but ignore them :)' >> $MEDIAGOBLIN_VIRTUAL_HOST
  8801. echo ' #################################################' >> $MEDIAGOBLIN_VIRTUAL_HOST
  8802. echo ' include /etc/nginx/mime.types;' >> $MEDIAGOBLIN_VIRTUAL_HOST
  8803. echo '' >> $MEDIAGOBLIN_VIRTUAL_HOST
  8804. echo ' autoindex off;' >> $MEDIAGOBLIN_VIRTUAL_HOST
  8805. echo ' default_type application/octet-stream;' >> $MEDIAGOBLIN_VIRTUAL_HOST
  8806. echo ' sendfile on;' >> $MEDIAGOBLIN_VIRTUAL_HOST
  8807. echo '' >> $MEDIAGOBLIN_VIRTUAL_HOST
  8808. nginx_limits $MEDIAGOBLIN_DOMAIN_NAME '20m'
  8809. nginx_ssl $MEDIAGOBLIN_DOMAIN_NAME
  8810. nginx_disable_sniffing $MEDIAGOBLIN_DOMAIN_NAME
  8811. echo '' >> $MEDIAGOBLIN_VIRTUAL_HOST
  8812. echo ' # Gzip' >> $MEDIAGOBLIN_VIRTUAL_HOST
  8813. echo ' gzip on;' >> $MEDIAGOBLIN_VIRTUAL_HOST
  8814. echo ' gzip_min_length 1024;' >> $MEDIAGOBLIN_VIRTUAL_HOST
  8815. echo ' gzip_buffers 4 32k;' >> $MEDIAGOBLIN_VIRTUAL_HOST
  8816. echo ' gzip_types text/plain application/x-javascript text/javascript text/xml text/css;' >> $MEDIAGOBLIN_VIRTUAL_HOST
  8817. echo '' >> $MEDIAGOBLIN_VIRTUAL_HOST
  8818. echo ' #####################################' >> $MEDIAGOBLIN_VIRTUAL_HOST
  8819. echo ' # Mounting MediaGoblin stuff' >> $MEDIAGOBLIN_VIRTUAL_HOST
  8820. echo ' # This is the section you should read' >> $MEDIAGOBLIN_VIRTUAL_HOST
  8821. echo ' #####################################' >> $MEDIAGOBLIN_VIRTUAL_HOST
  8822. echo '' >> $MEDIAGOBLIN_VIRTUAL_HOST
  8823. echo " server_name $MEDIAGOBLIN_DOMAIN_NAME;" >> $MEDIAGOBLIN_VIRTUAL_HOST
  8824. echo ' access_log /var/log/nginx/mediagoblin.log;' >> $MEDIAGOBLIN_VIRTUAL_HOST
  8825. echo ' error_log /var/log/nginx/mediagoblin.error.log;' >> $MEDIAGOBLIN_VIRTUAL_HOST
  8826. echo '' >> $MEDIAGOBLIN_VIRTUAL_HOST
  8827. echo ' # MediaGoblins stock static files: CSS, JS, etc.' >> $MEDIAGOBLIN_VIRTUAL_HOST
  8828. echo ' location /mgoblin_static/ {' >> $MEDIAGOBLIN_VIRTUAL_HOST
  8829. echo " alias $MEDIAGOBLIN_WORKING_DIRECTORY/mediagoblin/static/;" >> $MEDIAGOBLIN_VIRTUAL_HOST
  8830. echo ' }' >> $MEDIAGOBLIN_VIRTUAL_HOST
  8831. echo '' >> $MEDIAGOBLIN_VIRTUAL_HOST
  8832. echo ' # Instance specific media:' >> $MEDIAGOBLIN_VIRTUAL_HOST
  8833. echo ' location /mgoblin_media/ {' >> $MEDIAGOBLIN_VIRTUAL_HOST
  8834. echo " alias $MEDIAGOBLIN_WORKING_DIRECTORY/user_dev/media/public/;" >> $MEDIAGOBLIN_VIRTUAL_HOST
  8835. echo ' }' >> $MEDIAGOBLIN_VIRTUAL_HOST
  8836. echo '' >> $MEDIAGOBLIN_VIRTUAL_HOST
  8837. echo ' # Theme static files (usually symlinked in)' >> $MEDIAGOBLIN_VIRTUAL_HOST
  8838. echo ' location /theme_static/ {' >> $MEDIAGOBLIN_VIRTUAL_HOST
  8839. echo " alias $MEDIAGOBLIN_WORKING_DIRECTORY/user_dev/theme_static/;" >> $MEDIAGOBLIN_VIRTUAL_HOST
  8840. echo ' }' >> $MEDIAGOBLIN_VIRTUAL_HOST
  8841. echo '' >> $MEDIAGOBLIN_VIRTUAL_HOST
  8842. echo ' # Plugin static files (usually symlinked in)' >> $MEDIAGOBLIN_VIRTUAL_HOST
  8843. echo ' location /plugin_static/ {' >> $MEDIAGOBLIN_VIRTUAL_HOST
  8844. echo " alias $MEDIAGOBLIN_WORKING_DIRECTORY/user_dev/plugin_static/;" >> $MEDIAGOBLIN_VIRTUAL_HOST
  8845. echo ' }' >> $MEDIAGOBLIN_VIRTUAL_HOST
  8846. echo '' >> $MEDIAGOBLIN_VIRTUAL_HOST
  8847. echo ' # Mounting MediaGoblin itself via FastCGI.' >> $MEDIAGOBLIN_VIRTUAL_HOST
  8848. echo ' location / {' >> $MEDIAGOBLIN_VIRTUAL_HOST
  8849. echo ' fastcgi_pass 127.0.0.1:26543;' >> $MEDIAGOBLIN_VIRTUAL_HOST
  8850. echo ' include /etc/nginx/fastcgi_params;' >> $MEDIAGOBLIN_VIRTUAL_HOST
  8851. echo '' >> $MEDIAGOBLIN_VIRTUAL_HOST
  8852. echo ' # our understanding vs nginxs handling of script_name vs' >> $MEDIAGOBLIN_VIRTUAL_HOST
  8853. echo ' # path_info dont match :)' >> $MEDIAGOBLIN_VIRTUAL_HOST
  8854. echo ' fastcgi_param PATH_INFO $fastcgi_script_name;' >> $MEDIAGOBLIN_VIRTUAL_HOST
  8855. echo ' fastcgi_param SCRIPT_NAME "";' >> $MEDIAGOBLIN_VIRTUAL_HOST
  8856. echo ' }' >> $MEDIAGOBLIN_VIRTUAL_HOST
  8857. echo '}' >> $MEDIAGOBLIN_VIRTUAL_HOST
  8858. echo '' >> $MEDIAGOBLIN_VIRTUAL_HOST
  8859. else
  8860. echo -n '' > $MEDIAGOBLIN_VIRTUAL_HOST
  8861. fi
  8862. echo 'server {' >> $MEDIAGOBLIN_VIRTUAL_HOST
  8863. echo " listen 127.0.0.1:${MEDIAGOBLIN_ONION_PORT} default_server;" >> $MEDIAGOBLIN_VIRTUAL_HOST
  8864. echo ' #################################################' >> $MEDIAGOBLIN_VIRTUAL_HOST
  8865. echo ' # Stock useful config options, but ignore them :)' >> $MEDIAGOBLIN_VIRTUAL_HOST
  8866. echo ' #################################################' >> $MEDIAGOBLIN_VIRTUAL_HOST
  8867. echo ' include /etc/nginx/mime.types;' >> $MEDIAGOBLIN_VIRTUAL_HOST
  8868. echo '' >> $MEDIAGOBLIN_VIRTUAL_HOST
  8869. echo ' autoindex off;' >> $MEDIAGOBLIN_VIRTUAL_HOST
  8870. echo ' default_type application/octet-stream;' >> $MEDIAGOBLIN_VIRTUAL_HOST
  8871. echo ' sendfile on;' >> $MEDIAGOBLIN_VIRTUAL_HOST
  8872. echo '' >> $MEDIAGOBLIN_VIRTUAL_HOST
  8873. nginx_limits $MEDIAGOBLIN_DOMAIN_NAME '20m'
  8874. nginx_disable_sniffing $MEDIAGOBLIN_DOMAIN_NAME
  8875. echo '' >> $MEDIAGOBLIN_VIRTUAL_HOST
  8876. echo ' # Gzip' >> $MEDIAGOBLIN_VIRTUAL_HOST
  8877. echo ' gzip on;' >> $MEDIAGOBLIN_VIRTUAL_HOST
  8878. echo ' gzip_min_length 1024;' >> $MEDIAGOBLIN_VIRTUAL_HOST
  8879. echo ' gzip_buffers 4 32k;' >> $MEDIAGOBLIN_VIRTUAL_HOST
  8880. echo ' gzip_types text/plain application/x-javascript text/javascript text/xml text/css;' >> $MEDIAGOBLIN_VIRTUAL_HOST
  8881. echo '' >> $MEDIAGOBLIN_VIRTUAL_HOST
  8882. echo ' #####################################' >> $MEDIAGOBLIN_VIRTUAL_HOST
  8883. echo ' # Mounting MediaGoblin stuff' >> $MEDIAGOBLIN_VIRTUAL_HOST
  8884. echo ' # This is the section you should read' >> $MEDIAGOBLIN_VIRTUAL_HOST
  8885. echo ' #####################################' >> $MEDIAGOBLIN_VIRTUAL_HOST
  8886. echo '' >> $MEDIAGOBLIN_VIRTUAL_HOST
  8887. echo " server_name $MEDIAGOBLIN_ONION_HOSTNAME;" >> $MEDIAGOBLIN_VIRTUAL_HOST
  8888. echo ' access_log /var/log/nginx/mediagoblin.log;' >> $MEDIAGOBLIN_VIRTUAL_HOST
  8889. echo ' error_log /var/log/nginx/mediagoblin.error.log;' >> $MEDIAGOBLIN_VIRTUAL_HOST
  8890. echo '' >> $MEDIAGOBLIN_VIRTUAL_HOST
  8891. echo ' # MediaGoblins stock static files: CSS, JS, etc.' >> $MEDIAGOBLIN_VIRTUAL_HOST
  8892. echo ' location /mgoblin_static/ {' >> $MEDIAGOBLIN_VIRTUAL_HOST
  8893. echo " alias $MEDIAGOBLIN_WORKING_DIRECTORY/mediagoblin/static/;" >> $MEDIAGOBLIN_VIRTUAL_HOST
  8894. echo ' }' >> $MEDIAGOBLIN_VIRTUAL_HOST
  8895. echo '' >> $MEDIAGOBLIN_VIRTUAL_HOST
  8896. echo ' # Instance specific media:' >> $MEDIAGOBLIN_VIRTUAL_HOST
  8897. echo ' location /mgoblin_media/ {' >> $MEDIAGOBLIN_VIRTUAL_HOST
  8898. echo " alias $MEDIAGOBLIN_WORKING_DIRECTORY/user_dev/media/public/;" >> $MEDIAGOBLIN_VIRTUAL_HOST
  8899. echo ' }' >> $MEDIAGOBLIN_VIRTUAL_HOST
  8900. echo '' >> $MEDIAGOBLIN_VIRTUAL_HOST
  8901. echo ' # Theme static files (usually symlinked in)' >> $MEDIAGOBLIN_VIRTUAL_HOST
  8902. echo ' location /theme_static/ {' >> $MEDIAGOBLIN_VIRTUAL_HOST
  8903. echo " alias $MEDIAGOBLIN_WORKING_DIRECTORY/user_dev/theme_static/;" >> $MEDIAGOBLIN_VIRTUAL_HOST
  8904. echo ' }' >> $MEDIAGOBLIN_VIRTUAL_HOST
  8905. echo '' >> $MEDIAGOBLIN_VIRTUAL_HOST
  8906. echo ' # Plugin static files (usually symlinked in)' >> $MEDIAGOBLIN_VIRTUAL_HOST
  8907. echo ' location /plugin_static/ {' >> $MEDIAGOBLIN_VIRTUAL_HOST
  8908. echo " alias $MEDIAGOBLIN_WORKING_DIRECTORY/user_dev/plugin_static/;" >> $MEDIAGOBLIN_VIRTUAL_HOST
  8909. echo ' }' >> $MEDIAGOBLIN_VIRTUAL_HOST
  8910. echo '' >> $MEDIAGOBLIN_VIRTUAL_HOST
  8911. echo ' # Mounting MediaGoblin itself via FastCGI.' >> $MEDIAGOBLIN_VIRTUAL_HOST
  8912. echo ' location / {' >> $MEDIAGOBLIN_VIRTUAL_HOST
  8913. echo ' fastcgi_pass 127.0.0.1:26543;' >> $MEDIAGOBLIN_VIRTUAL_HOST
  8914. echo ' include /etc/nginx/fastcgi_params;' >> $MEDIAGOBLIN_VIRTUAL_HOST
  8915. echo '' >> $MEDIAGOBLIN_VIRTUAL_HOST
  8916. echo ' # our understanding vs nginxs handling of script_name vs' >> $MEDIAGOBLIN_VIRTUAL_HOST
  8917. echo ' # path_info dont match :)' >> $MEDIAGOBLIN_VIRTUAL_HOST
  8918. echo ' fastcgi_param PATH_INFO $fastcgi_script_name;' >> $MEDIAGOBLIN_VIRTUAL_HOST
  8919. echo ' fastcgi_param SCRIPT_NAME "";' >> $MEDIAGOBLIN_VIRTUAL_HOST
  8920. echo ' }' >> $MEDIAGOBLIN_VIRTUAL_HOST
  8921. echo '}' >> $MEDIAGOBLIN_VIRTUAL_HOST
  8922. create_site_certificate $MEDIAGOBLIN_DOMAIN_NAME
  8923. nginx_ensite $MEDIAGOBLIN_DOMAIN_NAME
  8924. systemctl restart php5-fpm
  8925. systemctl restart nginx
  8926. add_ddns_domain $MEDIAGOBLIN_DOMAIN_NAME
  8927. if ! grep -q "Mediagoblin domain" $COMPLETION_FILE; then
  8928. echo "Mediagoblin domain:$MEDIAGOBLIN_DOMAIN_NAME" >> $COMPLETION_FILE
  8929. else
  8930. sed -i "s/Mediagoblin domain.*/Mediagoblin domain:$MEDIAGOBLIN_DOMAIN_NAME/g" $COMPLETION_FILE
  8931. fi
  8932. echo 'install_mediagoblin' >> $COMPLETION_FILE
  8933. }
  8934. function create_upgrade_script {
  8935. if [ -f /usr/local/bin/${PROJECT_NAME}-upgrade ]; then
  8936. cp /usr/local/bin/${PROJECT_NAME}-upgrade /etc/cron.weekly/$UPGRADE_SCRIPT_NAME
  8937. else
  8938. cp /usr/bin/${PROJECT_NAME}-upgrade /etc/cron.weekly/$UPGRADE_SCRIPT_NAME
  8939. fi
  8940. if grep -Fxq "create_upgrade_script" $COMPLETION_FILE; then
  8941. return
  8942. fi
  8943. apt-get -y install unattended-upgrades
  8944. echo 'create_upgrade_script' >> $COMPLETION_FILE
  8945. }
  8946. function intrusion_detection {
  8947. if grep -Fxq "intrusion_detection" $COMPLETION_FILE; then
  8948. return
  8949. fi
  8950. if [[ $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  8951. return
  8952. fi
  8953. apt-get -y install tripwire
  8954. apt-get -y autoremove
  8955. cd /etc/tripwire
  8956. cp site.key $DEFAULT_DOMAIN_NAME-site.key
  8957. echo '*** Installing intrusion detection ***'
  8958. echo '
  8959. ' | tripwire --init
  8960. # make a script for easy resetting of the tripwire
  8961. echo '#!/bin/sh' > /usr/bin/reset-tripwire
  8962. echo 'tripwire --update-policy --secure-mode low /etc/tripwire/twpol.txt' >> /usr/bin/reset-tripwire
  8963. chmod +x /usr/bin/reset-tripwire
  8964. sed -i 's/SYSLOGREPORTING.*/SYSLOGREPORTING =false/g' /etc/tripwire/twcfg.txt
  8965. # only send emails if something has changed
  8966. sed -i 's|MAILNOVIOLATIONS.*|MAILNOVIOLATIONS = false|g' /etc/tripwire/twcfg.txt
  8967. sed -i '/# These files change the behavior of the root account/,/}/ s/.*//g' /etc/tripwire/twpol.txt
  8968. sed -i 's|/etc/rc.boot.*||g' /etc/tripwire/twpol.txt
  8969. # Don't show any changes to /proc
  8970. sed -i 's|/proc.*||g' /etc/tripwire/twpol.txt
  8971. # Don't report log changes
  8972. sed -i 's|/var/log.*||g' /etc/tripwire/twpol.txt
  8973. # Ignore /etc/tripwire
  8974. if ! grep -q '!/etc/tripwire' /etc/tripwire/twpol.txt; then
  8975. sed -i '\|/etc\t\t->.*|a\ !/etc/tripwire;' /etc/tripwire/twpol.txt
  8976. fi
  8977. # ignore tt-rss cache
  8978. if ! grep -q '!/etc/share/tt-rss/cache' /etc/tripwire/twpol.txt; then
  8979. sed -i '\|/etc\t\t->.*|a\ !/etc/share/tt-rss/cache' /etc/tripwire/twpol.txt
  8980. fi
  8981. if ! grep -q '!/etc/share/tt-rss/lock' /etc/tripwire/twpol.txt; then
  8982. sed -i '\|/etc\t\t->.*|a\ !/etc/share/tt-rss/lock' /etc/tripwire/twpol.txt
  8983. fi
  8984. # Avoid logging the changed database
  8985. sed -i 's|$(TWETC)/tw.pol.*||g' /etc/tripwire/twpol.txt
  8986. # recreate the configuration
  8987. echo '
  8988. ' | twadmin --create-cfgfile -S /etc/tripwire/site.key /etc/tripwire/twcfg.txt
  8989. # reset
  8990. echo '
  8991. ' | reset-tripwire
  8992. echo 'intrusion_detection' >> $COMPLETION_FILE
  8993. }
  8994. # see https://trac.torproject.org/projects/tor/wiki/doc/TransparentProxy
  8995. # Local Redirection and Anonymizing Middlebox
  8996. function route_outgoing_traffic_through_tor {
  8997. if grep -Fxq "route_outgoing_traffic_through_tor" $COMPLETION_FILE; then
  8998. return
  8999. fi
  9000. if [[ $ROUTE_THROUGH_TOR != "yes" ]]; then
  9001. return
  9002. fi
  9003. apt-get -y install tor tor-arm
  9004. ### set variables
  9005. # Destinations you don't want routed through Tor
  9006. _non_tor="192.168.1.0/24 192.168.0.0/24"
  9007. # The user that Tor runs as
  9008. _tor_uid="debian-tor"
  9009. # Tor's TransPort
  9010. _trans_port="9040"
  9011. # Your internal interface
  9012. _int_if="eth0"
  9013. ### Set iptables *nat
  9014. iptables -t nat -A OUTPUT -o lo -j RETURN
  9015. iptables -t nat -A OUTPUT -m owner --uid-owner $_tor_uid -j RETURN
  9016. iptables -t nat -A OUTPUT -p udp --dport 53 -j REDIRECT --to-ports 53
  9017. # Allow clearnet access for hosts in $_non_tor
  9018. for _clearnet in $_non_tor; do
  9019. iptables -t nat -A OUTPUT -d $_clearnet -j RETURN
  9020. iptables -t nat -A PREROUTING -i $_int_if -d $_clearnet -j RETURN
  9021. done
  9022. # Redirect all other pre-routing and output to Tor
  9023. iptables -t nat -A OUTPUT -p tcp --syn -j REDIRECT --to-ports $_trans_port
  9024. iptables -t nat -A PREROUTING -i $_int_if -p udp --dport 53 -j REDIRECT --to-ports 53
  9025. iptables -t nat -A PREROUTING -i $_int_if -p tcp --syn -j REDIRECT --to-ports $_trans_port
  9026. ### set iptables *filter
  9027. iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
  9028. # Allow clearnet access for hosts in $_non_tor
  9029. for _clearnet in $_non_tor 127.0.0.0/8; do
  9030. iptables -A OUTPUT -d $_clearnet -j ACCEPT
  9031. done
  9032. # Allow only Tor output
  9033. iptables -A OUTPUT -m owner --uid-owner $_tor_uid -j ACCEPT
  9034. iptables -A OUTPUT -j REJECT
  9035. save_firewall_settings
  9036. if ! grep -q "fs.file-max" /etc/sysctl.conf; then
  9037. echo "fs.file-max=100000" >> /etc/sysctl.conf
  9038. /sbin/sysctl -p
  9039. fi
  9040. echo 'domain localdomain' > /etc/resolv.conf
  9041. echo 'search localdomain' >> /etc/resolv.conf
  9042. echo 'nameserver 127.0.0.1' >> /etc/resolv.conf
  9043. if ! grep -q "VirtualAddrNetworkIPv4" /etc/tor/torrc; then
  9044. echo 'VirtualAddrNetworkIPv4 10.192.0.0/10' >> /etc/tor/torrc
  9045. fi
  9046. if ! grep -q "AutomapHostsOnResolve" /etc/tor/torrc; then
  9047. echo 'AutomapHostsOnResolve 1' >> /etc/tor/torrc
  9048. fi
  9049. if ! grep -q "TransPort" /etc/tor/torrc; then
  9050. echo 'TransPort 9040' >> /etc/tor/torrc
  9051. fi
  9052. if ! grep -q "TransListenAddress 127.0.0.1" /etc/tor/torrc; then
  9053. echo 'TransListenAddress 127.0.0.1' >> /etc/tor/torrc
  9054. fi
  9055. if ! grep -q "TransListenAddress $LOCAL_NETWORK_STATIC_IP_ADDRESS" /etc/tor/torrc; then
  9056. echo "TransListenAddress $LOCAL_NETWORK_STATIC_IP_ADDRESS" >> /etc/tor/torrc
  9057. fi
  9058. if ! grep -q "DNSPort" /etc/tor/torrc; then
  9059. echo 'DNSPort 53' >> /etc/tor/torrc
  9060. fi
  9061. if ! grep -q "DNSListenAddress 127.0.0.1" /etc/tor/torrc; then
  9062. echo 'DNSListenAddress 127.0.0.1' >> /etc/tor/torrc
  9063. fi
  9064. if ! grep -q "DNSListenAddress $LOCAL_NETWORK_STATIC_IP_ADDRESS" /etc/tor/torrc; then
  9065. echo "DNSListenAddress $LOCAL_NETWORK_STATIC_IP_ADDRESS" >> /etc/tor/torrc
  9066. fi
  9067. echo 'route_outgoing_traffic_through_tor' >> $COMPLETION_FILE
  9068. }
  9069. # A command to create a git repository for a project
  9070. function create_git_project {
  9071. if grep -Fxq "create_git_project" $COMPLETION_FILE; then
  9072. return
  9073. fi
  9074. apt-get -y install git
  9075. echo '#!/bin/bash' > /usr/bin/$CREATE_GIT_PROJECT_COMMAND
  9076. echo '' >> /usr/bin/$CREATE_GIT_PROJECT_COMMAND
  9077. echo 'GIT_PROJECT_NAME=$1' >> /usr/bin/$CREATE_GIT_PROJECT_COMMAND
  9078. echo 'if [ ! $GIT_PROJECT_NAME ]; then' >> /usr/bin/$CREATE_GIT_PROJECT_COMMAND
  9079. echo ' echo "Please specify a project name, without any spaces"' >> /usr/bin/$CREATE_GIT_PROJECT_COMMAND
  9080. echo ' exit 1' >> /usr/bin/$CREATE_GIT_PROJECT_COMMAND
  9081. echo 'fi' >> /usr/bin/$CREATE_GIT_PROJECT_COMMAND
  9082. echo '' >> /usr/bin/$CREATE_GIT_PROJECT_COMMAND
  9083. echo 'if [ ! -d /home/$USER/projects/$GIT_PROJECT_NAME ]; then' >> /usr/bin/$CREATE_GIT_PROJECT_COMMAND
  9084. echo ' mkdir -p /home/$USER/projects/$GIT_PROJECT_NAME' >> /usr/bin/$CREATE_GIT_PROJECT_COMMAND
  9085. echo 'fi' >> /usr/bin/$CREATE_GIT_PROJECT_COMMAND
  9086. echo '' >> /usr/bin/$CREATE_GIT_PROJECT_COMMAND
  9087. echo 'cd /home/$USER/projects/$GIT_PROJECT_NAME' >> /usr/bin/$CREATE_GIT_PROJECT_COMMAND
  9088. echo 'git init --bare' >> /usr/bin/$CREATE_GIT_PROJECT_COMMAND
  9089. echo '' >> /usr/bin/$CREATE_GIT_PROJECT_COMMAND
  9090. echo -n 'echo "Your project has been created, ' >> /usr/bin/$CREATE_GIT_PROJECT_COMMAND
  9091. echo 'use the following command to clone the repository"' >> /usr/bin/$CREATE_GIT_PROJECT_COMMAND
  9092. echo -n " git clone ssh://$MY_USERNAME@$DEFAULT_DOMAIN_NAME:$SSH_PORT" >> /usr/bin/$CREATE_GIT_PROJECT_COMMAND
  9093. echo '/home/$USER/projects/$GIT_PROJECT_NAME' >> /usr/bin/$CREATE_GIT_PROJECT_COMMAND
  9094. echo '' >> /usr/bin/$CREATE_GIT_PROJECT_COMMAND
  9095. echo 'exit 0' >> /usr/bin/$CREATE_GIT_PROJECT_COMMAND
  9096. chmod +x /usr/bin/$CREATE_GIT_PROJECT_COMMAND
  9097. echo 'create_git_project' >> $COMPLETION_FILE
  9098. }
  9099. function check_date {
  9100. curr_date=$(date)
  9101. if [[ $curr_date == *"1970"* ]]; then
  9102. apt-get -y install ntp
  9103. fi
  9104. }
  9105. function install_dynamicdns {
  9106. if [[ $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
  9107. return
  9108. fi
  9109. if [[ $ONION_ONLY != "no" ]]; then
  9110. return
  9111. fi
  9112. # update to the next commit
  9113. set_repo_commit $INSTALL_DIR/inadyn "inadyn commit" "$INADYN_COMMIT" $INADYN_REPO
  9114. if grep -Fxq "install_dynamicdns" $COMPLETION_FILE; then
  9115. return
  9116. fi
  9117. # Here we compile from source because the current package
  9118. # doesn't support https, which could result in passwords
  9119. # being leaked
  9120. # Debian version 1.99.4-1
  9121. # https version 1.99.8
  9122. apt-get -y install build-essential curl libgnutls28-dev automake1.11
  9123. if [ ! -d $INSTALL_DIR/inadyn ]; then
  9124. git_clone $INADYN_REPO $INSTALL_DIR/inadyn
  9125. fi
  9126. if [ ! -d $INSTALL_DIR/inadyn ]; then
  9127. echo 'inadyn repo not cloned'
  9128. echo -n | openssl s_client -showcerts -connect github.com:443 -CApath /etc/ssl/certs
  9129. exit 6785
  9130. fi
  9131. cd $INSTALL_DIR/inadyn
  9132. git checkout $INADYN_COMMIT -b $INADYN_COMMIT
  9133. if ! grep -q "inadyn commit" $COMPLETION_FILE; then
  9134. echo "inadyn commit:$INADYN_COMMIT" >> $COMPLETION_FILE
  9135. else
  9136. sed -i "s/inadyn commit.*/inadyn commit:$INADYN_COMMIT/g" $COMPLETION_FILE
  9137. fi
  9138. ./configure
  9139. if [ ! "$?" = "0" ]; then
  9140. exit 74890
  9141. fi
  9142. USE_OPENSSL=1 make
  9143. if [ ! "$?" = "0" ]; then
  9144. exit 74858
  9145. fi
  9146. make install
  9147. if [ ! "$?" = "0" ]; then
  9148. exit 3785
  9149. fi
  9150. # create an unprivileged user
  9151. #useradd -r -s /bin/false debian-inadyn
  9152. # create a configuration file
  9153. echo 'background' > /etc/inadyn.conf
  9154. echo 'verbose 1' >> /etc/inadyn.conf
  9155. echo 'period 300' >> /etc/inadyn.conf
  9156. echo 'startup-delay 60' >> /etc/inadyn.conf
  9157. echo 'cache-dir /run/inadyn' >> /etc/inadyn.conf
  9158. echo 'logfile /dev/null' >> /etc/inadyn.conf
  9159. chmod 600 /etc/inadyn.conf
  9160. echo '[Unit]' > /etc/systemd/system/inadyn.service
  9161. echo 'Description=inadyn (DynDNS updater)' >> /etc/systemd/system/inadyn.service
  9162. echo 'After=network.target' >> /etc/systemd/system/inadyn.service
  9163. echo '' >> /etc/systemd/system/inadyn.service
  9164. echo '[Service]' >> /etc/systemd/system/inadyn.service
  9165. echo 'ExecStart=/usr/local/sbin/inadyn --config /etc/inadyn.conf' >> /etc/systemd/system/inadyn.service
  9166. echo 'Restart=always' >> /etc/systemd/system/inadyn.service
  9167. echo 'Type=forking' >> /etc/systemd/system/inadyn.service
  9168. echo '' >> /etc/systemd/system/inadyn.service
  9169. echo '[Install]' >> /etc/systemd/system/inadyn.service
  9170. echo 'WantedBy=multi-user.target' >> /etc/systemd/system/inadyn.service
  9171. systemctl enable inadyn
  9172. systemctl start inadyn
  9173. systemctl daemon-reload
  9174. echo 'install_dynamicdns' >> $COMPLETION_FILE
  9175. }
  9176. function get_voip_server_password {
  9177. if [ -f /home/$MY_USERNAME/README ]; then
  9178. if grep -q "VoIP server password" /home/$MY_USERNAME/README; then
  9179. if [ ! $VOIP_SERVER_PASSWORD ]; then
  9180. VOIP_SERVER_PASSWORD=$(cat /home/$MY_USERNAME/README | grep "VoIP server password" | awk -F ':' '{print $2}' | sed 's/^ *//')
  9181. fi
  9182. fi
  9183. fi
  9184. }
  9185. function get_sip_server_password {
  9186. if [ -f /home/$MY_USERNAME/README ]; then
  9187. if grep -q "SIP server password" /home/$MY_USERNAME/README; then
  9188. if [ ! $SIP_SERVER_PASSWORD ]; then
  9189. SIP_SERVER_PASSWORD=$(cat /home/$MY_USERNAME/README | grep "SIP server password" | awk -F ':' '{print $2}' | sed 's/^ *//')
  9190. fi
  9191. fi
  9192. fi
  9193. }
  9194. function install_ipfs {
  9195. if [[ $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_MAILBOX" ]]; then
  9196. return
  9197. fi
  9198. export GOPATH=/home/git/go
  9199. systemctl set-environment GOPATH=/home/git/go
  9200. # update to the next commit
  9201. set_repo_commit /home/git/go/src/github.com/ipfs/go-ipfs "ipfs commit" "$IPFS_COMMIT" $IPFS_REPO
  9202. if grep -Fxq "install_ipfs" $COMPLETION_FILE; then
  9203. return
  9204. fi
  9205. apt-get -y install golang libpam0g-dev fuse
  9206. if [ ! -d /home/git ]; then
  9207. # add a gogs user account
  9208. adduser --disabled-login --gecos 'Gogs' git
  9209. # install Go
  9210. if ! grep -q "export GOPATH=/home/git/go" ~/.bashrc; then
  9211. echo 'export GOPATH=/home/git/go' >> ~/.bashrc
  9212. echo 'systemctl set-environment GOPATH=/home/git/go' >> ~/.bashrc
  9213. fi
  9214. export GOPATH=/home/git/go
  9215. if [ ! -d $GOPATH ]; then
  9216. mkdir -p $GOPATH
  9217. fi
  9218. fi
  9219. IPFS_PATH=/home/git/go/bin
  9220. if ! grep -q 'GOPATH/bin' ~/.bashrc; then
  9221. export PATH="$GOPATH/bin:$PATH:"
  9222. echo 'export PATH="$GOPATH/bin:$PATH:";' >> ~/.bashrc
  9223. fi
  9224. # set gopath for the user
  9225. if ! grep -q "GOPATH=" /home/$MY_USERNAME/.bashrc; then
  9226. echo 'export GOPATH=/home/git/go' >> /home/$MY_USERNAME/.bashrc
  9227. echo 'export PATH="$GOPATH/bin:$PATH:";' >> /home/$MY_USERNAME/.bashrc
  9228. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.bashrc
  9229. fi
  9230. IPFS_GO_REPO2=$(echo "$IPFS_GO_REPO" | sed 's|https://||g')
  9231. go get -u ${IPFS_GO_REPO2}/cmd/ipfs
  9232. if [ ! "$?" = "0" ]; then
  9233. exit 8242
  9234. fi
  9235. cd /home/git/go/src/$IPFS_GO_REPO2
  9236. git checkout $IPFS_COMMIT -b $IPFS_COMMIT
  9237. if ! grep -q "ipfs commit" $COMPLETION_FILE; then
  9238. echo "ipfs commit:$IPFS_COMMIT" >> $COMPLETION_FILE
  9239. else
  9240. sed -i "s/ipfs commit.*/ipfs commit:$IPFS_COMMIT/g" $COMPLETION_FILE
  9241. fi
  9242. # initialise
  9243. su -c "$IPFS_PATH/ipfs init -b 4096" - $MY_USERNAME
  9244. if [ ! -d /home/$MY_USERNAME/.ipfs ]; then
  9245. echo "IPFS could not be initialised for user $MY_USERNAME"
  9246. exit 7358
  9247. fi
  9248. # directories to mount to
  9249. if [ ! -d /ipfs ]; then
  9250. mkdir /ipfs
  9251. mkdir /ipns
  9252. chown $MY_USERNAME:$MY_USERNAME /ipfs
  9253. chown $MY_USERNAME:$MY_USERNAME /ipns
  9254. fi
  9255. if [ -f /etc/fuse.conf ]; then
  9256. chown $MY_USERNAME:$MY_USERNAME /etc/fuse.conf
  9257. fi
  9258. if [ -f /dev/fuse ]; then
  9259. chown $MY_USERNAME:$MY_USERNAME /dev/fuse
  9260. fi
  9261. echo '[Unit]' > /etc/systemd/system/ipfs.service
  9262. echo 'Description=IPFS daemon' >> /etc/systemd/system/ipfs.service
  9263. echo 'After=syslog.target' >> /etc/systemd/system/ipfs.service
  9264. echo 'After=network.target' >> /etc/systemd/system/ipfs.service
  9265. echo '' >> /etc/systemd/system/ipfs.service
  9266. echo '[Service]' >> /etc/systemd/system/ipfs.service
  9267. echo 'Type=simple' >> /etc/systemd/system/ipfs.service
  9268. echo "User=$MY_USERNAME" >> /etc/systemd/system/ipfs.service
  9269. echo "Group=$MY_USERNAME" >> /etc/systemd/system/ipfs.service
  9270. echo "WorkingDirectory=/home/$MY_USERNAME" >> /etc/systemd/system/ipfs.service
  9271. echo "ExecStart=$IPFS_PATH/ipfs daemon --mount" >> /etc/systemd/system/ipfs.service
  9272. echo 'Restart=on-failure' >> /etc/systemd/system/ipfs.service
  9273. echo "Environment=\"USER=$MY_USERNAME\" \"HOME=/home/$MY_USERNAME\" \"GOPATH=/home/git/go\"" >> /etc/systemd/system/ipfs.service
  9274. echo '' >> /etc/systemd/system/ipfs.service
  9275. echo '[Install]' >> /etc/systemd/system/ipfs.service
  9276. echo 'WantedBy=multi-user.target' >> /etc/systemd/system/ipfs.service
  9277. systemctl enable ipfs
  9278. systemctl daemon-reload
  9279. systemctl restart ipfs
  9280. if [ -d /etc/avahi ]; then
  9281. su -c "echo $($IPFS_PATH/ipfs id | grep '\"ID\":' | awk -F '\"' '{print $4}') > /tmp/ipfsid" - $MY_USERNAME
  9282. if [ ! -f /tmp/ipfsid ]; then
  9283. echo 'No IPFS identity was created'
  9284. exit 37895
  9285. fi
  9286. IPFS_PEER_ID=$(cat /tmp/ipfsid)
  9287. if [ ${#IPFS_PEER_ID} -lt 10 ]; then
  9288. echo 'Invalid IPFS peer ID'
  9289. echo "$IPFS_PEER_ID"
  9290. exit 74782
  9291. fi
  9292. # Add an avahi service
  9293. echo '<?xml version="1.0" standalone="no"?><!--*-nxml-*-->' > /etc/avahi/services/ipfs.service
  9294. echo '<!DOCTYPE service-group SYSTEM "avahi-service.dtd">' >> /etc/avahi/services/ipfs.service
  9295. echo '<service-group>' >> /etc/avahi/services/ipfs.service
  9296. echo ' <name replace-wildcards="yes">%h IPFS</name>' >> /etc/avahi/services/ipfs.service
  9297. echo ' <service>' >> /etc/avahi/services/ipfs.service
  9298. echo ' <type>_ipfs._tcp</type>' >> /etc/avahi/services/ipfs.service
  9299. echo " <port>$IPFS_PORT</port>" >> /etc/avahi/services/ipfs.service
  9300. echo " <txt-record>$IPFS_PEER_ID</txt-record>" >> /etc/avahi/services/ipfs.service
  9301. echo ' </service>' >> /etc/avahi/services/ipfs.service
  9302. echo '</service-group>' >> /etc/avahi/services/ipfs.service
  9303. rm /tmp/ipfsid
  9304. fi
  9305. echo 'install_ipfs' >> $COMPLETION_FILE
  9306. }
  9307. function install_voip {
  9308. 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
  9309. return
  9310. fi
  9311. if grep -Fxq "install_voip" $COMPLETION_FILE; then
  9312. return
  9313. fi
  9314. apt-get -y install mumble-server
  9315. get_voip_server_password
  9316. if [ ! $VOIP_SERVER_PASSWORD ]; then
  9317. if [ -f $IMAGE_PASSWORD_FILE ]; then
  9318. VOIP_SERVER_PASSWORD="$(printf `cat $IMAGE_PASSWORD_FILE`)"
  9319. else
  9320. VOIP_SERVER_PASSWORD="$(openssl rand -base64 18 | cut -c1-16)"
  9321. if [ ${#VOIP_SERVER_PASSWORD} -lt $MINIMUM_PASSWORD_LENGTH ]; then
  9322. VOIP_SERVER_PASSWORD="$(openssl rand -base64 18 | cut -c1-16)"
  9323. fi
  9324. fi
  9325. fi
  9326. # Make an ssl cert for the server
  9327. if [ ! -f /etc/ssl/certs/mumble.dhparam ]; then
  9328. ${PROJECT_NAME}-addcert -h mumble --dhkey $DH_KEYLENGTH
  9329. check_certificates mumble
  9330. fi
  9331. # Check that the cert was created
  9332. if [ ! -f /etc/ssl/certs/mumble.crt ]; then
  9333. echo $'VoIP server certificate not created'
  9334. exit 57892
  9335. fi
  9336. if [ ! -f /etc/ssl/private/mumble.key ]; then
  9337. echo $'VoIP server key not created'
  9338. exit 57893
  9339. fi
  9340. if [ ! -d /var/lib/mumble-server ]; then
  9341. mkdir /var/lib/mumble-server
  9342. fi
  9343. cp /etc/ssl/certs/mumble.* /var/lib/mumble-server
  9344. cp /etc/ssl/private/mumble.key /var/lib/mumble-server
  9345. chown -R mumble-server:mumble-server /var/lib/mumble-server
  9346. sed -i "s|welcometext=.*|welcometext=\"<br />Welcome to $DEFAULT_DOMAIN_NAME <b>VoIP</b>.<br />Chat freely!<br />\"|g" /etc/mumble-server.ini
  9347. if [[ $VOIP_SERVER_PASSWORD && $SYSTEM_TYPE != "$VARIANT_MESH" ]]; then
  9348. sed -i "s|serverpassword=.*|serverpassword=$VOIP_SERVER_PASSWORD|g" /etc/mumble-server.ini
  9349. fi
  9350. sed -i 's|#autobanAttempts.*|autobanAttempts = 10|g' /etc/mumble-server.ini
  9351. sed -i 's|#autobanTimeframe.*|autobanTimeframe = 120|g' /etc/mumble-server.ini
  9352. sed -i 's|#autobanTime.*|autobanTime = 300|g' /etc/mumble-server.ini
  9353. sed -i 's|#sendversion=.*|sendversion=False|g' /etc/mumble-server.ini
  9354. sed -i 's|sendversion=.*|sendversion=False|g' /etc/mumble-server.ini
  9355. if ! grep -q "allowping" /etc/mumble-server.ini; then
  9356. echo 'allowping=False' >> /etc/mumble-server.ini
  9357. fi
  9358. sed -i 's|allowping=.*|allowping=False|g' /etc/mumble-server.ini
  9359. sed -i 's|#sslCert=.*|sslCert=/var/lib/mumble-server/mumble.crt|g' /etc/mumble-server.ini
  9360. sed -i 's|#sslKey=.*|sslKey=/var/lib/mumble-server/mumble.key|g' /etc/mumble-server.ini
  9361. sed -i 's|#certrequired=.*|certrequired=True|g' /etc/mumble-server.ini
  9362. sed -i 's|users=100|users=10|g' /etc/mumble-server.ini
  9363. sed -i 's|#channelnestinglimit=10|channelnestinglimit=10|g' /etc/mumble-server.ini
  9364. sed -i 's|#textmessagelength=.*|textmessagelength=1000|g' /etc/mumble-server.ini
  9365. sed -i 's|textmessagelength=.*|textmessagelength=1000|g' /etc/mumble-server.ini
  9366. sed -i 's|#imagemessagelength=.*|imagemessagelength=131072|g' /etc/mumble-server.ini
  9367. sed -i 's|#allowhtml=.*|allowhtml=False|g' /etc/mumble-server.ini
  9368. sed -i 's|allowhtml=.*|allowhtml=False|g' /etc/mumble-server.ini
  9369. sed -i "s|port=.*|port=${VOIP_PORT}|g" /etc/mumble-server.ini
  9370. VOIP_ONION_HOSTNAME=$(add_onion_service voip ${VOIP_PORT} ${VOIP_PORT})
  9371. if ! grep -q $"VoIP onion domain" $COMPLETION_FILE; then
  9372. echo "VoIP onion domain:$VOIP_ONION_HOSTNAME" >> $COMPLETION_FILE
  9373. fi
  9374. systemctl restart mumble-server
  9375. if ! grep -q $"VoIP Server" /home/$MY_USERNAME/README; then
  9376. echo '' >> /home/$MY_USERNAME/README
  9377. echo '' >> /home/$MY_USERNAME/README
  9378. echo $'VoIP Server' >> /home/$MY_USERNAME/README
  9379. echo '===========' >> /home/$MY_USERNAME/README
  9380. echo $"VoIP onion domain:$VOIP_ONION_HOSTNAME" >> /home/$MY_USERNAME/README
  9381. echo $'VoIP server username: mumble-server' >> /home/$MY_USERNAME/README
  9382. if [[ $SYSTEM_TYPE != "VARIANT_MESH" ]]; then
  9383. echo $"VoIP server password: $VOIP_SERVER_PASSWORD" >> /home/$MY_USERNAME/README
  9384. fi
  9385. echo '' >> /home/$MY_USERNAME/README
  9386. echo $'To connect to the VoIP server use your username and the server password shown above.' >> /home/$MY_USERNAME/README
  9387. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
  9388. chmod 600 /home/$MY_USERNAME/README
  9389. fi
  9390. echo 'install_voip' >> $COMPLETION_FILE
  9391. }
  9392. function update_sipwitch_daemon {
  9393. if [ ! -f /etc/init.d/sipwitch ]; then
  9394. return
  9395. fi
  9396. service sipwitch stop
  9397. # remove the original sipwitch daemon if it exists
  9398. if [ -f /etc/init.d/sipwitch ]; then
  9399. rm -f /etc/init.d/sipwitch
  9400. fi
  9401. # daemon
  9402. echo '[Unit]' > /etc/systemd/system/sipwitch.service
  9403. echo 'Description=GNU SIP Witch, a SIP telephony service daemon.' >> /etc/systemd/system/sipwitch.service
  9404. echo 'After=network.target' >> /etc/systemd/system/sipwitch.service
  9405. echo '' >> /etc/systemd/system/sipwitch.service
  9406. echo '[Service]' >> /etc/systemd/system/sipwitch.service
  9407. echo 'Type=simple' >> /etc/systemd/system/sipwitch.service
  9408. echo 'Group=sipwitch' >> /etc/systemd/system/sipwitch.service
  9409. echo 'PIDFile=/var/run/sipwitch/pidfile' >> /etc/systemd/system/sipwitch.service
  9410. echo 'EnvironmentFile=-/etc/conf.d/sipwitch' >> /etc/systemd/system/sipwitch.service
  9411. echo 'EnvironmentFile=-/etc/sipwitch.conf' >> /etc/systemd/system/sipwitch.service
  9412. echo 'EnvironmentFile=-/etc/default/sipwitch' >> /etc/systemd/system/sipwitch.service
  9413. echo 'ExecStartPre=-/bin/rm -f /var/run/sipwitch/control' >> /etc/systemd/system/sipwitch.service
  9414. echo "ExecStart=/usr/sbin/sipw -f \$OPTIONS -P$SIP_PORT" >> /etc/systemd/system/sipwitch.service
  9415. echo 'Restart=always' >> /etc/systemd/system/sipwitch.service
  9416. echo 'NotifyAccess=main' >> /etc/systemd/system/sipwitch.service
  9417. echo '' >> /etc/systemd/system/sipwitch.service
  9418. echo '[Install]' >> /etc/systemd/system/sipwitch.service
  9419. echo 'WantedBy=multi-user.target' >> /etc/systemd/system/sipwitch.service
  9420. systemctl enable sipwitch
  9421. systemctl daemon-reload
  9422. systemctl start sipwitch
  9423. }
  9424. function install_sip {
  9425. 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
  9426. return
  9427. fi
  9428. if grep -Fxq "install_sip" $COMPLETION_FILE; then
  9429. return
  9430. fi
  9431. apt-get -y install sipwitch
  9432. get_sip_server_password
  9433. if [ ! $SIP_SERVER_PASSWORD ]; then
  9434. if [ -f $IMAGE_PASSWORD_FILE ]; then
  9435. SIP_SERVER_PASSWORD="$(printf `cat $IMAGE_PASSWORD_FILE`)"
  9436. else
  9437. SIP_SERVER_PASSWORD="$(openssl rand -base64 12 | cut -c1-10)"
  9438. fi
  9439. fi
  9440. echo '<?xml version="1.0"?>' > /etc/sipwitch.conf
  9441. echo '<sipwitch>' >> /etc/sipwitch.conf
  9442. echo '<provision>' >> /etc/sipwitch.conf
  9443. echo "<user id=\"$MY_USERNAME\">" >> /etc/sipwitch.conf
  9444. echo '<extension>201</extension>' >> /etc/sipwitch.conf
  9445. echo "<secret>$SIP_SERVER_PASSWORD</secret>" >> /etc/sipwitch.conf
  9446. echo "<display>$MY_USERNAME 201</display>" >> /etc/sipwitch.conf
  9447. echo '</user>' >> /etc/sipwitch.conf
  9448. echo '</provision>' >> /etc/sipwitch.conf
  9449. echo '<access>' >> /etc/sipwitch.conf
  9450. echo '</access>' >> /etc/sipwitch.conf
  9451. echo '<stack>' >> /etc/sipwitch.conf
  9452. echo " <localnames>$DEFAULT_DOMAIN_NAME</localnames>" >> /etc/sipwitch.conf
  9453. echo ' <mapped>200</mapped>' >> /etc/sipwitch.conf
  9454. echo ' <threading>2</threading>' >> /etc/sipwitch.conf
  9455. echo ' <interface>*</interface>' >> /etc/sipwitch.conf
  9456. echo ' <dumping>false</dumping>' >> /etc/sipwitch.conf
  9457. echo ' <system>system</system>' >> /etc/sipwitch.conf
  9458. echo ' <anon>anonymous</anon>' >> /etc/sipwitch.conf
  9459. echo '</stack>' >> /etc/sipwitch.conf
  9460. echo '<timers>' >> /etc/sipwitch.conf
  9461. echo ' <!-- ring every 4 seconds -->' >> /etc/sipwitch.conf
  9462. echo ' <ring>4</ring>' >> /etc/sipwitch.conf
  9463. echo ' <!-- call forward no answer after x rings -->' >> /etc/sipwitch.conf
  9464. echo ' <cfna>4</cfna>' >> /etc/sipwitch.conf
  9465. echo ' <!-- call reset to clear cid in stack, 6 seconds -->' >> /etc/sipwitch.conf
  9466. echo ' <reset>6</reset>' >> /etc/sipwitch.conf
  9467. echo '</timers>' >> /etc/sipwitch.conf
  9468. echo '<!-- we have 2xx numbers plus space for external users -->' >> /etc/sipwitch.conf
  9469. echo '<registry>' >> /etc/sipwitch.conf
  9470. echo ' <prefix>200</prefix>' >> /etc/sipwitch.conf
  9471. echo ' <range>100</range>' >> /etc/sipwitch.conf
  9472. echo ' <keysize>77</keysize>' >> /etc/sipwitch.conf
  9473. echo ' <mapped>200</mapped>' >> /etc/sipwitch.conf
  9474. echo ' <!-- <realm>GNU Telephony</realm> -->' >> /etc/sipwitch.conf
  9475. echo '</registry>' >> /etc/sipwitch.conf
  9476. echo '<routing>' >> /etc/sipwitch.conf
  9477. echo '</routing>' >> /etc/sipwitch.conf
  9478. echo '</sipwitch>' >> /etc/sipwitch.conf
  9479. sed -i 's|#PLUGINS=|PLUGINS=|g' /etc/default/sipwitch
  9480. sed -i 's|PLUGINS=.*|PLUGINS="zeroconf subscriber forward"|g' /etc/default/sipwitch
  9481. groupadd sipwitch
  9482. usermod -aG sipwitch $MY_USERNAME
  9483. SIP_ONION_HOSTNAME=$(add_onion_service sip ${SIP_PORT} ${SIP_PORT})
  9484. if ! grep -q $"SIP onion domain" $COMPLETION_FILE; then
  9485. echo "SIP onion domain:$SIP_ONION_HOSTNAME" >> $COMPLETION_FILE
  9486. fi
  9487. if ! grep -q $"SIP Server" /home/$MY_USERNAME/README; then
  9488. echo '' >> /home/$MY_USERNAME/README
  9489. echo '' >> /home/$MY_USERNAME/README
  9490. echo $'SIP Server' >> /home/$MY_USERNAME/README
  9491. echo '==========' >> /home/$MY_USERNAME/README
  9492. echo $"SIP onion_domain: $SIP_ONION_HOSTNAME" >> /home/$MY_USERNAME/README
  9493. echo $"SIP server username: $MY_USERNAME" >> /home/$MY_USERNAME/README
  9494. echo $"SIP server extension: 201" >> /home/$MY_USERNAME/README
  9495. echo $"SIP server password: $SIP_SERVER_PASSWORD" >> /home/$MY_USERNAME/README
  9496. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
  9497. chmod 600 /home/$MY_USERNAME/README
  9498. fi
  9499. echo 'install_sip' >> $COMPLETION_FILE
  9500. }
  9501. function install_sip_turn {
  9502. 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
  9503. return
  9504. fi
  9505. if grep -Fxq "install_sip_turn" $COMPLETION_FILE; then
  9506. return
  9507. fi
  9508. apt-get -y install turnserver
  9509. # create a nonce if needed
  9510. if [ ! $VOIP_TURN_NONCE ]; then
  9511. VOIP_TURN_NONCE="$(openssl rand -base64 32 | cut -c1-30)"
  9512. fi
  9513. create_site_certificate $DEFAULT_DOMAIN_NAME
  9514. echo '##' > /etc/turnserver/turnserver.conf
  9515. echo '# TurnServer configuration file.' >> /etc/turnserver/turnserver.conf
  9516. echo '#' >> /etc/turnserver/turnserver.conf
  9517. echo '' >> /etc/turnserver/turnserver.conf
  9518. echo '## Public IPv4 address of any relayed address (if not set, no relay for IPv4).' >> /etc/turnserver/turnserver.conf
  9519. echo '## To have multiple address, separate addresses with a comma' >> /etc/turnserver/turnserver.conf
  9520. echo '## (i.e. listen_address = { "172.16.0.1", "172.17.0.1" }).' >> /etc/turnserver/turnserver.conf
  9521. echo "listen_address = { \"192.168.0.1\" }" >> /etc/turnserver/turnserver.conf
  9522. echo '' >> /etc/turnserver/turnserver.conf
  9523. echo '## Public IPv6 address of any relayed address (if not set, no relay for IPv6).' >> /etc/turnserver/turnserver.conf
  9524. echo '## To have multiple address, separate address with a comma' >> /etc/turnserver/turnserver.conf
  9525. echo '## (i.e. listen_addressv6 = { "2001:db8:1::1", "2001:db8:2::1" }).' >> /etc/turnserver/turnserver.conf
  9526. echo "#listen_addressv6 = { \"2001:db8::1\" }" >> /etc/turnserver/turnserver.conf
  9527. echo '' >> /etc/turnserver/turnserver.conf
  9528. echo '## UDP listening port.' >> /etc/turnserver/turnserver.conf
  9529. echo "udp_port = $VOIP_TURN_PORT" >> /etc/turnserver/turnserver.conf
  9530. echo '' >> /etc/turnserver/turnserver.conf
  9531. echo '## TCP listening port.' >> /etc/turnserver/turnserver.conf
  9532. echo "tcp_port = $VOIP_TURN_PORT" >> /etc/turnserver/turnserver.conf
  9533. echo '' >> /etc/turnserver/turnserver.conf
  9534. echo '## TLS listening port.' >> /etc/turnserver/turnserver.conf
  9535. echo "tls_port = $VOIP_TURN_TLS_PORT" >> /etc/turnserver/turnserver.conf
  9536. echo '' >> /etc/turnserver/turnserver.conf
  9537. echo '## TLS support.' >> /etc/turnserver/turnserver.conf
  9538. echo 'tls = true' >> /etc/turnserver/turnserver.conf
  9539. echo '' >> /etc/turnserver/turnserver.conf
  9540. echo '## DTLS support. It is an experimental feature and is not defined in TURN' >> /etc/turnserver/turnserver.conf
  9541. echo '## standard.' >> /etc/turnserver/turnserver.conf
  9542. echo 'dtls = false' >> /etc/turnserver/turnserver.conf
  9543. echo '' >> /etc/turnserver/turnserver.conf
  9544. echo '## Maximum allocation port number.' >> /etc/turnserver/turnserver.conf
  9545. echo 'max_port = 65535' >> /etc/turnserver/turnserver.conf
  9546. echo '' >> /etc/turnserver/turnserver.conf
  9547. echo '## Minimum allocation port number.' >> /etc/turnserver/turnserver.conf
  9548. echo '' >> /etc/turnserver/turnserver.conf
  9549. echo 'min_port = 49152' >> /etc/turnserver/turnserver.conf
  9550. echo '' >> /etc/turnserver/turnserver.conf
  9551. echo '## TURN-TCP support.' >> /etc/turnserver/turnserver.conf
  9552. echo '' >> /etc/turnserver/turnserver.conf
  9553. echo 'turn_tcp = true' >> /etc/turnserver/turnserver.conf
  9554. echo '' >> /etc/turnserver/turnserver.conf
  9555. echo '## TURN-TCP buffering mode:' >> /etc/turnserver/turnserver.conf
  9556. echo '## - true, use userspace buffering;' >> /etc/turnserver/turnserver.conf
  9557. echo '## - false, use kernel buffering.' >> /etc/turnserver/turnserver.conf
  9558. echo 'tcp_buffer_userspace = true' >> /etc/turnserver/turnserver.conf
  9559. echo '' >> /etc/turnserver/turnserver.conf
  9560. echo '## TURN-TCP maximum buffer size.' >> /etc/turnserver/turnserver.conf
  9561. echo 'tcp_buffer_size = 32768' >> /etc/turnserver/turnserver.conf
  9562. echo '' >> /etc/turnserver/turnserver.conf
  9563. echo '## Daemon mode.' >> /etc/turnserver/turnserver.conf
  9564. echo 'daemon = true' >> /etc/turnserver/turnserver.conf
  9565. echo '' >> /etc/turnserver/turnserver.conf
  9566. echo '## Unprivileged user.' >> /etc/turnserver/turnserver.conf
  9567. echo '## If you want to use this feature create a system user.' >> /etc/turnserver/turnserver.conf
  9568. echo '## On Linux: adduser --system --group turnserver' >> /etc/turnserver/turnserver.conf
  9569. echo 'unpriv_user = turnserver' >> /etc/turnserver/turnserver.conf
  9570. echo '' >> /etc/turnserver/turnserver.conf
  9571. echo '## Realm value.' >> /etc/turnserver/turnserver.conf
  9572. echo "realm = \"$DEFAULT_DOMAIN_NAME\"" >> /etc/turnserver/turnserver.conf
  9573. echo '' >> /etc/turnserver/turnserver.conf
  9574. echo '## Nonce key.' >> /etc/turnserver/turnserver.conf
  9575. echo "nonce_key = \"$VOIP_TURN_NONCE\"" >> /etc/turnserver/turnserver.conf
  9576. echo '' >> /etc/turnserver/turnserver.conf
  9577. echo '## Max relay per username.' >> /etc/turnserver/turnserver.conf
  9578. echo 'max_relay_per_username = 5' >> /etc/turnserver/turnserver.conf
  9579. echo '' >> /etc/turnserver/turnserver.conf
  9580. echo '## Allocation lifetime.' >> /etc/turnserver/turnserver.conf
  9581. echo 'allocation_lifetime = 1800' >> /etc/turnserver/turnserver.conf
  9582. echo '' >> /etc/turnserver/turnserver.conf
  9583. echo '## Allocation bandwidth limitation (in KBytes/s).' >> /etc/turnserver/turnserver.conf
  9584. echo '## 0 value means bandwidth quota disabled.' >> /etc/turnserver/turnserver.conf
  9585. echo 'bandwidth_per_allocation = 150' >> /etc/turnserver/turnserver.conf
  9586. echo '' >> /etc/turnserver/turnserver.conf
  9587. echo '## Restricted user bandwidth (in KBytes/s).' >> /etc/turnserver/turnserver.conf
  9588. echo '## 0 value means bandwidth limitation disabled.' >> /etc/turnserver/turnserver.conf
  9589. echo 'restricted_bandwidth = 10' >> /etc/turnserver/turnserver.conf
  9590. echo '' >> /etc/turnserver/turnserver.conf
  9591. echo '## Denied addresses.' >> /etc/turnserver/turnserver.conf
  9592. echo '' >> /etc/turnserver/turnserver.conf
  9593. echo '# disallow relaying to localhost' >> /etc/turnserver/turnserver.conf
  9594. echo 'denied_address {' >> /etc/turnserver/turnserver.conf
  9595. echo ' address = "127.0.0.1"' >> /etc/turnserver/turnserver.conf
  9596. echo ' mask = "8"' >> /etc/turnserver/turnserver.conf
  9597. echo ' port = 0' >> /etc/turnserver/turnserver.conf
  9598. echo '}' >> /etc/turnserver/turnserver.conf
  9599. echo '' >> /etc/turnserver/turnserver.conf
  9600. echo '# disallow relaying to ip6-localhost' >> /etc/turnserver/turnserver.conf
  9601. echo 'denied_address {' >> /etc/turnserver/turnserver.conf
  9602. echo ' address = "::1"' >> /etc/turnserver/turnserver.conf
  9603. echo ' mask = "128"' >> /etc/turnserver/turnserver.conf
  9604. echo ' port = 0' >> /etc/turnserver/turnserver.conf
  9605. echo '}' >> /etc/turnserver/turnserver.conf
  9606. echo '' >> /etc/turnserver/turnserver.conf
  9607. echo '## Certification Authority file.' >> /etc/turnserver/turnserver.conf
  9608. echo "ca_file = \"/etc/ssl/certs/ca-certificates.crt\"" >> /etc/turnserver/turnserver.conf
  9609. echo '' >> /etc/turnserver/turnserver.conf
  9610. echo '## Server certificate file.' >> /etc/turnserver/turnserver.conf
  9611. if [ -f /etc/ssl/certs/$DEFAULT_DOMAIN_NAME.pem ]; then
  9612. echo "cert_file = \"/etc/ssl/certs/$DEFAULT_DOMAIN_NAME.pem\"" >> /etc/turnserver/turnserver.conf
  9613. else
  9614. if [ -f /etc/ssl/certs/$DEFAULT_DOMAIN_NAME.crt ]; then
  9615. echo "cert_file = \"/etc/ssl/certs/$DEFAULT_DOMAIN_NAME.crt\"" >> /etc/turnserver/turnserver.conf
  9616. fi
  9617. fi
  9618. echo '' >> /etc/turnserver/turnserver.conf
  9619. echo '## Private key file.' >> /etc/turnserver/turnserver.conf
  9620. echo "private_key_file = \"/etc/ssl/certs/$DEFAULT_DOMAIN_NAME.key\"" >> /etc/turnserver/turnserver.conf
  9621. echo '' >> /etc/turnserver/turnserver.conf
  9622. echo '## Account method.' >> /etc/turnserver/turnserver.conf
  9623. echo "account_method = \"file\"" >> /etc/turnserver/turnserver.conf
  9624. echo '' >> /etc/turnserver/turnserver.conf
  9625. echo '## Account file (if account_method = file).' >> /etc/turnserver/turnserver.conf
  9626. echo "account_file = \"/etc/turnserver/turnusers.txt\"" >> /etc/turnserver/turnserver.conf
  9627. echo '' >> /etc/turnserver/turnserver.conf
  9628. echo '## mod_tmpuser.' >> /etc/turnserver/turnserver.conf
  9629. echo 'mod_tmpuser = false' >> /etc/turnserver/turnserver.conf
  9630. echo "${MY_USERNAME}:password:${DEFAULT_DOMAIN_NAME}:authorized" > /etc/turnserver/turnusers.txt
  9631. systemctl restart turnserver
  9632. echo 'install_sip_turn' >> $COMPLETION_FILE
  9633. }
  9634. function install_final {
  9635. if grep -Fxq "install_final" $COMPLETION_FILE; then
  9636. return
  9637. fi
  9638. # unmount any attached usb drive
  9639. if [ -d $USB_MOUNT ]; then
  9640. umount $USB_MOUNT
  9641. rm -rf $USB_MOUNT
  9642. fi
  9643. split_gpg_key_into_fragments
  9644. echo 'install_final' >> $COMPLETION_FILE
  9645. clear
  9646. echo ''
  9647. echo $"
  9648. *** ${PROJECT_NAME} installation is complete. Rebooting... ***
  9649. Now forward these ports from your internet router
  9650. HTTP 80
  9651. HTTPS 443
  9652. SSH 2222
  9653. DLNA 1900
  9654. DLNA 8200
  9655. XMPP 5222-5223
  9656. XMPP 5269
  9657. XMPP 5280-5281
  9658. IRC 6697
  9659. Git 9418
  9660. Email 25
  9661. Email 587
  9662. Email 465
  9663. Email 993
  9664. VoIP 64738
  9665. VoIP 5060
  9666. Tox 33445
  9667. IPFS 4001
  9668. "
  9669. if [ -f "/home/$MY_USERNAME/README" ]; then
  9670. echo $"See /home/$MY_USERNAME/README for post-installation instructions."
  9671. echo ''
  9672. fi
  9673. # add user menu on ssh login
  9674. if ! grep -q 'control' /home/$MY_USERNAME/.bashrc; then
  9675. echo 'control' >> /home/$MY_USERNAME/.bashrc
  9676. fi
  9677. if [ ! -f $IMAGE_PASSWORD_FILE ]; then
  9678. reboot
  9679. fi
  9680. }
  9681. read_configuration
  9682. set_default_onion_domains
  9683. locale_setup
  9684. parse_args
  9685. check_domains
  9686. install_not_on_BBB
  9687. remove_default_user
  9688. configure_firewall
  9689. configure_firewall_ping
  9690. configure_firewall_for_ssh
  9691. configure_firewall_for_dns
  9692. configure_firewall_for_ftp
  9693. configure_firewall_for_web_access
  9694. configure_firewall_for_voip
  9695. configure_firewall_for_voip_turn
  9696. configure_firewall_for_sip4
  9697. configure_firewall_for_avahi
  9698. configure_firewall_for_zeronet
  9699. configure_firewall_for_ipfs
  9700. create_repo_sources
  9701. configure_dns
  9702. initial_setup
  9703. install_tor
  9704. resolve_dns_via_tor
  9705. install_command_line_browser
  9706. enable_ssh_via_onion
  9707. check_date
  9708. install_dynamicdns
  9709. randomize_cron
  9710. create_freedns_updater
  9711. mark_admin_user_account
  9712. enforce_good_passwords
  9713. install_editor
  9714. change_login_message
  9715. enable_zram
  9716. random_number_generator
  9717. set_your_domain_name
  9718. time_synchronisation
  9719. configure_internet_protocol
  9720. create_git_project
  9721. configure_ssh
  9722. configure_ssh_onion
  9723. allow_ssh_to_onion_address
  9724. remove_instructions_from_motd
  9725. check_hwrng
  9726. search_for_attached_usb_drive
  9727. regenerate_ssh_keys
  9728. create_mirrors
  9729. create_upgrade_script
  9730. letsencrypt_renewals
  9731. install_zeronet
  9732. install_watchdog_script
  9733. configure_avahi
  9734. create_avahi_onion_domains
  9735. install_zeronet_blog
  9736. install_zeronet_mail
  9737. install_zeronet_forum
  9738. #install_atheros_wifi
  9739. configure_firewall_for_cjdns
  9740. mesh_cjdns
  9741. mesh_cjdns_tools
  9742. configure_firewall_for_batman
  9743. mesh_batman
  9744. configure_firewall_for_babel
  9745. mesh_babel
  9746. route_outgoing_traffic_through_tor
  9747. configure_email
  9748. create_procmail
  9749. handle_admin_emails
  9750. spam_filtering
  9751. configure_imap
  9752. #configure_imap_client_certs
  9753. configure_gpg
  9754. configure_backup_key
  9755. encrypt_incoming_email
  9756. encrypt_outgoing_email
  9757. email_client
  9758. email_archiving
  9759. email_from_address
  9760. configure_firewall_for_email
  9761. create_public_mailing_list
  9762. #create_private_mailing_list
  9763. encrypt_all_email
  9764. import_email
  9765. script_for_attaching_usb_drive
  9766. install_web_server
  9767. install_web_server_access_control
  9768. configure_firewall_for_web_server
  9769. install_owncloud_official_deb
  9770. upgrade_golang
  9771. install_gogs
  9772. install_xmpp
  9773. install_xmpp_client
  9774. install_tox_node
  9775. install_tox_client
  9776. tox_avahi
  9777. configure_firewall_for_xmpp
  9778. install_irc_server
  9779. configure_firewall_for_irc
  9780. install_irc_client
  9781. install_voip
  9782. install_sip
  9783. update_sipwitch_daemon
  9784. install_wiki
  9785. install_sip_turn
  9786. install_blog
  9787. mark_blog_domain
  9788. install_gnu_social
  9789. expire_gnu_social_posts
  9790. install_gnu_social_theme
  9791. install_gnu_social_markdown
  9792. install_rss_reader
  9793. install_rss_reader_gnusocial
  9794. install_rss_mobile_reader
  9795. install_hubzilla
  9796. #install_search_engine
  9797. install_dlna_server
  9798. configure_firewall_for_dlna
  9799. #install_mediagoblin
  9800. #install_ipfs
  9801. repair_databases_script
  9802. backup_to_friends_servers
  9803. intrusion_detection
  9804. install_final
  9805. echo "${PROJECT_NAME} installation is complete"
  9806. exit 0