From 0ac03fe5b0a3ec765a2e9dd07f0d22a7ce3d1ff7 Mon Sep 17 00:00:00 2001 From: Egutierrez Date: Tue, 2 Jun 2026 23:00:23 +0200 Subject: [PATCH] feat(linux): launcher de escritorio con binding SQLite directo Anade launch_linux.sh y appicon.png para correr el dashboard en Linux nativo: - Stagea el ejecutable + assets a ~/fn_apps/registry_dashboard/ y lanza desde alli, de modo que local_files/ (imgui.ini, app_settings.ini, layouts.db, logs) queda contenido en esa carpeta en lugar del arbol de build o el escritorio. - Fuerza --api "" para leer registry.db directo y prescindir de sqlite_api (el puente HTTP solo hacia falta cuando el binario corria en Windows con los datos en WSL). - appicon.png: rasterizado del appicon.ico para el icono del .desktop. Co-Authored-By: Claude Opus 4.8 (1M context) --- appicon.png | Bin 0 -> 5993 bytes launch_linux.sh | 56 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+) create mode 100644 appicon.png create mode 100755 launch_linux.sh diff --git a/appicon.png b/appicon.png new file mode 100644 index 0000000000000000000000000000000000000000..4b78aaf5b4417d0c56bbe8f80d204a4a14908150 GIT binary patch literal 5993 zcmdT|^;c9;w7x@2D>Zb7ARs6mg9sMV3_UbRcS$3S2!a9v5{iHfokKSRC@n}gN)9P7 zlJDYLFV_15-dgXcdt&dqPVDpTZ+|fwYLCf?8HfP@Aba{mNeciVU=som5r7|K_pdep zKzH}4(gPjekC?fazBIp@3HNrT`ubX;in-o~2a@>f#}U(%^Nkv!blvP&r;# zCAGT3HS_$n^9>q}c4fLH#QY9Q;W?oSZ0w;57T%RNlimix)-KH}*zjzA_kWZ+Y*`q} zmaRHhJO~<+@d!GMCo@6scgP7{F^F8lk`lHl&=n3`R zwqn96eS67IL<+k>D4*#4h%nTgaIKAZG(q!0&e;R0y_mRMAIixiStubavEmPlWy6u91d3u`ne7U>7l~ zuE+ZSx}*R{%oIfJD#psgrvKVrgaAnFf&xmnECI@={bbziUGgAesveuq8op z|8E8q+#j?A*`zA)9Eddnqw4NYsL{$@Y=Ubz#3T(K#g5}I2*=_;T3Lr#`cmj}Tg5R)9!3A^AG z&~)9zBl!5xIWwc*+@r}g;rlkn`Y8Hwm$}^m*BurqNGf-nvZq4%6n9{ue>tlZ*{?~2 z-m3)rc=obFVl}#};^GjjMMraZVS;SXl zhF}M=_4;yBRQDcnWgz0sHyfw-P?l1@zt&mCJZnE7$U`A!$oJ*8vl31sJLz?l=0Q7i zZBU$}nUiom3vVecOW=c<;h!h6vRn4EcWr0`9NkeC+c1Ne0t)AzGa7u? z(BRlCG_aQgo){L6CN6%SDZlNrU&(J@+PQKDv!e8c;*0@$2NV4xYXc5W2i$!cdV0%g4!)u(ym18rvX>RUcUP~;Ncsr26W zIGVbbvySIxYq0XNijLvKzGz5JuFIFfHWI!0*bfRT@`6TZ4Hc*grh2mEUI%1HUlw`i zpjYi+s63Oid}!wYZ%C!^rQkOhw94`^JEu6!;j;EkMyP#nJ+Cs);=8TjSg*e_d)P|~ zNyg!uxC(^qInt-AqNZ9mUj^ZK<6D;ySHa?Y(D zl&sm3@v6xYDZX`Re7g7=@kMMZsy%j6;L zrQvy+b5Al2ZW|f6vXHehtT;{pQv-9=r$*-8_sm^{$@r3U6S*^Pa+oJ7%<Q z76u2@v-iDe(UDtJN#JAmeL2E!Oberh4F-i#FxH1caze}I;$H|g-Z**Qtc9{nK}js_ z_PB@po8`Z71sDYmDk?Zw>D_MEc`W1f$J3X5uh{({$*P@8<<|K#Rb%F*VXEb~NJx%W zcrcrZX)S|F63>QvQ|z&}elQnf_E-wh0wi@tKV}yF?E3BRs<$wCSj38~NrbmT{xaaYLFEEk+{KqHh`nv#iI#Y7Uwo6I->Q_8e{JnM0W!9dPrQao6 z`$5W~6AQEVw45!ucV_qXWW8LsUN)21Yc~ zJRo4N@u7jV-fb2W9OJH!lOxU)mq|a~)UD*UE@$VRNnvSv?f80}X0GCj(=AZ(Ro<6J z`u98v)!;F&A$Q~ctaG6VuUfwyl%K9lXpFb>PLHia*SmAi#Ft}mGlpfpT*zG39G3MY z?sIe;ws}Ghs9L19Ov@Zbbx}Tm(vP%M<9>sFDJJ9=B>&*;>h1^=`^0$GPZ9 zAgOfo86@k3|GjGVg5YRmHGRk2BVN3_YA0G(TzfMyo0tYw$5N z%KQUTpCfL(C`)HY;*JZPk?DyyvuI+(gs3r?+lqK!Am?|hB1MgB%riB%guik-aSo5I zE1mPNNROYvYb92eKKk5|!9sExa`DHR(XAiv^-fSw4C=pfc%&|~7Qy#Wh<9E977nA{ z9{Y8*pPcJY$x0nbb9)1MYy^c7TpM0VRnK7>!NGmegkt|Yxn1Yh?|AOLg!1&)9@Qp9Et_fAY+kTrG~!Tku6Px; z$9^FVAn55#vFZ@-5fUXlFXbg8;x(xI*Vq3U6KjHdSGKw{U zEMdGxq@b>bWr%gY(65zuEs#p{az_wrp{#}9R=L`TbfL}!fscw%{=NNxe2HWEQbn8t zoQ$h+Aph*onQ1m_SJvqe97DxS8E0x!JX}LA@RkP%aP(GXHglkGtoU>9LJ6Xtc z{4X!S5VKGaGi|EfP7Cld-Tga_@pW&hO>r$s;sC&0MvzgD!votl`gyHM2(PmfaH8u)8CzTsX-e$vPzq$Af^!C;Pi&C0(gB@5%v z?J})S?-PG@I+Dv>_2j(N$HuUW-L3)Y3I9xT>lbbi)3M26;bbA#af$5qG#b}L&=pc9 zrs$e3zJ^BzSGeSEIPgg#gqn0em+mf>##q3(xU8P8B_3x7kMf@^(>quq(8hO znp`93oxRb~%|gA1X6llXmSE|0Orox7iMSqZ;q)b=v>@WQ6KJ}nHFoj2b{u*ri6jDl zDt2%iCTBH~iu9x0*kVu|CI(G@g5OBZb zpK#c??=V<)CYu&vishWm#D3b;=$Z<8kEig>{{)eWCT4}K7|o=J-?p4crQ_7vSUQ&T ztau={q{VRC>5kqJf3*NTFpmMFBNlayAYh`!Evn!VK%FAT#fB4J{buN%dBGDeQqJH( zbYx#1vHvajK_+fD7U|7IKIh(xdxF3b7wcb9xq?|N8 zNbVFb1|x2SOtxvj1v9`34m(noA{k!cTD~%ocAfi~D z*8v5j>w-@$xbUJfyn}oU3dbcxBs(x^88V}}!j~-%i*E7&`N|3RF|$G5rp7XU>2_;A zso=4esXU!Hf?L?D#ykV(9#QfDV?i$jr~lSe8WxpJl^tYJ(!bdJd&HvzU?;bsR4kUx zWZqlNCez?4%8PqkS#@6E+@yk9*pvC);s9=iaW3v!?$9yl8mYG-OIqglu0G!4AH-o- z#8Y^t|Gsd|r#)f-zL_O-F9U8Ah|-};yUhQ+s^N8_(v(ICc}wl+3^W<|wP{h%3?!&@ z`k)P}#!o;ZK7U)r)}D-W&Q|t7T=6~*clsZik3W8OFy_^#*oVsf*etSX*8%wC0!JN! z245V)I&yx*Wb_PbUU;mti{I^ES-T%g38AEdB7JAjS>C8!6B&e%j!(6j|A3~B7oVxk zwBt_o>1DtI!4JJ7xy}vurTSOQllqz=d42ERGTr*+P5C@FPH$FAmP6rVMu;L_NV@40 zwLqz?gAT7v*(I5kHN*UIy_kO#TWL<9HPR#abb=ZNp?dU;R2;x7Ci3o? zV^VUcevD70R#BOOU)1|61Rj>}%Ky+CTu3(JZ%Ledfic7kjQgsu2K2q#&PsAO_TPQ| z8{vCqk?dD#0XmJ{r%T%(&(#bk0;IFSWACei0gzvsS89{t!{LyV1fTo6?wA(t;NP zF*EQ{ufL_8JKmfJ)_0dOL$mO}zDDpjwkF2N@LYD= zfpW^))1>)ueH!21ya2IOv3n^?yc>G-`fuDoDFdtrktZHtN-F3^F=`}Aj@{QJYlsAI zxhk9}M7#N$i#=HBQxduT^wjQ{aDMzjL0~E!W2GK7#l8M0S_Me^S;~1BGp4|;1Z+!c zI(pyWN-VZ_yPOA|Gi!P@e{2N0l(O&Z)JkwRwv26ydU7fOq|%vK)hs6AayE~Wff)`R zx;#oyY7D-8N$tNmwW^4og6qA~OIZ7Wh%61i0Tg_Xn5n%=6PS6+4vGsE_GhNyr+*0X zK%MgIu5%}xabn3@z7eU8@(kiJKH)t89wMM7<%9*H0MoPu}I+wQ#_-=@>cKXI^bC0ONx zsdefX^w~NfY4qHT=uw0cX9sL}TdP;4=GZGYze*X|lNVu&ulu>MKpSa#C-GLt94;Hj zum4oy;voM^n*0ATP(?9&_IY5NBf9sHU?*?{P5(c{#eX}H+3Owvsz}&5hNSNOzLqcl zX^WspDU2KaUn1oi9`FM4-xB5;{=aU+@Z|4nWs;5*7{rP05}p0(AJT?7qAp4{(I^&6^@;W^ z-zApRtRBwKhZ}!C6*&mpeSxcl9`%o-7dMk)WCJy1*3!sei+e=T)%W~#F%`FE!a|-% zsUy_<&(kv>DBPD-UwC})D4)4Aq<1!B&BSLS>yrY KQz}(7d-Wgb<3Kh5 literal 0 HcmV?d00001 diff --git a/launch_linux.sh b/launch_linux.sh new file mode 100755 index 0000000..0be8ea5 --- /dev/null +++ b/launch_linux.sh @@ -0,0 +1,56 @@ +#!/usr/bin/env bash +# Lanza registry_dashboard en Linux con binding SQLite directo (sin sqlite_api), +# stageando el ejecutable a ~/fn_apps/registry_dashboard/ para que todos los +# artefactos de runtime (imgui.ini, app_settings.ini, layouts.db, logs) queden +# contenidos en esa carpeta y no se mezclen con el arbol de build ni con el +# escritorio. +# +# Por que stagear: fn::run_app guarda local_files/ JUNTO al ejecutable +# (fn::exe_dir() resuelve /proc/self/exe, asi que un symlink no basta — apunta +# al binario real en cpp/build). Copiando el binario a su propia carpeta de +# despliegue, local_files/ se crea alli. +# +# El dashboard, por defecto, intenta sqlite_api en http://127.0.0.1:8484 y solo +# cae a SQLite directo si la API falla. Ese puente HTTP existia porque antes el +# binario corria en Windows y los datos vivian en WSL. En Linux nativo el +# registry.db es local, asi que forzamos el binding directo con --api "". +set -euo pipefail + +# Raiz del repo: este script vive en projects/fn_monitoring/apps/registry_dashboard/, +# cuatro niveles por debajo de la raiz de fn_registry. +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +ROOT="$(cd "$SCRIPT_DIR/../../../.." && pwd)" + +BIN_SRC="$ROOT/cpp/build/apps/registry_dashboard/registry_dashboard" +ASSETS_SRC="$ROOT/cpp/build/apps/registry_dashboard/assets" +DB="$ROOT/registry.db" +APP_HOME="$HOME/fn_apps/registry_dashboard" + +if [ ! -x "$BIN_SRC" ]; then + echo "Binario no encontrado: $BIN_SRC" >&2 + echo "Compila primero:" >&2 + echo " cmake -S $ROOT/cpp -B $ROOT/cpp/build -DCMAKE_BUILD_TYPE=Release -DBUILD_TESTING=OFF" >&2 + echo " cmake --build $ROOT/cpp/build --target registry_dashboard -j\$(nproc)" >&2 + exit 1 +fi + +if [ ! -f "$DB" ]; then + echo "registry.db no encontrado: $DB" >&2 + echo "Regenera el indice: (cd $ROOT && ./fn index)" >&2 + exit 1 +fi + +# Stage del ejecutable + assets a su carpeta de despliegue. -u copia solo si la +# fuente es mas nueva, asi que tras un rebuild se actualiza automaticamente. +# local_files/ NO se toca: persiste config y layouts entre lanzamientos. +mkdir -p "$APP_HOME" +cp -u "$BIN_SRC" "$APP_HOME/registry_dashboard" +if [ -d "$ASSETS_SRC" ]; then + mkdir -p "$APP_HOME/assets" + cp -ru "$ASSETS_SRC/." "$APP_HOME/assets/" +fi + +# Lanzar desde APP_HOME → fn::exe_dir() apunta aqui → local_files/ vive aqui. +# --api "" fuerza binding SQLite directo (salta el intento HTTP a sqlite_api). +cd "$APP_HOME" +exec "$APP_HOME/registry_dashboard" --api "" "$DB"