From 385cec42b8537ce6cfae29c0986f8a2ab37958af Mon Sep 17 00:00:00 2001 From: mudler Date: Thu, 4 Aug 2016 16:50:12 +0200 Subject: [PATCH] first commit --- .gitignore | 11 + README.md | 9 + bin/sfdisk | Bin 0 -> 70064 bytes build.sh | 56 +++ molecules/arm-base.common | 130 +++++++ molecules/sabayon-arm-odroid-c2-8G.spec | 36 ++ molecules/sabayon-arm-odroid-u2-x2-8G.spec | 37 ++ molecules/sabayon-arm-rpi-8G.spec | 25 ++ molecules/sabayon-arm-rpi-mc-8G.spec | 27 ++ molecules/sabayon-arm-udooneo-8G.spec | 36 ++ scripts/cleanup_pkgcache.sh | 9 + scripts/image_error_script.sh | 19 + scripts/mkcard.txt | 77 +++++ scripts/mkloopcard.sh | 325 ++++++++++++++++++ scripts/mkloopcard_chroot.include | 82 +++++ scripts/mkloopcard_generic_hook.sh | 17 + scripts/mkloopcard_raspberry_chroot_hook.sh | 21 ++ scripts/mmc_remaster_post.sh | 18 + scripts/odroid_c2_image_generator_script.sh | 11 + .../odroid_u2_x2_image_generator_script.sh | 11 + scripts/outer_source_chroot_script_arm.sh | 21 ++ scripts/post_mmc_image_script.sh | 36 ++ scripts/pre_mmc.sh | 5 + scripts/raspberry_image_generator_script.sh | 10 + scripts/remaster_error_script.sh | 11 + scripts/remaster_post.sh | 21 ++ scripts/remaster_post_common.sh | 31 ++ scripts/remaster_pre.sh | 24 ++ scripts/udoo_neo_image_generator_script.sh | 11 + 29 files changed, 1127 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100755 bin/sfdisk create mode 100755 build.sh create mode 100644 molecules/arm-base.common create mode 100644 molecules/sabayon-arm-odroid-c2-8G.spec create mode 100644 molecules/sabayon-arm-odroid-u2-x2-8G.spec create mode 100644 molecules/sabayon-arm-rpi-8G.spec create mode 100644 molecules/sabayon-arm-rpi-mc-8G.spec create mode 100644 molecules/sabayon-arm-udooneo-8G.spec create mode 100755 scripts/cleanup_pkgcache.sh create mode 100755 scripts/image_error_script.sh create mode 100755 scripts/mkcard.txt create mode 100755 scripts/mkloopcard.sh create mode 100644 scripts/mkloopcard_chroot.include create mode 100755 scripts/mkloopcard_generic_hook.sh create mode 100755 scripts/mkloopcard_raspberry_chroot_hook.sh create mode 100755 scripts/mmc_remaster_post.sh create mode 100755 scripts/odroid_c2_image_generator_script.sh create mode 100755 scripts/odroid_u2_x2_image_generator_script.sh create mode 100755 scripts/outer_source_chroot_script_arm.sh create mode 100755 scripts/post_mmc_image_script.sh create mode 100644 scripts/pre_mmc.sh create mode 100755 scripts/raspberry_image_generator_script.sh create mode 100755 scripts/remaster_error_script.sh create mode 100755 scripts/remaster_post.sh create mode 100755 scripts/remaster_post_common.sh create mode 100755 scripts/remaster_pre.sh create mode 100755 scripts/udoo_neo_image_generator_script.sh diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a2c0f48 --- /dev/null +++ b/.gitignore @@ -0,0 +1,11 @@ +CHROOTS +chroot/* +iso/* +livecd/* +pkgcache/* +sources/* +iso_rsync/* +automatic-changelogs/* +monthly-git-logs/* +images/* +bin/docker-companion diff --git a/README.md b/README.md new file mode 100644 index 0000000..427036d --- /dev/null +++ b/README.md @@ -0,0 +1,9 @@ +# Arm molecules + +**Required:** + +* docker running: ```systemctl start docker``` +* docker-companion, available in sabayon repositories, or it will be fetched and placed automatically in bin/docker-companion +* molecules, available in sabayon repositories + +then you can run build.sh inside the folder: ```./build.sh``` diff --git a/bin/sfdisk b/bin/sfdisk new file mode 100755 index 0000000000000000000000000000000000000000..4976fb083594a680dfd526ac6f4af22e8e3f98ab GIT binary patch literal 70064 zcmce<3w#sB+CRQ&8wfYI%Ef{psRk(m(xPY!jUY@*%9 zXpiDK=<&kwc2Mz%w^~p`+CmFnuoOWQ4^&jxCENrl<(l93ncZy{w7>U#fA9bE4>U8+ zGc(UT^UO2PJagI2l04stB#VVJK1tlo96^ijbupCo&2ekmHs^71*<4%B#dYVd;94P< z6@NxPmmV|1%p@e@V}v#h28aT>*AyBLVj#Ue(SLW0AmDbzr249XFo|J{$l=U?>tT9V6A zy?sV#NGH%aWjdGf->r?~jQR!?&AR8t8wM0j>t8f$wtrFoMcFs@zww6a=FhoqAd^=r zNKzdmZynEw8}e_XSM>zK0zFQ_#cduA+{J8N1>BYRy9|Hy@!~I?#hSnRHAkCb*CIxJ z(OSn0K}h@=A0Cm*bwEJq#$Ub;cS6_|e|_*bP{&blEBeW zhh)*;09pv0I^KuS7#le{?rMa6_4pMCZ^EAof0_8BPj4+?-);5yFoc(y@aAY29mqnM zr^kCB^yu+x^pJvE^!P{I86@+Aq!xk90o_b`cfk4>J z6#w5uN$>u*AKj!dGWxLneDEyX~q|$BmN8@My5Z*H?~0MyB6}hTfo240)BT3^y^y4e@P4Z zXSdL<4_lz~Mhp0w7VxjOP;YGu_*+`wC%uLI-CDqpX#qc?1^RPa;6K&^{vR#S|F8x8 z^)1xd*A8papz(3-xwrpJ6=fM_l?|)8Abm2Gm$=b z-mKZ;jLC&F@8>3aM^B#X7Yn)h)5W4Wg;R^BbMwV{vkM=X%gvc9&YC@qzCx8JblqDk%)?O7;SM*5jSi8R8f40n*l=eDXD1sY))gQaL()nj2MWc z+Szj^6JDG(XErx)`qXK_&RB$oiZ|XsQB%86*&M&f%>WDYxd)~{P&gO#3ybE=pN@>I z_M*uU!t{Bwrxt14_=~s)rWS!biDLS_v!-!ihl0tIo2w`kADTOT@;$@_H-CQN)Y&sg zOjGCGORWQg+^ji;Vi8p_+sq6I`Zaz@T?0nD8@=iYf!A3!4)=n|Vef94!$#O$dL zFd3Nm1LKQ0KTDXQbs={Tx}G|9+MEZbqSvSnsKn&Sq)obNv4k0#GUzh(n}j-J-gK&m z_|U5?Tr_p^R1ih~kMwzm4WB&ly6c-_H#NnwZfJ^Le_eBY;B~ZWNam98Py43W|9Ag5 zMk|GVTQ8vd$Jz+f>QA_!acsc~jT~Xa8SXf17F_vO+#49jgu9%brzOT$=n7V_ID#ViK_)npPh**EF_P5o7YllCcI%Q zses*tr@D<#h6ztHGCr9mJn>|FvQ2pN+R0_YqXU{gf(dV|rzx?(gm2fBo8u;!@U%`d zK2uD1C`i+1rU`#Z6BhesCOmJ#FEZf`oulM{32$EO7n|^AzoFEGH`eb&XN3t*dmhGT zr3r7W?2jr#&m<6ENWi8c2l2Cj9j#e5na<-iujb!qW_7d{&z9=Ka1^ zCOrA(#%GNQpKTx!mYeX#o*pH~O!&d3{F_X8+OIS|wI;lIZ*8XuZ|oydnR*kR_9u;x zV#1sE-Hw{@E+aF-Mibs`!gEQ@`ajHsx0&$6P54w3-ebb2necfgyxoK!VZvva@FPw5 zOcP!(;RWfSO?d=6TuKtALFG^}#|hE~Ta}R|G3f1mb}rFtHNN?tF2o3)Ny%z`0-s*5 z5^N#3mccI&OjDa0WAHNs)0C#JVQ>k-G?l3<8N7^On!?ml20u(NO z-$$^G;3*8ghhUnb)B*g*Ah%qjatv(s|cnkMy+LVH-c$uQDY3gj9{8l)HMulOE66(>PiMD z5lmBvTFT(lzXGPILk%$a7{N4UsB;;7fMA*`)F}+!OE66lY5{|PAeg2G)y3dCf@w-n zGa38^!88@9b_Q1xOjCfG%HVYblj&DE27f>>nSAx=Icopg1ltL&XYi{8lZjVr8TLxeUIK;0%JNF!&yV z$waFK48D_KGR>-s!G9r`OtPBE;9CeLQ>@wU^1<0DT7b{0+>vy z8es4-g2|Msa~XVqU^1cV6bA1lm`tZyz~CPUCX=bU7+gm%nMyU2!Cw$eCQ`LCxRPKp zjcO``*AYx6QRNu?0l{Pn)uU%v{}b#YxSqkU5=^E~t!3~F1e3{AV+?+VU@~>;8U~jT z>>+q1gO?GUM{p^FA10Vgni>FHPL?IBE`E)4I(czdL0W9%#7-r*Is&IcV*9`;tJpel ziWid-u|%aHRl9OdKf0r8Y*tK=&j?Eou1tY73nl!E)#ae#i#+Mzf$>Fxj#5ei{2~jN zJ65ppQ3szDi*9<=#VI0mUusP84>wA=%Xb66mYn%@#8Z@F>$&dta9J^B-|0kx#g(s? za$G1Tw%4G4KfrPED})FL3-S+9I&D)1L#u>Pj1Lt-n!?fz#N@;(_wDZ6+{NeJ!>j)9r%Dn4`op(}ek z6Br-*5s*1i8j1|CSZ=$p?J$KBX%r z0svv>1XRSA?aB`&#GAbGZnv~=sAvV5`F%7pGc__fL`H7Bh{`t1DMV#ZH&DqBHHbGa z{W*rpU3}RgAu{PD&YQE_;HO+8bQDs|kBlIG1o`_Weq=@ovr^i`yWEr9ce(F&Pp$%c z@1IGB`v8()kPrGGO_j&jctJiY6mE__^qPwsE6Cfj>V%WW-35ZBLXfv-#pKhpWy>j5 zP;MddrI;p2=PW{a&}*ul>za`EpO9+$Dm%ala8Cob-j3XNPP|L41a7<_odR6NxZ@Fvf!r5gln>d1DPSAj=oZ z0peVGjJwL;UQ^Q-z*4-E5FY193k>E&yM}!mSd4*38_{^V2EwXCOxlF5b4zC}eyd~o|FVUHtCSb91EE*5qdq*Fr| zb`hKjI6ez65#(y2;&76*FV<#Dyf-Y8$O{+|Z6miQq%E;EiFn77&Z8RBIakS`JOm|H z7Xf_P7QU>GFN+m#5i06ag*LTSkXC^Zs`JXVUU{>4qY&CGW)Y=+g4{@Y{+l3g&8qXB zJPKGyK;eCkOhF#!$e_dqLH0PZ@)n<5qok90 zD%`}EZ7B9Qx)%E!X(YiJpazrTaf|?O5JW+7wIFZm#c>Ia7lHpLbW4R%*L#|b9lgs-ri6;wk zr4SyL2_F2v3*n@|BMw;P`I-K{j77g=M!56i4b*$f@Le-J1Jt+~^4Rp^;a4N*RXn_R zyhsT5^@V#KK?YyA|4|kU`VE16K#-5X`1YxUC6>o#z!WPyrXV5tew$EOOPw$_U8p#a zT0H!!;;~mFlV+@i$YTj*AI&Iwre0d6Yl_GA7Q(}A^6-AlL>iV83Tu53^$Aj=rEA^E zI;k=xl#n}**lp+h?ZVD3C+r-IspqtmND{A-5-H;4iEsR^7>O!0oXva~4wY5qbmOI} zocw%rdcM5HJw9LF=pN^me}~c7K2|;>f1^B2Dik_|KIVhFku&g^gY!cb9)J)J@xd>F z3U^-iJ4}+SgzCg=@t9e3p~>kqL=-GIBv$akr3DA!Z9<7wf-c@sW8Tb-56R z^#v(k&ZY%z^FxQkF1{RP;icY4%Jo8WQ_{ju1*yU%&ofxqC%-CMIq%rTB&qtX@yDpz zu-i~!w@q*4NitA{UkVjJwendu$1}W;RnKNwIlY>gPC_{IS_?VV0zdMo7b5ZIY}Q2b z-CZOTj2KMXeGd3?4$~}+T$Pxqz0yNA&i`3_i$^}m+VdmYLoGq2ahdr&GW;H6vXKrh z@`V4*1vt(vol9Qa4s%3);jd~8EzAoYVguNJMYLM8-qB<5yDUfoEtv2l0HgKV=za}x z4-KnoV`AP4j5bu~(byHcVFnX0rFF)H!RSK5QQIe&EN%`wVsB1Afr+6hU7++UrAIP2 zGP6lh}p)Q|%UYl7q<$*z|%0)fiM-eI-TlsS8`6p>Pn_mcL=s9vFeX>gO z_sZW17BxQ2EiK9B{C9Z6BcWa~vA|uj(BTT44~Zl2Z53Vk=K0WI48r&gLh?eJ&k_@I zjxK;1KdgAzoOakJC%p0o1m=}$(0$*``@6T|S5$iBmdK?3occLZ z@=;|z%ye)y0C&kqM{bA@u0%Z7$_H0a$a^D8TzrV8Wc3Mr2|AMxmW*bmcov!BX)win z=>67U@D9Op6vK~yCKhkwgBzB!1<_zkbQ80G$6St3XI2KpWKGN-)nxhoQIh3e<`wQn zFF)jA)_MR)3uuLqbB2H7A;^-N*|1=tCyat?xi4NALZ<0(e&OMK{=Hv)ay=~6+G)rs#Rfiq@{}8H!TuAvG@=UQ z3LT}~#2Bmb$c@pq$o#x}Eme^(*Pp})*zJ*TaDd#`@>aPL-M0>FLohxUE0Lz|n~&^G zoCO$Xy@@f=6D~3{<}KXl<=@+IF;~^fm?o|QYe`nb)jtmtQE+v1t;SW9xXP2&lc&Iy z4_vwBTACg9f-8r{)ek8qt`;(`l&sD1)U1ZUB8Sz*FR!M4r+%tj7*A|o+*figJ(A9G ze%-Z5UB`Or8m(&3{mRW+yNuCwo;ZxWeDEkq)G1IwuY8aXlH;N7!k1TqM~e)V6c4As z!|hOoBARO#Lf2G_cY5Jyk_9K9N>9nD7Kgim&Jc1o&C5Xt`sDq}&A(%!fd$yebT=9R zXUbEDXehyIk;9t>)+FauhwNN3AKU{+l_=Z1$te!1Z_q8M81t=Y&^vtm0(vo`ce9z^ zPcEWYcaYJ0n&?RzFd%>CpXj9tlAQT?VPFw#>m6{i6aMzFPu@NUy%h&rVU-N`s?P!4 zgI=Qh?%bys7+o(&THHfxP$`lyC_X*NdKvARiu&VijB&XFH6$;w!hQE&k)@5_Xd{X! zB~1k~Q2_E+w_#kkA^B{M4^<(q^@2Fc8_uO37;^}M2zMUFfE1qvB8zzWM|15|86*5T7#)D2j~q&t{F!N<{a*=HgI`ovKRnAT2{# z6DLtn=aZ)|D7iERf<#8iILAonj;Huh#{-mgcJVmJ95M_7EukJzmSFsbVkJb4vU?Cq zfsr8baZ9$mJ zgIs!zD0#I1HN#4L{d+eFtv3nHFB-B^UUPA}oF+N4HK~!nmK-nyhGC*~_{|U(1OfM& z#5J3V4PAjkkQfQ;FBsbw3(JH3m~1}y0){OXM@RTFSd{}y_r?egHuxf)O2sSkvMczI z4-(7EKF^1SBjV2f5>q%LaLRu_KyoU;hS2Hr7&;4Y_T|*h*N2`D<~&oGjcHIH%Ab+u z6U$K*LPbAf%D@)RVcIgOQ|`cKUenNXU~RzM_jnRpxGpkQ0_2&6mt^LLTVq!8<{agv zk1_YEpW(|J=4qzN`Hg>K7@P-Hz!#deL(?t9jy5SCV-1*u@(pyz7-umssHtENgF(LR zQO8K1+`x2e={}MS=^O1S`Q%&&_|BJWeX{7V>0;x{HsilH(&?|hNc&F&Oi%(E>6Yq; zVyG{`{-wH%mOV_}nfkL1Huz~EZOV2_zYbMy1Y?@qQa{(^R--(wP*)=d(|4bIjIqTe zsa4P9c|I$KrtQKXQ6VzUvC@aHT0#CUtM2$a>Ql%d$UB6Jeek$3r_i?M!-2){N=2Xiolo9;{2kJ^ zHGJ8v*YITvdI^bY>8GKzUjh-;)4E;}`1iiYR)Qc;a_saE6fnWB1W{0(b{t}lRAsi#3|~x+F16hT zmnY*duqwL;r8#*XnhK|V>F z#$U13Bh!){5H1!{gFGna!))O4K@S99_%p{Ev@9>w;Nd-kMsKlmLZ9!1ibN~PPm1H9M2-Zmb__DDMY}-HHl%zmLSiuGSmqwp9kT4osHPJ0vPt7p2z&%;@{;X4K zT{7GrjQKl8XPQd=1Et~_xdEVGFrkBlzBKx>3H2aQ-iW6^b|24Uvj`#-J0qIH2fs#z zh$Z<2HtV1sx^X-DT78m{O4Ugv0a}k0C8v}lG2EeXFVuq= zTGyO%8Yyv4xWkV~TSt39#6DbkP6?9oXzZ^y619|Sq_Diy1eSM*#t@Mu9An>uT&zRK zm5g09@h*c?{g<$T21l=MFX?MJKkr8G__R&m`sc?*yql^{NVCAsEib$-8&8)!5W32rC z6R|Sr2n($H5tIzSrethyPf1}fzD(iEzCZ^o-4{c}dBKHa=3caRU!a>SDz<3n{U za*PjcM#M|UMNaZi_$TPm4{y#MUa}$*Ess(!upUu*L(DKzi?qdR^H9UGuLwz)P&ebR z&TtnRQ4}6U2FWs&?3A6R@ie8rUh{6!AlMAdxZ8c`9_FH^=F8jovQutp?@+gPtb{3( z=4toRpJHGWbEQx2s?S|)D2{Vav!S| z5S$0{I8ZO}Uy=Rk2S264y|kXH0PV+7jaS~OtRSL$L6q9u+}i(#a}E(ZbXWl@J9g7p zGM#Q@)zzR*j4~gz{J(#?@$w$fVGaKsvH$Vu2HTvYow>0%Oijbcm7II9Q_Rt1LCyu- z&T)<@=&(s_ioxpX63X)l<>5nR0N@K@E`W5av3-Ed6O_Ja0M=TQIJrt3j>rVg-yK0N zC$^ECf2EQ*JbmL$C{s*%dLV`a#4ttPt<618^@D}_5`!BvEz;*udc@;yh)C9DM7-+)Aw<FRmGq4Aq*x)X~;*5{hx*I&>Eq4E*AU62+fzGD^Tntj_=@6QF zX#sJHHm>Bu$No+0$dg-z#AZQ;k-*4PM*m1`@}YWE;!B2i_NSz!M^ZWQGNBMBG~*m| zA@vO;_4sYMPX7RK;^m_$4zQ62HgHgz?2}*DG7y_hiJZ-UG=8;a;8!sTD_c?fg-%ui zm~iqCG}~R$-4Q9U@IGvO1$RNwuo`QPMg`6c5&H(t^b@bqNbS@}J&uBWbQ^jJ`{jlc z^FEO7>J$g3u0M~Oq^dO9uE75jI zSD}!U5Pwb5Y~?B*h;&y;7S8!xe6$+svx;RCa+Yr>fWUDi0vp!{h2rgq%y~Yjo`t-C zXyu2h@XICVJ4jCP zUm`h&{RpQpuj?;v>6hdzY=M*@ffG}O!Xnrh>`eZ*Vr6)0=6qbmdZzAriFNl$*SG zuqNJiZ!je~_Ps7%NKARIKNh%);1^N5lNMhhz;UNbb0w|epnA0iw&Kh39Pt66UFGCc z`L99N2^N1hjdn-L>G>W#AaspM^^0NhtZ{3(gnWV=bl6ZpEd~Guks5vePJt!pv^#_v zEs3(li=@V}dVxev5sDar$ zKJ*NnNFltOWzcv37Vw&6dO$Mjx1?F8L&eJ-6caBEoVJSX^Rf;FPV;Vl`NnuF_vbXg znx)>{D;{j5Plk8zp&hX*g+tUUSNr()j+27462fFmyER@P>mUZ79pN+n%y)aR|y#)R?|3ZQ1HpMUQ~t%>rB zOnsGkIx(0a90WE9ePE8XBq6MYD8}Y{R;AWHd8ek7hp`3DG#IK2EmJ;eZe=&n#oiEF z8E38Zg&(uUJ87+Ko0mnCFEuk?K0?j3kZ!%`m_oXh4BhJBlRtBm15(2fD(+>Z1|ETK zwDrlW89KfY&H4mRoW>Nc8GsSJd$TZ8?9t@V71I^X6d$)@a(J8^!VBe~%ma=D6Pc8Z zv=sHh4}I1Xbdd49}L`RWb@%x3rRvNu5F5SrNjiIt8`#-O`B3@HCW~WR>jZU)i|WD@dALIRDL>+_3!~ zWO9S0^j~ZEl6|4FN^jI)SjsQ^5Y1^C%{M`licy2mIT(sRBIb9KQOG5-++s$Sw2sKO zr*TBajy{y0q@|N7pmbYxkc|pR=OdPH{%uWsilZQ?4)78nmB^%43B|(Vnk))*Sv=)#zOZwC{^Z>WswP9{|eI_3f_Ne$NdJHsW$FiL?LvKv+?yILZS&0Cp>SI0t&eVD!1k{E1&kOJlav(@@_CmPQfU*t`Jz{Q#5JwBOJhCr^`%oJ`b$ir|QXgRA$$l1CuRY+d0 z^|ob`fF0eDn)uhCky$Vq%DHX2rYNuV#+Z9NnHmRX6JPjbi=WAx>5A;O#oK9>tkCLU zH+v4_G~ZV3MhoR{s@)E&?Cz&L1lI%G@m<(j+?XttLWcF^EtJ;OjD>W`!?Bm`i ztCie&eQE_`*R%ZC%1NSGBIu|i;g>CUY-8bS$5wZDM*SC>9lMK&P-Q3 zjv^V3oud&UP0sY*j`)3)sTKd!ag?D6Z4o8Hc2FX!{2IpnHO-j@>5)7_K~vQ&;;X~KpgT!iqT;%!iiu=61V%J3f`cy?!oFI(-{j;zoy zt&u^;4g#06HnQt9MzfbYzC+5z&2If)G}}+jZnH$!?>w5*=w>xFu@vM?68I7)5F`Q2 z#!Lb$^khQ<@9621_4Ji`x*>tEo<5Y)|4agp*D(n!M4-6I-_ULiEoTCtrsf3?K@NKR zsj=ehW`j~FIgi%bfxELrGdnoL9}O4l5}d2IB?pTfPPiE~jIt})Q<+mKHd)8| z7_4KPt-8*m&);>>@ErkuFto`dAs056cwd9cnZJO$Z>@x6>|ny8Qa56ACcKOba2)*p z+$C+KSc=R*)HjJ^{+&2XC=@{@Y<+nvU9{@(Gz+W&1UR62kOd$^%d07ZjD-=l;e}+; z;ZoklCQCdS9vCj>(t=msX5hpTuM<#Xd+Y?WrwY!$@0(jQE___D9r%Ib&pOcP?t?Z9e#3D~P<+X>pmPbo@F zasC@6=M}Z20-@CyyT(-d08OPoZh^8$8*r}$3y)^zRR>67*IS8@XC4#plAMRW0R{g! z^!fzEa6kBY1dKV{xC}R7)6#45%hwK82eLSQkRj z@CiOelH@E!W+HH6OFAd^W$mI(>SfelF=Zk8X8k{i-3PwLe0soM%#b<>3ANa~B8vq7ypc?a4gIoqKkPVC~5>z{X@JdYmn>)XdYzl5|B z8;88Z#*%#S(U(azo3*lPJX8kPY|o8#k5R62Xa`$-@!vU)Q#y7hODCXOZD-!!9wyT1 zAQ(oHZuJ~d=Ad3Jme-$hx1vto~zCoNC z7d?cYn0(vTSnI#SQX9OuC(yB&`XIzN83WjTJ8_N2541aY=f;jzW?XIXzK(dm{R*9F zjk!&rr^R0GM{HjHCD_D(O9g#gYwgN{LETu;>k0(o_3Nn#Nb8 zbN~v{m7DjF1&8<+xby3;Md`Izz;ix64`)34j=xEVuxx*hBJ=;W0kH&zqQxstug}CdQ*R{bdRa;o>5EgVe<+jY=dj=^P+bprQ^;=xrx|R5X z20%eJZ>D(ydpy~g(4@whe2`D(xFvq6arBH*K6nHsmw$Q#qdgLEfZ(U@gQ7@{Uch$| z{N!c$##RAf+WeOqZ-tkFh}J*08a8w@Q4##B2g~iKxmu|h4mGiUy2;L|Gq9Nn7Cjv2 zT#AbL;3`%r4GgJqJ|Daiq_lMYDLboq0Uzv$Jf-|o#H`e~2-}_%i3RvjD@1Cnhc|25 zthUjJYwedBZ{vf@iTYEt|0gw04chn*lxpQ0xApH(B>*)v)fL2RhXK&kQ3v)^JTa z`kxgQbe3wY*BZ>_BLQ{a%*t3>1Fh2YQQ*Tte5n0d!HK97+;ZxbEPIdrAKP`!yI!lh ztU8fcI~4H?{f<4GKz->38rNp$fiA&+1rp%yCE{)q%qsNupFk-u;>pVz>w%4SltG2> zBB{o@1i2VHF9X!tENK-xQ89`xX4I;cm))$*uT+ETJXZ8|gHj;_-3Fy`O_auHl#Xv? zly1-|jngRIMU*nAD8@fy;R*m!qn{663J_JdBd+&#roJrnA5ld}NNSwr|Fy0uxM_o4@f?80wDcmHsa%3aG7kg&1ixu0)0jc^@1ieoO?Swrf#j*W9WcD$A2-mc zZbv%QeTN*L8205;841P0O3!CU!L{&5#xU4=>_aS698?^N7{i{jkS}(_b0feQDg0~T5rZGfMM%1pqsOk4{n7fViA(oZk)r>uJg2w z=^SEqKD36$ld}*o#`tRhJdr|rI7+-kSOKRX{OCs9zq}F_8jn7Nj$q}D1xp69KF<>l z=D9ogbf2stv5Vaz!_N<~_C%GUzHVHx$;GK}QI@6qX)uJX7NkbTp5udlU~?)#v^|K% zlZeR|kwaL48#Ehnbyae1-jGgHRnbOlP84m#qeZyKDj&(JQy#<2j-Am3cs`k3574Id z{g)dP{O1mu*^VfFFpde?EpOz5-;*30FyF1C&39!TDXuetC?;+GiMMc&fLrbBXu_9w z)9rH9#%6z=V?jmkcdfCbw>0&; z3%8^t>n30<821Qrs+O!!??6%PZ>6<^(QRja79|n0^P%llBKZta;zOGNFwN~nSf;r_ z8ts~VccA-ftl!3TGrbU(2y3hx0YX(cbtVJL0HRko^$vh^8ni;4O6D8_-H$fIXTq*E zp5p{JFl%QkusUmijpz%~p%|uDzBpu|B%CSI`nN{eif$0F2{4xrz684KN3Ft`?vCtu z{^oNO*E+KGzgR~uk5N_n-TA-6$WuoST~Axk3FThu&~2xvq*Fpk^tiH(cnbFrn+TO^ zT{_B4=vEL?RkXseE5E%79x_-Kx^A!q<4Wy8=`pP{(ZP3uFg2)}FP_R8gcdM$%$E<+ zHAAdHD|Ma3#^bCQX{yhnKsfn12l-$bnu;ShsN?}$O(;r979_=jm77gyvmM8iXZ=|A z9q`CZ$9PS(g2zzCi_2^&>&SB80Rg2KS}r&V;zO@f>e3BVPy9t+p%QIGBUr!E=*^0u zn&;T)EhRCH#{2^@O^RWtzDGR}?ooiaA%I3mN$E}04Pjr4xk=rKQgneY4PqzhZv31i z&zQUxG9>+otQ$CigbPVPW==t%afOgjPyUHzD!ttiOZg%%V6S ztbs988nBYcs`Jp2eUCEhGU_81y%{SlRw*ug4}u~qUxQ_nK{*fE=&Qp$$_s~Sl|1Tm zJ4Z9jZ=j1Up>${y+k;}qrL@O`vp|cmv~o%}T2p?99W`eHYPjG#jP4q1A19c?M{K?` z|0SxujU>hHk(`Ciud(j<%+9i99m?7aJuD|;IBWy=g0#`1Y&(eT(zz7>PgtJByI^}T z1CQM}@PLlRi-!vNU@4gM;o72hzDuR)EHgLc|5lJ5!&TVrHP$(L6?mj?MQ%Dw{TJSd zJ4M&oC!DYnd07p^Bb^3nwPU|VV}R}t**v%bkgE8=Mkq$x_BId9Mk*hCIDy?0tew2L zmgmRADDgBpP3()KMDZFX7d-OM2RRVGCDPA!0ej;eIE3`qYW!_er-PEF4p(BdsHt!f zG%yRg`Xh2eaoT*wgsHecHOgexu!N&PTzHM(N~o1ac8Zqe z>px^UgRarCtkSZ)jVy+Wtoxa&j43+|wNd(kV)SuX%Ju(3l2BtkxlZd!!@I}1g2RMHh?XbtiKUa;%;`vu%ZK|=0*g$8DN0jd| z9#ECC6%!wGQrO@)qPXEW>CrAUJ)+?93XPE87TnB-PC-Y*gC1Uoi^=8iKJXTaR0)S> zDb+58lPWFfa97T;M-K)!yQ3HZoc}sc&hf=wFV0Jq5R4WcH^x?{#L9C1*42TPAQGUZ zw^!O|i{luHuH{W^F(-3@bOr}?)r{PJ)Kg=<{Zq|Oggg9aE#@hrOSdZGm*#AG?6SaM zi?l02gH)E*w_1DJLshN)pg`TaUiXXL=U(>XJmK9 zTT4~Muxm(1usiS=#`ghZ`{*CYtHoFFf#J3FttU&9O8^I5z3D|R*^>)G!jmt&`HYIjO1}*VZB&x|6J?L68c?}Ak z(I8F9Dup3I`2ujbOW%x3 zJH&8lX53lI=X@1H!9&TC^DT<-!BOW-q|1nzDBN7b&4Kf+d*SDgvWXTcJ&lSFJxwEq*<{yG4#qq@LoBQ~1-HSsS*Ry%3|D(gQs1lJigNzT1xD5!~K zE^_*<(G{$K@;78OF;YW)6YgC8x}A&KL5Q^bHBg{~ULu@3h7TU6@IgKp*VC)02F1b$ zx9NxvfWT(1+feHewYdL<72Qq!G!272TKg5c=m1V=(ITAD>n%_PnnpG6fjK-K;JM*0 zL_v-9db9!373(y%27#;^)fw!*4{>~q3?cVNMtMwnQ}LHR3AFqtVf%W zO({kulQh;MQ+x&PCU0#p6zV>-MWx5*Fsfd7&5lvX<|>-G7Jm#G=VRAbbL`-R(9Z85 zu!pJdx)gniVvi*$uYd^Xl1BS!SUO*^CU>53i90OU2eP}dxMr#<=vJ=#+IBQm}0`Yj0g=PkLc~joO z$lIKlN4>VNDe-H>)Nzo5Pm*koOAGFGmZ;d23=v|LKCiQ89%DHK_%twhIFnV!Y88d;ChkvaKG6sXlp{0}mn|9m+Ky zV1C5wF+QUc2c;3s_7-l(t%_nDU~zUb~#?Jj@cs3R|O>-j&c2W!7+cux+VPlJEn&!N2k9<=nYO_J0id|B&a zTx=X^DIQ@#kW@S(2|;r4h-3sQ#UpUrXr#4xgcU)n;t`ayb@7PSeA(zWeA(@70op2l zvQ_L&wR~Zz1k|pgKFv}qkFX&}2jsW}xb_$1;Po8s(JBwdULyPy7r>^!FSL2FfX$j% z+(z#`glBdmIb%JwXZ3n|__7fWcc3vOcEYz+yaeC8Xe)(ZnR8m~%G@{hIw~#idIqeHm+RnF;*0nk9-=?&T)kr%>ZDgLT@{B1h^IfF< z)SR}!l$J((Zfs7w)0Eao<=$#eyV*#Ka__O3Khm6bm63+Fmm*bpusN-jDXn-7(#AKZ z9YEA*dn2XgG^cGbr5$}AX+4_LK0wsykxd^U&C;CqHEV3IP7_Ow5`^?g@7%Xz z14cWV#bp!N7@SluJ-8E^Bt&q{j6xWiw5TN+GlkF5NqGdMV6d{_sdj?B#a%<>q0bD& zKVUIj8hoE32#Emf_LKOAMz3agL~#8E7`leDi9))uh)_O)Eh;)Bu;FzM`;<$urop)) z-IAqT;+(7)o!MSS?~7x%7zsj(Q5^GdQWS z*$_q8K9iyFK#~x_zAVW1EEov&1v{sF1gRi?4sm)I2Il++HqMnt-ew8E zP^PCT)6xyZ|HLY7o^+3wx8g>Qyj?yf$mdDHU{K)w?pN63)!`0bz60|U#vLj20G_iGy0R#5(_- zLjiFT&Kt<_`QcZVnwqWU~-U%(zs#*0R zGeS0VmUoavQ{lgYRO$au`UO?_0Pfa*p=Qe6?~w9z_!qLS!={-2QordmdXBRs=ab~L zU7&DnS22Z~j|AmP%48@Un_uy6&gkUJI8NF276exZ6;6?BCsrxH{0lB_+WI*}dICz} za?F`j{<%u&fF-`$G+%1-AFkMBC2;jFnp)<97m6A1Bh+g0>3`L|^K)SjTpV4g?pd{x(FvLn5MtodmX!VE`?OYJt`|t{7}#-8h<>X56ZI6#yMaG8a;N zyfpEq@v;R)E0+!SQ0{V8juyBNutM?87<@s<6K>i#={(-1`0aT4MAwFsJH|@;k}w99 zkHLmqS#h8z?pa$&wX5(Dxu5Nq4<=@{RbliX_`)i$)$6R9HIN}w)~0psZeT9*H{gCL zczY$etVe~4pWBdA)`&N@L5gWG*78|;eb8>jfm+}yGe1u3zg|EMN(@YC?JE78RXCJY zh=nv>KCut28wy>{s-su6b%(v6HzvSTU}3x=4bGL`-rKTb>*#EsZc)-*KwQIdLk^_( zskC1hcD7lC!FL1e2e!l51-Y@|viDzPS$6Tk$B^Aerx`RqhUceZ4L)56kG0WC3)i@6 zi#y>$r(!GiI4tzqxC$i|QAm}dX^18(C(pA^_Os&#A}a<`*trf=a2%btlP(Rmr*TlsHg51fPEFTQ>w@JN zS8j;F;4m!;4l}7b+^!)7Ie&mGU)@#faBQFL;l9qdvmfP6;`V3h$bGQt# z8Kq+bL$Ahw5HqqGv`0WELUj6mr84?=>c>S_4zWJ>I<_{uOq@|#B}A53Sk9~lWdQQV zcWbqNq>Yg$U)Ou2X^gA`rg?s6w^PGCo_m(s0DJKoW#5C7ZRJ%hidB9ZO5lj-xfr(A z%3}T^*o&^1srcY~&i?FX!3M9Ivw0*CPpG(NyvC-CO~L|KMHQg$2vyUY$V zn}T(mazD_-ZW}%%z&NTt%|gC;0p;78C_jqq?EPo@dPX0{#%mu*h0x*~(H%5YE{*rr z^J!xTZ`;ke-{wC?nuMos^f{aOWQUgf==|?a=qb3qdwm+lhVm8lmwp2A3Pd49=62Fg zG50Iq5L?=y9f}=+*lVa&zTZ|eJe5Qz$UXkeFxVTousW>s2t`l37(6J2|HRM?+hJzK zw%Ul^imERd%>`&X_+;jeMsoo+D4`s<#@?_JQt3_eJTZO2HtQMiXqvy6x%EZvfoWof zn5-}?uONSolb`VOwDeR~!93BXLz|_GI^CXk+cLbV@Xrh?vU1$g@)h`|T>c;UPu9E) zK!}vCqM#7X`;K-f9}yy>EM#s@C7?|Udc_}Z)^~a%WW}izypwP7ILfAHT6lZl;r5(3 zz!M&pf>{FBWaBe0I|e-v|K=ip+kIQOL;F|Lwdo?XnY}({{8&%; z10stf9#o!R*dRpiv||qQ;zF<2vcs2ij9<1MT&e%Tmo{!{T&cuoczibQd4!%rlrO^r zHRIEYeW{)JvQZX?1C^E;pGTZ5T+rtBJ7H=6~b-^TO+(8Jjy0-L8N=dd7G

(ACQE)d9Nh_%@DDvBgq_*QTAA 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 + exit 1 +fi + +update_chroot() { + + local image=$1 + local chroot_name=$2 + + pushd ./sources + + rm -rf $(pwd)/${chroot_name} + [[ -e ./../bin/docker-companion ]] \ + && ./../bin/docker-companion --pull unpack "${image}" $(pwd)/${chroot_name} \ + || docker-companion --pull unpack "${image}" $(pwd)/${chroot_name} + + popd + +} + +update_docker_companion() { + + type docker-companion >/dev/null 2>&1 || { + echo >&2 "Fetching docker-companion for you, and placing it under bin/" + curl -s https://api.github.com/repos/mudler/docker-companion/releases/latest \ + | grep "browser_download_url.*amd64" \ + | cut -d : -f 2,3 \ + | tr -d \" \ + | wget -i - -N -O bin/docker-companion + chmod +x bin/docker-companion +} + +} + +echo ':arm:M::\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x28\x00:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/bin/qemu-arm-binfmt:' > /proc/sys/fs/binfmt_misc/register || true + +update_docker_companion +update_chroot sabayon/rpi-armhfp rpi +update_chroot sabayon/rpi-mc-armhfp rpi-mc +update_chroot sabayon/odroid-u2-x2-armhfp odroid-u2-x2 +update_chroot sabayon/odroid-c2-armhfp odroid-c2 +update_chroot sabayon/udooneo-armhfp udooneo + +export SABAYON_RELEASE="${SABAYON_RELEASE:-16}" + +echo "Release ${SABAYON_RELEASE}" + +SABAYON_MOLECULE_HOME=$(pwd) molecule molecules/sabayon-arm-rpi-8G.spec +SABAYON_MOLECULE_HOME=$(pwd) molecule molecules/sabayon-arm-rpi-mc-8G.spec +SABAYON_MOLECULE_HOME=$(pwd) molecule molecules/sabayon-arm-odroid-u2-x2-8G.spec +SABAYON_MOLECULE_HOME=$(pwd) molecule molecules/sabayon-arm-odroid-c2-8G.spec +SABAYON_MOLECULE_HOME=$(pwd) molecule molecules/sabayon-arm-udooneo-8G.spec diff --git a/molecules/arm-base.common b/molecules/arm-base.common new file mode 100644 index 0000000..7ca950c --- /dev/null +++ b/molecules/arm-base.common @@ -0,0 +1,130 @@ +# Define an alternative execution strategy, in this case, the value must be +execution_strategy: chroot_to_mmc + +# Prefix command to add to chroot calls, when on x86_64 and touching a i686 +# chroot, set it to "linux32" +# prechroot: + +# Outer source chroot script. It's executed before entering the source_chroot. +# This is the very first thing molecule does. You can use it to setup +# packages cache. +# Variables exported: +# IMAGE_NAME = name of the final MMC image +# DESTINATION_IMAGE_DIR = path to the destination image directory +# CHROOT_DIR = path pointing to the chroot +%env outer_source_chroot_script: ${SABAYON_MOLECULE_HOME:-/sabayon}/scripts/outer_source_chroot_script_arm.sh + +# Inner source chroot script. Called from inside the source_chroot. +# Can be used to spawn package updates inside the chroot. +# inner_source_chroot_script: /sabayon/scripts/inner_source_chroot_update.sh + +# Outer source chroot script, executed after inner_source_chroot_script. +# Can be used to unload resources allocated by outer_source_chroot_script. +# Variables exported: +# IMAGE_NAME = name of the final MMC image +# DESTINATION_IMAGE_DIR = path to the destination image directory +# CHROOT_DIR = path pointing to the chroot +# outer_source_chroot_script_after: /some/path.sh + +# Error script command, executed when something went wrong and molecule has +# to terminate the execution +# error_script: /path/to/some/error_script.sh + +# Pre-image building script. Hook called before image file creation +# IMAGE_NAME = name of the final MMC image +# DESTINATION_IMAGE_DIR = path to the destination image directory +# CHROOT_DIR = path pointing to the chroot +pre_image_script: ${SABAYON_MOLECULE_HOME:-/sabayon}/scripts/pre_mmc.sh + +# Post-image building script. Hook called after image file creation and move +# into destination directory. +# Variables exported: +# IMAGE_NAME = name of the final MMC image +# DESTINATION_IMAGE_DIR = path to the destination image directory +# CHROOT_DIR = path pointing to the chroot +# IMAGE_PATH = path pointing to the destination image file +# IMAGE_CHECKSUM_PATH = path pointing to the destination image file checksum (md5) +%env post_image_script: ${SABAYON_MOLECULE_HOME:-/sabayon}/scripts/post_mmc_image_script.sh + +# Destination directory for the image path (MANDATORY) +%env destination_image_directory: ${SABAYON_MOLECULE_HOME:-/sabayon}/images + +# Release file that will be created onto the root filesystem +release_file: /etc/sabayon-edition + +# Release string (the actual distro name) +release_string: Sabayon Linux + +# Directories to remove completely (comma separated) +paths_to_remove: + /var/lib/entropy/client/database/*/sabayon*, + /root/.subversion, + /lib/udev-state/devices.tar.bz2, + /var/log/scrollkeeper.log, /var/log/genkernel.log, + /var/log/emerge.log, /usr/tmp/portage/*, + /root/.bash_history, + /usr/share/slocate/slocate.db, + /root/test-results.txt, + /root/test.sh, + /usr/portage/distfiles/*, + /usr/portage/packages/*, + /root/.revdep*, + /install-data/games/*, + /var/lib/entropy/store/*, + /var/log/entropy/*, + /var/lib/entropy/caches/*, + /var/lib/entropy/smartapps/*/*, + /var/lib/entropy/smartapps/*/*, + /var/lib/entropy/tmp/*, + /var/tmp/entropy/*, + /*.txt, + /usr/portage/a*, + /usr/portage/b*, + /usr/portage/c*, + /usr/portage/d*, + /usr/portage/e*, + /usr/portage/f*, + /usr/portage/g*, + /usr/portage/h*, + /usr/portage/i*, + /usr/portage/j*, + /usr/portage/k*, + /usr/portage/licenses, + /usr/portage/lxde*, + /usr/portage/m*, + /usr/portage/n*, + /usr/portage/o*, + /usr/portage/packages, + /usr/portage/pe*, + /usr/portage/q*, + /usr/portage/r*, + /usr/portage/s*, + /usr/portage/t*, + /usr/portage/u*, + /usr/portage/v*, + /usr/portage/w*, + /usr/portage/x*, + /usr/portage/y*, + /usr/portage/z*, + /etc/ssh/ssh_host_*, + /entropy, + /tmp/equoerror.txt, + /var/cache/man, + /var/lib/entropy/glsa/*, + /root/local, + /var/tmp/*, + /root/.ssh, + /root/.distcc, + /etc/distcc/.ssh + +# Directories to empty (comma separated) +paths_to_empty: + /home/sabayonuser/.thumbnails/, + /root/.ccache, + /var/tmp/portage, + /var/tmp/ccache, + /var/tmp/portage-pkg, + /var/tmp/binpkgs, + /var/lib/entropy/portage, + /var/lib/entropy/logs, + /var/cache/genkernel diff --git a/molecules/sabayon-arm-odroid-c2-8G.spec b/molecules/sabayon-arm-odroid-c2-8G.spec new file mode 100644 index 0000000..40c2797 --- /dev/null +++ b/molecules/sabayon-arm-odroid-c2-8G.spec @@ -0,0 +1,36 @@ +%env %import ${SABAYON_MOLECULE_HOME:-/sabayon}/molecules/arm-base.common + +%env source_chroot: ${SABAYON_MOLECULE_HOME:-/sabayon}/sources/odroid-c2 + +packages_to_add: + app-misc/sabayon-skel, + net-misc/networkmanager, + openssh, + sys-apps/keyboard-configuration-helpers, + sys-process/vixie-cron + +packages_to_remove: + +# Release desc (the actual release description) +release_desc: armv7l Odroid C2 + +# Release Version (used to generate release_file) +%env release_version: ${SABAYON_RELEASE:-11} + +# Specify image file name (image file name will be automatically +# produced otherwise) +%env image_name: Sabayon_Linux_${SABAYON_RELEASE:-11}_armv7l_Odroid_C2_8GB.img + +# Specify the image file size in Megabytes. This is mandatory. +# To avoid runtime failure, make sure the image is large enough to fit your +# chroot data. +image_mb: 7200 + +# Path to boot partition data (MLO, u-boot.img etc) +%env source_boot_directory: ${SABAYON_MOLECULE_HOME:-/sabayon}/boot/arm/odroid-c2 + +# External script that will generate the image file. +# The same can be copied onto a MMC by using dd +%env image_generator_script: ${SABAYON_MOLECULE_HOME:-/sabayon}/scripts/odroid_c2_image_generator_script.sh + + diff --git a/molecules/sabayon-arm-odroid-u2-x2-8G.spec b/molecules/sabayon-arm-odroid-u2-x2-8G.spec new file mode 100644 index 0000000..589de21 --- /dev/null +++ b/molecules/sabayon-arm-odroid-u2-x2-8G.spec @@ -0,0 +1,37 @@ +%env %import ${SABAYON_MOLECULE_HOME:-/sabayon}/molecules/arm-base.common + +%env source_chroot: ${SABAYON_MOLECULE_HOME:-/sabayon}/sources/odroid-u2-x2 + +packages_to_add: + app-misc/sabayon-skel, + net-misc/ntp, + net-misc/networkmanager, + openssh, + sys-apps/keyboard-configuration-helpers, + sys-process/vixie-cron + +packages_to_remove: + +# Release desc (the actual release description) +release_desc: armv7l Odroid U2/X2 + +# Release Version (used to generate release_file) +%env release_version: ${SABAYON_RELEASE:-11} + +# Specify image file name (image file name will be automatically +# produced otherwise) +%env image_name: Sabayon_Linux_${SABAYON_RELEASE:-11}_armv7l_Odroid_U2_X2_8GB.img + +# Specify the image file size in Megabytes. This is mandatory. +# To avoid runtime failure, make sure the image is large enough to fit your +# chroot data. +image_mb: 7200 + +# Path to boot partition data (MLO, u-boot.img etc) +%env source_boot_directory: ${SABAYON_MOLECULE_HOME:-/sabayon}/boot/arm/odroid-u2-x2 + +# External script that will generate the image file. +# The same can be copied onto a MMC by using dd +%env image_generator_script: ${SABAYON_MOLECULE_HOME:-/sabayon}/scripts/odroid_u2_x2_image_generator_script.sh + + diff --git a/molecules/sabayon-arm-rpi-8G.spec b/molecules/sabayon-arm-rpi-8G.spec new file mode 100644 index 0000000..10180a2 --- /dev/null +++ b/molecules/sabayon-arm-rpi-8G.spec @@ -0,0 +1,25 @@ +%env %import ${SABAYON_MOLECULE_HOME:-/sabayon}/molecules/arm-base.common +# Path to source chroot (mandatory) +%env source_chroot: ${SABAYON_MOLECULE_HOME:-/sabayon}/sources/rpi + +# Release desc (the actual release description) +release_desc: armv7l RPi + +# Release Version (used to generate release_file) +%env release_version: ${SABAYON_RELEASE:-11} + +# Specify image file name (image file name will be automatically +# produced otherwise) +%env image_name: Sabayon_Linux_${SABAYON_RELEASE:-11}_armv7l_RPi_Base_8GB.img + +# Specify the image file size in Megabytes. This is mandatory. +# To avoid runtime failure, make sure the image is large enough to fit your +# chroot data. +image_mb: 7200 + +# Path to boot partition data (MLO, u-boot.img etc) +%env source_boot_directory: ${SABAYON_MOLECULE_HOME:-/sabayon}/boot/arm/rpi + +# External script that will generate the image file. +# The same can be copied onto a MMC by using dd +%env image_generator_script: ${SABAYON_MOLECULE_HOME:-/sabayon}/scripts/raspberry_image_generator_script.sh diff --git a/molecules/sabayon-arm-rpi-mc-8G.spec b/molecules/sabayon-arm-rpi-mc-8G.spec new file mode 100644 index 0000000..1d6d544 --- /dev/null +++ b/molecules/sabayon-arm-rpi-mc-8G.spec @@ -0,0 +1,27 @@ +%env %import ${SABAYON_MOLECULE_HOME:-/sabayon}/molecules/arm-base.common + +# Path to source chroot (mandatory) +%env source_chroot: ${SABAYON_MOLECULE_HOME:-/sabayon}/sources/rpi-mc + +# Release desc (the actual release description) +release_desc: armv7l RPi + +# Release Version (used to generate release_file) +%env release_version: ${SABAYON_RELEASE:-11} + +# Specify image file name (image file name will be automatically +# produced otherwise) +%env image_name: Sabayon_Linux_${SABAYON_RELEASE:-11}_armv7l_RPi_MediaCenter_8GB.img + +# Specify the image file size in Megabytes. This is mandatory. +# To avoid runtime failure, make sure the image is large enough to fit your +# chroot data. +image_mb: 7200 + +# Path to boot partition data (MLO, u-boot.img etc) +%env source_boot_directory: ${SABAYON_MOLECULE_HOME:-/sabayon}/boot/arm/rpi + +# External script that will generate the image file. +# The same can be copied onto a MMC by using dd +%env image_generator_script: ${SABAYON_MOLECULE_HOME:-/sabayon}/scripts/raspberry_image_generator_script.sh + diff --git a/molecules/sabayon-arm-udooneo-8G.spec b/molecules/sabayon-arm-udooneo-8G.spec new file mode 100644 index 0000000..0a9d6eb --- /dev/null +++ b/molecules/sabayon-arm-udooneo-8G.spec @@ -0,0 +1,36 @@ +%env %import ${SABAYON_MOLECULE_HOME:-/sabayon}/molecules/arm-base.common + +%env source_chroot: ${SABAYON_MOLECULE_HOME:-/sabayon}/sources/udooneo + +packages_to_add: + app-misc/sabayon-skel, + net-misc/networkmanager, + openssh, + sys-apps/keyboard-configuration-helpers, + sys-process/vixie-cron + +packages_to_remove: + +# Release desc (the actual release description) +release_desc: armv7l Udoo Neo + +# Release Version (used to generate release_file) +%env release_version: ${SABAYON_RELEASE:-11} + +# Specify image file name (image file name will be automatically +# produced otherwise) +%env image_name: Sabayon_Linux_${SABAYON_RELEASE:-11}_armv7l_Udoo_Neo_8GB.img + +# Specify the image file size in Megabytes. This is mandatory. +# To avoid runtime failure, make sure the image is large enough to fit your +# chroot data. +image_mb: 7200 + +# Path to boot partition data (MLO, u-boot.img etc) +%env source_boot_directory: ${SABAYON_MOLECULE_HOME:-/sabayon}/boot/arm/udooneo + +# External script that will generate the image file. +# The same can be copied onto a MMC by using dd +%env image_generator_script: ${SABAYON_MOLECULE_HOME:-/sabayon}/scripts/udoo_neo_image_generator_script.sh + + diff --git a/scripts/cleanup_pkgcache.sh b/scripts/cleanup_pkgcache.sh new file mode 100755 index 0000000..81fc643 --- /dev/null +++ b/scripts/cleanup_pkgcache.sh @@ -0,0 +1,9 @@ +#!/bin/sh +# Remove tarballs not accessed in the last 30 days +# concurrency wrt scripts is handled in crontab + +# Path to molecules.git dir +SABAYON_MOLECULE_HOME="${SABAYON_MOLECULE_HOME:-/sabayon}" + +DIR="${SABAYON_MOLECULE_HOME}/pkgcache" +find "${DIR}" -atime +30 -type f -delete diff --git a/scripts/image_error_script.sh b/scripts/image_error_script.sh new file mode 100755 index 0000000..4b04c2c --- /dev/null +++ b/scripts/image_error_script.sh @@ -0,0 +1,19 @@ +#!/bin/sh +if [ -d "${CHROOT_DIR}/proc" ]; then + echo "Unmounting ${CHROOT_DIR}/proc" + umount "${CHROOT_DIR}/proc" +fi + +CHROOT_PKGS_DIR="${CHROOT_DIR}/var/lib/entropy/client/packages" +if [ -d "${CHROOT_PKGS_DIR}" ]; then + echo "Umounting bind to ${CHROOT_PKGS_DIR}" + umount "${CHROOT_PKGS_DIR}" || exit 1 +fi + +echo "trying to umount ${CHROOT_DIR}" +umount "${CHROOT_DIR}" + +#if [ -n "${LOOP_DEVICE}" ]; then +# echo "trying to umount loop device ${LOOP_DEVICE}" +# /sbin/losetup -d "${LOOP_DEVICE}" +#fi diff --git a/scripts/mkcard.txt b/scripts/mkcard.txt new file mode 100755 index 0000000..8c569d1 --- /dev/null +++ b/scripts/mkcard.txt @@ -0,0 +1,77 @@ +#! /bin/sh +# mkcard.sh v0.5 +# (c) Copyright 2009 Graeme Gregory +# Licensed under terms of GPLv2 +# +# Parts of the procudure base on the work of Denys Dmytriyenko +# http://wiki.omap.com/index.php/MMC_Boot_Format + +export LC_ALL=C + +if [ $# -ne 1 ]; then + echo "Usage: $0 " + exit 1; +fi + +DRIVE=$1 + +dd if=/dev/zero of=$DRIVE bs=1024 count=1024 + +SIZE=`fdisk -l $DRIVE | grep Disk | grep bytes | awk '{print $5}'` + +echo DISK SIZE - $SIZE bytes + +CYLINDERS=`echo $SIZE/255/63/512 | bc` + +echo CYLINDERS - $CYLINDERS + +{ +echo ,9,0x0C,* +echo ,,,- +} | "${SABAYON_MOLECULE_HOME}"/bin/sfdisk -D -H 255 -S 63 -C $CYLINDERS $DRIVE + +sleep 1 + + +"${SABAYON_MOLECULE_HOME}"/bin/sfdisk -R $DRIVE + +# handle various device names. +# note something like fdisk -l /dev/loop0 | egrep -E '^/dev' | cut -d' ' -f1 +# won't work due to https://bugzilla.redhat.com/show_bug.cgi?id=649572 + +PARTITION1=${DRIVE}1 +if [ ! -b ${PARTITION1} ]; then + PARTITION1=${DRIVE}p1 +fi + +DRIVE_NAME=`basename $DRIVE` +DEV_DIR=`dirname $DRIVE` + +if [ ! -b ${PARTITION1} ]; then + PARTITION1=$DEV_DIR/mapper/${DRIVE_NAME}p1 +fi + +PARTITION2=${DRIVE}2 +if [ ! -b ${PARTITION2} ]; then + PARTITION2=${DRIVE}p2 +fi +if [ ! -b ${PARTITION2} ]; then + PARTITION2=$DEV_DIR/mapper/${DRIVE_NAME}p2 +fi + + +# now make partitions. +if [ -b ${PARTITION1} ]; then + umount ${PARTITION1} + mkfs.vfat -F 32 -n "boot" ${PARTITION1} +else + echo "Cant find boot partition in /dev" +fi + +if [ -b ${PARITION2} ]; then + umount ${PARTITION2} + mkfs.ext4 -L "Sabayon" ${PARTITION2} +else + echo "Cant find rootfs partition in /dev" +fi + diff --git a/scripts/mkloopcard.sh b/scripts/mkloopcard.sh new file mode 100755 index 0000000..eb06d7a --- /dev/null +++ b/scripts/mkloopcard.sh @@ -0,0 +1,325 @@ +#! /bin/bash +# (c) Copyright 2012 Fabio Erculiani +# Licensed under terms of GPLv2 + +/usr/sbin/env-update +. /etc/profile + +export LC_ALL=en_US.UTF-8 + +# Path to molecules.git dir +SABAYON_MOLECULE_HOME="${SABAYON_MOLECULE_HOME:-/sabayon}" +export SABAYON_MOLECULE_HOME + +# Expected env variables: +# PATHS_TO_REMOVE = ";" separated list of paths to rm -rf +# PATHS_TO_EMPTY = ";" separated list of paths to rm -rf (keeping the dir) +# RELEASE_STRING +# RELEASE_VERSION +# RELEASE_DESC +# RELEASE_FILE +# IMAGE_NAME +# DESTINATION_IMAGE_DIR +# PACKAGES_TO_ADD +# PACKAGES_TO_REMOVE + +if [ ${#} -ne 5 ]; then + echo "usage: ${0} " + exit 1 +fi + +CHROOT_SCRIPT="${1}" +if [ ! -x "${CHROOT_SCRIPT}" ]; then + echo "${CHROOT_SCRIPT} is not executable" + exit 1 +fi +FILE="${2}" +SIZE="${3}" +BOOT_DIR="${4}" +CHROOT_DIR="${5}" +# Should we make a tarball of the rootfs and bootfs? +MAKE_TARBALL="${MAKE_TARBALL:-0}" +SD_FUSE="${SD_FUSE:-}" +DTB_FILES="${DTB_FILES:-}" +# Boot partition type +FIRST_PARTITION_START_CYL="${FIRST_PARTITION_START_CYL:-0}" +BOOT_PART_TYPE="${BOOT_PART_TYPE:-vfat}" +BOOT_PART_TYPE_MBR="${BOOT_PART_TYPE_MBR:-0x0C}" +BOOT_PART_MKFS_ARGS="${BOOT_PART_MKFS_ARGS:--n boot -F 32}" +# Root partition type +ROOT_PART_TYPE="${ROOT_PART_TYPE:-ext4}" +ROOT_PART_MKFS_ARGS="${ROOT_PART_MKFS_ARGS:--L Sabayon}" +# Copy /boot content from Root partition to Boot partition? +BOOT_PART_TYPE_INSIDE_ROOT="${BOOT_PART_TYPE_INSIDE_ROOT:-}" + +# Using /tmp is bad and triggers monitoring notifications +export TMPDIR=/var/tmp + +cleanup_loopbacks() { + cd / + sync + sync + sleep 5 + sync + [[ -n "${tmp_file}" ]] && rm "${tmp_file}" 2> /dev/null + [[ -n "${tmp_dir}" ]] && { umount "${tmp_dir}/proc" &> /dev/null; } + [[ -n "${tmp_dir}" ]] && { umount "${tmp_dir}" &> /dev/null; rmdir "${tmp_dir}" &> /dev/null; } + [[ -n "${boot_tmp_dir}" ]] && { umount "${boot_tmp_dir}" &> /dev/null; rmdir "${boot_tmp_dir}" &> /dev/null; } + sleep 1 + [[ -n "${boot_part}" ]] && losetup -d "${boot_part}" 2> /dev/null + [[ -n "${root_part}" ]] && losetup -d "${root_part}" 2> /dev/null + [[ -n "${DRIVE}" ]] && losetup -d "${DRIVE}" 2> /dev/null + # make sure to have run this + [[ -n "${tmp_dir}" ]] && CHROOT_DIR="${tmp_dir}" "${SABAYON_MOLECULE_HOME}"/scripts/mmc_remaster_post.sh +} +trap "cleanup_loopbacks" 1 2 3 6 9 14 15 EXIT + +# Erase the file +echo "Generating the empty image file at ${FILE}" +dd if=/dev/zero of="${FILE}" bs=1024000 count="${SIZE}" || exit 1 + +DRIVE=$(losetup -f "${FILE}" --show) +if [ -z "${DRIVE}" ]; then + echo "Cannot execute losetup for $FILE" + exit 1 +fi + +echo "Configured the loopback partition at ${DRIVE}" + +# Calculate size using fdisk +SIZE=$(fdisk -l "${DRIVE}" | grep Disk | grep bytes | awk '{print $5}') +CYLINDERS=$((SIZE/255/63/512)) +BOOTPART_CYLS=9 +ENDSECT=$(( 144584 + (EMPTYSIZE/512) )) + +echo "Disk size : ${SIZE} bytes" +echo "Disk cyls : ${CYLINDERS}" +echo "Boot p. cyls : ${BOOTPART_CYLS}" +echo "Boot p. start cyls : ${FIRST_PARTITION_START_CYL}" +echo "End block : ${ENDSECT} block" + +{ +echo ${FIRST_PARTITION_START_CYL},${BOOTPART_CYLS},${BOOT_PART_TYPE_MBR},* +echo $(( BOOTPART_CYLS + FIRST_PARTITION_START_CYL )),,,- +} | "${SABAYON_MOLECULE_HOME}"/bin/sfdisk -D -H 255 -S 63 -C ${CYLINDERS} ${DRIVE} + +sleep 2 + +BOOT_STARTBLOCK=$(fdisk -l "${DRIVE}" | grep "${DRIVE}p1" | awk '{print $3}') +if [ -z "${BOOT_STARTBLOCK}" ]; then + echo "No BOOT_STARTBLOCK" >&2 + exit 1 +fi +BOOT_ENDBLOCK=$(fdisk -l "${DRIVE}" | grep "${DRIVE}p1" | awk '{print $4}') +if [ -z "${BOOT_ENDBLOCK}" ]; then + echo "No BOOT_ENDBLOCK" >&2 + exit 1 +fi + +BOOT_STARTOFFSET=$(( BOOT_STARTBLOCK * 512 )) +BOOT_ENDOFFSET=$(( BOOT_ENDBLOCK * 512 )) +BOOT_MAGICSIZE=$(( BOOT_ENDOFFSET - BOOT_STARTOFFSET )) +echo "Boot start offset : ${BOOT_STARTOFFSET} bytes" +echo "Boot start block : ${BOOT_STARTBLOCK} block" +echo "Boot end block : ${BOOT_ENDBLOCK} block" +echo "Boot size : ${BOOT_MAGICSIZE} bytes" + +ROOT_STARTBLOCK=$(fdisk -l "${DRIVE}" | grep "${DRIVE}p2" | awk '{print $2}') +if [ -z "${ROOT_STARTBLOCK}" ]; then + echo "No ROOT_STARTBLOCK" >&2 + exit 1 +fi +ROOT_ENDBLOCK=$(fdisk -l "${DRIVE}" | grep "${DRIVE}p2" | awk '{print $3}') +if [ -z "${ROOT_ENDBLOCK}" ]; then + echo "No ROOT_ENDBLOCK" >&2 + exit 1 +fi + +ROOT_STARTOFFSET=$(( ROOT_STARTBLOCK * 512 )) +ROOT_ENDOFFSET=$(( ROOT_ENDBLOCK * 512 )) +ROOT_MAGICSIZE=$(( ROOT_ENDOFFSET - ROOT_STARTOFFSET )) +echo "Root start offset : ${ROOT_STARTOFFSET} bytes" +echo "Root start block : ${ROOT_STARTBLOCK} block" +echo "Root end block : ${ROOT_ENDBLOCK} block" +echo "Root size : ${ROOT_MAGICSIZE} bytes" + +# Get other two loopback devices first +boot_part=$(losetup -f --offset "${BOOT_STARTOFFSET}" --sizelimit "${BOOT_MAGICSIZE}" "${FILE}" --show) +if [ -z "${boot_part}" ]; then + echo "Cannot setup the boot partition loopback" + exit 1 +fi + +root_part=$(losetup -f --offset "${ROOT_STARTOFFSET}" --sizelimit "${ROOT_MAGICSIZE}" "${FILE}" --show) +if [ -z "${root_part}" ]; then + echo "Cannot setup the ${ROOT_PART_TYPE} partition loopback" + exit 1 +fi + +echo "Boot Partiton at : ${boot_part}" +echo "Root Partition at : ${root_part}" + +# Format boot +echo "Formatting ${BOOT_PART_TYPE} ${boot_part}..." +"mkfs.${BOOT_PART_TYPE}" ${BOOT_PART_MKFS_ARGS} "${boot_part}" || exit 1 + +# Format rootfs +echo "Formatting ${ROOT_PART_TYPE} ${root_part}..." +"mkfs.${ROOT_PART_TYPE}" ${ROOT_PART_MKFS_ARGS} "${root_part}" || exit 1 + +sleep 2 +sync + +boot_tmp_dir=$(mktemp -d --suffix="boot_tmp_dir") +if [[ -z "${boot_tmp_dir}" ]]; then + echo "Cannot create temporary dir (boot)" + exit 1 +fi +chmod 755 "${boot_tmp_dir}" || exit 1 + +tmp_dir=$(mktemp -d --suffix="root_tmp_dir") +if [[ -z "${tmp_dir}" ]]; then + echo "Cannot create temporary dir" + exit 1 +fi +chmod 755 "${tmp_dir}" || exit 1 + +echo "Setting up the boot directory content, mounting on ${boot_tmp_dir}" +mount "${boot_part}" "${boot_tmp_dir}" +cp -R "${BOOT_DIR}"/* "${boot_tmp_dir}"/ || exit 1 + +echo "Setting up the rootfs directory content, mounting on ${tmp_dir}" +mount "${root_part}" "${tmp_dir}" +rsync -a -H -A -X --delete-during "${CHROOT_DIR}"/ "${tmp_dir}"/ --exclude "/proc/*" --exclude "/sys/*" \ + --exclude "/dev/pts/*" --exclude "/dev/shm/*" || exit 1 + +CHROOT_DIR="${tmp_dir}" "${SABAYON_MOLECULE_HOME}"/scripts/remaster_pre.sh || exit 1 + +# execute PACKAGES_TO_ADD and PACKAGES_TO_REMOVE +export ETP_NONINTERACTIVE=1 +# Entropy doesn't like non-UTF locale encodings +export LC_ALL=en_US.UTF-8 + +# do I have to run "equo update?" +# If we are running outside the DAILY scope, it's +# better to do it here. If instead we're doing a +# DAILY, this is already done by other scripts. +if [ -z "${BUILDING_DAILY}" ]; then + FORCE_EAPI=2 chroot "${tmp_dir}" equo update || \ + FORCE_EAPI=2 chroot "${tmp_dir}" equo update || \ + exit 1 +fi + +if [ -n "${PACKAGES_TO_ADD}" ]; then + add_cmd="equo install ${PACKAGES_TO_ADD}" + chroot "${tmp_dir}" ${add_cmd} || exit 1 +fi +if [ -n "${PACKAGES_TO_REMOVE}" ]; then + rem_cmd="equo remove ${PACKAGES_TO_REMOVE}" + chroot "${tmp_dir}" ${rem_cmd} || exit 1 +fi + +# execute CHROOT_SCRIPT hook inside chroot +chroot_script_name=$(basename "${CHROOT_SCRIPT}") +target_chroot_script="${tmp_dir}"/"${chroot_script_name}" +chroot_hook_inc_name="mkloopcard_chroot.include" +chroot_hook_include="${SABAYON_MOLECULE_HOME}/scripts/${chroot_hook_inc_name}" +target_chroot_hook_inc="${tmp_dir}/${chroot_hook_inc_name}" +cp -p "${chroot_hook_include}" "${target_chroot_hook_inc}" || exit 1 +chmod 0700 "${target_chroot_hook_inc}" || exit 1 +cp -p "${CHROOT_SCRIPT}" "${target_chroot_script}" || exit 1 +chmod 0700 "${target_chroot_script}" || exit 1 +chown root "${target_chroot_script}" || exit 1 +chroot "${tmp_dir}" "/${chroot_script_name}" || exit 1 +rm -f "${target_chroot_script}" "${target_chroot_hook_inc}" + +CHROOT_DIR="${tmp_dir}" "${SABAYON_MOLECULE_HOME}"/scripts/mmc_remaster_post.sh + +# execute final cleanup of entropy stuff +chroot "${tmp_dir}" equo rescue vacuum +chroot "${tmp_dir}" equo cleanup + +# setup sudoers, enable wheel group +if [ -f "${tmp_dir}/etc/sudoers" ]; then + echo "# added by Sabayon Molecule" >> "${tmp_dir}/etc/sudoers" + echo "%wheel ALL=ALL" >> "${tmp_dir}/etc/sudoers" +fi + +export LC_ALL=C + +# work out paths to empty and paths to remove +if [ -n "${PATHS_TO_REMOVE}" ]; then + set -f + for path in $(echo ${PATHS_TO_REMOVE} | tr ";" "\n"); do + echo "Removing: ${path}" + set +f + rm -rf "${tmp_dir}"/${path} + set -f + done + set +f +fi +if [ -n "${PATHS_TO_EMPTY}" ]; then + set -f + for path in $(echo ${PATHS_TO_EMPTY} | tr ";" "\n"); do + set +f + echo "Emptying: ${path}" + rm -rf "${tmp_dir}"/"${path}"/* + set -f + done + set +f +fi + +if [ -n "${RELEASE_FILE}" ]; then + release_file="${tmp_dir}"/"${RELEASE_FILE}" + release_dir=$(dirname "${release_file}") + [[ ! -d "${release_dir}" ]] && { mkdir -p "${release_dir}" || exit 1; } + echo "${RELEASE_STRING} ${RELEASE_VERSION} ${RELEASE_DESC}" > "${release_file}" +fi + +for dtb in ${DTB_FILES}; do + echo "Requested to copy dtb: ${dtb}" + # expect to have just one kernel installed + dtb_files=$(find "${tmp_dir}/lib/dts" -name "${dtb}" -print) + for dtb_file in ${dtb_files}; do + echo "Copying dtb: ${dtb_file} to ${tmp_dir}/boot/" + cp "${dtb_file}" "${tmp_dir}/boot/" || exit 1 + done +done + +# BOOT_PART_TYPE_INSIDE_ROOT +if [ -n "${BOOT_PART_TYPE_INSIDE_ROOT}" ]; then + echo "Copying data from ${tmp_dir}/boot to ${boot_tmp_dir} as requested..." + if [ "${BOOT_PART_TYPE}" = "vfat" ]; then + cp -rL "${tmp_dir}/boot/"* "${boot_tmp_dir}/" || exit 1 + else + cp -rp "${tmp_dir}/boot/"* "${boot_tmp_dir}/" || exit 1 + fi +fi + +umount "${boot_tmp_dir}" || exit 1 + +echo "Umounting cruft..." +umount -f "${tmp_dir}/"{proc,sys,dev/shm,dev/pts} + +if [ -n "${DESTINATION_IMAGE_DIR}" ] && [ "${MAKE_TARBALL}" = "1" ]; then + # Create the rootfs tarball + ROOTFS_TARBALL="${DESTINATION_IMAGE_DIR}/${IMAGE_NAME}.rootfs.tar.xz" + echo "Creating the roofs tarball: ${ROOTFS_TARBALL}" + tmp_file=$(mktemp --suffix=.tar.xz) + [[ -z "${tmp_file}" ]] && exit 1 + cd "${tmp_dir}" || exit 1 + tar --one-file-system --numeric-owner --preserve-permissions --same-owner -cJf "${tmp_file}" ./ || exit 1 + mv "${tmp_file}" "${ROOTFS_TARBALL}" || exit 1 + chmod 644 "${ROOTFS_TARBALL}" || exit 1 + cd "$(dirname "${ROOTFS_TARBALL}")" || exit 1 + md5sum "$(basename "${ROOTFS_TARBALL}")" > "$(basename "${ROOTFS_TARBALL}")".md5 +fi + +umount "${tmp_dir}" || exit 1 + +if [ -n "${SD_FUSE}" ] && [ -x "${SD_FUSE}" ]; then + "${SD_FUSE}" "${DRIVE}" || exit 1 +fi + +cleanup_loopbacks +echo "Your MMC image \"${FILE}\" is ready" diff --git a/scripts/mkloopcard_chroot.include b/scripts/mkloopcard_chroot.include new file mode 100644 index 0000000..77f4ba1 --- /dev/null +++ b/scripts/mkloopcard_chroot.include @@ -0,0 +1,82 @@ +#!/bin/bash + +sd_enable() { + local srv="${1}" + local ext=".${2:-service}" + [[ -x /usr/bin/systemctl ]] && \ + systemctl --no-reload enable -f "${srv}${ext}" +} + +sd_disable() { + local srv="${1}" + local ext=".${2:-service}" + [[ -x /usr/bin/systemctl ]] && \ + systemctl --no-reload disable -f "${srv}${ext}" +} + +setup_displaymanager() { + if [ -n "$(equo match --installed gnome-base/gdm -qv)" ]; then + sd_enable gdm + elif [ -n "$(equo match --installed lxde-base/lxdm -qv)" ]; then + sd_enable lxdm + elif [ -n "$(equo match --installed x11-misc/lightdm-base -qv)" ]; then + sd_enable lightdm + elif [ -n "$(equo match --installed kde-base/kdm -qv)" ]; then + sd_enable kdm + else + sd_enable xdm + fi +} + +setup_desktop_environment() { + local session= + if [ -f "/usr/share/xsessions/LXDE.desktop" ]; then + session="LXDE" + elif [ -f "/usr/share/xsessions/xfce.desktop" ]; then + session="xfce" + elif [ -f "/usr/share/xsessions/gnome.desktop" ]; then + session="gnome" + elif [ -f "/usr/share/xsessions/mate.desktop" ]; then + session="mate" + elif [ -f "/usr/share/xsessions/KDE-4.desktop" ]; then + session="KDE-4" + fi + + if [ -n "${session}" ]; then + echo "[Desktop]" > /etc/skel/.dmrc || return 1 + echo "Session=${session}" >> /etc/skel/.dmrc || return 1 + fi +} + +setup_bootfs_fstab() { + # add /dev/mmcblk0p1 to /etc/fstab + local boot_part_type="${1}" + echo "/dev/mmcblk0p1 /boot ${boot_part_type} defaults 0 2" >> /etc/fstab +} + + +setup_boot() { + sd_enable sshd + sd_enable vixie-cron + sd_enable NetworkManager + #eselect uimage set 1 +} + +setup_users() { + # setup root password to... root! + echo root:root | chpasswd + # setup normal user "sabayon" + ( + if [ ! -x "/sbin/sabayon-functions.sh" ]; then + echo "no /sbin/sabayon-functions.sh found" + exit 1 + fi + . /sbin/sabayon-functions.sh + sabayon_setup_live_user "sabayon" || exit 1 + # setup "sabayon" password to... sabayon! + echo "sabayon:sabayon" | chpasswd + + # also add "sabayon" to disk group + usermod -a -G disk sabayon + ) || return 1 +} diff --git a/scripts/mkloopcard_generic_hook.sh b/scripts/mkloopcard_generic_hook.sh new file mode 100755 index 0000000..d3f5e51 --- /dev/null +++ b/scripts/mkloopcard_generic_hook.sh @@ -0,0 +1,17 @@ +#!/bin/bash + +/usr/sbin/env-update +. /etc/profile + +. /mkloopcard_chroot.include || exit 1 + +setup_displaymanager +setup_desktop_environment +setup_users +setup_boot +#setup_bootfs_fstab "vfat" +#wget http://builder.mdrjr.net/tools/kernel-update.sh -O /usr/local/sbin/kernel-update.sh +#chmod +x /usr/local/sbin/kernel-update.sh +#/usr/local/sbin/kernel-update.sh + +exit 0 diff --git a/scripts/mkloopcard_raspberry_chroot_hook.sh b/scripts/mkloopcard_raspberry_chroot_hook.sh new file mode 100755 index 0000000..ebd68ed --- /dev/null +++ b/scripts/mkloopcard_raspberry_chroot_hook.sh @@ -0,0 +1,21 @@ +#!/bin/bash + +/usr/sbin/env-update +. /etc/profile + +. /mkloopcard_chroot.include || exit 1 + +#setup_boot +#setup_users +#setup_bootfs_fstab "vfat" +# For kodi-raspberrypi +#echo 'SUBSYSTEM=="vchiq",GROUP="video",MODE="0660"' > rpi2/etc/udev/rules.d/10-vchiq-permissions.rules +#usermod -a -G video sabayon + +#/usr/sbin/rpi-update +#timedatectl set-ntp true + +echo -5 | equo conf update +equo cleanup + +exit 0 diff --git a/scripts/mmc_remaster_post.sh b/scripts/mmc_remaster_post.sh new file mode 100755 index 0000000..36e0090 --- /dev/null +++ b/scripts/mmc_remaster_post.sh @@ -0,0 +1,18 @@ +#!/bin/sh + +# Path to molecules.git dir +SABAYON_MOLECULE_HOME="${SABAYON_MOLECULE_HOME:-/sabayon}" +export SABAYON_MOLECULE_HOME + +PKGS_DIR="${SABAYON_MOLECULE_HOME}/pkgcache" +CHROOT_PKGS_DIR="${CHROOT_DIR}/var/lib/entropy/client/packages" + +# remove entropy hwash +rm -f "${CHROOT_DIR}"/etc/entropy/.hw.hash +# remove entropy pid file +rm -f "${CHROOT_DIR}"/var/run/entropy/entropy.lock + +echo "Umounting bind to ${CHROOT_PKGS_DIR}" +umount "${CHROOT_PKGS_DIR}" || exit 1 + +exit 0 diff --git a/scripts/odroid_c2_image_generator_script.sh b/scripts/odroid_c2_image_generator_script.sh new file mode 100755 index 0000000..2d0f913 --- /dev/null +++ b/scripts/odroid_c2_image_generator_script.sh @@ -0,0 +1,11 @@ +#!/bin/sh + +# Path to molecules.git dir +SABAYON_MOLECULE_HOME="${SABAYON_MOLECULE_HOME:-/sabayon}" +export SABAYON_MOLECULE_HOME + +# rootfs and bootfs tarball is generated by image +export FIRST_PARTITION_START_CYL=1 # ~8Mb +export SD_FUSE="${SABAYON_MOLECULE_HOME}/boot/arm/udooneo/sd_fuse/sd_fusing.sh" +export BOOT_PART_TYPE_INSIDE_ROOT="1" +exec "${SABAYON_MOLECULE_HOME}"/scripts/mkloopcard.sh "${SABAYON_MOLECULE_HOME}"/scripts/mkloopcard_odroid_generic_hook.sh "${@}" diff --git a/scripts/odroid_u2_x2_image_generator_script.sh b/scripts/odroid_u2_x2_image_generator_script.sh new file mode 100755 index 0000000..3585172 --- /dev/null +++ b/scripts/odroid_u2_x2_image_generator_script.sh @@ -0,0 +1,11 @@ +#!/bin/sh + +# Path to molecules.git dir +SABAYON_MOLECULE_HOME="${SABAYON_MOLECULE_HOME:-/sabayon}" +export SABAYON_MOLECULE_HOME + +# rootfs and bootfs tarball is generated by beaglebone image +export FIRST_PARTITION_START_CYL=1 # ~8Mb +export SD_FUSE="${SABAYON_MOLECULE_HOME}/boot/arm/odroid-u2-x2/sd_fuse/sd_fusing.sh" +export BOOT_PART_TYPE_INSIDE_ROOT="1" +exec "${SABAYON_MOLECULE_HOME}"/scripts/mkloopcard.sh "${SABAYON_MOLECULE_HOME}"/scripts/mkloopcard_generic_hook.sh "${@}" diff --git a/scripts/outer_source_chroot_script_arm.sh b/scripts/outer_source_chroot_script_arm.sh new file mode 100755 index 0000000..ab76dd8 --- /dev/null +++ b/scripts/outer_source_chroot_script_arm.sh @@ -0,0 +1,21 @@ +#!/bin/bash + +/usr/sbin/env-update +. /etc/profile + +# Execute this here due to technical problems with qemu-user + +# Update /usr/portage/profiles +# This is actually not strictly needed but several +# gentoo tools expect to find valid /etc/make.profile symlink +# This part is best effort, if it will be able to complete +# correctly, fine. +# For a list of mirrors, see: http://www.gentoo.org/main/en/mirrors-rsync.xml +RSYNC_URI="rsync://rsync.at.gentoo.org/gentoo-portage/profiles" +PROFILES_DIR="${CHROOT_DIR}/usr/portage/profiles" +for x in $(seq 5); do + rsync -av -H -A -X --delete-during "${RSYNC_URI}/" "${PROFILES_DIR}/" && break + sleep 1m || exit 1 +done + +exit 0 diff --git a/scripts/post_mmc_image_script.sh b/scripts/post_mmc_image_script.sh new file mode 100755 index 0000000..bb5e1d2 --- /dev/null +++ b/scripts/post_mmc_image_script.sh @@ -0,0 +1,36 @@ +#!/bin/bash +# Compress the freaking MMC image using xz +# +# Available env vars: +# IMAGE_PATH = path to generated image +# IMAGE_CHECKSUM_PATH = path to generated md5 for image +# + +/usr/sbin/env-update +. /etc/profile + +COMPRESSED_IMAGE_PATH="${IMAGE_PATH}.xz" +COMPRESSED_IMAGE_CHECKSUM_PATH="${COMPRESSED_IMAGE_PATH}.md5" + +echo +echo "Spawning xz --compress --force -3 for:" +echo "IMAGE_PATH = ${IMAGE_PATH}" +echo "COMPRESSED_IMAGE_PATH = ${COMPRESSED_IMAGE_PATH}" +echo "COMPRESSED_IMAGE_CHECKSUM_PATH = ${COMPRESSED_IMAGE_CHECKSUM_PATH}" +echo + +xz --compress --force -3 "${IMAGE_PATH}" || exit 1 +[[ ! -f "${COMPRESSED_IMAGE_PATH}" ]] && { echo "${COMPRESSED_IMAGE_PATH} not found"; exit 1; } + +chmod 644 "${COMPRESSED_IMAGE_PATH}" || exit 1 + +cd "$(dirname "${COMPRESSED_IMAGE_PATH}")" || exit 1 +img_name=$(basename "${COMPRESSED_IMAGE_PATH}") +# make sure to not leave zombies +rm -f "${img_name}.md5" +md5sum "${img_name}" > "${COMPRESSED_IMAGE_CHECKSUM_PATH}" || exit 1 + +echo "All done" + +exit ${?} + diff --git a/scripts/pre_mmc.sh b/scripts/pre_mmc.sh new file mode 100644 index 0000000..cd6ae30 --- /dev/null +++ b/scripts/pre_mmc.sh @@ -0,0 +1,5 @@ +#!/bin/sh + +rm -rfv "${DESTINATION_IMAGE_DIR}"/usr/bin/qemu-arm-binfmt || die + +exit 0 diff --git a/scripts/raspberry_image_generator_script.sh b/scripts/raspberry_image_generator_script.sh new file mode 100755 index 0000000..78bb05e --- /dev/null +++ b/scripts/raspberry_image_generator_script.sh @@ -0,0 +1,10 @@ +#!/bin/sh + +# Path to molecules.git dir +SABAYON_MOLECULE_HOME="${SABAYON_MOLECULE_HOME:-/sabayon}" +export SABAYON_MOLECULE_HOME + +# sigh vfat +export BOOT_PART_TYPE_INSIDE_ROOT="1" + +exec "${SABAYON_MOLECULE_HOME}"/scripts/mkloopcard.sh "${SABAYON_MOLECULE_HOME}"/scripts/mkloopcard_raspberry_chroot_hook.sh "${@}" diff --git a/scripts/remaster_error_script.sh b/scripts/remaster_error_script.sh new file mode 100755 index 0000000..321aa33 --- /dev/null +++ b/scripts/remaster_error_script.sh @@ -0,0 +1,11 @@ +#!/bin/sh +if [ -d "${CHROOT_DIR}/proc" ]; then + echo "Unmounting ${CHROOT_DIR}/proc" + umount "${CHROOT_DIR}/proc" +fi + +CHROOT_PKGS_DIR="${CHROOT_DIR}/var/lib/entropy/client/packages" +if [ -d "${CHROOT_PKGS_DIR}" ]; then + echo "Umounting bind to ${CHROOT_PKGS_DIR}" + umount "${CHROOT_PKGS_DIR}" || exit 1 +fi diff --git a/scripts/remaster_post.sh b/scripts/remaster_post.sh new file mode 100755 index 0000000..9df0915 --- /dev/null +++ b/scripts/remaster_post.sh @@ -0,0 +1,21 @@ +#!/bin/sh + +# Path to molecules.git dir +SABAYON_MOLECULE_HOME="${SABAYON_MOLECULE_HOME:-/sabayon}" +export SABAYON_MOLECULE_HOME + +PKGS_DIR="${SABAYON_MOLECULE_HOME}/pkgcache" +CHROOT_PKGS_DIR="${CHROOT_DIR}/var/lib/entropy/client/packages" + +# load common stuff +. "${SABAYON_MOLECULE_HOME}"/scripts/remaster_post_common.sh + +# make sure to not leak /proc +umount "${CHROOT_DIR}/proc" &> /dev/null +umount "${CHROOT_DIR}/proc" &> /dev/null +umount "${CHROOT_DIR}/proc" &> /dev/null + +echo "Umounting bind to ${CHROOT_PKGS_DIR}" +umount "${CHROOT_PKGS_DIR}" || exit 1 + +exit 0 diff --git a/scripts/remaster_post_common.sh b/scripts/remaster_post_common.sh new file mode 100755 index 0000000..86f618e --- /dev/null +++ b/scripts/remaster_post_common.sh @@ -0,0 +1,31 @@ +# switch to sabayon-weekly repository if the ISO is not a DAILY one +# BUILDING_DAILY is set in scripts/daily_iso_build.sh +if [ -z "${BUILDING_DAILY}" ]; then + # only the first occurence + repo_conf="${CHROOT_DIR}/etc/entropy/repositories.conf" + sed -i "/^officialrepositoryid/ s/sabayonlinux.org/sabayon-weekly/" "${repo_conf}" || exit 1 + sed -i "/^official-repository-id/ s/sabayonlinux.org/sabayon-weekly/" "${repo_conf}" || exit 1 + + # new style repository config files (inside + # repositories.conf.d/ directory) + repo_conf_d="${CHROOT_DIR}/etc/entropy/repositories.conf.d" + src_conf="${repo_conf_d}/entropy_sabayonlinux.org" + dst_conf="${repo_conf_d}/entropy_sabayon-weekly" + if [ -f "${src_conf}" ]; then + mv "${src_conf}" "${dst_conf}" || exit 1 + sed -i "/^\[sabayonlinux.org\]$/ s/sabayonlinux.org/sabayon-weekly/" \ + "${dst_conf}" || exit 1 + fi +fi + +# remove entropy hwash +rm -f "${CHROOT_DIR}"/etc/entropy/.hw.hash +# remove entropy pid file +rm -f "${CHROOT_DIR}"/run/entropy/entropy.lock + +# remove /run/* and /var/lock/* +# systemd mounts them using tmpfs +rm -rf "${CHROOT_DIR}"/run/* +rm -rf "${CHROOT_DIR}"/var/lock/* + +# do not exit!! this file is sourced! diff --git a/scripts/remaster_pre.sh b/scripts/remaster_pre.sh new file mode 100755 index 0000000..d11458c --- /dev/null +++ b/scripts/remaster_pre.sh @@ -0,0 +1,24 @@ +#!/bin/sh + +# Path to molecules.git dir +SABAYON_MOLECULE_HOME="${SABAYON_MOLECULE_HOME:-/sabayon}" +export SABAYON_MOLECULE_HOME + +PKGS_DIR="${SABAYON_MOLECULE_HOME}/pkgcache" +CHROOT_PKGS_DIR="${CHROOT_DIR}/var/lib/entropy/client/packages" + +[[ ! -d "${PKGS_DIR}" ]] && mkdir -p "${PKGS_DIR}" +[[ ! -d "${CHROOT_PKGS_DIR}" ]] && mkdir -p "${CHROOT_PKGS_DIR}" + +# make sure it's all clean before mounting +echo "Mounting bind to ${CHROOT_PKGS_DIR}" +mkdir -p "${CHROOT_PKGS_DIR}" || exit 1 +mount --bind "${PKGS_DIR}" "${CHROOT_PKGS_DIR}" || exit 1 + +content=$(ls -1 "${CHROOT_DIR}/proc" | wc -l) +if [ "${content}" -le 3 ]; then + echo "Mounting /proc ..." + mount -t proc proc "${CHROOT_DIR}/proc" +fi + +exit 0 diff --git a/scripts/udoo_neo_image_generator_script.sh b/scripts/udoo_neo_image_generator_script.sh new file mode 100755 index 0000000..89b7ae9 --- /dev/null +++ b/scripts/udoo_neo_image_generator_script.sh @@ -0,0 +1,11 @@ +#!/bin/sh + +# Path to molecules.git dir +SABAYON_MOLECULE_HOME="${SABAYON_MOLECULE_HOME:-/sabayon}" +export SABAYON_MOLECULE_HOME + +# rootfs and bootfs tarball is generated by image +export FIRST_PARTITION_START_CYL=1 # ~8Mb +export SD_FUSE="${SABAYON_MOLECULE_HOME}/boot/arm/odroid-c2/sd_fuse/sd_fusing.sh" +export BOOT_PART_TYPE_INSIDE_ROOT="1" +exec "${SABAYON_MOLECULE_HOME}"/scripts/mkloopcard.sh "${SABAYON_MOLECULE_HOME}"/scripts/mkloopcard_generic_hook.sh "${@}"