From 73d09977fc9e333fc693eae4ca77e89de9b95fdd Mon Sep 17 00:00:00 2001 From: abalfoort Date: Thu, 21 Apr 2022 16:39:07 +0200 Subject: [PATCH 01/10] Support unencrypted boot partition --- src/modules/fstab/main.py | 28 ++++++++++++++++--- .../luksbootkeyfile/LuksBootKeyFileJob.cpp | 27 ++++++++++++++++-- 2 files changed, 48 insertions(+), 7 deletions(-) mode change 100644 => 100755 src/modules/fstab/main.py mode change 100644 => 100755 src/modules/luksbootkeyfile/LuksBootKeyFileJob.cpp diff --git a/src/modules/fstab/main.py b/src/modules/fstab/main.py old mode 100644 new mode 100755 index 9bc427b13..e65e36445 --- a/src/modules/fstab/main.py +++ b/src/modules/fstab/main.py @@ -142,13 +142,21 @@ class FstabGenerator(object): with open(crypttab_path, "w") as crypttab_file: print(CRYPTTAB_HEADER, file=crypttab_file) + # Check if /boot is unencrypted + unencrypted_separate_boot = False for partition in self.partitions: - dct = self.generate_crypttab_line_info(partition) + if (partition["mountPoint"] == "/boot" + and "luksMapperName" not in partition): + unencrypted_separate_boot = True + break + + for partition in self.partitions: + dct = self.generate_crypttab_line_info(partition, unencrypted_separate_boot) if dct: self.print_crypttab_line(dct, file=crypttab_file) - def generate_crypttab_line_info(self, partition): + def generate_crypttab_line_info(self, partition, unencrypted_separate_boot): """ Generates information for each crypttab entry. """ if "luksMapperName" not in partition or "luksUuid" not in partition: return None @@ -158,11 +166,19 @@ class FstabGenerator(object): if not mapper_name or not luks_uuid: return None + # Set crypttab password for partition to none and remove crypttab options + # on root partition when /boot is unencrypted + password = "/crypto_keyfile.bin" + crypttab_options = self.crypttab_options + if partition["mountPoint"] == "/" and unencrypted_separate_boot: + password = 'none' + crypttab_options = '' + return dict( name=mapper_name, device="UUID=" + luks_uuid, - password="/crypto_keyfile.bin", - options=self.crypttab_options, + password=password, + options=crypttab_options, ) def print_crypttab_line(self, dct, file=None): @@ -264,6 +280,10 @@ class FstabGenerator(object): options = "subvol={},".format(partition["subvol"]) + options if has_luks: + # Check if user mounted a previously encrypted partition + if not partition["luksMapperName"]: + return None + device = "/dev/mapper/" + partition["luksMapperName"] elif partition["uuid"]: device = "UUID=" + partition["uuid"] diff --git a/src/modules/luksbootkeyfile/LuksBootKeyFileJob.cpp b/src/modules/luksbootkeyfile/LuksBootKeyFileJob.cpp old mode 100644 new mode 100755 index 137cb750d..38658a7a9 --- a/src/modules/luksbootkeyfile/LuksBootKeyFileJob.cpp +++ b/src/modules/luksbootkeyfile/LuksBootKeyFileJob.cpp @@ -172,6 +172,22 @@ hasUnencryptedSeparateBoot() return false; } +static bool +hasEncryptedRoot() +{ + const QVariantList partitions = ::partitions(); + for ( const QVariant& partition : partitions ) + { + QVariantMap partitionMap = partition.toMap(); + QString mountPoint = partitionMap.value( QStringLiteral( "mountPoint" ) ).toString(); + if ( QDir::cleanPath( mountPoint ) == QStringLiteral( "/" ) ) + { + return partitionMap.contains( QStringLiteral( "luksMapperName" ) ); + } + } + return false; +} + Calamares::JobResult LuksBootKeyFileJob::exec() { @@ -218,9 +234,10 @@ LuksBootKeyFileJob::exec() } // /boot partition is not encrypted, keyfile must not be used - if ( hasUnencryptedSeparateBoot() ) + // But only if root partition is not encrypted + if ( hasUnencryptedSeparateBoot() && !hasEncryptedRoot() ) { - cDebug() << Logger::SubEntry << "/boot partition is not encrypted, skipping keyfile creation."; + cDebug() << Logger::SubEntry << "/boot partition is not encrypted, skipping keyfile creation."; return Calamares::JobResult::ok(); } @@ -241,7 +258,11 @@ LuksBootKeyFileJob::exec() for ( const auto& d : s.devices ) { - if ( !setupLuks( d ) ) + // Skip setupLuks for root partition if system has an unencrypted /boot + if ( d.isRoot && hasUnencryptedSeparateBoot() ) + continue; + + if ( !setupLuks( d ) ) return Calamares::JobResult::error( tr( "Encrypted rootfs setup error" ), tr( "Could not configure LUKS key file on partition %1." ).arg( d.device ) ); From 807dee54fd6a1071ce38d652d3d9dd8234d77f5b Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Thu, 21 Apr 2022 17:11:59 +0200 Subject: [PATCH 02/10] [locale]: fix display of timezone for Dhaka FIXES #1929 --- src/modules/locale/images/timezone_5.5.png | Bin 5495 -> 5413 bytes src/modules/locale/images/timezone_8.0.png | Bin 18180 -> 17644 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/src/modules/locale/images/timezone_5.5.png b/src/modules/locale/images/timezone_5.5.png index 78c972fab91ffa402d3bd78aa57566e670daa450..172ad8127ba74bf08c5c5f7f92b42edf779da249 100644 GIT binary patch delta 4459 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 delta 4530 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 aMe+{jI-4s-hV23uaO0|lN!bsUmF|% diff --git a/src/modules/locale/images/timezone_8.0.png b/src/modules/locale/images/timezone_8.0.png index ee5095a26d4c9830ecaf13f8c34fa2e36cb73f7e..6db98f18f2b57c38b81bfe637c9dffee143b8524 100644 GIT binary patch literal 17644 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

