From 3d01d5cb04b1510f934913b8888f36a6322bbbf7 Mon Sep 17 00:00:00 2001 From: sergio Date: Wed, 29 Jul 2026 19:19:23 -0400 Subject: [PATCH] =?UTF-8?q?gnome:=20el=20bus=20de=20sistema=20COMPLETO=20?= =?UTF-8?q?=E2=80=94=20faltaba=20polkit,=20y=20lo=20dijo=20la=20lista=20de?= =?UTF-8?q?=20nombres?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit bus: org.freedesktop.login1 OK bus: org.freedesktop.PolicyKit1 OK bus: org.freedesktop.Accounts OK bus: org.freedesktop.UPower OK accounts-daemon y upowerd arrancaban, seguían vivos, y NUNCA adquirían su nombre: los dos se bloquean en `polkit_authority_get_sync()` al iniciar, y `org.freedesktop.PolicyKit1` no lo servía nadie —nuestra receta polkit es libs-only a propósito, porque el demonio lo pone arje—. gnome-shell esperaba después 25s por cada uno. **El dato que lo resolvió no salió del log de los daemons sino de la LISTA DE NOMBRES DEL BUS**: ahí estaban como conexiones anónimas `:1.0`, `:1.1`, sin nombre bien conocido. Eso distingue tres cosas que en el log del cliente se ven igual — «no arrancó», «arrancó y no llegó a pedir el nombre» y «lo pidió y se lo negaron». Era la segunda. `gnome-start` ahora espera cada nombre con NameHasOwner y, si no aparece, vuelca el log del daemon y la lista. Receta nueva `arje-polkit-compat` (b3:03e0a86f), tercer shim de este tipo tras arje-logind-compat y arje-sdlogin-compat. Su propio autor ya había escrito el diagnóstico en el crate: «apps que usan polkit bloquean en CheckAuthorization si no responde nadie». ⚠ AUTORIZA TODO — es la postura de sistema confiado que arje ya tenía tomada, no algo que esta receta introduzca; queda explícito en su comentario. Dos gotchas del empaquetado: - **La política de polkit ya existe y NO alcanza**: permite `own` sólo al usuario polkitd y el shim corre como root. Se agrega un `zz-arje-polkit-compat.conf` en vez de reescribir la de upstream — dbus lee system.d en orden alfabético y las posteriores ganan. - **Los ficheros del rootfs fundido son hardlinks de SÓLO LECTURA del store** (0444). Un `cat >` encima falla con Permission denied y rompió un build. Regla: nunca sobrescribir un fichero que venga de un artefacto; agregar al lado. Queda escrito en el runbook lo que sigue faltando (colord, y que el shell no tiene servidor de sonido porque pulseaudio se construyó sólo-cliente: el demonio de audio de la distro sigue sin decidirse) y las dos lecciones de método que costaron una iteración cada una. Co-Authored-By: Claude Opus 5 (1M context) --- .../evidencia/gnome-shell-qemu-2026-07-29.png | Bin 22410 -> 22455 bytes docs/runbooks/gnome-qemu-desktop.md | 56 +++++++++++++++--- recipes/arje-polkit-compat.toml | 51 ++++++++++++++++ scripts/gnome/gnome-start-qemu.sh | 42 +++++++++++++ scripts/gnome/qemu-desktop-image.sh | 44 ++++++++++++++ 5 files changed, 184 insertions(+), 9 deletions(-) create mode 100644 recipes/arje-polkit-compat.toml diff --git a/docs/evidencia/gnome-shell-qemu-2026-07-29.png b/docs/evidencia/gnome-shell-qemu-2026-07-29.png index 5aab2d2e133d2b39362e84331ba54f9cd4ebe5e2..00b5043e42f8e6feb339c3f5c6497653765f7dbc 100644 GIT binary patch literal 22455 zcmeFZc{tSl`#wAVF%l-6~}wzqv)w)QpYYF zkf}hjAGy{#9%|Z{^YIquV`^?iJNu3o+R&p&&Vy-xQMMn*=uySqn6Yn}0( zLEDwjHIKl7CoUhsIfjUch(xK*B*ewdJQMwSaj+!YZlux&y|H*|;{tp~2sOZ=5`Fp1 zoiFz{7Bfx+Ul2gH#pOHq<^7x8-6+lt-(r}Q|4dpUl+#ADo4%C zWIf&&b!y`z>*BKEyWH(2-(1$(OzvGAD1lpjp~-q9O^uRlf$it?1f4}=!ZZ;VxW}EX zx1(aE(|2Z+k+N{(Aw}NHf0?eY`*_F%i|1u#X4ckrZgOzENjC~!l_;p3N9l6MTLnCzB$vHxy~e2Q^FIyoSmGkwg>UmJJYi1%1AeE zTk7g`I%CZ-cs*B-Z=18QVrCwXWo$-i1=PPebyZVSQ$)#SXC(@=(S=2_yX&l3BmO3VL`YJ z%(3lVh%4Xf5oz#RB~9+TrUo?ZFVvd*AmHrm%s0u{AQP}oy*bEWO61W%%DLby!_-P7 zVdicWdq~SdX9QWUZhG?9?1s$dJ%WVtk~Ja9KD@Z;YEa>{aRi(-po25 zG$D}Q9^kxBP^NmZINoKn+MmgwH!$t!@A!h2D;Em(NouTokJ;WtrTWh#7Wy?xcWQ19 zx5;9=l-b#@ZScy3x;=Oxywa7Qe^ZzFA>^4+i!ZCL^;8)@4=4NK4 zek&8wh1ILA(uEeq_WwFK`1FYg553s`Yk2s^at7PmTO&c6meM9#)CydX5@k}~I$)_a z)~LXOI`t_#O>M%5TtOVg*KX{0Ob;48Xky{teHE$dzE5_)q-fCELw%VFm9XX5!kujq zf?u}}-Vz%~eGZ>ZEEC5|=G5h8(hAE{eflcmtr_Yj)tMEK2#xcT|$>NZ3ZoP&bs&Q_EhT;PnCZkg&-Rc!_xY#T%PJ|a3IcAEtMJZr3A12YObuR0yo_tEpbco1ZG$n8~e;OLs0U6`}VlG zJyqS2GDEzCek2(d85v2X5D5Vb;kh|EhtA$f7}zRF*L>~l2NB<*u$9i-aeQ&;ESPu& zTsqy-(h>~jtEbo8tj*x7ICP8Sf~u-eU2pGEqgQF(UC-=%nx#^`yOv*q2ehv_aZ5s` zu<$eJvloL`BN@VWa`>up&8MuaEG(9}&wA?yx9v#fx{+4J&YPQt!3`o-s6I1CgT$^k z)MM`4wtaaSp1a-CMB4AWxTuh;De~Fd+uPdP131i#f^54b5)Nf-OK?jrj@DGYV#DlA zGJlSYc)^PlPgt-jb?S{V(lVRn;0(Fp>%M1g7iQJ5E4cHA)LX>Ki^j&i;o3Wb<-@DZ zK|w(hTXpGgTU-0n^Bm&Jof&QZg9l~L{Fx;0;7#DrhQ!O5GbM3=?i`N>eV8mpHbvdGKR?|efx~ji5SePRC$C` zoiL;uau68}{z$4Iro9wVCXJ3TYRL4z!sLQzU-G0&5O3Q>dB#X2`cW%dGNIazP#dHd zT!`Kz)zCMPyoB0&9fRPJn`_?iN1MLZ4Y{i=V7;iOpC1a&ZmqqDEBHt;bscUB5m)%} zf{;;l{Q7lxO`w%lf&+C|f z%ftk~IxX#nr6(^fxi;XImX^$F0@k0V_pto=*XXELP8-Ly=i01gQcO&&Ev`l-%)LVqKkPTTfG;FmGdEYjFn0LA zLFv)jD8g!0ix?a`K=#K~5h!UWB%wB=uyFHZMr5n#=!80fYIr(!ucW9?&-KJfLkxpr z-EOhcu7KM~#!_?nzd=RR<(5kGyE~&qpmw6@8|65Son@R%_430PvQ`_Zb_>Eh~e;In}B~7Rh90UpYwy{Nr9nlCcTC($T271gAx5kQj~iku<(!Y3X{R zS^~i~cab(5x2okg1A?x3w&q`1RC(_YwZ5(_W%d*VXIRitE3;y~5NBqXZA>b=A zGb^5EoT}W|*qClB2~-gd=`uDqN7LrAM|_8{J$-#;<>l6XTh5}JfC@W{HJ8t#UmbF|4RMyl|NvUq$zzn zZRtGZd=@0 z0qvw`@rL1W**w#t_l1Rp{dVvz8`1ri?3$)fB7W&fD7fBPxX63|NNIU_p?Uczk#(B8 zuVh0M=I7_(6%0aMy!rccJ=&q`>#Ywr=n#_dsX~>Lhbwa7(|;78tj)s+(K@)lYn)g7 z)CA#&y;A=HlMY2(2!0*zIq%ATU4%{bu>;TU^0EE3i;d^ck+C(+^N)_714l}zN?hyM zS(kYf`d*;!!Y`iIk@l9*{au1@KR7TB8;Pos(a z*Olz1kous7Sc-{7-7nDnAlDzEN*`MY=H zA7ZS)*;Mma4W5gI{$FxjMH0t-rUhvN?C@?FY`fe|u_+U(z zi7*g_^M!>z(%@qV=p-m3{|>5&#UZ8(i;6rp7X2lMF#8PHIRq{tI0WWiVb%+Cb5k|Z zhDG7K>UJe6IJy}d#|qoLeY#6d?r+Y>0QqGjMu{WNYuPBo@7Aqj#7;~8Cx-0KHZ~Jm z!(wtI-XJf^H*KoPty>1^S~d6W*li+i-MV#NQL(q@RycoU6Y(GM;;M1p5i5gRMFo26w((BFB9kxF) zyyxZQqIbz%6Wzamy-}PUp?A7u)xWLJ2C5wD(z9TB7}w<$avI zoSkoSzsq;U6@ z=iuOZA16uz@7@p(lplu45wQn?rrB0>sU#~)K6ZYf$ga8W(0-n4o}x>_Cyy}Mx!ycU zN@^V(%;Ep`O4i89)z!((&8o^*H*EnLCV$FIXDS-nDNFgpMW{!M!{v6(od7b#$3I4D zGy3f!&G>b`64L-GZAUHlL837MBOZ{u1~6Jo-IphAmlka{Lr})zv-|i%4HIp~mR-Dz zW^n79Q&6@fKLBRTGIZ6P|7bR;KD*+$zX(v(hLCj{LIO4}rMyRM^I*Si}PR zNGxdW7e_YhWB>syn!hJ$qVIuy^64wh>5B^sxe&QdPA>QFx2K>dp6L@iQ%8n|w(B^w z+uA2&Oy!U*uc2o1X>FCzx2w#}%@3VbyVv@r2~cYL;tFkDqzp;$AN6-MN?iT+(!zJ( zxMY~?P?`41_f`IHDXMxM>DmxA5VVUULlwdFrhM~q2O0lPRYxUd<)wk{BHMhvmgkP( zNMD(HDk)v9bR7a8S}yVGiOP5H7$0H`XURs!w~je>rd+qSCiM5ey0UHzag^K_(Dkpr zM9>;WZ&(#NkO?mFEq@~;6t^uH^v0(i1zaAqG3do_{*-%CF$balG}5B>3|HtGo0z2f z4xR!Oh|{X_g|__>a_Y6dj0HA$5}qSB=k(AJs?eh1bgE%E|NO#2oQ!2x&-u*kY{!nI zQuA^xZK(MW{~C-f0m-lzGHOU%TBKB(=^r|#Ws47+B{1(Z?8r|!I1wjhAiFr35rY-< z-*O%HqtgICCs+(t4Tq?nOZ| zkT>tkGXp5Opu_z_Py)5~ixQ>j`wNQS%};__QWn>*uk_nRkq3KyNfnNYidP@FxBv_y zxb=UYn~E_?(A@qAJOrRhKZ(Y6h4OEhfmvC+pTzk00(Wo!? zys|QV-X!WVf2S%j!mQ*T^bBXCFQ?#nL-=~5A@p@aMb-M9y|{9ercctwXtXh zG{n`bFZcic057m!l1|U5LSwjX8=kzpnOz2-^XGfu_B5j}L#yCIs8tC2IZ#oU>x{9q zT=FNTj^Od-D5Rsg`Sz3j$)5ZD#xlxSZQYmq<8>R)pW8#PnWib0C{b0p0rokhGrPFx z;-uC;BqoM-#6ih=Us>tIWRR{eK^vnq7fsY%Tx+`Zc*MfFhFfraMs~&vG=ThNNtwDek?BboN1pEQFhxa3D4;T z*o#K11Qy~;S=kf*G_;#@)*i@xnDyM|nU3V4t}Ygc@9IjS#yCG)t;3@=m^&Lm+q_g! zBoawp?&jEhohT~4HvLyPRZ$WiH{JhUhez{Sr~4l<3~Fkwi8jz=G0f8(kN(ZP0fkR8 zY<@lo(v^bUKFP%)d~bh0zs`MUXCwfW`yZWI7$g8PS#okR)F?jWM+8E^0KpMs@sEnP zxL#tnmBxSPyzLq^{72(|lSQX>c&9-Ht~RI#M6h zW*GnA&`_39x|NAZx$hEfbhKx2K*9V@l9Jo7Mi$>b0DjyyHmm9%LbHw1YlG>u`j|TE z0@S#!E{)~hzvsNw6#h-Vl9`4H-mY_ichLr>%=`F}NAgQ)DWAb8;1mGg6~I3&04gQ( z-ON@B7v%Mi<(2gItz90#Q*hdjKo~)K9jx>jf)W4}8Uu2@qO#FId0}o=R#{O|ZB-R| z?7~kw2V7ds&1}PwYH9_)eG_GvvO74~X&c2;Ppc{f7N5a7W9 ztNUYiQJPAkwB47F_93}#*XJGYwI}=<*2t`^%qlK^pPiiz&^<|UffMtitWdVppVGH` z-^^ovCFH35XU*98A$XQIr*7W4lO*uW9*M+3r>DSW&MWCMR2I~oMZ5>;{pL+e_+xG^ zrn9w#OkY}DOi^&`d~<3)khaiysiVqV3ALILiGue&rw7v#V+`-8p-3rofUf;T3MEDF z-`}0`{L;h0L;C|| zwYfMTqSIfFv_9P%uNvZex)**lf!nN$P(#!mi#Ppp-=nA*@utGyugq>J9djJgueyn; zsPS3kse?N6kWt0B$I#>&)OXt1;S|*pBee%}W3s!_!s5(U`I94qB)3!54+^xHa@{c zA-I9ogpx6(*4qJ{y?W}aBRz24g1@IS(;1sfEF(qKN$&=BSkHxfH*KArHmCSfO zfc|tVr=No@#FX3SZP@Vx&*H168sn{l=c@g^1fG45J8KR^K)nQgmIMam*8%t>GP=Ai zXz3j+Zw93qYgHTAI5fJ^$N#NaYhy(!-6EPf%>V6p{F&`kLWK)s#~+HoWYbmDC^aKo zg5f_C43wo?^~$Df_41B=@dPx%=Cy$iX@8Fbn+f2h8rUelz_Er$m>n{ckse>OI5^jx z?K=2{+Gfp|pYO$r1&=rvR5%S3?_*^=YioRWcU3U`Nfn84+_H~W6P^eCu z-3_Ayz__ezqfXxW1-XNKA1Q?oA!C{EoC~NUpKh8fyAJ-o4$vxx14$z&Ce8<6ftP(&3h%{mh5z6obJLg?0OCfU%@$9A!f^ zy+Uwa=@%hv(Q*rDsr))njI6DlpmHjYZf(CfBt`+w1SuJ&jHT|6xAc9${jR2l4&aBC zBRH*Z^8< zs%awINA9mA+D$I|m%U0nff^Hxm2Gy&CkFkbQec^2}*?o4M$h5>cR zEtzM!(gXf?X;@)5iTYl{S(v&R$T%1AbrTWd0XgA@qFqx2fj%Ow!yTo~NX9a^G4sGu zWoQR%KNd{G{Q5_b_4H7&tpnzu4Zy0eX{HU@Kb zxKYC^slXu(fuXC%Hw$Yva!jx^V{K}SCW}m4kg={^MKWf{y4(^wW7~#W)bH2#Yeiq) znYLyuDd05F>%AtmD=!O?uC73#kszHvu~-DQyfsY|efaRa$l=2|IXTQ#S?2qqqLqmk zvH=s%rWG6w3qO70l^pgRa_q|=;@A0DP>?2{d2V53x+2x$s6lo&IE=L$Ak&S-0bqRsrp5Li z+~aBJV6_Q1;RiV7KR3;3ybEH>-8BswiNfjSp=z2Z8wu>%Hza#ieLeox=ai?aNpX7(Q`f_p}c>xtx>+dZi8R^r(2CtBR;6Usx~k63Ktm3fGs4$0AaHLVMb(IzkC)0FOjeq;Y9D?I)q#)J<_H!~l8ZPfJ5;&EX6V+!%n?M-8Sp z=Dzhf4C4hPZWxZ8^y-5q^8o;8G8x7Pf)?(h4SYe2u z$)=Z&I*o{xce&r?Ix}&>8!z-_Yqn?$*1rY^59@s09NpgQ|KsQqwRR7>51=m4+0Zj8 z#I)F}rD_pVN;o@Pe|vNt%bg{_og**|q7hFDpa7WVl<#acYgf$Y5LB1G+(cF_rPF9P zAn)->YOMXl^%YnO{=R?=cIP;Z0|p(nD7fFPQ^43f)PDcYk=meUOVmhEhawi;a=a}P znp22Xn9!3QhcNrZ#kyZ-re3AFuYk*#i5kgSj`y;AAK7^M1_Vbg0 zWH!X)_afzx0~@S*3Zubze4ZKp=TAWY)j+ot2Crk?s+LL;y|AmX%<63tb8c~w)e6=I zPD4T^w7TH(8apr~$c5JF)OMmtVeq}Ch`H>vfGan<-$1!vNhJp|>&{}ZOyPf zmHo{*h}#etY`|2T5cUd&2LaR4)+_aVwd5$~Rt?MxCOxb-N6`eo;l*RuN26pipxchU za&YT1AZQMGbXI@HNiG3uaiS*L7sfsSOrqxRq&bIJKxSmW@rluqoW4&Iv<($7#D*)s zfGP?7Jg|~_TC4RyW(7`5GZQPOiX8+;11S>KjCJM5{G)UdYJGDPIl42P8E<7_0yEO? zTpElat2qZBEs zwFN_>>4SxSb30TDaCXYB0VEj3vUsTW__ zs;?5@32TN0{c1)Og9gZd0Qd)-v8SuV&g_9_-=(cqirZwWplA976G2*w5s3;Z14b=W z3BU0u8C-*EHJw62VWq=91MBS7shSHA1cmbs9X)EVve#UlQ1ki9lLQMF4f44jc+x6CVi1h0i-_7E#?%O?gdIa>$K zWeP$B0Xr=qeOn`T{oIpk*|`S4$2quqKWfF@DyCB*ZMt!f zgCU?e!0ipzpiyboLr47!*p5g7F6`>*@t(_!595a!#ome?80}X;rqgCjZr(OAp%0|f z=dLP`Y_%9M2!G&CPaP`2G7duP(8v<&KyGBs9cyU4c;aDQV7-ijJ;}gnbk8yN$*8dA z?3?NI0c)4xuMd7S!pNPmh#L*UX>JD5y3?1)M!*6&j&&@=npmx%v8WM{=cHrlOA7h< zXTh+QfO?rbliCcgg50T!PxV$C#mzZy z>at!YlR-v8Nzw}Y9JIaBzF{vOkVeJZWOG!JSUPjA(B$C;rTsuM_ zq+iLb-D)fhq;)elp;>Fq+uaZHEzsk181V4*jf~J=Sntd?%38%eOX=&26ReqiV-z@X zv!Y30l|<1*Z%hTuQ>+(Qc@j;iqKt=Q#C5jn`GWlbj{|j`r(q{VlCzQo2D-Dvadr6K zB}ZcIklVJ)z2i%pwJ0L1m%LUd?RXK;?=5sjc{#CcNGthMDTa>6?R0C?=`B*}U+y-x z?nDKAwkRypD16B-aWAb|Uc4~;4?UlLoZQJ#*0bkV^Gtv$j0ZfAp4>Nod8{>9k=aFyD$jTYL{G*{zF5f@>{Dc zGP=~sr!RM^@>4y4uRGS(%$}RMoMm|y)Sfo$U{_~neUJ={Z%g4br0sb!2DOEOkOa{J zE@c!36u2~2E8Dhf8RiOJHK&7V-CSCd2i;kbPDm(z zzBUD`6~r=c??ubcHlrZgV}-+Nb(3d}(xsiU( zI^xz(`TG~4gEgPuij;cxKNqF=P;$BQ75KWACU)Ma0%et~Scyw)H`w6+!#&&GNSk!*$7SVgJiA1P-1z z2`ttL3~Lok%}kVl?3HDZDDO@J?~$_MVLkNxAl7eXg~OaPT|5uQ;J@D6fs{ubxSRk6 zbqQi4O~KJO&74J4@CCc$35+GFS|(irPN)An)(Haxtl8tC;MkoZ1z*x|DJXXYj5KU* z+MY?J{rpu_UQ?qJ-_-VoL8};Q zxCj(dECfrj*1~DwC_Pc$`2`tKR&t*m#=m8Fji4FvYqr%om(EXgpEm_#NMfTh21O*p z;IzQ8I~d{;70@tB1x$31@sWaMdCcCO-7OT;rulWb{%Gc4o?5xX;rFIBprw0%IM@$3&>$t4{%B~1NW&|I66syP()6g3*FD$5DeXh`{a(1D$ z0fcgpXIPXA^gHk0Pxus~JH9-)Su#2UgfND=X>FZHr&DvZ5+1{~t8g4Sa}YKPJ* zl~~oN)M=8-p~qY|GoyxMw#r~~C=RwG`!#m}|BYU4Irx}oJ(Np4MagxZMZH0cMt)sY z_-#=lwl5XMm_1ndb>m~ky~q5Z#cct|HdDE2@f&JHe5}iU@Oh^&MJHH7uT)uw8|X^R zR=6@QRekg8g#AJ%qe)*`zZ52yUk*sTW$d7{GU&dJ0It?{tq<)gHB z{uHY%{Byuc3w`F=J^lR&)Rk6gS>_KtEz=*CF#gkj8`?#IGBM>KTQxK2T==^SuH)bX z06+$KX>%mn6lQ0D7dr9PCx~o`%|D@9v2?=Bo%Cer(#0`5&&a`>ohCK&2ODJL46~Wg z^-y0T1L=<1+p<7PYp?#0g=sO~4EY&mC*bpKah5$W*oASefYBM|ya`j6pQa4=^A{*`Eww!gSr>#FXQ|MZ_*+ooHi++1mEQGxce zF;-(4;wy@A3#He`WG_RxIZ+rc$-9kL!g-AVS>ru70Yky|C>WbUwGcNwt_AuZC>(!! z3L=h67Ty0faW{(Xq*o#;7e*!+jM~w#HGks4^OM(4yH(D;gjx15m)7#TyL=x~9BNay zSZ(KBzA65+02LlUMDE>Z&iSa{}+o-1P=p-Gd;k`82AJr z31q7l8+RL?y)mz`?jE++;wzh+I8;MXXa_mC%1&LKlP>UUNhSo^$tMm&8%NY;PH&UY zZ~Jxc-u0Uwe<~Uf;t{gPfz`Ve%Yxv2vj9f(J_&3u3Le+`eQt*$w^>zddlHFqpjY=~j^*TV2?d%o`wU zgqZ}tEX-b0>LtkVKadPhj+!D)K1@|F=VRcFB(`^-NI-BtpQ#`!ZOik7_<;lpdT>GX zpBH*S0%UstL~avf*iABlunt=BgI*UA25*UJL&GCA+Fk*mvS|k?kseD*G**?;zMXb8 zxsNz+R_`yR@&ah`Y%vW?3}qJNz66EWS0qY?nx0eiNwcHbsswFf{^&rNB0 z432Myu00#Iw);dReEr76Pi~cpPVmb>5?G`BsLV2Orvi0@=!yF;^ z#{r}R|h9w4r2mRtP`NUgI(_QrY z^0$X?AIXb6*SP)HVbG8L#pQ`|r}I7-`yd+t)!W(z_y1D81;JtJ>YF5Z zy)`vwW3TMjUd7UOgR1W4tF?DN?BT?^eWyUfp(~;iHm1mVt%=iV^VQaV_Jng2k1vL@ z#z!Z_^4qrlJ$8UgYfqf`7N4=2*nww&P=D4T9Gvdc?hlsI5Rc+PfB z=E<(YSlpl8bye1~*n~Y}v$Iww9)*_v4(p)vYknrHk0x$>J10=* zaUE+Q&UILYCuy(vWor;b%|FQt7O&iW;*o{KkM|LK#!g0D-`snk$#e#*!X@uFn<$_y zj%XTwiyh^<(xAS#X?Ps#DkmZ;!e+tX%?(yu2_p9Z1P0?GSvASj$%7r)lXkV#J~IYyzCWq^kJ*1HU~nEZLeF` zV!VE~F83TeF)aV7j0yYK;Xkio{bgQjt$Es=`wLWA`*zo=Up@B3g7hj|9PUl(dw+Pm}E!mgNAmb0R&o@U>8I=a>ZNw3|>|J@xiQ=P}PC zA#L?17f@l3f2wxwMufDSTtMU74(sq;{f8;3E zuVQ~%Wt;9aCjVE6zG=M|_HlM$;os~Co8mU6l25+=N;Ua; zZ6~e9NYVF<(FRIFO=?GnlP`U5=k>-2o7aM5{$~KA1kpSZcM1dt-VK%XAPY1|1&O7O z^N%%q6`BG*fI8NoS5rO7m!6k})>rweMzg{54!mAsA2`~7%>9868Np`p+OvAFtHMi} zc*{Mf*cKllohgezIOJ72>Mc-ECRrQ2^L>lIl9!s#;_q+r^4DcL8q6zG?DQy! z=sTT<({0&dnk%14|CKco_4wg?<@;ljS2TkZ0y)2a2VY7|=Sve^o0Lpv8$Gv>Ia2D? zWE+7%$O-#=N$I_*jHLCE_fvV6U-2RMsB6dqj=POs=ktm#6Iu@7?uFGz@$A;|j&8KIh=TWn9^&{##tNzSCW5{eWmbLV)QeXl(0t>toSC4zW#!D zjRrOOzFqWl92x^JzcBp6oWuDy@UlW}Y;g90xtwI{D&*DBn^k6f(Xocv0-2P2>2Px_ zHS6J~qRgC&#o$e^o`gtmNbJSYUUV;`^$)>&*bx_gt@E~)eY^d4e5UR^%5Q;}N$T}h zTQfF%knZb&TB_b7JRW_ZF7xCzw$EO3$C&$Fd8N;=-Yx_pGq2ofOp|hfltl@axUt8? zBXW+wzJU6fhdfeb*QW>}((ITpse_3B!XBk$l7mfzaPj}pEg5}soYdhw+e*}MbO>H_ z(I^TUEZ!qLWC|B?{63qS(rnK1ylC`9`Okd@cOHw{oov3fTu&QOoP1vJE_}cAe)g{# zm#rYBYdgrVBs;HoMZT~vBrKI!58TwW3*=NG1@7B^ODPWB}D)lI^ zQGLr>xChB!=U~@QzN6Oc3-tR73yFtklTkexbCh>_H37EMl(qOb-gHhji-)b#oA4s8 zmtWKcBB1(p2KpV|XYl7ydm}f*Ki+=p36PgbG-$HyeI`dLoQ9J$Ty39e!xgy4>c7 zp28?g*>b^RwE&|vb9`^u&sPj9#V|*c_V)?`E<&|_k zt@ri#lgSO%4y>_6h>C+X)1vA3S*D5$F)}b*1p^(SMg#|CyII!@yTm}aQyV|C?&hS?W3j2zaeN4_-%^`nzfaZEiu~jy^ZQhXsOII1`lc+= zjodA>rr*c>5AzQQ^b4xuJM)PDO|%nzk~rP*__xXaNBxeyu^U&%fjY$hvBc;9xhUwr zNBq~i{~t7E|8<}Ly3c>z=l_Km^S^=f-@y5A;QTjm>i!!B|33-?v*XV-L(ZKDVeNwR zKgpVoTzBItJ$&|m1N8qv@p5ldw587c4<~qX<;|pH=3@QmJVp5IR=V@CAT ztG>`(kd7yrD_Gej@&EpBr2&(_iRrs|CC{x>tMn^Fce@Lpj4p+hk+Uk4iH3z z^Q5zl;yTxl6<-aK(zz^kKr*${llE9&v@+8luiH^2KL07P6xq6Gdm(Dc=(f?Au8!+b8A1}sJtrH?UWD|8!+N?8hbTh zI#QEgi8klneA&I#9CrL?%-}5c3vKL4=#t{L^2_N2pl=p?yj_K=#r>Aec4LoAG*)f4 z9E-M-T>IH=hS%X6G(8+;$s&hjtL90r0vf#V?hf{9;)p8Q=ie8&XIx#AWS*3(4%Ln0 zN$XJuQaa5=cJL1?`sySQ zGL^?&`0$rV=I&C<1)a-A-|!N!0>*NwR#CU?jR`^g$bwX8cp$>>M|da~#&GMW-QCBM z%~FS}37nP=2hMR=bnU(K?Nx2o-O|&?@W$_6G!HK(8e%^9zpN-pN}? z*FWQ-cguz&+%`9(;paNe_D3Ev&1n2kJVNIB(O{RL`#gL*Dy|Eu;H%9@dw3Tu#_Ob{ z+NJG*zO_R_HI1ELJ>oAPTLrdg%9N?Gm6x*bo!G7ye?)xQOM6A37_jqMxHNeYK9V}u z9SC6C&Kz_Zu0Iex;~lxD<=yd=%VD+x`r%gZW)+gdrO7|`CGPDkVfb$~K4-$cC+gh3 zD5b;QT|Ruhd~l9%q;#sI+L09Qm&Kt1M>}Yda$M#X z>|ebdTu17&OLlnqv~qo#Yx31eV$Ezo729_ePmcC2F$HvlR`NYZb*;pL8#24+WCO=b zKpbEQqt8VVVZNh^?r}WgWhVn>D=L6pMD6ir?Nnx0f)jEa2>zE7DYCLQb~W7PK{8bx zNTkT|Yryc|__P%0JHNryTE5wrS>1qFjdG`r#qLY%GswKL(5G2q*BpteS%?E|>$JVO zisp^D?1uU`LY11$W-*b%W3QDaAg6RcvoODt&Lo?OFl!1Zi5|j7!I6zzi3%l33_aU* z^cZm^k+EOW{>}>QNVSb+Zl-r?Gpk=Gaq(6-2Jt2Gr)lJ-mdJBh$b0StOr>n?5AR%? zN#oM8w*#^*^`$;~e&%KUQ#Qog%Q;m_%8Qo9_=$1PH;9ZOa7a(ZdAlQwko%E z@RlD3v2{#tmb~vA58}cnA=(M0%|DVaUB^BukE(cmf9#>-qi`!lT>4$8F(>fS$RB#t zea>TYJIbm<+AUM)@zdb^C$79B>w6g~%(RS1YKwb159ldeq9nv%Llv6lR}RHLvWfk` z9?31{DX~j>YAdJUkKln5E3)toS5CieEADd{Usu2PBArWOm-EwqgAMW|Pk4PKN`>g( zAPEk0|4J_P(~GT#5K&vrL<&vcT9zzV?_(3ak{_yYr6BBVsLa0=7>QNcU_<-ux5xq` zCh*PATG#&_8y67}xQ(qC#xP+4pIWM+_SV=VnAUE66VyVF`V%9^m!fhd(?6fxaKCih zY>~}9;lQ(tkr=msd6F7C)|SThozS`LXqCvNbk8blE;N4O-B9?+BFq@Pm*MG%0^8@kBeEDhVAaCQ>x3o?*xTvJ*IGUah1*GDsP)TYoIHp(P6Dw zw4Qjy#B*s-Hnzq}!xlv568=;1iB*OtVlqv!$Lo3A_q1v5(b#Ffc;ws%KUT13>He(; zNg<@=L>nsAUK8cV7iCT7H3enjQaK?Q_E@4$NojjD2|Mo4KywH>n{XxtGr9_*;yb7J zJ=2fJ!O*1|EB?$DOEfDJ{d&IudAZHg)E|LJFj%ee=m_A46$G9xEgs5tZ?ZtSQ;w{q zF7auuEem3|8aJznny|4@(2_IkTQo7z*qlpPxwpq#RjA|6>?^w!FQH<_z=R{v-nYs= zrRE9#DCZC8H*WgtDy$2DJskq+3&@?`Lh-97r03_IB!ag>VReufY&ZaB*f!FpN3b?* zQ(XRfpw8h4h9g{5VzVPCGmx75k_~aPGFt5%UNWyZCD~^ZY?*xWYUT~tm7ocvMs2Xr z0yY@Avd&V_4dU_Ju;5JU?Af!hUlXYDDX{3n&ePidct~6GWiHdUfZ)DD_Riq-24Mln ztYOhkDnrrfT&c0-c{`Qku#{+f`{uKY@)R=yEXsCvUSRIvMqqWwr6bW>u+g8_Od=6> z5{v2`IhO*CA64D_eJ@wASGa}!m_psrxX-b`dA~`}7!lcfnIP9^O-;Uhj1z;sek6Jr z6riw55^toja*=!ds6++q`%?}JfqBT$k}yI_X0N^P{O61Gd|#N$hDB_##%W6L){~7v z?E(wmXM(%tuEBD41GQ@_Dv;{jiaRO16_@?SQCbU`PXa}C*f&sIeI{IMYJ#gEmdbpDfBhXy<{9q0Fn%#_?PVxJ29wb~ z_6RTHz0Y6fL?leO|$lAfj??^q(X#q>aeH0HoiRG_d16IPDFRuYqH zN{FX12+ojmahH!B77a06tfjL>hlLQY&TIf+420FUadB}+^9T{(v+$FB7v>Y2P5Tz^G$P{V#UsC9 z`vWtx+3;Y!H)gy`Zy&+@2^xopmrYIo*Nz#^{4Ki%=n3Ek&76E;hDE9kj0rrzvl8U* z1+I4k(&4eOwsPBf7&ZbsB?fH3;~Hf4OXuh0Y!Q%R=$iv{o-*)Ut>7Qu|H`$UI>j~l z07JnOpvf{TfqU^k?(6>bt8hOzgGM#5vES$6>gpPLRYLxE)(+rmwZge6Yz-2?2_6e2 z;cXT-wK5nifM+cMRfUE=b-8Qo#Uw&x;O#&GJ+00_01U#SW%sUQ-Q^0M?4a%3UPoFiz8n}~l{tRoT zh9aOBA9O4UsueDF7Y@6{5U>v9;)(a}adJHXE*|RKsm!1e4t9&b|9O|Yf!~kZ5oDMG z+|$V5t}@lj_rRSTV9wEcY7BB5*str>{e4_79{adfoFU*FSOmCDtkBjeRO{;XyS9$p zYZ({xa01;I^s=N182yjSe*;(8eN}~qRZk-@p%q4P+`YQ>{>S-@2|mC;k&p&%GJgA7 z`tf>~S8w0SUf-F@&;eZM)Ua`)-*VvLEd3AL8-M=-F50TrsRIfELnYzNm+#+!Isf~& zzJoReK=)NwS6jVZ-OrG424tM~Og6hi`MR%O-MW8o-|qeKf0+(MtOBQ;JHW+DeSLd@ zt3P{tdx7b1@vc1J&j0lDaqfGW8bI@j2{FKfM1aROT)lGT%GImDRi(WZKY^hHJS=wC z?%nDMISc~oz>s;Y3f!@Ce}6r2&pYt^psT?BD!@`@>dCGyU;!%Vn;9FFpD08C`@J})&xn-xXa9C#nx^;KI}3q^ OF?hQAxvX5prLrYSvWHZbk+Bbk5_d%sg>0#iy$IQ6CW`E3 zUuW!N9m_DoFf-3<`aaL`{P8@`@Av%v{T-hp>Mqrj`piJ z8jZOi(PzYS;6jJ9~NzlY9(ND3rIix1pio#h=IACvW87Dl03qva<5?-DqU% z4XXF+0A2Wt$XMM_8bayZIZ@xihb=9p^{De>+11q!4EpN){CtKe4}8brv@b$(&(ojJ z545EQ&8_j@+jJYMaGUQhnf9vaPX?VPy9VQpbi9=KkVZQA5B>ie>)nNC0U8DV$!CvL#uV{?PGid5uU0vPvXt-R6{KH!aG2g+O>roDmK64{@!~+?# zENsB)-m)PdmuzkhL}aE8_xGH_!snRwv?ZeMX;3e*OB@%X{7u7hH>Bk}yLL>-iN(-JP9P%+m?t`EB(U zMC`A0MC!TuggXVl+ZE=$3(+kNl4&^SYK)DjH8c;KWW%cJ4=0UC{_MW6a$ zXlUA|K^rV?)7(f|2<+kHSNC&NT6=$>`rdSVMx}3AX-P?2ikkCu`*HpF(}@Zh)23;3 zuU5;-@mJ4T6SmCk_wVlzu>}PMK~3?ptXUkh$)fmfAd_OdQ~cEJuTw=$HtgmwHfUmf zS`!F4f05f9LxY3ra~YPmGlS+F#8hVU6riRKDvm?@|vTUFDa$_9>55@l_vMK0!r!FN_? zB#qSOzuFg~X+ty^J!HVr^R~*-XVS>3rF?GWh?98O6W#+>o((_6!wQ4uiG{&~a5^g0U-q!1nzG&cLxZuoTK!FV51hXB&Eo>kNGh7_hD0tbEU=ig1s?Gm z=H_V_X1RD6l}df_;)O{sFG6lRjGDEz#^%;(n1p9;`vxvINb(PTyZ7h4?vWUkl*`Bd zkx?a2XQheGKIc0UvgHIJN{ML%AqazE#bZ}q3)Ik8g;M?QOk`)JE@vuLkIWUfB`ai{ zq!iqhJYOop~>l5lI~Z6XPkgi^PGAli_ac5kt>F^_#~ zGG}5niu9uSsfgOH_f>TBubjK1orRemU`G27ZbE=GtZ)! z$sppW6+P8H5Tlg{Yo*N!W0Bq6Lt?BoNgH~*bgS~%+-yOmrlR}+k%$Xs(2rJr--4!* z83Y;@_n@oMQDI#Vvyz%zR_xRiI;L!trs?qeDJhMp`o5kAF+sY9@bz5~qqakY+`tBH zykOeU$V2Ga{4%~Ftj~N!R$6dHRu&|Q4H%!>W$r<(xzXgGTn$x}9U;r5FnFM>pwqTo0hpiz+UiY?pSq`My^KY#V+Mq@UugKbL z^qZ%_#DwIh=Yg@dww5+8s95bD=@D5$z#6zzJ~jpB=?q}-6& zudPh&bx_pL!>#?4buL(IFlNrTD6uG2{uFXK34;!xDk+tP321KgwUv~TcZnx^cUxc> zJ(z>q2^wf0o{^8SMva4Gm4sC?#Glf&6a+j#I)YH*((|xhMwq%IKfh9oRxTSk@$#xG z%%coZ4#bB-ELIcsJ}XNpY_X(}G4Q3nwQBTP6R9~dh!{k}kkp7l&|u4PL%yo&bEq&< zWT?ZH0-Ndw^ZniwQd@3zc3+i$Q#FmSQQj7050ggE=P`r9Akw?%os%EZVdBor-0mMx zgAmduwmICI%$u!1#<4<)jG?mX|DN_{W`$A%JzFrF^_XC|UqiB`xp`8eSx$rkZ%H{giAzH+yLQotrM zUH7iK%y#F)+L2j3fe>_>_UbJwob7W?tDY}K4h3(N>1zlh-Z}2FqJ$TX! z3z1zpW|n2{BCJ1=I4@P#p$c#KMNm*shA4as;c#zp&y?%x>MHL6QQu~HnK6}jOP$@_ zrNIoYg$)3l|6WK(w0_FXRhvw>Z<=+kr<47kkAZKrH*gn%{=8@TBp?DCH7d3v3H%i*nCcE(xx z&_z?fzY?^2r5ab6xYDw@dirtbtG)R14UQA;ljC@mn^JU3Hry;dA@6m#uA1mNUlL*%`f&T3XtDL+Ul<6{qQU=1uOaH6#S*n2fYf zF{g5|d}mizbE4uxfYP{``Fl4!+2=(ARA` zGfLK$mStYk?G+W_d-!*Un7q1tY_d6VptEzO)6^vZjo$M#^syTB8>e1F(LaX-og1$6 zBmOl~72)ba>gd!qNa8LtIO5Xk>P}{*(%;kR^iUi{5yMbx7r(ZLLr_qX^LZM7^`?q4 ztAwJb!W*p{7<5uuOOomtz(o0H1kVF``SAgC4^@?=<0@?J1Tu}>PS4*%C@c}#t;r!-ClDLq|4y%mx@84OWua-pZ>^2>72fkHQ zP=C2Q_J7Tmkuekx>+YrwRnj6G@d#ywr@Alt;*y29J3EEx8(Jy52`Wo z!Zx{fB?v!wAm!qctIhLRQ$0H)gtq~4IlDg ziG6M62jQ-#lA@TwhrHT6zQiC~z)dEELl7excgo3a-`R=eu_v{r^u^)X)O{-9Hc5_I7rj z`DbhkB0;wq!MWGkhjG{Po5u)#`r`9{=K6{yiSl3Wwxu4_z6W7!?u#T$Uny9(Zx0C_ zI;2QS^=dCFM>*4|R04)&tXTYw_n&6Vij^M%HJtpLUMwd0&6~-e&!dwRGQJcQDJY_= zAUBGr`K0&~o@W`TcpQzl_PN4izd;p=*1{@;$vL-vfz;x5?;eC#G|k7o_w)UM()mRF zR8*@4#JQ3(U)RBJ(_wr6F*EC$>o0Lxoyp2HPAm0WdjIzAOlc_RB= zXQ$m{f$PXJZYv-P)P(a1DR9>}_ThtqvS((lSy-qzU9C;k5XrugQ{rvxG8?MzKKSiE zd9V+#p`vr^FUJ{3VcI-^?D}!I%A%s>NJXREPnXF<1AYA!S(%vuGo1iHGT~|Fhbqe| zDx@g)#eg2OlLpfE*X;vC{S}fap}k#s|ymZ6cQf6kaVc>2S+CbdU;aOev zZh9l*_TX)MM@KQhJGTKFHcW;fDvF+45~#U&Af<;uSXvu{Nh*EQYO&WL+ShAN#0QT+ zWE>9(-7Z5KMBd%La-I{}`&k_IJ|p9#GXgLyb38WQII-Q2+UFcDpsJ?kyWl?b*&cQG zjrRhfb*R!Z%g`lJ3E2v0eRk$SmQl(c?cSn^bpdT_YqyIR6~aDyPRtmL9gl68naN?( zXyaX9$+DPrOk&>{0IB9TfMS4!(gkW>9hW?1rOa9zJAfoq9e=I5s5t^8OHV8aFikhA zO`|gV{#6HuT2o_<;)i3CrbZT;Fv~%~fPfiOo&7EQe&bwUJ#)@E8qhZ6j?9i}m@xr$ zkq4tSsJejCTXPLk`d5IzAJSGPB`Z3&yajAP)jjeMfP^~{JNBhsG)>jJ@t|{ZcVAyu ze}Adh^mg$un0vZM`Ucg{hFvo^H#ad!58e`T=)!Tbs zc2Y`6$-T9iPVVpO?>yrKi_p+8>g?IGE9c8yfCbA1q?U)SIy;kKKJ$qmi*4A( zJDKJ;ItuJGQ85eI|5YXIvqODB&_>0~?CfM~N=JM99&JD7x?7^e98kXrS+Nu)q&o^_ z3Md{$>1<95)Q{uVB#b>d;4?Si+q>b%CR?eZ-{PCcJ-Q#n4zK_qkxI2wQ@4y|=}j}Ul)&X>2-ljc zor>a-u4la=Y`D1@PRfT1KqppIqP2P4-0~q17J~d%=B|T8KA_GewzNRQ+zxg{Y(vQ1 zgi%@&>Bhr%h@b6ssK-1;=zQX5l#E5zrrrTqOZ;e%+1M>ty&xet_A#Rl@@WoBQu;cqUve{gaZC5+Uh2ytq+G`)kP(hxeZ_;r9I&# zwI!nFI`WbWu?%zfkbm-}s`T2thCftaG;XTg}$evsk z3{i;R{?V%fhtmr3*yc&EqMR09m&wq+EP~lw;@lDl(%()?+|MLP5Dk*DP0aJd+wc8+ z#(T3c_yLHOpaY-h5pPb_P$NB^DR*Vr2Jy?vV5%rSXENMAuP#Ga4I3*72i9Ln&juP^O)6k=~Ef(tRsH5ESVXJpVTz{N-TRCP4+>`&3so1;V=Y>aDuQe?=X3 zs%=FiBmgiI&Od-#%d~aXlT%3PXh7uS)0<1t zm~r^hdJ=B^`4?fkT~BZ>i1QYJ?G3yZ{M#y9wOAlls}a{DDt+cpuX-R533*%P@V)dY zJyubtj-bv{-6M$xFQ(+*&~_b+X(s4rTxVdxeUy8 zo`4ox8{uD=Syxj`QbFwTFhDn={#rc4GeGW-j?kXfKuXMEStR|oBu`0Rqa~nJ06&B7;PXiVi zOYvn+k+fJ&lY_BFw|y9^Ju+6`-eIxs3xsORQgsab_A7r_Leul(LW@B(4N&iKDlp3? zTP&ILM5e>)%-KE?!MlfL<2%#@xM2M|fAF{rvfO@H9=n>4L;c(z@9pD5@ahm-p;E&I zPUAK+kmvzRZ64_HjWYKk)q4>;&HUP;+kEHKnA4`kcUuDHzSOfOkxUS^?)-eR5YRKA z!y~r-t3EB5-dBUh;srg))gX246NDuC48rr%>h%_671Str#J>X6UCsFCR05`!4_EEC z^pLgLmc}PuH6eqnm@CrPfoSiRmF(GW;hd5fG*m;vE=3h$`kD%MiL*mP_Klf1Q=lWrpH(u}So*Q|A6c6? z#Sq>>BkbxC(Ri$S>%hI$P@W{rVa(G%i7Ny z>;^%);9FjL`Uqg~ji0ij+r{&4J-onU59^%Ww{xi{J=@~PE8m#-wH*+x{fy>E2%2&T zCgk01PFPC9`CsH2`BERu@Ws%g0VTtOEPPw6p~zNDJyIjD*+atCm#sb)wm566wN!@L zm=>ss&|Hz^j8J=U|Nco2^2&6*6?)!GJZu2TYE{Cm&kNKf5mp9zY|vdUHk29AVaY&> zn!U{ntU!=s_=<PSf&*&V78EnjssM z4{R?z9Sc}3CxV>HTqnZ4*i%Y?@-sCq0c6kj97c$CJ!_={VTB~k^_xh6a?H5K7=Q;J5wVpsA8o|Avqk9L4Myvb5^wNyI7*%EW4qE$wYj)dS$Te^cLSrq6QX zS(nKxk}{Un0qnZwnIO8nco;xcr`(v^|a_q zX6B4Ks8jh+T3Ee3@o(iF0(eHgb7LxC)dpJ z?Lh_@w@^hXa4A@C(LZhR5avAqT}^W%b>;O_qZ0BEGOPoMtja>t9AWUiYd zFA5;OudJ?`-Mon%;VTRpkJ-!a@;Tb`b7u`1&CX2nI;jliF>m$_7W4-%_fZesvRGqi zavGzL8KSdIl$0m9@RgD37b>Yh=mEE?x^y?= z7z4&PZX5%ZU(w@csD`cI&Yue!2)jsSDwo_-#sH2{4>+R>!i3V9Gl2hxAc)J9ZIU1Y zX`;wISgM%s&?*jyB#=QUqA&|t^qY6lcV*m1P{{HLEq0AT6WA5x4XydFrb%xz)t7$c zECiC!+{pDe5Gqq!TZ5ohd?kbKUOpk@urvikazrt0J-#KW48r091g1?$t>1ulhoWfn zvusR|(J`H&AD`^gpACz<5(*Bi5izF!$FkVAH!^K3iWcVF>lt9BvpvYoaY?O`pbg%i z{7e|hp>Iq0$cHfksJ#?6N%>yCDgMPj+6z1&{UMf@kp-PiTQ7@*r@$zE$OS zCA%IGSKgfLs5%5|pp{2Fh~R%<7y9Ri&h~b;q721s0d0lEK&XtMx-Fbx^s49Ga5y9p zTSI!W+AC3Hua#967TEJnU43&=NBo$=s|F~8?kwN+1R*zbDwM0S`(#$~N@-d31du2NC`x zH6(qQoAs^pgP`;TW2$KX`sHHTbE#^iN4%{YbxKUPK=SObDq8hIa2uL%_LVsRy!fMvQMod5aCN|I7(e^L4`sX$m>vM zOGCR4xs|c&igfvkN(hQM`S}Mw2+5W&2YdBB3;eh=CvfSHpQalid^(i%7+<0pU73bS zV4bKZ8Et7y0A>)Xfu;s-j$uT!-;@KxMO z`}5hEnbd%p={5{gIzK=ENm~H)?t=#p*wfN_?G7{t=~p{@8j?E*T~PiD?8@oFQPhwD zj9H?(*J4(R&y2L~dJ#kob2Bq{!saG)784{mQeXm5!63%0Z84Zh92J&oc-64$Ed!XP z=Xwgx)}9R)0gSAIfK*yC?>`=6I}|YMW^KK}YjvDRozsiIe9UIO5qvCt$2&3&2TELM z(U?FQJ7lP)oZiGg$9QcMZH<{vqhV=7;$bOjzA32IzNn}uW6knOeOvlWfpsN!Yd@Cp z1nRa4s@^l~cB7snQcQ-F4si0y;$%a~# zJ3A}X4Rmo)_{3uKNx3!Gp9@iu=G8O%&29YsK`w*R@}afN1Ad*4$I&nL2fOd{OXxFB zs)?RBk;eZ&Sx$Z#VUPB==}axQK_FCY;KRBNr!JewTroB6$cVSuqYXt0>B(i;;3W%C zyy&%Bo3Su9{DH&K;0Osf#?V=O=$rCo9*ot(zy|%(%$ft(DnJH`t;&qEh2@$=K@eCl zn`3AovvEc=TaWMl3m6t!YcW)7;Ol+LyXS1z$S~(Z^#&Qu_69*rNd+Mk|GWpxE2Cw> zvlZ+~1?oT_2<1ZVezo8aL9-V5S#b+e+uWrFnrwsTy?d%Rb8Q)AuwFE$KTaV1o00%; zk|E*jo=*#mF8C$C4~J1`)!b-a2wHdnOM%8tC>uiy>>x!M;m4ez%&@>!Q8o5LjYvtQ zMbxH=@@s8A7eZFCEftIgV{(%#*d3k+ujbaPs;VvrHSL(ATwAoX9lqUTOLcf0c%!Cr=N-hmfAf6?4#(<9V?yaFC&@iv7LR(jsF)>q zv|k9MmD@ZcvaID;sO%^a{A%$^)r%im-z=!yTq`#juRXPR>jiUtF|lp4DaS0=cB7vd zFl$MS>05qgUX_Rc^kNOoC&0gDrvXPtW{Kkqfmj0x9iCisEsOC-c&PJH=aDR5p7gRZ zT0td~1{3p3LUDNY6A*1zyKw#+^TZ$sm|+6sirIQl0N36>KmE&}R}1Rs+(sCDM0GV8y)y7cs_KRfpP$kGm-eWm_Eh!0t zQZzVOj5Ds=GM9UptF|m6J_`zI+G%ONf~J zdKI_1D}E?O5!rdX_!Sk$+IRs}CMx}3=hn|qAN`kl35jfDe`xB$T9!@QsK;zpni{G2 zLxg%F=3N@t_JyM@>WJ9g(0YY`+9K@rynhf~Lj0h_vIkaHo22GagJaR1hF5zFtEo9j zNM>NGxt|U=0=G*Tue~tuTq-;>XPytXr zfLj5Zb>i@&OvrnQ1?2Ve&jLwf&wQ6fssMsjRaLA8fihQ*iUdJQxbmn5&{o3#-&V{2xmEXO}8H{4#Nc31+MJG7`0yh%<4`@NIl)U67;T;g$BWeXzWBN6gTf@vZpfyvGHjM#?JpzH^PkINr@nKG zNd*SJ>wuwmL;mpE}s1g#N|lLsm^78Y+nMUu4PJ3844a;?x_$gcL3TO`v%8}wJMnr#7G&q?iNU0m6AX{7cPwa=) z8PNJV0&qT*G{IwY`$){EPoMk%>YMl@+bJj;?%Q)wf|C$FM;q6*24i(OA@+fdp)>il>ikpflKaJ?A%zu48y=zgZ#!W zW!jqu|IHs44(edB-aSFJ_)~|@ocb8#N zECxTALKhswHas9>(5Icj*}LF3??MrM>Aw$5M!vvaF$*;Jyqp}iLWtWKQnO*qnD45- zrJBNwz^rAl!*&{LQ)_`pWGvR=`~dGwRDB1>4-^mJIZeO^@!~}_)YF&WSTYq+-Qa)I zf*rR>Sx;P^AwHfRVcju3U3lS)X|2tUhNS1ld? zLE01eVOnIp=*B8r3f*kex?yXJgL*AUOt}}aLV@6A10D#Kr&!$bYmDsV@;cT3#9F?r zM?RbNLBda4`%w=b8F0~Ug0)$T7>c22u-Cpq-VvPP<9&XU`_?J9HVHi3xM}c44DJ7Hb#-?xBtftOl>84LB0uL+fi zgnj?BuHj$u)(A|@S&G`1(|m1A6h&iyMk!&}!8yD3J3{mNOlVwjbJkuA*q!0Ma9x?` z3w$lV);{ecM-vSkcgepz;c;eLh{+u;aCCU7YGm8aHbWi&nG-;6yXLu}fiIpDW5DT-kDT~@{ys#YH(+Cl zJMT=wf-~#icm&r~2S|2o58v_6&c>G65r`l9V7&SR#qz5eY>RxInbhkCE-qkW3-JTP z6PR79rC(o#dPcFA!pxWNPYJI^t6e=O zjHuHGK{?YQxxDCnKL{MPC?6oew>uns(#dX4XXlMw=K#D@!#1mN-n2)k@ z!O+&!JrOLG&ku>%)_O5a-iKOAPR_U_a41Wr`nkd{=WtXM!xAAU`adSf33yb2_QzoY zy9)l*2Z62}bpQmBtoQHVe>}R)ZXbLK$g=8wM;#2lhwu*%y9>X?6ZwvdN(%rrkBog> zo@9-Cd`KCLH90wNm5|>f4=Osz;g7w(ngOnzFHTL9WHN&jRmHigb|Un#5;)c_!@sO= zT)V_Sf}`p7?M$d_fz9Ppc6NSV-pVqMUCq_34zT|X4Q;5Y(a3$puqWf}>#KYk%Q*Tr zaMhW{t&Dhc=uHmqJ(*$@Q7fbzHmt%0X2J)w&ue@f2_~aYbz`LTH4qZQ`Axmhb=<`5 zZ$#H3q*8XV>q$oU>_QaIehXFn8kD4urn7DIo@%FmGNxmxj>dNy( z#ETbXrz3*5cs1lyUY?zGkvVhTUvO>e!}t2iS7LE*_Pl^^Jf}O2D)-{WU8MXD2c4C} zJ1X55Ns z)=LT4>0w)mtCF*(G3vZq8pD$9Hl3R8a)#3hIGV6r^)EYSPy<((CS_9AL>lIn9|pSe!!b9~F&X^vaJ8zi#40}-Mi zKXumaCO`k_k;l#x`Br>Z!CO7n1xte|8OYs3xshPR8s3o?xJ!Ke*U)3Vlg2K?emuhp zCZB`#-eUbrbD*3kks2EPN-)5PdcdMwDBRH_egB_B-;#NTJ>_cXB6r2TQc+tFc1If5 z`_EEFIyi0lDm+?uo|fC67upn#NL^X(LB>p58qjv!fh&DW=B{kCu2E6^ws-?t%Fp5F zDeZNhG%{O;|5EtO&+_vLF2uWi%U<`$kF`irBRb9^gUa`$lxd6y!wQE(B)_~T1wS{o z6??oDf!8%(bDDWsww3?wDqr8hWM`>f^+iFcQIuu^Ka~-%v_}hl7OuugdSb`AR99^?gRyy>34MBYJbF zxOn18rIabUxZiz0$qm3leDhT|fTCW2U-{yI4&xh1sTB0%sMfyQ#v36!~3{J(@H3G%K^*2`g?a zjVTTMV*)~bY6!Q!>)-ute?DJ28YFpDJ!wm-nrIIH+|ea>*;vtTa>m)uX9)3)m)j004(I_~|lh%my*k;>@O59$MN!62HfO1ju2 zP~J9ACl@9b8?2mc`Qq`;DWb9yzfG?Q)t0vm|j@{D*|CrzL`TeUOB;=F}snyTrDrmq*=OLir9=1w}R0q5R-} z_VX@Q{nllNBVEP45`_waDJ^`?=I(^GWS*^yAK%cf#8I66NRheq_6G1}i@9Wfvrrw< zxPrWbyX(F@V)As-(SYaWV*2k6ULxBTkEbz3JQKb2Iu51}@?Yl$Q$d&fYM%O#<=in3 z|GY<{1;O0N1~MT%UUn@jE^yc4xLN1QLJ0K@s@_K#F2B7*3Fp_Cs#kpOW3lEzv5(K~ znyVh|*0$s@yl~WlrS3&n0vqi;Rfjw-Xicn@UdOa}*ag}2h^o5NZDzmM^)$Z)Q$8YF zM@zQ8HF-nvk44d8S47~-ZUkby!@Nt~BjDF4DVaC5$#K8e!&NmecXiSN$Enb}>ibfe z;B8`f*GG*(FWN2l+2Ym~`JPCGHr4L#TCo4y5?8JFM;)R%#1!#+hdgG}BFcSu>@kc- ze}n}Ph`5x3iuIC>?tfHDk|+Weu-{1DU(Ml$58H2m|u)V~2Q5!jB=#-@~ulwzW0}_VxK)ACQ->b8`J~1!1gNduic^ zI@?8S@Xxwr@bhYXm|3%Y__Dz^u^i%%V!_m*z~0Xd7ZCB>4PY5@$TE-!rpN@hqGASD zD;=o00Xfc*Er|N$=nHRuUt)&#Ull|kE;aqKv5wyC+R(lB$*4-%Svt$cHH3j#lWldG_qBD(H>k3n|1)!yYX z>bJ`sASIYc1Sc#vlZ(SFvussu#t!Ll_$@b9ho!sTyayux_6f`vjgz(>q-PN${QsWy zxYH9Ut%otl_-jSEbFO)m#B`iz(k~tt>=FE137E)BXk)gxHhG77u{-3>jpO1WP56&i zkD+i7do{6orj_AQl!f6o^6C=P5ja>;XKd;ZjzmRNvpU(bo8T3e^TkE1+c z!?LPl7bnh-dlq6&YyG{$ktfjsW`wOCDo@8$pwq{)Hf9PLv zGuvBp!Wix)^+pN7{kP6>?C+&I8%(GBo(sL;v!PQ#+j9EG{9>u`eS~!ZDO|IjipBVF%dYj6l4!bR(fM zL~HK-h5i#KO*-FB>N5AH2QR$+BXa%zc01r~JbbqGPjx@_u{OW$yqo-&_xMGwDVwi~ z1=HvXE7&{#*^=*M+)O>W*K_=4fk6he zAPJh(R81^i{8(nSN6$xhyDe5+5)J)8%@Te{Eaj5ln_oEac5AEqaGeHANs3bl^S9xu zeMrC4clRi7NEzny8xxrfc@YBax0#ULO@|#B@VCS58KU^!#6=x^3m@K6wX$iT)-qmtXLfprJHr|^mB$Al}x>U@EA zO`X=XHVal?I90OF=iP^_qE1e`X0v%>x2eVl*pq<>d74{+cFB&ow&$spDejwrwh`MkwkB}t62e$jCGEqLPV&I-KCcI?3S0Cuzdvy+OZaw}qec_!aYgZ$Q@e;ReZ`Sf2z*3x@$m zM)GL{LeM43Et=0aMtoLA(rY5>2H`33niXe6t%9=S>&37ELjtE&cv1I~*tLNY&9IfN zfy^z4^9@~OOSOCY{;Tu$p4h#9zlB1$s}Cw~1l2@{?UmlCs%b(EZmMY9dWXyJy7YtX zI+F@5m1MEmKOkIvRP^p)q<j}Q6%e)yTo$>Uf2_q|bw z(?YdkIqvkOqig}o+kZ364I(q=4%!9;qJTY!4%zVHo(ntQYvgAj$XS| zSL4B#eDra|sb`{r?pU+m8P*&r;GAuknp3R1RUr0i&aF1JmEhI;raKY$#|*Q1Vi#=E zl8EbXC1uX9r9HNtuxeEEN}`0+NMLXdhZ&pOpvX^q) zp2uY*6_*-$PW5a)we874sxe6YCSI1JO9!sYTT@NKVJjk}J$pXTr#llPTM*12tZ}Xb zw(=QB!zLYX)&h$$1{>X#vL{1zm=?rZi7?652c+a?gz+K&VD)9A&G1_107@IDSm~GC zksqyfP8!~nOZGot6pnORTOOhoWX}ewx>!P=t_}}T;JgAj@ob%c&08M zuwDW8(T2vt`WSfVN1mSJ7YgrjlfFz11tv5rfq@Z-N@Z9>J~%tc?_p%Yxnk82*LWpcvCt;><0 zgDHcJ_i(p@7r%4cuI88rO)93PhPb5b6dbjks2s*SNy74T1@W|jvQK^PXbwded14SB z;k+1z>4$2A92Z8a?InuRwUBTsxb^-cB@e+qP6NlEi}qKNDaP46!^do{uF;9iME{-X%QlGOVq&u-VHRka7t(~9{Yo&B{{OQQSmUX@PXz4+McOvypHKS{-Y zdU4-jiu&)nN|dX~9{WMMH}Ungu= z_j0&1IHQ!dL9UcdF@in0+@gMVu+h_&-cD*$TNpH{V#uGJ5-H6PZCzwnP+wew?GBXL zH@e-Y+%u8IvI#umDgJjw2NV3?W^$(%L?Fc+UojqWBSJjml`6u8d+ttAYxGm7(9wYg2om0!=EHG*{q+;P`e#t-Y%tN+RTS0*&|#}3WJ9aUm$ z_%|=d+^Ti3ske;HAy0h7hZgR_;eSWf;udJb<$8n+PW^Z6D}zk~4W`XSIAaOSQLvq# z@h3WXb0h*2Q$FjcpmK25_qrUX`qPQDt)c;UkHiSxsA8}7j`UAQ;lMn+ZtPgGk!Pyf z*NA$kWaPoF57-}A4JR%I(>u~sDb0$QRdARxh%CkegJ8+F6-zW}k2W-+LnO-{X^B1+ z*CMHu3Rm638eeXDc*`Hs_~jkd9xeU?$)Ux|t_>)q4{@19CbbM%F)hMA+AJOp*a6FU z5FDb0Va!UVc(udM{T$+#yW71~1RHKoy>wne34UevjXFbQ$hI<7Q<1%PPkiNNZlw0x z%(qT_PMQl=fg){&+}}?g-Z| ze*!s)b@j=zxezDfnrE%|9jwl+31uZxU9GH~stLFv*!Ea(%^ZL&HBWUFUe9dAYORl9 zu>>vp2dxM0?gThk>bY&8jjip28|3H7?1C&A;iA&kwr+wiFAP5B04Z!q&Wewux(v4e zCk2|%OpD;a9Guqc%f}QKR_7OtOTK>HTwoErClkSX_tcg}?|}xp!(kowhD3B!cy6wr z@H5EsSd{ereUXd6sqVVn@+pY^$4uX$b#_k+UD`N`f&DL3lF;!z4Pe0z8r_RoT^oyz z5YVLmiH74fZr->NIjW)X@4;bD(;wV!QFcqkU9B+1kJMr}Xp7IITo{v`L?UruAgMgf zOBHru9*^C1Lp{71YNpAQs>i4I?AmN5Rdv2A(>Vd?R3he1w>E!T$(YZv9Ni-(a7Ki` zHCgdxT`1zTaji^*=(ih!?%KV^har*L#F%2aWz~ZVLoY7Crgx`YFfsJ)tw}7DK|^VH z=e}T052j1QA5V#pCX3xo>HL*z-(8%Tn5o;Z1Q8+I$&2n9ul{|Fl^4KIAj1v@P6b$$ zT^qhL3ZFexl!%fF8WRt3c=++4`X*mAl@DT-at!v%Zv4Z8#XGqGH0aXnt|00!b8#XB zWTu4_w+I)`r3K3GM4Ugkx7v}%PFtWB3Q{6}nyzsqe1Eo?q%Fz0uMj*Oa7JEEP7xe9 zl9+c{g1>72@z+I2lHWedb%Li;t$JuWUk%!ak>75g zeA#k78F*%7k?xT{y}h^Kh=#2_VDGr+p4#74f`L6|nUA*Ec>y~RGz7P7d3kn`Lj7CP zC~PExU0Gn=pI%rH%MaaxU>_fZXw*|kbai*vY^1k*%FBayMiLBtKE#JQtz3khDs07r zBM_XNz98u$H}9%^eY}eUe{VM)K7rkXdQM~|OD88MI0<8lAc4>YZxH?j9B`od-?nLS z953+1pmn=;Rq5nOG9)PjJtP9$kZw_Ce(%PO3`G+L8Czg~$9?s-ZOeX~|82`Ob*iXZ zBjbY?KsQ@N0e7n;*NT7rnp`K&5bzD?QJJa0!#7r~3bgxn6}W~jG}-DT4+Aiw845y< z{fg=&%#m5i1A@ zTDkAz&c%h=xeOY>6-NwxUit4WSPOug?0(!4WSF82^4Zem%hUI~TTxx}j)UP8@I0Z0 z#gn|29!t#Iwtc(#)K79iZ)$;bh5`4OZQS3zZsR^~290X42yoZc47r8C0|;KflUv?; z4S13l$Zu;)toD|_zqfJs-*4ac+OYt&&I1}6c;WJ8V>j-Fz(XLc{~0s%Z~?6buJygQ zx3+fipNSs84WG$Y+j$rQ!4U@BhX>q&8dzgo06a)z?b^G*GEqVoXr&wQgv9#j=;-|S z8fTb+B>?cO&83&^esM6k^#ZN9I3@GJ;y+gwty}jOc)ZK6-&gg4XPce^Cmdhk2J#m- zZr{Co8JGwoBMle51{SHn^8jSO0vCn>JIxJ-7cXDF3_SWSI5;>wJUTSg^vzS?B5mMi zt5?93-VRH}!0_G+-0%cEoiiMGgb?sx6JQjFsR36n0m~_1o%qgw=`Y|36+pk(+TL9` zh4nmx!8TCh-x;C>OwgrM@_`w+ZxV^yk+6@{{rE3X;GuurEe_a@WMJ@g^>bP0l+XkK DtjGPU diff --git a/docs/runbooks/gnome-qemu-desktop.md b/docs/runbooks/gnome-qemu-desktop.md index 6dc1cc34..7ceecbab 100644 --- a/docs/runbooks/gnome-qemu-desktop.md +++ b/docs/runbooks/gnome-qemu-desktop.md @@ -122,19 +122,57 @@ reportaba colord. Sin eso **ninguna** activación por bus de sistema funciona. L `root:messagebus 4750`, y el síntoma de colord cambió de «permiso incorrecto» a «timed out»: la activación ya se intenta de verdad, y lo que queda es del demonio, no del bus. +### El bus de sistema, completo (cerrado): faltaba polkit + +``` +== gnome-qemu :: bus: org.freedesktop.login1 OK +== gnome-qemu :: bus: org.freedesktop.PolicyKit1 OK +== gnome-qemu :: bus: org.freedesktop.Accounts OK +== gnome-qemu :: bus: org.freedesktop.UPower OK +``` + +`accounts-daemon` y `upowerd` arrancaban, seguían vivos, y **nunca adquirían su nombre**: los dos se +bloquean en `polkit_authority_get_sync()` al iniciar, y `org.freedesktop.PolicyKit1` no lo servía +nadie —nuestra receta `polkit` es `libs-only` a propósito, porque el demonio lo pone arje—. gnome-shell +esperaba después 25 s por cada uno. + +**El dato que lo resolvió no salió del log de los daemons sino de la LISTA DE NOMBRES DEL BUS.** Ahí +estaban como conexiones anónimas `:1.0`, `:1.1` — sin nombre bien conocido. Eso distingue tres cosas +que en el log del cliente se ven igual: «no arrancó», «arrancó y no llegó a pedir el nombre» y «lo +pidió y se lo negaron». Era la segunda. `gnome-start` ahora **espera cada nombre** con +`NameHasOwner` y, si no aparece, vuelca el log del daemon y la lista de nombres. + +Lo sirve `recipes/arje-polkit-compat.toml` (b3:03e0a86f), el tercer shim de este tipo tras +arje-logind-compat y arje-sdlogin-compat. **⚠ Autoriza TODO** — es la postura de sistema confiado que +arje ya tenía tomada, no algo que la receta introduzca; está escrito en su comentario. + +Dos gotchas del empaquetado, los dos medidos: +- **La política de polkit ya existe y NO alcanza**: permite `own` sólo al usuario `polkitd`, y el shim + corre como root. Se agrega un `zz-arje-polkit-compat.conf` en vez de reescribir la de upstream — + dbus lee `system.d` en orden alfabético y las reglas posteriores ganan. +- **Los ficheros del rootfs fundido son hardlinks de SÓLO LECTURA del store** (0444). Un `cat >` + encima falla con `Permission denied` y rompió un build. Regla de este script: nunca sobrescribir un + fichero que venga de un artefacto; agregar al lado, o `rm -f` primero — y entonces se está pisando + algo sellado, que es una decisión, no un descuido. + ### Lo que queda, y ninguno impide el escritorio -- **UPower**: `gnome-start` lanza `upowerd` y **verifica que siga vivo** (lo hace: «upowerd sigue - vivo»), pero el nombre `org.freedesktop.UPower` no aparece en el bus y el shell espera sus 25 s. - Su política D-Bus está bien (`allow own` para root, verificado en el artefacto), así que el proximo - paso es mirar el log del propio upowerd —probablemente se queda enumerando por gudev sobre - libudev-zero—. Es el indicador de batería en una VM sin batería. -- **colord**: activación por bus ya permitida, el demonio no llega a arrancar. Es gestión de color. +- **colord** sigue sin arrancar (gestión de color de pantalla). Su activación por bus ya está + permitida; falta ver por qué el demonio no sube. +- **PulseAudio**: `Gvc-WARNING: Failed to connect context: Connection refused` — el control de volumen + del shell no tiene servidor de sonido. Coherente con que `pulseaudio` se construyó **sólo cliente** + (`-Ddaemon=false`): el demonio de sonido de la distro sigue sin decidirse (PulseAudio vs PipeWire). - `Missing required core component Settings` — es gnome-control-center, que no está en el corpus. -**Lección de las dos anteriores, que ya costó una iteración: un pid no es un servicio.** La primera -versión del lanzamiento de upowerd decía «lanzado» y el shell seguía esperando; reportar el arranque -de un daemon sin comprobar que adquirió su nombre es reportar una intención, no un hecho. +### Dos lecciones de método que costaron una iteración cada una + +1. **Un pid no es un servicio.** La primera versión del lanzamiento de upowerd decía «lanzado» y el + shell seguía esperando. Reportar el arranque de un daemon sin comprobar que adquirió su NOMBRE es + reportar una intención, no un hecho. +2. **El log serial persiste, y la imagen tarda más que el polling.** Tres veces leí un marcador del + arranque anterior y saqué conclusiones de una VM muerta. El orden correcto: esperar a que la imagen + esté hecha, *después* esperar el marcador. Truncar no alcanza si la truncada ocurre a mitad de la + cadena. ## CÓMO SE CERRÓ LA CAPA JS (2026-07-29) diff --git a/recipes/arje-polkit-compat.toml b/recipes/arje-polkit-compat.toml new file mode 100644 index 00000000..4a72768d --- /dev/null +++ b/recipes/arje-polkit-compat.toml @@ -0,0 +1,51 @@ +# arje-polkit-compat — el shim de `org.freedesktop.PolicyKit1.Authority` del fractal. +# +# POR QUÉ HACE FALTA, y es un diagnóstico que su propio autor ya había escrito: el comentario del +# crate dice literalmente «apps que usan polkit bloquean en `CheckAuthorization` si no responde +# nadie». Eso es exactamente lo que pasaba al arrancar la sesión GNOME: +# +# !! bus: org.freedesktop.Accounts NO apareció en 10s +# !! bus: org.freedesktop.UPower NO apareció en 10s +# nombres en el bus: org.freedesktop.DBus, org.freedesktop.login1, :1.0, :1.1, :1.2 +# +# Los dos daemons estaban CONECTADOS al bus (`:1.x`) pero sin adquirir su nombre: se quedaban en +# `polkit_authority_get_sync()` esperando a un `org.freedesktop.PolicyKit1` que no existía. Y como no +# adquirían el nombre, gnome-shell esperaba 25 s a cada uno. +# +# **Ese dato no se sacó del log del daemon sino de la LISTA DE NOMBRES DEL BUS**: una conexión anónima +# sin nombre bien conocido dice «arrancó y no llegó a pedirlo», que es distinto de «no arrancó» y de +# «lo pidió y se lo negaron». Vale para cualquier servicio D-Bus que parezca colgado. +# +# POR QUÉ ESTE SHIM Y NO EL polkitd DE VERDAD: nuestra receta `polkit` va con `-Dlibs-only=true` —el +# bloque `if not libs_only` es justo el que pide expat y duktape— y la decisión estaba tomada desde +# entonces: **el demonio lo pone arje**. La autorización real del fractal no es polkit sino SO_PEERCRED +# + capability grants sobre el bus interno; polkit es sólo la interfaz que el escritorio espera +# encontrar. +# +# ⚠ POSTURA DE SEGURIDAD, explícita porque no es un detalle: este shim responde +# `is_authorized = true` a TODO, y deja traza en el log de qué se pidió. Es la decisión que arje ya +# había tomado —el fractal es un sistema confiado y la puerta está en otro lado—, no algo que esta +# receta introduzca. Su propio comentario marca el camino de producción: que `CheckAuthorization` pida +# un token al grafo y devuelva el resultado. Mientras eso no exista, **cualquier cliente de polkit en +# esta distro está autorizado**, y quien lea esta receta tiene que saberlo. +# +# HUB-ONLY, como toda receta con fuente tawasuyu: el clone va a `gitea@git.tawasuyu.net` por el puerto +# 22 y la gitea escucha en :2345; el worker efímero es secretless por diseño y recibe +# `Connection refused`. Se muele en el hub. Ver [[rootfs-laptop-worker-divergen]]. +name = "arje-polkit-compat" +version = "0.0.1" + +[source] +# Mismo commit y misma rama que arje-logind-compat: `selfhost/arje-zero-attest-lockfile` es la única +# que versiona el `Cargo.lock` de la raíz, sin el cual el vendoreo `--locked` no es reproducible. +repo = "gitea@git.tawasuyu.net:tawasuyu/tawasuyu.git" +commit = "98db584fd28d9ff2bf34c9cf7d7db2e1de0b3fd0" +# El monorepo commitea su propio `vendor/` (la copia parcheada de smithay que mirada necesita) y el +# `cargo vendor` de hammer lo pisaría. Ver [[hammer-cargo-vendor-clobbers-project-vendor]]. +cargo_vendor_dir = ".hammer-cargo-vendor" + +[build] +compiler = "zig-cc" +target = "x86_64-linux-musl" +link = "static" +flags = ["-p", "arje-compat", "--bin", "arje-polkit-compat"] diff --git a/scripts/gnome/gnome-start-qemu.sh b/scripts/gnome/gnome-start-qemu.sh index 086d3d58..485de982 100755 --- a/scripts/gnome/gnome-start-qemu.sh +++ b/scripts/gnome/gnome-start-qemu.sh @@ -214,6 +214,18 @@ export XDG_SESSION_ID=1 export XDG_SEAT=seat0 export XDG_VTNR=1 +# arje-polkit-compat: el PolicyKit1 del fractal. **VA ANTES que accounts-daemon y upowerd**, y el +# orden no es estético: los dos se bloquean en `polkit_authority_get_sync()` al arrancar, así que si +# `org.freedesktop.PolicyKit1` no está en el bus se quedan conectados pero SIN adquirir su nombre —y +# gnome-shell después espera 25 s por cada uno—. Nuestra receta `polkit` es libs-only a propósito +# (el demonio lo pone arje). Ojo: el shim autoriza TODO; ver recipes/arje-polkit-compat.toml. +if [ -x /usr/bin/arje-polkit-compat ]; then + /usr/bin/arje-polkit-compat >/tmp/polkit-compat.log 2>&1 & + say "arje-polkit-compat lanzado (pid $!)" +else + say "!! sin arje-polkit-compat — accounts-daemon y upowerd se van a colgar pidiendo autorización" +fi + # accounts-daemon: el servicio D-Bus de cuentas (org.freedesktop.Accounts). El shell lo consulta # desde JavaScript vía `imports.gi.AccountsService` para el nombre y el avatar del usuario del menú. # @@ -254,6 +266,36 @@ else say "!! sin upowerd — el shell va a esperar 25s a su activación D-Bus y seguir sin batería" fi +# ── ESPERAR EL NOMBRE, NO EL PROCESO ──────────────────────────────────────────────────────────── +# El paso que faltaba, y es la otra mitad de «un pid no es un servicio»: comprobar que el daemon +# ADQUIRIÓ su nombre en el bus. Se le da tiempo y, si no aparece, se vuelca su log y la lista de +# nombres del bus — que es el dato que dice si el problema es «no arrancó», «arrancó y no pidió el +# nombre» o «lo pidió y se lo negaron». +esperar_nombre() { + n="$1"; log="$2"; i=0 + while [ $i -lt 20 ]; do + if dbus-send --system --dest=org.freedesktop.DBus --print-reply \ + /org/freedesktop/DBus org.freedesktop.DBus.NameHasOwner "string:$n" 2>/dev/null \ + | grep -q "boolean true"; then + say "bus: $n OK" + return 0 + fi + i=$((i+1)); sleep 0.5 + done + say "!! bus: $n NO apareció en 10s" + [ -n "$log" ] && [ -s "$log" ] && dump "$log" + say "nombres en el bus de sistema:" + dbus-send --system --dest=org.freedesktop.DBus --print-reply \ + /org/freedesktop/DBus org.freedesktop.DBus.ListNames 2>/dev/null \ + | tr -d '" ' | grep -v '^\s*$' > /tmp/busnames.log + dump /tmp/busnames.log + return 1 +} +esperar_nombre org.freedesktop.login1 /tmp/logind-compat.log +esperar_nombre org.freedesktop.PolicyKit1 /tmp/polkit-compat.log +esperar_nombre org.freedesktop.Accounts /tmp/accounts-daemon.log +esperar_nombre org.freedesktop.UPower /tmp/upowerd.log + if [ "${DIAG:-1}" = 1 ]; then ulimit -c unlimited 2>/dev/null || true echo '/core.%e.%p' > /proc/sys/kernel/core_pattern 2>/dev/null || true diff --git a/scripts/gnome/qemu-desktop-image.sh b/scripts/gnome/qemu-desktop-image.sh index 81bbba9f..0f169d37 100755 --- a/scripts/gnome/qemu-desktop-image.sh +++ b/scripts/gnome/qemu-desktop-image.sh @@ -130,6 +130,50 @@ XML chmod 644 "$MERGED/usr/share/dbus-1/system.d/org.freedesktop.login1.conf" echo " ✓ org.freedesktop.login1.conf" +echo "==> inyectando arje-polkit-compat (el PolicyKit1 del fractal) + su política" +# EL TERCER ESLABÓN DEL MISMO TIPO, y lo destapó la lista de nombres del bus: accounts-daemon y +# upowerd quedaban CONECTADOS (`:1.0`, `:1.1`) sin adquirir su nombre, porque los dos se bloquean en +# `polkit_authority_get_sync()` esperando a `org.freedesktop.PolicyKit1`. Nuestra receta `polkit` es +# libs-only a propósito (el demonio lo pone arje), así que nadie servía ese nombre y gnome-shell +# esperaba 25 s por cada uno. +# ⚠ El shim autoriza TODO (postura de sistema confiado ya tomada por arje) — ver su receta. +if APC="${APC:-store/$(./target/release/hammer --store store hash recipes/arje-polkit-compat.toml 2>/dev/null | tail -1 | sed 's/^b3://')-arje-polkit-compat}"; [ -d "$APC" ]; then + install -Dm755 "$APC"/usr/bin/arje-polkit-compat "$MERGED"/usr/bin/arje-polkit-compat + echo " ✓ $(basename "$APC" | cut -c1-12)" +else + echo " ✗ falta arje-polkit-compat en store/ — accounts-daemon y upowerd no adquirirán su nombre" >&2 + exit 1 +fi +# A DIFERENCIA de login1, acá el nombre YA tiene política: la trae el artefacto de `polkit`. Pero +# permite `own` sólo al usuario **polkitd**, y nuestro shim corre como root ⇒ dbus se lo niega. +# +# Se agrega un fichero APARTE en vez de reescribir el de polkit, por dos razones: +# 1. dbus lee todo `system.d` en orden alfabético y las reglas posteriores ganan, así que un +# `zz-…` añade el permiso sin descartar el resto de la política de upstream (que además trae las +# reglas de `AuthenticationAgent`). +# 2. **el fichero de polkit es un HARDLINK DE SÓLO LECTURA del store** — el rootfs fundido se arma +# con hardlinks a los artefactos sellados, que están a 0444. Un `cat >` encima falla con +# `Permission denied`, y eso ya rompió un build de esta imagen. Regla para este script: nunca +# sobrescribir un fichero que venga de un artefacto; agregar al lado, o `rm -f` primero para +# romper el enlace (y entonces se está pisando algo sellado, que es una decisión, no un descuido). +cat > "$MERGED/usr/share/dbus-1/system.d/zz-arje-polkit-compat.conf" <<'XML' + + + + + + + + + + + +XML +chmod 644 "$MERGED/usr/share/dbus-1/system.d/zz-arje-polkit-compat.conf" +echo " ✓ zz-arje-polkit-compat.conf (añade own= para root sobre la política de polkit)" + echo "==> usuario messagebus (el system bus hace setuid a él)" for f in passwd:messagebus:x:81:81:messagebus:/dev/null:/sbin/nologin group:messagebus:x:81:; do file="${f%%:*}"; line="${f#*:}"