Zqm6z58$mDxEK{_W@ zGu_zElK16Qr(Dfzk2t*?7r(DVwwUkMIqBn#DZY$t@dS$}IsYsmxs2(|c-PqNwP}MV zF`)9ev*_uvj8<$WZ`e=kENh=B!;<+Q=4BoM8C(y1mDlEv{+{7B>Qt@%xdB#|pFR%u zc={`t@nrtD8~NR` zSy(q%xPIg=#78Sb*kX2p1;CC>h`bWIkH{SuBzU>~@>Yf?`G=++dM-@9*o#H|5t3L- zME4+GgLmH#{?*Q48ZWi$GTMNdIYP~ybmeK5hH;`tVhYk5$s>d@EY33Kn;2N9S%kC7 z{a&p=5&^6OqhM0#5oc=IbMD=%em)8Afg4Qn+{ z!1-zTFz{Pxh1H;x#}0Zk6!gxvD|?1&8kMyfp4B$Z19l(zRg>`fppEC|)t|nt3*B@b z{hXU-CC*ssZ}O9;R^qDpcY3+7 ztogLA4f?yjM}03one{EN)7mfMWyC)EyuOBn2OC&R-h2?!-;Hb=`-y6jx-`}Bg19u< zR}brLZb3s8z{X^530F#jd7iKZ4z|gIN`x3E(#Y%^y*<26XSY$vr#B~>-&E4d0c=u2 zwZi;HT(!_dGwg5t1nc9Ne1>ps?UFWTPo?RurqZU!2bur9{H9QqFt##ePj|B}XpRF% z@>*eTcwY^FT+_wPc&{r$f{?{OAeJT(-R!Dx;oGF;&(fbs3O<>4JHkTePrW}(JvPs8 zW4x8Gf;{3xigZ^z6#2}i@K4B2wo$pl<7ofY=jyEM+l;xcZFkAc5WTj=y3}Yc+4uft zT-ZY?sSogv;w5m)gm+nNab^z|1)cph9b+8JZagD-;vjL;A~|AKIKzvzj-@3!KQv~J zcS%^tT+DNlQuaGmf+%GqoOpR6V>d@2_a@^o27!OA+OKfA;>TyH{)Cu7omRV{Cty)m zqXo$S!;l%Drp)&p{Kt*O;_%-O==puudb2ppp_XuuiFX zZR_S|VWtprZhN6@0iO^;Q2zly_G=N>_;d3UX+wy%O18M=(`T#npQ(E2-lMCqLEZLND8QPnHrIF|_^+D13{tB?rR zcSd3=fyD>Q++z(tqxFOjs>^i{#Q=JsdFs<7#v2BnH|Bi2-ShPex%52#d!CGz!Ks-g zkHO;r5$fqMLyV4}HhjYRZF+P7(4$VgjTSCP}MBB*QIXVi!%PQH8DTT_;h{KV@l}P`VwFQWwn#uSD z0dr1-1q0!?^&N}+xo;=-pyI#$e#>B%S|XWmVU>xZi%SSxhCoJ@J< zxhfb9VN&%Z((&Qr+Jsy|>P6nc#g->$26_U*`3(DUlQcdo-OfD~B$pW+^e2(o70G6l zy^~ZIL0A8%i{dNM8z(rNKhJG$d_JGYnc?ir7cp?O+u7zVBth?Y>EKS)aY!DY8#Tar za_GC}G7CZvu$7aI!n5VKshaN8dqO}_(|y42^zX&${qp(gBSOjuq^Y0NO1#Ix%qu11 zD;S3dZ(_aZAi;XnTj1Oqn?|LJ|MmK86R4E9<*#D~FLEEyjA%pgG-2;Rnc_?gnvvsd zJ0{EF{w}#$E|s90IID?cKU4G(cE8k;S<>gz74vyzw_!C;-!-fs-4!)8odNDH&D$eS z|63^Yv9nFVW~}++ zwqct;)ngjnex52r1HKOxUb0g!N)X+-Q|IOaS9OPJ>`U7p+#TZw=qrX_DD#3;p=h%r z{j}H3O;D9~z&>BglM>#uAx}p9iQe*&Cl>s$!a2*+RpRxHCXDp-)9&KFni*5Cj+y1x zG4>W%YV{^`DcYWxB&2ap{+(W!O#k|E<=810O`PI7B&b)`8n<~;Y zS0ZO4l3ZVI;l46CX-ik zB@a~#``zwG)(LFa-d>8Z(<&-b;uUjAxj5@h>Wa*evgDSVtUPHxN+ID)xmw<>Py=|V zl6@YwyULijwCEaPelbVo^E;IiA|Mu6Z7SaBe2kVVJ-s_R8C&DIro+yPsxscEpt8!W zG{~aPG8V(ix%)$i!`fgCZ7`+6wX&Oz^E6A2`F^prKSr}m)I2tn-P!hC8=5dE_CdD z9}!hNPz9-CKBu^j^XD#tjiK5kk~#XWuM}`jNZiPk(Kj%Ea~bpCH@de(8;^Vz10+jk zo;RrJvsG9MI=EzZ=Ch5X$Egh3%b0WOT%~EP-NbCf(({))OLlT5FKH@m{qy3m{*yTX zu@ezL#vCd9A513k;`GUI%oRel$oeV?NsF4c{Bd7T3ocYA;zCY1meq7&{}=OlHzw8t~R3YT6W*bSl%O zBC!EdcwV1;MAF<=Vr%K?Ofz$J1@oLr{#|@76~Ng{{^clX`A(d5a5~2Q{mT3ZA+gKP zF#@dT<0dxt{gbh~T2<7x9S+NK;urZ-r&%obda=>()7(o+yi~}-_CuwjY1I+O2U`i?p(px_1(b6?e_Gr_$6)=1P*8Y+?4;D-Ty;*U-<`#<%`=bIB;?muz z*+#pM!Bxhjb+8&Pw(O@8u!qlID~+iD`p-M@vx42sj*a4iwUy)L93_Ho;-7T3dqQh~ zfLV<}E=L$FK<^dTAbdI@m+P)b*S>RKmg_0ZR=$qV zEms53pSrYC{w)ZNb@QGoV5HR2BWo-Ne$1kFzSfO3?N8%icYy>pA*H6B>2-aH0TFgc ze;Tn$U6(^j^Q5t6*TD?FM0+>*s?cVT0Fwa1_YJl)2i9dx zZNP)Z=Qby@j%3~w9C)zO)9dHW^uuyr2+%S9Jyi5x)SV*gxinmT^19BEHRhMLD^U;6 zt>}fv%`oJ{H#rvJYE0IcliSuJww9NBKQjR2kloY#6!E*~VoWZswPOz#dq?vuzdkoI zgn33A>XJE=%*Rz3C>N$&R$No1;;Blh@zw(4R;@*I_Qu~i(DQ~S?`%V3P-(s(2Kg8LtOKu^YYRkgQDjCQKnqhGI9Bf0z_| zCCL~E%|X^{fX@5Su|bflo%CUrrkGC!rnM0343>&9545rCrkBB`*sI?l)S}YO0!mpR zCUu$VA`V3m6*2U@e|p_Wv$J*Ph!@njrB|2V)(p#U994d^UM`p`M;{cL#@qXITb8I& zvx1}2@{zO}kqKoeP)QYYu3_M~0cU4qo)IYJUYVqUlx!e#J5^EC_^lFQ=?y~APmcOo z1%(QG`c|B9$k$&46`%KL3Nh8=>%=QqZWGQS2__}AsiApF*5&BY`CLjY@MW`U3o`D>DJZ^DQ{9MmP<6Og?i;1Cy=JlG|)^4h?GF zb`-yxDCP_pS{ZyapO??LQok_$Ga#J4z)kC#dMBspFoGJtC5`mm0rX_DZ9kimlI;B0@upo@Df%>l zh3jNP)cLCpl#I#X$aIinCuJ(C!4_dFJ=1t|RA8`JR?4y&opBP}*|s%RLBw~{iF2Cu zFEEdn29a!nL;NW@BP>h7hv427cAz9BdkJ%!FY^n$TnTq)H*}8iD`}3IdwMOblFb^* zqMiQ}pPK3;Q;*h80@Q(>?XeKz?;8QcUj)B2H(!q1QjEXbQRXAD+JS*@+En$g+>HPw zBO7B4o;`e#VH+6hYxJkck_S%Ox)#gqB3FM*Kd7d4nx&emwB;3&>f(y%YLX(`McS4H z%w5lMk(;4CbBUdQMwz4m;JPYR-8b6I>3aJn`rm||bT^}lLfIbcwo9LpQ7CiSJG2x^ zhXQtOC0A;=7i;_lchD_7PZ$pWhqZLEVqKEDtI>U>*EmI=!?AIHGULZg$KynbCAD^I<~>F4V-x)+H!m$DclliVo6fMX$M9Lu z&@T45*2_Od+b$xmid|!|xRRsJh${VWFBL@=L-?4TvqvS;54z_g&UD}}8bBq1NL=Ck z#-`pohi!E1Ew5WgY zcMy^#T3m;OCFOho*?mC)ZeG!KGUO zJsrdj---t;G3XXH*1BeyeNbp8KkJ({?>Xe<(g=%W?X@JxFB;RaKNNi#F~O{DvD2c) zxcp(1Y9%tb$oZ;K9ep@65@KAhoKUrY{;&HGS0;ULAOkW?J`@(Yb}j@&CAyl(g2wX) zyA(F8RmuMf(q*frsM!Zt4CSoE56AZ_&sCne(}@pCk*=k!xe>6A$TJ*)My;OA7){}O z^JNMl8h>hz?!}h}Q<+d=j)I04AEY(hea^3OeevBRF z4tCl9I2j4UK}r4&_M?Co{}JI{lV1 zPwa`wYuhHKz7Vm=Lxzi_YUg;QA?z=?%b`aGa0vS6Odt6m<%?|NT|BqyDisgNQpR~V zgh)twodZwiw%$a3TN-JJfhF93IEB?*X1Qk0Lxzh~VvcNc1QiEv+clqS?XDdZP1Hp{cMi1F8|bo2Zq}lD?47l&n`U|9qaX;*EQ~ zX_>j+c28gbfh9A4Hf#U%dryru+SXHl?&a|F@U|2BlQ~ysUL~#|=VejC;9m{ISNbi( zHlzdqzZ=ZjMhd0 za&MB(mXRv5vRK3svB9^Z!s)EpcI*eIV|Tv_B{7Zl6=9@mmArKmUrdUa_9ZZM9uq)! z3>pB?N*)#~^RDIS*HpDTfLoOMD}31(sZ^e0@L6x7=W2OishP~O0OmioeXy@{@YF_n zBuu!+>(mdmdID6{m1hW^TbWDjy9XB3v|_-akaa4oOS8G*Vs8x>`CHlJ!?rAv-YC$_ z1}uNJ3tIoKGap2VHT#mDLA$Be|ay4YV%Eoev8K02(T<)|o zP%`$GYDpDFThFRGSWv=I>Gh0o<%q~oEz2faf?#Dh;BQ<6WNAFZW^j_~B&bJeOTLUW z`?i_iTWqfV(X18cr5Wy7kIUi~l37ndwy)Xr4#^q9s_ClE@y_6R$Tr4pwBGRHbNA)= zY;Jzdq!R^cOx5hY5ck|VX=H9^$QuATS!AXtt}QQ)H%bd5$_$PU)w*9}ANrbU>HPD` z=aew_ytvUuMi9UEws`s=(;NmTef1p_)649PSQ8&v2BzPp&so_b-mx9~2gbB^7jDjQ zIN$}`R^-sE$PU87s-K1Q#FY5l9`Ib!-o_r(i4Pfq1+N43ZC}~S|@rqSVY;R)h62zW2&Uncu`Az zJINw>AavoRDVU(@;w8U+PO_0&=VHO}4fzy8v)t!=z} zSPXJ1jBGCr+rUl1!_FlD0*_|-VMvdGv&+O*!1UTHdYIqVyoCH!!_9SwQsT5TaGtK4 zRYvQX$H?y)bjM62YYimC{&YLfAD`6;V?yR``-;-+p~8ZnxOy$6mUce^N8@&DMg9D$ zHTF{6nyzN&A!t}iAtGtJPPc69)Y|6ADgTx9l#(9ikly-TYd6`UccC`uW^1wJC;M`? z?T<1Z$_YIiS-*OLlde(YtKFfOtR8b@N5H|n_ZRCho<7NMPEl_JOz~N;6JK-$An{U! zFJ1N|b`r78X^A`-I{hYJCMl{|uzPOuD*#wn?#ME`LHaxi>3X02yCy=fKJm~ov*jy< zNZX7|lkjsnbk94=S-$K3RiRp{w59Mb+WeonlYW*Z=q!DOYE1sAFWM6bI-c9td_xp9 zN`Tl#0A(^cy#PG!Rp@>*MtQ54wC%(r(JWgLZ0T$TazkN$yv<#iB!tfbut3g9*_9?>kQCR2!CE|ri{h|W2-)X;vlJRpGa6`^SX&(05ClPSS#?^i_05IDpl ze5>+ncum$sHh|)>uvq~S$F}75yS;FJlCqX^4hwsPsfp_tdAe`AN!nDh1CU|OayKp- zNUwZpTVZZ?yjdQ&A74PF2elffP>eNWCZW!p2+Yud0Yc8p&CDKOmFcX{yhdwqte00+PBn9&f zy`Z12efl0Lu+rso?77JBn%c2>UI@6(`u+7#u^#|n-4HFm`C%(=t}2sVsdTU~uacKw zP>kH{$~i@i!cT{Lbd3z>tS60)-bE`4s3w6hZ_&Vy#D@&~>oj~arF&MQ(11T&wgRj!SpfKYu2!j}-h9?7J7gH+}f;b^^R|f}J`YTyioU`5>0N z9C;?{gMNfxOTZCDXy?hUM(sNRsAUMPOt16L6r#^Y$W9u!n})z38Q!m_1A0nqfT~*b zrk&%HT(;_s+v4gx6=Jkgx2yie=IJB)4eIg+2e~g_MFGIYjjz_)Zg~O$iStxY)@?}@ z^UBUveA_NEUe(AxH*nBt(sZtt_vd1JFJyiRdwF->@Epj)Db0I&c}Dl(mIwyR|2CF1ZcG!C#^C~orlpPj1We40mX3QX(WPsf>lZCfXf z#G6_rRX0z5fiZYFH>dw5XqlYTJ- z4b7x|=_eHTU^&DRAK2s9i--vuo)dQj-%q(2F|npI<ywQ<#@8TDJ&vega0|D{2?2e{Hue~2I zpPYNZZkxvIJT(%(Rv?)xZ!suLdJtbauyEE>>nofiK$8|PZ`lA&jkwE-e3-|=CX#cr zxizebEche+8a*IEMI*T^`R|P~jPQ`EnxV#5IG>Nka~%JvZd9T5J$^q&LQJm6=M+xg ziG#alTCX-&nLp%O;i$NU&)-wyJKwn0{QXYK#|2ILwtRmG^413qnG^I3Cc%P=0OW2n zwn_Hl#XWfdhT=vUZ4y5RP?5Yt(aGLkmL1wLxl*n~6U0JU%gy4YJ@)JOfTQ zP|fZCZhC@zG{lbs$H1P!Cua_lp+Di!Vw96gzgu1?9?ytrKkog+D@+wE`pvsEmc(Jm za|f_BO+54iTZqWslyo&}$L}cKVObyMaj<~{_jJ?A;UrNIcz8_u7w?by009&`YPN4{ z4PT?n+g1|GSoAb>m6AQ*Zmj~9ZmxHx<2&m^pqy=6V@pHBQqg7beD4rYqq{y)+_K)t zhEAm|M3z;)G#6VM2C|N~_e!x4()6;(pqRtus~OXvmKKZvx3_ny6Os-niiYCheR9Cnh5X5_V?3|1D$#UYgR8ho zZL!$I4kSV7Ejk{{)c?9)`u6&Oh%5}%Os$a_?K91w0N{vT&_!pkUvZ zeyxbmU3~`}NZ`(3(Dy&FKFKx#D1FzZAg1p1(s=&|!zSZ>lFNgaF9Ye^s*CT3an-m>5*++CAO@Y0+FAiweoq znChQWWs0UU;=!gykld3#|->qd#B9K$;a`YkCTg$ zjh&B;&7H`k^8fXMwXLzasq6gP(UCMi@A-ZqmhA~35%_RS@Ny`DbNT-Qe5t1q3HiwLK6Uv2217u From dcbb83ebe5a971f42c074dbba1775f06158278c0 Mon Sep 17 00:00:00 2001 From: abalfoort Date: Thu, 21 Apr 2022 17:13:50 +0200 Subject: [PATCH 03/10] Replace tabs with 4 spaces --- src/modules/luksbootkeyfile/LuksBootKeyFileJob.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/modules/luksbootkeyfile/LuksBootKeyFileJob.cpp b/src/modules/luksbootkeyfile/LuksBootKeyFileJob.cpp index 38658a7a9..d4a718acf 100755 --- a/src/modules/luksbootkeyfile/LuksBootKeyFileJob.cpp +++ b/src/modules/luksbootkeyfile/LuksBootKeyFileJob.cpp @@ -237,7 +237,7 @@ LuksBootKeyFileJob::exec() // But only if root partition is not encrypted if ( hasUnencryptedSeparateBoot() && !hasEncryptedRoot() ) { - cDebug() << Logger::SubEntry << "/boot partition is not encrypted, skipping keyfile creation."; + cDebug() << Logger::SubEntry << "/boot partition is not encrypted, skipping keyfile creation."; return Calamares::JobResult::ok(); } @@ -258,11 +258,11 @@ LuksBootKeyFileJob::exec() for ( const auto& d : s.devices ) { - // Skip setupLuks for root partition if system has an unencrypted /boot + // Skip setupLuks for root partition if system has an unencrypted /boot if ( d.isRoot && hasUnencryptedSeparateBoot() ) - continue; + continue; - if ( !setupLuks( d ) ) + if ( !setupLuks( d ) ) return Calamares::JobResult::error( tr( "Encrypted rootfs setup error" ), tr( "Could not configure LUKS key file on partition %1." ).arg( d.device ) ); From ab8d59bd410866780dbc4f2a43b6dc824d368a02 Mon Sep 17 00:00:00 2001 From: Calamares CI Date: Fri, 22 Apr 2022 11:03:15 +0200 Subject: [PATCH 04/10] i18n: [calamares] Automatic merge of Transifex translations --- lang/calamares_ko.ts | 30 +++++++++++++++--------------- lang/calamares_tr_TR.ts | 8 ++++---- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/lang/calamares_ko.ts b/lang/calamares_ko.ts index 34a32d5ef..bf62fd7d7 100644 --- a/lang/calamares_ko.ts +++ b/lang/calamares_ko.ts @@ -338,12 +338,12 @@ Link copied to clipboard Calamares Initialization Failed - 깔라마레스 초기화 실패 + Calamares 초기화에 실패했습니다 %1 can not be installed. Calamares was unable to load all of the configured modules. This is a problem with the way Calamares is being used by the distribution. - %1 가 설치될 수 없습니다. 깔라마레스가 모든 구성된 모듈을 불러올 수 없었습니다. 이것은 깔라마레스가 배포판에서 사용되는 방식에서 발생한 문제입니다. + %1 가 설치될 수 없습니다. Calamares가 모든 구성된 모듈을 불러올 수 없었습니다. 이것은 Calamares가 배포판에서 사용되는 방식에서 발생한 문제입니다. @@ -1127,7 +1127,7 @@ The installer will quit and all changes will be lost. The installer failed to create partition on disk '%1'. - 디스크 '%1'에 파티션을 생성하지 못했습니다. + 설치 관리자가 디스크 '%1'에 파티션을 생성하지 못했습니다. @@ -1262,7 +1262,7 @@ The installer will quit and all changes will be lost. The installer failed to deactivate a volume group named %1. - %1로 이름 지정된 볼륨 그룹을 비활성화하지 못했습니다. + 설치 관리자가 %1로 이름 지정된 볼륨 그룹을 비활성화하지 못했습니다. @@ -1672,7 +1672,7 @@ The installer will quit and all changes will be lost. has a screen large enough to show the whole installer - 전체 설치 프로그램을 표시할 수 있을 만큼 큰 화면이 있습니다 + 전체 설치 관리자를 표시할 수 있을 만큼 큰 화면이 있습니다 @@ -2835,17 +2835,17 @@ The installer will quit and all changes will be lost. Unsafe partition actions are enabled. - + 안전하지 않은 파티션 작업이 활성화되었습니다. Partitioning is configured to <b>always</b> fail. - + 파티셔닝이 <b>항상</b> 실패하도록 구성되어 있습니다. No partitions will be changed. - + 파티션 없음은 변경될 것입니다. @@ -2905,7 +2905,7 @@ The installer will quit and all changes will be lost. A GPT partition table is the best option for all systems. This installer supports such a setup for BIOS systems too.<br/><br/>To configure a GPT partition table on BIOS, (if not done so already) go back and set the partition table to GPT, next create a 8 MB unformatted partition with the <strong>%2</strong> flag enabled.<br/><br/>An unformatted 8 MB partition is necessary to start %1 on a BIOS system with GPT. - + GPT 파티션 테이블은 모든 시스템에 가장 적합한 옵션입니다. 이 설치 관리자는 BIOS 시스템에 대한 이러한 설정도 지원합니다.<br/><br/>BIOS에서 GPT 파티션 테이블을 구성하려면(아직 수행하지 않은 경우) 돌아가서 파티션 테이블을 GPT로 설정한 다음 <strong>%2</strong> 플래그가 활성화된 8MB의 포맷되지 않은 파티션을 생성하십시오.<br/><br/>GPT가 있는 BIOS 시스템에서 %1을(를) 시작하려면 포맷되지 않은 8MB 파티션이 필요합니다. @@ -3287,7 +3287,7 @@ Output: Calamares cannot start KPMCore for the file-system resize job. - 깔라마레스는 파일 시스템 크기 조정 작업을 위해 KPMCore를 시작할 수 없습니다. + Calamares는 파일 시스템 크기 조정 작업을 위해 KPMCore를 시작할 수 없습니다. @@ -3791,7 +3791,7 @@ Output: Could not configure machine feedback correctly, Calamares error %1. - 시스템 피드백을 정확하게 설정할 수 없습니다, %1 깔라마레스 오류. + 시스템 피드백을 정확하게 설정할 수 없습니다, Calamares의 %1 오류입니다. @@ -4021,7 +4021,7 @@ Output: <h1>Welcome to the Calamares setup program for %1.</h1> - <h1>%1에 대한 깔라마레스 설정 프로그램에 오신 것을 환영합니다.</h1> + <h1>%1용 Calamares 설정 프로그램에 오신 것을 환영합니다.</h1> @@ -4031,7 +4031,7 @@ Output: <h1>Welcome to the Calamares installer for %1.</h1> - <h1>%1을 위한 깔라마레스 설치 관리자에 오신 것을 환영합니다.</h1> + <h1>%1용 Calamares 설치 관리자에 오신 것을 환영합니다.</h1> @@ -4095,7 +4095,7 @@ Output: No partitions are available for ZFS. - ZFS에 사용할 수 있는 파티션이 없습니다. + 파티션 없음을 ZFS로 사용할 수 있습니다. @@ -4525,7 +4525,7 @@ Output: About - 깔라마레스에 대하여 + Calamares에 대하여 diff --git a/lang/calamares_tr_TR.ts b/lang/calamares_tr_TR.ts index 91c8c718a..b899e02f2 100644 --- a/lang/calamares_tr_TR.ts +++ b/lang/calamares_tr_TR.ts @@ -2850,17 +2850,17 @@ Sistem güç kaynağına bağlı değil. Unsafe partition actions are enabled. - + Güvenli olmayan bölümleme eylemi etkinleştirildi. Partitioning is configured to <b>always</b> fail. - + Bölümleme, <b>her zaman</b> başarısız olacak şekilde yapılandırılmıştır. No partitions will be changed. - + Hiçbir bölüm değiştirilmeyecek. @@ -2920,7 +2920,7 @@ Sistem güç kaynağına bağlı değil. A GPT partition table is the best option for all systems. This installer supports such a setup for BIOS systems too.<br/><br/>To configure a GPT partition table on BIOS, (if not done so already) go back and set the partition table to GPT, next create a 8 MB unformatted partition with the <strong>%2</strong> flag enabled.<br/><br/>An unformatted 8 MB partition is necessary to start %1 on a BIOS system with GPT. - + GPT bölüm tablosu, tüm sistemler için en iyi seçenektir. Bu yükleyici, BIOS sistemleri için de böyle bir kurulumu destekler. <br/><br/>BIOS'ta bir GPT bölüm tablosu yapılandırmak için (önceden yapılmadıysa) geri dönün ve bölüm tablosunu GPT olarak ayarlayın, ardından <strong>%2</strong> bayrağı etkinleştirilmiş.<br/><br/> 8 MB biçimlendirilmemiş bölüm oluşturun .GPT' ile BIOS sisteminde %1 başlatmak için biçimlendirilmemiş 8 MB bir bölüm gereklidir. From c86ff3a5bb8ef58e648faaca2b5795712d4c1f27 Mon Sep 17 00:00:00 2001 From: Calamares CI Date: Fri, 22 Apr 2022 11:03:16 +0200 Subject: [PATCH 05/10] i18n: [python] Automatic merge of Transifex translations --- lang/python/ko/LC_MESSAGES/python.po | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lang/python/ko/LC_MESSAGES/python.po b/lang/python/ko/LC_MESSAGES/python.po index d5bb1fa76..e8e751c9c 100644 --- a/lang/python/ko/LC_MESSAGES/python.po +++ b/lang/python/ko/LC_MESSAGES/python.po @@ -5,7 +5,7 @@ # # Translators: # Ji-Hyeon Gim , 2018 -# Junghee Lee , 2022 +# JungHee Lee , 2022 # #, fuzzy msgid "" @@ -14,7 +14,7 @@ msgstr "" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2022-03-21 17:21+0100\n" "PO-Revision-Date: 2017-08-09 10:34+0000\n" -"Last-Translator: Junghee Lee , 2022\n" +"Last-Translator: JungHee Lee , 2022\n" "Language-Team: Korean (https://www.transifex.com/calamares/teams/20061/ko/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -58,7 +58,7 @@ msgstr "부트로더 설치." #: src/modules/bootloader/main.py:614 msgid "Failed to install grub, no partitions defined in global storage" -msgstr "grub을 설치하지 못했습니다. 전역 저장소에 파티션이 정의되어 있지 않습니다" +msgstr "grub을 설치하지 못했습니다. 파티션 없음이 전역 저장소에 정의되었습니다" #: src/modules/bootloader/main.py:782 msgid "Bootloader installation error" From a86f3ba96da34d8efd78dec601ebb00ab4f6c26c Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Fri, 22 Apr 2022 11:05:18 +0200 Subject: [PATCH 06/10] i18n: update English source phrases --- lang/calamares_en.ts | 52 ++-- lang/python.pot | 603 +++++++++++++++++++++---------------------- 2 files changed, 316 insertions(+), 339 deletions(-) diff --git a/lang/calamares_en.ts b/lang/calamares_en.ts index 25da31891..f3d84c625 100644 --- a/lang/calamares_en.ts +++ b/lang/calamares_en.ts @@ -862,52 +862,52 @@ The installer will quit and all changes will be lost. <h1>Welcome to the %1 installer</h1> - + Your username is too long. Your username is too long. - + '%1' is not allowed as username. '%1' is not allowed as username. - + Your username must start with a lowercase letter or underscore. Your username must start with a lowercase letter or underscore. - + Only lowercase letters, numbers, underscore and hyphen are allowed. Only lowercase letters, numbers, underscore and hyphen are allowed. - + Your hostname is too short. Your hostname is too short. - + Your hostname is too long. Your hostname is too long. - + '%1' is not allowed as hostname. '%1' is not allowed as hostname. - + Only letters, numbers, underscore and hyphen are allowed. Only letters, numbers, underscore and hyphen are allowed. - + Your passwords do not match! Your passwords do not match! - + OK! OK! @@ -2487,7 +2487,7 @@ The installer will quit and all changes will be lost. Unknown error - + Password is empty Password is empty @@ -3421,29 +3421,29 @@ Output: SetHostNameJob - + Set hostname %1 Set hostname %1 - + Set hostname <strong>%1</strong>. Set hostname <strong>%1</strong>. - + Setting hostname %1. Setting hostname %1. - - + + Internal Error Internal Error - - + + Cannot write hostname to target system Cannot write hostname to target system @@ -3645,18 +3645,18 @@ Output: SetupGroupsJob - + Preparing groups. Preparing groups. - - + + Could not create groups in target system Could not create groups in target system - + These groups are missing in the target system: %1 These groups are missing in the target system: %1 @@ -3669,12 +3669,12 @@ Output: Configure <pre>sudo</pre> users. - + Cannot chmod sudoers file. Cannot chmod sudoers file. - + Cannot create sudoers file for writing. Cannot create sudoers file for writing. @@ -3877,12 +3877,12 @@ Output: UsersPage - + <small>If more than one person will use this computer, you can create multiple accounts after setup.</small> <small>If more than one person will use this computer, you can create multiple accounts after setup.</small> - + <small>If more than one person will use this computer, you can create multiple accounts after installation.</small> <small>If more than one person will use this computer, you can create multiple accounts after installation.</small> diff --git a/lang/python.pot b/lang/python.pot index 897a6b4de..2396b14dd 100644 --- a/lang/python.pot +++ b/lang/python.pot @@ -2,426 +2,403 @@ # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. -# +# #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-03-21 17:21+0100\n" +"POT-Creation-Date: 2022-04-22 11:03+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=CHARSET\n" -"Content-Transfer-Encoding: 8bit\n" "Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" -#: src/modules/initramfscfg/main.py:32 -msgid "Configuring initramfs." -msgstr "Configuring initramfs." - -#: src/modules/initramfscfg/main.py:85 src/modules/initramfscfg/main.py:89 -#: src/modules/fstab/main.py:361 src/modules/fstab/main.py:367 -#: src/modules/fstab/main.py:394 src/modules/networkcfg/main.py:105 -#: src/modules/initcpiocfg/main.py:235 src/modules/initcpiocfg/main.py:239 -#: src/modules/localecfg/main.py:135 src/modules/mount/main.py:229 -#: src/modules/rawfs/main.py:164 src/modules/openrcdmcryptcfg/main.py:72 -#: src/modules/openrcdmcryptcfg/main.py:76 -msgid "Configuration Error" -msgstr "Configuration Error" - -#: src/modules/initramfscfg/main.py:86 src/modules/fstab/main.py:362 -#: src/modules/initcpiocfg/main.py:236 src/modules/mount/main.py:230 -#: src/modules/rawfs/main.py:165 src/modules/openrcdmcryptcfg/main.py:73 -msgid "No partitions are defined for

{!s}
to use." -msgstr "No partitions are defined for
{!s}
to use." - -#: src/modules/initramfscfg/main.py:90 src/modules/fstab/main.py:368 -#: src/modules/networkcfg/main.py:106 src/modules/initcpiocfg/main.py:240 -#: src/modules/localecfg/main.py:136 src/modules/openrcdmcryptcfg/main.py:77 -msgid "No root mount point is given for
{!s}
to use." -msgstr "No root mount point is given for
{!s}
to use." - #: src/modules/grubcfg/main.py:28 msgid "Configure GRUB." -msgstr "Configure GRUB." - -#: src/modules/bootloader/main.py:43 -msgid "Install bootloader." -msgstr "Install bootloader." - -#: src/modules/bootloader/main.py:614 -msgid "Failed to install grub, no partitions defined in global storage" -msgstr "Failed to install grub, no partitions defined in global storage" - -#: src/modules/bootloader/main.py:782 -msgid "Bootloader installation error" -msgstr "Bootloader installation error" - -#: src/modules/bootloader/main.py:783 -msgid "" -"The bootloader could not be installed. The installation command " -"
{!s}
returned error code {!s}." msgstr "" -"The bootloader could not be installed. The installation command " -"
{!s}
returned error code {!s}." - -#: src/modules/fstab/main.py:29 -msgid "Writing fstab." -msgstr "Writing fstab." - -#: src/modules/fstab/main.py:395 -msgid "No
{!s}
configuration is given for
{!s}
to use." -msgstr "No
{!s}
configuration is given for
{!s}
to use." - -#: src/modules/dracut/main.py:27 -msgid "Creating initramfs with dracut." -msgstr "Creating initramfs with dracut." - -#: src/modules/dracut/main.py:49 -msgid "Failed to run dracut on the target" -msgstr "Failed to run dracut on the target" - -#: src/modules/dracut/main.py:50 src/modules/mkinitfs/main.py:50 -msgid "The exit code was {}" -msgstr "The exit code was {}" - -#: src/modules/displaymanager/main.py:524 -msgid "Cannot write KDM configuration file" -msgstr "Cannot write KDM configuration file" - -#: src/modules/displaymanager/main.py:525 -msgid "KDM config file {!s} does not exist" -msgstr "KDM config file {!s} does not exist" - -#: src/modules/displaymanager/main.py:586 -msgid "Cannot write LXDM configuration file" -msgstr "Cannot write LXDM configuration file" - -#: src/modules/displaymanager/main.py:587 -msgid "LXDM config file {!s} does not exist" -msgstr "LXDM config file {!s} does not exist" - -#: src/modules/displaymanager/main.py:670 -msgid "Cannot write LightDM configuration file" -msgstr "Cannot write LightDM configuration file" - -#: src/modules/displaymanager/main.py:671 -msgid "LightDM config file {!s} does not exist" -msgstr "LightDM config file {!s} does not exist" - -#: src/modules/displaymanager/main.py:745 -msgid "Cannot configure LightDM" -msgstr "Cannot configure LightDM" - -#: src/modules/displaymanager/main.py:746 -msgid "No LightDM greeter installed." -msgstr "No LightDM greeter installed." - -#: src/modules/displaymanager/main.py:777 -msgid "Cannot write SLIM configuration file" -msgstr "Cannot write SLIM configuration file" - -#: src/modules/displaymanager/main.py:778 -msgid "SLIM config file {!s} does not exist" -msgstr "SLIM config file {!s} does not exist" - -#: src/modules/displaymanager/main.py:991 -msgid "No display managers selected for the displaymanager module." -msgstr "No display managers selected for the displaymanager module." - -#: src/modules/displaymanager/main.py:992 -msgid "" -"The displaymanagers list is empty or undefined in both globalstorage and " -"displaymanager.conf." -msgstr "" -"The displaymanagers list is empty or undefined in both globalstorage and " -"displaymanager.conf." - -#: src/modules/displaymanager/main.py:1074 -msgid "Display manager configuration was incomplete" -msgstr "Display manager configuration was incomplete" - -#: src/modules/services-openrc/main.py:29 -msgid "Configure OpenRC services" -msgstr "Configure OpenRC services" - -#: src/modules/services-openrc/main.py:57 -msgid "Cannot add service {name!s} to run-level {level!s}." -msgstr "Cannot add service {name!s} to run-level {level!s}." - -#: src/modules/services-openrc/main.py:59 -msgid "Cannot remove service {name!s} from run-level {level!s}." -msgstr "Cannot remove service {name!s} from run-level {level!s}." - -#: src/modules/services-openrc/main.py:61 -msgid "" -"Unknown service-action {arg!s} for service {name!s} in run-" -"level {level!s}." -msgstr "" -"Unknown service-action {arg!s} for service {name!s} in run-" -"level {level!s}." - -#: src/modules/services-openrc/main.py:93 -#: src/modules/services-systemd/main.py:59 -msgid "Cannot modify service" -msgstr "Cannot modify service" - -#: src/modules/services-openrc/main.py:94 -msgid "" -"rc-update {arg!s} call in chroot returned error code {num!s}." -msgstr "" -"rc-update {arg!s} call in chroot returned error code {num!s}." - -#: src/modules/services-openrc/main.py:101 -msgid "Target runlevel does not exist" -msgstr "Target runlevel does not exist" - -#: src/modules/services-openrc/main.py:102 -msgid "" -"The path for runlevel {level!s} is {path!s}, which does not " -"exist." -msgstr "" -"The path for runlevel {level!s} is {path!s}, which does not " -"exist." - -#: src/modules/services-openrc/main.py:110 -msgid "Target service does not exist" -msgstr "Target service does not exist" - -#: src/modules/services-openrc/main.py:111 -msgid "" -"The path for service {name!s} is {path!s}, which does not " -"exist." -msgstr "" -"The path for service {name!s} is {path!s}, which does not " -"exist." - -#: src/modules/networkcfg/main.py:29 -msgid "Saving network configuration." -msgstr "Saving network configuration." - -#: src/modules/packages/main.py:54 src/modules/packages/main.py:65 -#: src/modules/packages/main.py:75 -msgid "Install packages." -msgstr "Install packages." - -#: src/modules/packages/main.py:63 -#, python-format -msgid "Processing packages (%(count)d / %(total)d)" -msgstr "Processing packages (%(count)d / %(total)d)" - -#: src/modules/packages/main.py:68 -#, python-format -msgid "Installing one package." -msgid_plural "Installing %(num)d packages." -msgstr[0] "Installing one package." -msgstr[1] "Installing %(num)d packages." - -#: src/modules/packages/main.py:71 -#, python-format -msgid "Removing one package." -msgid_plural "Removing %(num)d packages." -msgstr[0] "Removing one package." -msgstr[1] "Removing %(num)d packages." - -#: src/modules/packages/main.py:725 src/modules/packages/main.py:737 -#: src/modules/packages/main.py:765 -msgid "Package Manager error" -msgstr "Package Manager error" - -#: src/modules/packages/main.py:726 -msgid "" -"The package manager could not prepare updates. The command
{!s}
" -"returned error code {!s}." -msgstr "" -"The package manager could not prepare updates. The command
{!s}
" -"returned error code {!s}." - -#: src/modules/packages/main.py:738 -msgid "" -"The package manager could not update the system. The command
{!s}
" -" returned error code {!s}." -msgstr "" -"The package manager could not update the system. The command
{!s}
" -" returned error code {!s}." - -#: src/modules/packages/main.py:766 -msgid "" -"The package manager could not make changes to the installed system. The " -"command
{!s}
returned error code {!s}." -msgstr "" -"The package manager could not make changes to the installed system. The " -"command
{!s}
returned error code {!s}." - -#: src/modules/plymouthcfg/main.py:27 -msgid "Configure Plymouth theme" -msgstr "Configure Plymouth theme" - -#: src/modules/initcpiocfg/main.py:28 -msgid "Configuring mkinitcpio." -msgstr "Configuring mkinitcpio." - -#: src/modules/localecfg/main.py:30 -msgid "Configuring locales." -msgstr "Configuring locales." #: src/modules/mount/main.py:42 msgid "Mounting partitions." -msgstr "Mounting partitions." +msgstr "" #: src/modules/mount/main.py:88 src/modules/mount/main.py:124 msgid "Internal error mounting zfs datasets" -msgstr "Internal error mounting zfs datasets" +msgstr "" #: src/modules/mount/main.py:100 msgid "Failed to import zpool" -msgstr "Failed to import zpool" +msgstr "" #: src/modules/mount/main.py:116 msgid "Failed to unlock zpool" -msgstr "Failed to unlock zpool" +msgstr "" #: src/modules/mount/main.py:133 src/modules/mount/main.py:138 msgid "Failed to set zfs mountpoint" -msgstr "Failed to set zfs mountpoint" +msgstr "" + +#: src/modules/mount/main.py:229 src/modules/initcpiocfg/main.py:235 +#: src/modules/initcpiocfg/main.py:239 src/modules/rawfs/main.py:164 +#: src/modules/initramfscfg/main.py:85 src/modules/initramfscfg/main.py:89 +#: src/modules/openrcdmcryptcfg/main.py:72 +#: src/modules/openrcdmcryptcfg/main.py:76 src/modules/fstab/main.py:361 +#: src/modules/fstab/main.py:367 src/modules/fstab/main.py:394 +#: src/modules/localecfg/main.py:140 src/modules/networkcfg/main.py:105 +msgid "Configuration Error" +msgstr "" + +#: src/modules/mount/main.py:230 src/modules/initcpiocfg/main.py:236 +#: src/modules/rawfs/main.py:165 src/modules/initramfscfg/main.py:86 +#: src/modules/openrcdmcryptcfg/main.py:73 src/modules/fstab/main.py:362 +msgid "No partitions are defined for
{!s}
to use." +msgstr "" #: src/modules/mount/main.py:253 msgid "zfs mounting error" -msgstr "zfs mounting error" - -#: src/modules/rawfs/main.py:26 -msgid "Installing data." -msgstr "Installing data." - -#: src/modules/dummypython/main.py:35 -msgid "Dummy python job." -msgstr "Dummy python job." - -#: src/modules/dummypython/main.py:37 src/modules/dummypython/main.py:93 -#: src/modules/dummypython/main.py:94 -msgid "Dummy python step {}" -msgstr "Dummy python step {}" - -#: src/modules/hwclock/main.py:26 -msgid "Setting hardware clock." -msgstr "Setting hardware clock." - -#: src/modules/openrcdmcryptcfg/main.py:26 -msgid "Configuring OpenRC dmcrypt service." -msgstr "Configuring OpenRC dmcrypt service." +msgstr "" #: src/modules/services-systemd/main.py:26 msgid "Configure systemd services" -msgstr "Configure systemd services" +msgstr "" + +#: src/modules/services-systemd/main.py:59 +#: src/modules/services-openrc/main.py:93 +msgid "Cannot modify service" +msgstr "" #: src/modules/services-systemd/main.py:60 msgid "" "systemctl {arg!s} call in chroot returned error code {num!s}." msgstr "" -"systemctl {arg!s} call in chroot returned error code {num!s}." #: src/modules/services-systemd/main.py:63 #: src/modules/services-systemd/main.py:69 msgid "Cannot enable systemd service {name!s}." -msgstr "Cannot enable systemd service {name!s}." +msgstr "" #: src/modules/services-systemd/main.py:65 msgid "Cannot enable systemd target {name!s}." -msgstr "Cannot enable systemd target {name!s}." +msgstr "" #: src/modules/services-systemd/main.py:67 msgid "Cannot enable systemd timer {name!s}." -msgstr "Cannot enable systemd timer {name!s}." +msgstr "" #: src/modules/services-systemd/main.py:71 msgid "Cannot disable systemd target {name!s}." -msgstr "Cannot disable systemd target {name!s}." +msgstr "" #: src/modules/services-systemd/main.py:73 msgid "Cannot mask systemd unit {name!s}." -msgstr "Cannot mask systemd unit {name!s}." +msgstr "" #: src/modules/services-systemd/main.py:75 msgid "" -"Unknown systemd commands {command!s} and " -"{suffix!s} for unit {name!s}." +"Unknown systemd commands {command!s} and {suffix!s} for unit {name!s}." msgstr "" -"Unknown systemd commands {command!s} and " -"{suffix!s} for unit {name!s}." - -#: src/modules/mkinitfs/main.py:27 -msgid "Creating initramfs with mkinitfs." -msgstr "Creating initramfs with mkinitfs." - -#: src/modules/mkinitfs/main.py:49 -msgid "Failed to run mkinitfs on the target" -msgstr "Failed to run mkinitfs on the target" #: src/modules/unpackfs/main.py:34 msgid "Filling up filesystems." -msgstr "Filling up filesystems." +msgstr "" #: src/modules/unpackfs/main.py:254 msgid "rsync failed with error code {}." -msgstr "rsync failed with error code {}." +msgstr "" #: src/modules/unpackfs/main.py:299 msgid "Unpacking image {}/{}, file {}/{}" -msgstr "Unpacking image {}/{}, file {}/{}" +msgstr "" #: src/modules/unpackfs/main.py:314 msgid "Starting to unpack {}" -msgstr "Starting to unpack {}" +msgstr "" #: src/modules/unpackfs/main.py:323 src/modules/unpackfs/main.py:467 msgid "Failed to unpack image \"{}\"" -msgstr "Failed to unpack image \"{}\"" +msgstr "" #: src/modules/unpackfs/main.py:430 msgid "No mount point for root partition" -msgstr "No mount point for root partition" +msgstr "" #: src/modules/unpackfs/main.py:431 msgid "globalstorage does not contain a \"rootMountPoint\" key." -msgstr "globalstorage does not contain a \"rootMountPoint\" key." +msgstr "" #: src/modules/unpackfs/main.py:434 msgid "Bad mount point for root partition" -msgstr "Bad mount point for root partition" +msgstr "" #: src/modules/unpackfs/main.py:435 msgid "rootMountPoint is \"{}\", which does not exist." -msgstr "rootMountPoint is \"{}\", which does not exist." +msgstr "" #: src/modules/unpackfs/main.py:439 src/modules/unpackfs/main.py:455 #: src/modules/unpackfs/main.py:459 src/modules/unpackfs/main.py:465 #: src/modules/unpackfs/main.py:480 msgid "Bad unpackfs configuration" -msgstr "Bad unpackfs configuration" +msgstr "" #: src/modules/unpackfs/main.py:440 msgid "There is no configuration information." -msgstr "There is no configuration information." +msgstr "" #: src/modules/unpackfs/main.py:456 msgid "The filesystem for \"{}\" ({}) is not supported by your current kernel" -msgstr "The filesystem for \"{}\" ({}) is not supported by your current kernel" +msgstr "" #: src/modules/unpackfs/main.py:460 msgid "The source filesystem \"{}\" does not exist" -msgstr "The source filesystem \"{}\" does not exist" +msgstr "" #: src/modules/unpackfs/main.py:466 msgid "" "Failed to find unsquashfs, make sure you have the squashfs-tools package " "installed." msgstr "" -"Failed to find unsquashfs, make sure you have the squashfs-tools package " -"installed." #: src/modules/unpackfs/main.py:481 msgid "The destination \"{}\" in the target system is not a directory" -msgstr "The destination \"{}\" in the target system is not a directory" +msgstr "" + +#: src/modules/displaymanager/main.py:524 +msgid "Cannot write KDM configuration file" +msgstr "" + +#: src/modules/displaymanager/main.py:525 +msgid "KDM config file {!s} does not exist" +msgstr "" + +#: src/modules/displaymanager/main.py:586 +msgid "Cannot write LXDM configuration file" +msgstr "" + +#: src/modules/displaymanager/main.py:587 +msgid "LXDM config file {!s} does not exist" +msgstr "" + +#: src/modules/displaymanager/main.py:670 +msgid "Cannot write LightDM configuration file" +msgstr "" + +#: src/modules/displaymanager/main.py:671 +msgid "LightDM config file {!s} does not exist" +msgstr "" + +#: src/modules/displaymanager/main.py:745 +msgid "Cannot configure LightDM" +msgstr "" + +#: src/modules/displaymanager/main.py:746 +msgid "No LightDM greeter installed." +msgstr "" + +#: src/modules/displaymanager/main.py:777 +msgid "Cannot write SLIM configuration file" +msgstr "" + +#: src/modules/displaymanager/main.py:778 +msgid "SLIM config file {!s} does not exist" +msgstr "" + +#: src/modules/displaymanager/main.py:991 +msgid "No display managers selected for the displaymanager module." +msgstr "" + +#: src/modules/displaymanager/main.py:992 +msgid "" +"The displaymanagers list is empty or undefined in both globalstorage and " +"displaymanager.conf." +msgstr "" + +#: src/modules/displaymanager/main.py:1074 +msgid "Display manager configuration was incomplete" +msgstr "" + +#: src/modules/initcpiocfg/main.py:28 +msgid "Configuring mkinitcpio." +msgstr "" + +#: src/modules/initcpiocfg/main.py:240 src/modules/initramfscfg/main.py:90 +#: src/modules/openrcdmcryptcfg/main.py:77 src/modules/fstab/main.py:368 +#: src/modules/localecfg/main.py:141 src/modules/networkcfg/main.py:106 +msgid "No root mount point is given for
{!s}
to use." +msgstr "" + +#: src/modules/rawfs/main.py:26 +msgid "Installing data." +msgstr "" + +#: src/modules/services-openrc/main.py:29 +msgid "Configure OpenRC services" +msgstr "" + +#: src/modules/services-openrc/main.py:57 +msgid "Cannot add service {name!s} to run-level {level!s}." +msgstr "" + +#: src/modules/services-openrc/main.py:59 +msgid "Cannot remove service {name!s} from run-level {level!s}." +msgstr "" + +#: src/modules/services-openrc/main.py:61 +msgid "" +"Unknown service-action {arg!s} for service {name!s} in run-" +"level {level!s}." +msgstr "" + +#: src/modules/services-openrc/main.py:94 +msgid "" +"rc-update {arg!s} call in chroot returned error code {num!s}." +msgstr "" + +#: src/modules/services-openrc/main.py:101 +msgid "Target runlevel does not exist" +msgstr "" + +#: src/modules/services-openrc/main.py:102 +msgid "" +"The path for runlevel {level!s} is {path!s}, which does not " +"exist." +msgstr "" + +#: src/modules/services-openrc/main.py:110 +msgid "Target service does not exist" +msgstr "" + +#: src/modules/services-openrc/main.py:111 +msgid "" +"The path for service {name!s} is {path!s}, which does not exist." +msgstr "" + +#: src/modules/plymouthcfg/main.py:27 +msgid "Configure Plymouth theme" +msgstr "" + +#: src/modules/packages/main.py:54 src/modules/packages/main.py:65 +#: src/modules/packages/main.py:75 +msgid "Install packages." +msgstr "" + +#: src/modules/packages/main.py:63 +#, python-format +msgid "Processing packages (%(count)d / %(total)d)" +msgstr "" + +#: src/modules/packages/main.py:68 +#, python-format +msgid "Installing one package." +msgid_plural "Installing %(num)d packages." +msgstr[0] "" +msgstr[1] "" + +#: src/modules/packages/main.py:71 +#, python-format +msgid "Removing one package." +msgid_plural "Removing %(num)d packages." +msgstr[0] "" +msgstr[1] "" + +#: src/modules/packages/main.py:725 src/modules/packages/main.py:737 +#: src/modules/packages/main.py:765 +msgid "Package Manager error" +msgstr "" + +#: src/modules/packages/main.py:726 +msgid "" +"The package manager could not prepare updates. The command
{!s}
" +"returned error code {!s}." +msgstr "" + +#: src/modules/packages/main.py:738 +msgid "" +"The package manager could not update the system. The command
{!s}
" +"returned error code {!s}." +msgstr "" + +#: src/modules/packages/main.py:766 +msgid "" +"The package manager could not make changes to the installed system. The " +"command
{!s}
returned error code {!s}." +msgstr "" + +#: src/modules/bootloader/main.py:43 +msgid "Install bootloader." +msgstr "" + +#: src/modules/bootloader/main.py:614 +msgid "Failed to install grub, no partitions defined in global storage" +msgstr "" + +#: src/modules/bootloader/main.py:782 +msgid "Bootloader installation error" +msgstr "" + +#: src/modules/bootloader/main.py:783 +msgid "" +"The bootloader could not be installed. The installation command
{!s} returned error code {!s}."
+msgstr ""
+
+#: src/modules/hwclock/main.py:26
+msgid "Setting hardware clock."
+msgstr ""
+
+#: src/modules/mkinitfs/main.py:27
+msgid "Creating initramfs with mkinitfs."
+msgstr ""
+
+#: src/modules/mkinitfs/main.py:49
+msgid "Failed to run mkinitfs on the target"
+msgstr ""
+
+#: src/modules/mkinitfs/main.py:50 src/modules/dracut/main.py:50
+msgid "The exit code was {}"
+msgstr ""
+
+#: src/modules/dracut/main.py:27
+msgid "Creating initramfs with dracut."
+msgstr ""
+
+#: src/modules/dracut/main.py:49
+msgid "Failed to run dracut on the target"
+msgstr ""
+
+#: src/modules/initramfscfg/main.py:32
+msgid "Configuring initramfs."
+msgstr ""
+
+#: src/modules/openrcdmcryptcfg/main.py:26
+msgid "Configuring OpenRC dmcrypt service."
+msgstr ""
+
+#: src/modules/fstab/main.py:29
+msgid "Writing fstab."
+msgstr ""
+
+#: src/modules/fstab/main.py:395
+msgid "No 
{!s}
configuration is given for
{!s}
to use." +msgstr "" + +#: src/modules/dummypython/main.py:35 +msgid "Dummy python job." +msgstr "" + +#: src/modules/dummypython/main.py:37 src/modules/dummypython/main.py:93 +#: src/modules/dummypython/main.py:94 +msgid "Dummy python step {}" +msgstr "" + +#: src/modules/localecfg/main.py:31 +msgid "Configuring locales." +msgstr "" + +#: src/modules/networkcfg/main.py:29 +msgid "Saving network configuration." +msgstr "" From 1c49648fc5f9264fe4611e5cb17f287f508bfc60 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Fri, 22 Apr 2022 11:12:34 +0200 Subject: [PATCH 07/10] Changes: pre-release housekeeping --- CHANGES-3.2 | 14 ++++++++++++-- CMakeLists.txt | 2 +- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/CHANGES-3.2 b/CHANGES-3.2 index ffc8e0010..3171a939a 100644 --- a/CHANGES-3.2 +++ b/CHANGES-3.2 @@ -8,15 +8,25 @@ contributors are listed. Note that Calamares does not have a historical changelog -- this log starts with version 3.2.0. The release notes on the website will have to do for older versions. -# 3.2.56 (unreleased) # +# 3.2.56 (2022-04-22) # + +As of this release, Calamares 3.2 development is winding down. The +reason is simple: systems where the backwards-compatibility of Calamares +3.2 is important are becoming increasingly difficult to work with +for **other** reasons. Foremost among these are deprecated versions +of dependencies and tools. Calamares 3.2 branch remains open for +bugfixes and will see a few more releases, but development is now +shifting wholesale to the newer generation. This release contains contributions from (alphabetically by first name): - Victor Fuentes (new contributor! Welcome!) ## Core ## - - No core changes yet + - Changes in git forced some changes on the CI tooling. ## Modules ## + - *locale* showed the wrong timezone for Dhaka, although it configured + the correct one. #1929 - *users* module sets global storage key *fullname* to the full name of the user (e.g. what is entered in the "your full name" box on the users page). #1923 (Thanks Victor) diff --git a/CMakeLists.txt b/CMakeLists.txt index 472c17fb0..87fec664f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -45,7 +45,7 @@ project( CALAMARES LANGUAGES C CXX ) -set( CALAMARES_VERSION_RC 1 ) # Set to 0 during release cycle, 1 during development +set( CALAMARES_VERSION_RC 0 ) # Set to 0 during release cycle, 1 during development if( CALAMARES_VERSION_RC EQUAL 1 AND CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR ) message( FATAL_ERROR "Do not build development versions in the source-directory." ) endif() From 5d1b02423784776b48164a0c9cc8f5fc66213fd5 Mon Sep 17 00:00:00 2001 From: abalfoort Date: Sat, 23 Apr 2022 12:44:39 +0200 Subject: [PATCH 08/10] Implement comments - Unencrypted /boot check moved to generate_crypttab_line_info. - has_luks in class FstabGenerator changed to luks_mapper_name. --- src/modules/fstab/main.py | 42 +++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 22 deletions(-) diff --git a/src/modules/fstab/main.py b/src/modules/fstab/main.py index e65e36445..539457174 100755 --- a/src/modules/fstab/main.py +++ b/src/modules/fstab/main.py @@ -142,21 +142,13 @@ class FstabGenerator(object): with open(crypttab_path, "w") as crypttab_file: print(CRYPTTAB_HEADER, file=crypttab_file) - # Check if /boot is unencrypted - unencrypted_separate_boot = False for partition in self.partitions: - if (partition["mountPoint"] == "/boot" - and "luksMapperName" not in partition): - unencrypted_separate_boot = True - break - - for partition in self.partitions: - dct = self.generate_crypttab_line_info(partition, unencrypted_separate_boot) + dct = self.generate_crypttab_line_info(partition) if dct: self.print_crypttab_line(dct, file=crypttab_file) - def generate_crypttab_line_info(self, partition, unencrypted_separate_boot): + def generate_crypttab_line_info(self, partition): """ Generates information for each crypttab entry. """ if "luksMapperName" not in partition or "luksUuid" not in partition: return None @@ -166,13 +158,17 @@ class FstabGenerator(object): if not mapper_name or not luks_uuid: return None - # Set crypttab password for partition to none and remove crypttab options - # on root partition when /boot is unencrypted password = "/crypto_keyfile.bin" crypttab_options = self.crypttab_options - if partition["mountPoint"] == "/" and unencrypted_separate_boot: - password = 'none' - crypttab_options = '' + + # Set crypttab password for partition to none and remove crypttab options + # on root partition when /boot is unencrypted + if partition["mountPoint"] == "/": + if any([p["mountPoint"] == "/boot" + and "luksMapperName" not in p + for p in self.partitions]): + password = "none" + crypttab_options = "" return dict( name=mapper_name, @@ -236,7 +232,7 @@ class FstabGenerator(object): # Some "fs" names need special handling in /etc/fstab, so remap them. filesystem = partition["fs"].lower() filesystem = FS_MAP.get(filesystem, filesystem) - has_luks = "luksMapperName" in partition + luks_mapper_name = partition.get("luksMapperName", None) mount_point = partition["mountPoint"] disk_name = disk_name_for_partition(partition) is_ssd = disk_name in self.ssd_disks @@ -279,17 +275,19 @@ class FstabGenerator(object): if filesystem == "btrfs" and partition.get("subvol",None): options = "subvol={},".format(partition["subvol"]) + options - if has_luks: - # Check if user mounted a previously encrypted partition - if not partition["luksMapperName"]: - return None - - device = "/dev/mapper/" + partition["luksMapperName"] + device = None + if luks_mapper_name: + device = "/dev/mapper/" + luks_mapper_name elif partition["uuid"]: device = "UUID=" + partition["uuid"] else: device = partition["device"] + if not device: + # TODO: we get here when the user mounted a previously mounted partition + # This should be catched early in the process + return None + return dict(device=device, mount_point=mount_point, fs=filesystem, From 29733819f5ccd29ca62fefdced17062377ad8c4d Mon Sep 17 00:00:00 2001 From: abalfoort Date: Sat, 23 Apr 2022 13:06:44 +0200 Subject: [PATCH 09/10] Implement comments - Unencrypted /boot check moved to generate_crypttab_line_info. - has_luks in class FstabGenerator changed to luks_mapper_name. --- src/modules/fstab/main.py | 42 +++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 22 deletions(-) diff --git a/src/modules/fstab/main.py b/src/modules/fstab/main.py index e65e36445..539457174 100755 --- a/src/modules/fstab/main.py +++ b/src/modules/fstab/main.py @@ -142,21 +142,13 @@ class FstabGenerator(object): with open(crypttab_path, "w") as crypttab_file: print(CRYPTTAB_HEADER, file=crypttab_file) - # Check if /boot is unencrypted - unencrypted_separate_boot = False for partition in self.partitions: - if (partition["mountPoint"] == "/boot" - and "luksMapperName" not in partition): - unencrypted_separate_boot = True - break - - for partition in self.partitions: - dct = self.generate_crypttab_line_info(partition, unencrypted_separate_boot) + dct = self.generate_crypttab_line_info(partition) if dct: self.print_crypttab_line(dct, file=crypttab_file) - def generate_crypttab_line_info(self, partition, unencrypted_separate_boot): + def generate_crypttab_line_info(self, partition): """ Generates information for each crypttab entry. """ if "luksMapperName" not in partition or "luksUuid" not in partition: return None @@ -166,13 +158,17 @@ class FstabGenerator(object): if not mapper_name or not luks_uuid: return None - # Set crypttab password for partition to none and remove crypttab options - # on root partition when /boot is unencrypted password = "/crypto_keyfile.bin" crypttab_options = self.crypttab_options - if partition["mountPoint"] == "/" and unencrypted_separate_boot: - password = 'none' - crypttab_options = '' + + # Set crypttab password for partition to none and remove crypttab options + # on root partition when /boot is unencrypted + if partition["mountPoint"] == "/": + if any([p["mountPoint"] == "/boot" + and "luksMapperName" not in p + for p in self.partitions]): + password = "none" + crypttab_options = "" return dict( name=mapper_name, @@ -236,7 +232,7 @@ class FstabGenerator(object): # Some "fs" names need special handling in /etc/fstab, so remap them. filesystem = partition["fs"].lower() filesystem = FS_MAP.get(filesystem, filesystem) - has_luks = "luksMapperName" in partition + luks_mapper_name = partition.get("luksMapperName", None) mount_point = partition["mountPoint"] disk_name = disk_name_for_partition(partition) is_ssd = disk_name in self.ssd_disks @@ -279,17 +275,19 @@ class FstabGenerator(object): if filesystem == "btrfs" and partition.get("subvol",None): options = "subvol={},".format(partition["subvol"]) + options - if has_luks: - # Check if user mounted a previously encrypted partition - if not partition["luksMapperName"]: - return None - - device = "/dev/mapper/" + partition["luksMapperName"] + device = None + if luks_mapper_name: + device = "/dev/mapper/" + luks_mapper_name elif partition["uuid"]: device = "UUID=" + partition["uuid"] else: device = partition["device"] + if not device: + # TODO: we get here when the user mounted a previously mounted partition + # This should be catched early in the process + return None + return dict(device=device, mount_point=mount_point, fs=filesystem, From fae515c3a25168dd35ebfc983badded458cb9a34 Mon Sep 17 00:00:00 2001 From: abalfoort Date: Sat, 23 Apr 2022 13:21:27 +0200 Subject: [PATCH 10/10] Improve todo comment --- src/modules/fstab/main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/fstab/main.py b/src/modules/fstab/main.py index 539457174..1cfb5e660 100755 --- a/src/modules/fstab/main.py +++ b/src/modules/fstab/main.py @@ -284,7 +284,7 @@ class FstabGenerator(object): device = partition["device"] if not device: - # TODO: we get here when the user mounted a previously mounted partition + # TODO: we get here when the user mounted a previously encrypted partition # This should be catched early in the process return None