From b2ff632e646ceb839c0e573fb23a0383adfb9501 Mon Sep 17 00:00:00 2001 From: Tobias Reisinger Date: Sun, 18 Feb 2024 19:50:22 +0100 Subject: [PATCH] Improve config system Add pkl to generate configs --- .cargo/config.toml | 3 + .env | 2 +- .gitignore | 2 + ...86549c43e9be2f4ac3b257e836187fa9ed080.json | Bin 0 -> 734 bytes ...83d24f993442ea05e17910f587a4c92d4e7f5.json | Bin 295 -> 0 bytes ...3d15ccf840e9f469007d37b6eb47f96f31dc7.json | Bin 0 -> 442 bytes ...5d9768b3709b347afb04c329b8fb1d3972111.json | Bin 0 -> 261 bytes ...993ce9e4cafc90204b06977481130ec06d111.json | Bin 0 -> 691 bytes ...2dc6c655102a501d8aa48e03b1fb3dbbad02d.json | Bin 0 -> 454 bytes ...b9bbb0e6c203b721d29cf9149f60bfdd93465.json | Bin 0 -> 735 bytes ...f3b2d03cab39116c2732c06e3c74a02fb0367.json | Bin 0 -> 268 bytes ...1e824b99a3888adf5365619ecfed7ae6544a9.json | Bin 0 -> 866 bytes ...ceb0911001eee41256f7b324edc72f5cadcba.json | Bin 0 -> 759 bytes ...3d0d3c690b4e9bccc6f0f5fed2bfd2826b480.json | Bin 0 -> 265 bytes ...fee8914e253db00e6a648a78e99ade6a4de60.json | Bin 0 -> 253 bytes ...2bf715af1e1ed4d420ac6fa132a94ff352e56.json | Bin 0 -> 369 bytes ...8d7c739d0cb82eea1f8289d012c37bd30c776.json | Bin 0 -> 255 bytes ...4c32a261bb7d1f34577c0f4dc52e318124ecd.json | Bin 0 -> 874 bytes ...61be2fe713637f883d175f9b279f0f2f8fd87.json | Bin 0 -> 712 bytes ...1285034c573b86e3193da3995606dee412153.json | Bin 0 -> 717 bytes ...ad12237b9cb69ea6aa4686df6d5262065faa2.json | Bin 0 -> 702 bytes ...22a0a66064e3416e4f5c89d8d83fa6c0536ad.json | Bin 0 -> 367 bytes ...01b502ffd56dd88485cd73b694f6559ccd4e.json} | Bin 846 -> 835 bytes ...fb7b09f6355ecbc8b6e1085d5f2f9a08cac3f.json | Bin 0 -> 783 bytes ...f420d3abb08358a1abe301dc7e08693fbef4d.json | Bin 0 -> 678 bytes ...b28a92524b8f556840b76f76c8f317059e668.json | Bin 0 -> 311 bytes ...ada06827a0e5a2d2dbd48bfb8e04f973a6131.json | Bin 0 -> 283 bytes Makefile | 23 ++--- config/emgauwa-controller.pkl | 71 +++++++++++++++ config/emgauwa-core.pkl | 18 ++++ config/lib/common.pkl | 15 ++++ config/lib/controller.pkl | 16 ++++ config/lib/core.pkl | 12 +++ emgauwa-controller.toml | 60 ------------- emgauwa-controller/src/main.rs | 7 +- emgauwa-controller/src/settings.rs | 52 +++-------- emgauwa-core.toml | 15 ---- emgauwa-core/Cargo.toml | 1 - emgauwa-core/build.rs | 2 +- emgauwa-core/src/main.rs | 17 ++-- emgauwa-core/src/settings.rs | 43 ++-------- emgauwa-core/src/utils.rs | 66 -------------- emgauwa-lib/Cargo.toml | 1 + emgauwa-lib/build.rs | 2 +- emgauwa-lib/src/lib.rs | 1 + emgauwa-lib/src/settings.rs | 77 +++++++++++++++++ emgauwa-lib/src/utils.rs | 81 ++++++++++++++---- 47 files changed, 325 insertions(+), 262 deletions(-) create mode 100644 .cargo/config.toml create mode 100644 .sqlx/query-0874e71c6206efc82528cc450bc86549c43e9be2f4ac3b257e836187fa9ed080.json delete mode 100644 .sqlx/query-1d658709678f72291d835ef2a4183d24f993442ea05e17910f587a4c92d4e7f5.json create mode 100644 .sqlx/query-20e99a281e5e3e9c9d7375425d93d15ccf840e9f469007d37b6eb47f96f31dc7.json create mode 100644 .sqlx/query-3b5a701d0ace12125c573680bcd5d9768b3709b347afb04c329b8fb1d3972111.json create mode 100644 .sqlx/query-4f5408e64f5e6a8dd923c3b147f993ce9e4cafc90204b06977481130ec06d111.json create mode 100644 .sqlx/query-52958684fa52b7a4753cd4356482dc6c655102a501d8aa48e03b1fb3dbbad02d.json create mode 100644 .sqlx/query-5865f27b97487b6dfd956a3d260b9bbb0e6c203b721d29cf9149f60bfdd93465.json create mode 100644 .sqlx/query-711398eb64710a25cc818167be8f3b2d03cab39116c2732c06e3c74a02fb0367.json create mode 100644 .sqlx/query-7bbe1a982c77194feba2ff610b01e824b99a3888adf5365619ecfed7ae6544a9.json create mode 100644 .sqlx/query-7cd5b42013b4e6a37a670e55cd3ceb0911001eee41256f7b324edc72f5cadcba.json create mode 100644 .sqlx/query-7e7cdf2650c08feb10a35275e693d0d3c690b4e9bccc6f0f5fed2bfd2826b480.json create mode 100644 .sqlx/query-90ed2cd2f8161552dae06ab2d9cfee8914e253db00e6a648a78e99ade6a4de60.json create mode 100644 .sqlx/query-921a0775f75d9e2f67f604265872bf715af1e1ed4d420ac6fa132a94ff352e56.json create mode 100644 .sqlx/query-a1f5699889cfabb3f681e6bb71a8d7c739d0cb82eea1f8289d012c37bd30c776.json create mode 100644 .sqlx/query-a64694ec1a81472a05a68b1caf64c32a261bb7d1f34577c0f4dc52e318124ecd.json create mode 100644 .sqlx/query-ab8dafa95af67dc06074e83e1ec61be2fe713637f883d175f9b279f0f2f8fd87.json create mode 100644 .sqlx/query-b41855e635ac409559fa63cba4c1285034c573b86e3193da3995606dee412153.json create mode 100644 .sqlx/query-c9437ff0c3014b269dcb21304fbad12237b9cb69ea6aa4686df6d5262065faa2.json create mode 100644 .sqlx/query-cbda6fd5137f3698537262772df22a0a66064e3416e4f5c89d8d83fa6c0536ad.json rename .sqlx/{query-acfc608095768f30a55eb0298dfe86d095af0af9545252cf06f30827e9ca502a.json => query-cdcae4768f7b62390e5e5da850e301b502ffd56dd88485cd73b694f6559ccd4e.json} (76%) create mode 100644 .sqlx/query-e94ef5bc8b267d493375bb371dcfb7b09f6355ecbc8b6e1085d5f2f9a08cac3f.json create mode 100644 .sqlx/query-ee7da56331bece2efe21b55dbd5f420d3abb08358a1abe301dc7e08693fbef4d.json create mode 100644 .sqlx/query-f75318134ec1facc3de6b04232cb28a92524b8f556840b76f76c8f317059e668.json create mode 100644 .sqlx/query-f7b90a6a0af3f7d7c96158f96f1ada06827a0e5a2d2dbd48bfb8e04f973a6131.json create mode 100644 config/emgauwa-controller.pkl create mode 100644 config/emgauwa-core.pkl create mode 100644 config/lib/common.pkl create mode 100644 config/lib/controller.pkl create mode 100644 config/lib/core.pkl delete mode 100644 emgauwa-controller.toml delete mode 100644 emgauwa-core.toml create mode 100644 emgauwa-lib/src/settings.rs diff --git a/.cargo/config.toml b/.cargo/config.toml new file mode 100644 index 0000000..44fa6b4 --- /dev/null +++ b/.cargo/config.toml @@ -0,0 +1,3 @@ +[alias] +format = "+nightly fmt" +lint = "clippy --all-targets --all-features -- -D warnings" diff --git a/.env b/.env index 2f5ee4c..78b6033 100644 --- a/.env +++ b/.env @@ -1 +1 @@ -DATABASE_URL="sqlite://emgauwa-dev.sqlite" +DATABASE_URL="sqlite://_local/emgauwa-dev.sqlite" diff --git a/.gitignore b/.gitignore index 734f922..be8fe54 100644 --- a/.gitignore +++ b/.gitignore @@ -4,8 +4,10 @@ /tests/testing_bak/ /tests/testing_latest/ +/_local/ emgauwa-*.sqlite emgauwa-*.sqlite-* +emgauwa-*.json # Added by cargo diff --git a/.sqlx/query-0874e71c6206efc82528cc450bc86549c43e9be2f4ac3b257e836187fa9ed080.json b/.sqlx/query-0874e71c6206efc82528cc450bc86549c43e9be2f4ac3b257e836187fa9ed080.json new file mode 100644 index 0000000000000000000000000000000000000000..9b1f908dd7d9e54d1d38286570356c17f7887ce0 GIT binary patch literal 734 zcmbtSO-sZu6uj@R2sw&}Zu*rKL_{kJtKzQUL8PR~tBq#UwI4`X_P?8?&22@|90Hm5 z-pperyBR`Q6uD*_z$XZ=AC|HMd~D&59-6^{*)qF$L`Udqb$^TAdd)jo>%0NQhP>q! zh+YADy3SS^8bK-0DLO;vcbDiB;9ao6zDHUCEpKFD<#tBK2=Q9=8{Hb<*#T%OxT4=o z3O8;sGg3D~YNpIcV0Rr4?uISoQkS*e`bKw2gs0-(ca4&^AA9C$!^8A*KWGO2M(-Ut z%uoK!?*qucb13|sgmda;?8RHwm>6|AdNTB4D#DsDl#X-So5=RRjg|H}qlo8`$LE;o>n9ONf NvIU5M26(ogeE|Xrv)upy literal 0 HcmV?d00001 diff --git a/.sqlx/query-1d658709678f72291d835ef2a4183d24f993442ea05e17910f587a4c92d4e7f5.json b/.sqlx/query-1d658709678f72291d835ef2a4183d24f993442ea05e17910f587a4c92d4e7f5.json deleted file mode 100644 index f9ef3de6a2243fa3deb3a78bfc2140e39c9e70bf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 295 zcmX|)O-sWt7{~AZ6c0J?(4^_w2qJ<74<2-zco<`(d9i^k)if2x*mw6yCtiR5m*1rT zAi6&Wc{1b<$oB2UB|}yjf6peKGkkx2dfauO#*pIZy@?ZSyB*{W+{42PqVe*4RO1}d z4M>&T&l1ANbGPZh=^WgCwV70OefC|@gC;fl`4lDu`$JYE`jQdv6T1FuNH^|tNC@~+ zy8d;;?7i%LKHMKLSvVQwG$0{Vuj{rc#ky&2!C!wkE~3_yx2SPayyR diff --git a/.sqlx/query-20e99a281e5e3e9c9d7375425d93d15ccf840e9f469007d37b6eb47f96f31dc7.json b/.sqlx/query-20e99a281e5e3e9c9d7375425d93d15ccf840e9f469007d37b6eb47f96f31dc7.json new file mode 100644 index 0000000000000000000000000000000000000000..776039b179b55e5d9342bbc2a4a5952f758b7321 GIT binary patch literal 442 zcmY*V%WA_g5WMFrgw7@S?Wj_&r=8B#y*XyDrubbtX{0v4| z)tbsNHn;aVVwIBQ!K>z2eZCZBaif`cp!qnl9w%=Jz35c!GMz9BrV*_k4yH%o%LC-n z@Xc#{H1m1~qNeSnGF+o3a4(t`wc`;gWt!H#Z3};vUV3MLeos_-FTbGflxU_U|U?0uCH54+%N< z+;cAX>?R0dS*;Ck0be8h`m#_C@MVC%2C&-*mW%Rkg)Y$j^7#o_(0tpYw}*0BA|=rc zx*hovdSO)+bauYqD~L`Ht?51R9szVH#A32kGPVcIw{%u2!?kZAVTkcyx81;6nYs(( zJQ|lXd?@Y{YqSh}oRs66>POo27kZ?MQ5Dtv zCp&uJBLZY;#AeFSGRgzyCH)|^MdKxTNSz>H{lRz?-tFdQfmCn z?!HD9bU1clIaWTfrfz79tmG@CD^>|fD^}B{l%f_jV?|yf%L~~c(njSKFIrwn&Qa#2 IgzT360LoEp$p8QV literal 0 HcmV?d00001 diff --git a/.sqlx/query-5865f27b97487b6dfd956a3d260b9bbb0e6c203b721d29cf9149f60bfdd93465.json b/.sqlx/query-5865f27b97487b6dfd956a3d260b9bbb0e6c203b721d29cf9149f60bfdd93465.json new file mode 100644 index 0000000000000000000000000000000000000000..67ea7e8877419a84a9f133d916ac4c28076d8f5c GIT binary patch literal 735 zcma)3%WA_g5WMFr7M+sfgX4!B_fmQY#SmQTxV@ATBuj1#ik!+eG=%(nB{_lyQW{|- zJhMBq>>MWmh|!HCJC5!FtzTA6&yi=~uYs$B0keF)EK11o@);BtwU>6QS~2Wor-641 zz?rb58?Rxu-C(+c zau9-0VZwCT)kJjM+5Yo0`s&;2p)KjQCc1cm<2p!anna6)Vpg*>#w26`_GwBf^*OEr bKcq=8XF*!k={!nn&DD&hVT5BeIZb{5`#-Yk literal 0 HcmV?d00001 diff --git a/.sqlx/query-711398eb64710a25cc818167be8f3b2d03cab39116c2732c06e3c74a02fb0367.json b/.sqlx/query-711398eb64710a25cc818167be8f3b2d03cab39116c2732c06e3c74a02fb0367.json new file mode 100644 index 0000000000000000000000000000000000000000..4409006ef76811a9e2b798644dfb1d9616ac8a72 GIT binary patch literal 268 zcmX}lOG^VW6o%pb{E9=?E^?{KR1gsyaN(l%LKmf!He?jC2`3x=bK%qwC+cpJKEwmf&tr zH#cXU9Xk?cgi!O^J3TXkTX~OIi&|*oe0@|-wp^igYA%FEX_Q2+y+SjyTpk@)+OX_YEWTiwou5) zxg_W7riBn@G?ruu_yXbQrx7m!pKJK5f_!bjXcXPdP?0QvRRW6k8M>QJ9`^tmj>pjy zJxqpU^ij#AlNfYW5wT{ber6d4sNP>tEqTJa`ji1kn1tnlJJzjFG>ZthPx{f%Ss4Bg`S`tSV}|z zHuaxHovXga4=+fu(DUk33JwVaH|h7C&`W_5H%)z~Lpu%xu1CX=bb}xuEbVpup6`T^ Qq`>+F{GR8L5Vy9iUr?^-aR2}S literal 0 HcmV?d00001 diff --git a/.sqlx/query-7cd5b42013b4e6a37a670e55cd3ceb0911001eee41256f7b324edc72f5cadcba.json b/.sqlx/query-7cd5b42013b4e6a37a670e55cd3ceb0911001eee41256f7b324edc72f5cadcba.json new file mode 100644 index 0000000000000000000000000000000000000000..8d846ef0202322841d113d1aee256c51ea4b9b13 GIT binary patch literal 759 zcmbtS%SyvQ6y5hLhFP_eMczR-;vz_)L`+*ZB4HjkW^_8Kc_5+m-t7y@(d zJ?GrVoE8XSP76g2fNv1qK5j$@*fH=&56xh}b+%3O9a?9*2lUn})`?mb4M;K+Evta{ z643G!;GL7fK~q3*2iagD_zFGUZT9IFEpHuU&I;w}Zl7oC>>gcBejHlX2x{s$X@6Y- zt7U&stp=V)0L_6hXiFA+q#I0A>V^wNq^7v0iRr`LaD+mrvL4$}T^!;$c(z%SrOC%u zd2Z>lyl07;@HcrosLT5PzxBV3|FT8!JBx8rFHy|y!wl;j=oM3S!`lW#Ut4BtBYLLS&}(CiaLhFhEZ5HRjtjl+7_BbV EA5k$#UjP6A literal 0 HcmV?d00001 diff --git a/.sqlx/query-90ed2cd2f8161552dae06ab2d9cfee8914e253db00e6a648a78e99ade6a4de60.json b/.sqlx/query-90ed2cd2f8161552dae06ab2d9cfee8914e253db00e6a648a78e99ade6a4de60.json new file mode 100644 index 0000000000000000000000000000000000000000..9be1170ab262651ea6e31d8f5b373f4494dc970a GIT binary patch literal 253 zcmXZV!D_=W3Iu~6$GV?bJtRKO9M1_?ZtcDtyfp7`5INv^gzs0^IOqwUVR=szk8SLI zYPra^?6<#RJ`AJ4W}6Cyju_?8#4+hTCffA-ZW73Eq3eHkm_tAxQsHJRKQ~t$j-80I vn#r_ec6DCmWoZamSLhAdcE?=XykJu<$ZO3NRz;1EHCu}$uR?}a*){tEsUbsh literal 0 HcmV?d00001 diff --git a/.sqlx/query-921a0775f75d9e2f67f604265872bf715af1e1ed4d420ac6fa132a94ff352e56.json b/.sqlx/query-921a0775f75d9e2f67f604265872bf715af1e1ed4d420ac6fa132a94ff352e56.json new file mode 100644 index 0000000000000000000000000000000000000000..a7c8c1e400939f6a9c2be4bf5295272cf5080078 GIT binary patch literal 369 zcmX|+!E3`H7{%}TE5!2-(Z;w8#ttK8gO0Imu)`?D#Lq^srZeVHO8)n$N#{Y~eeb>R z=QTqJ%l2T!3Gf5LpC3Ez0pCUWcLH}wV!f-MzYsy&=KT$IgY|AO2Hc3gU+Shtla}Za zJuN8-W9M`m+peJ{^mK!nPIe5!PZH2NNWC;|jzAq$#|u2h0-sHh61HjDx*aW-dvT})em literal 0 HcmV?d00001 diff --git a/.sqlx/query-a1f5699889cfabb3f681e6bb71a8d7c739d0cb82eea1f8289d012c37bd30c776.json b/.sqlx/query-a1f5699889cfabb3f681e6bb71a8d7c739d0cb82eea1f8289d012c37bd30c776.json new file mode 100644 index 0000000000000000000000000000000000000000..2dfa51693c4610fdb95834a564a60d716133f3e7 GIT binary patch literal 255 zcmX|)J!``-5I}eT3Zc1!Wm8KobO_X2hvuVG2t{`~*9O^6WH}H*{(DbJ=y>nmy}M>Y zNC!Wo9Z0?jxm|zuk>pFlr-i~L!SAn+)vggZjWJB#Q<%lJ*$IoWKa+SD`NMZKW9T7u zu6)l0ocuD3GlTshB^e!U;8&3w{~FUx|Jy|d`CYm_-Er~Wf=|Kyfj4(9J3Dtwq*d)} sRoBMU*jj+Ht&E}yKr3sUMqSn}M=%8uo2D>4ssc+5uFO&EN@ln04^)Xo761SM literal 0 HcmV?d00001 diff --git a/.sqlx/query-a64694ec1a81472a05a68b1caf64c32a261bb7d1f34577c0f4dc52e318124ecd.json b/.sqlx/query-a64694ec1a81472a05a68b1caf64c32a261bb7d1f34577c0f4dc52e318124ecd.json new file mode 100644 index 0000000000000000000000000000000000000000..cd86c5fdff422df7192daca1f421505a37d2dabd GIT binary patch literal 874 zcma)4?MlNi6#c)a2>B^embUArAi}ibWNugoB2G%0q&AwRvma;~dv}v`VH;Sqg+fox z$L+b@^Z!<1JHo@)5BW<_Jba2j4MKuI!2Yr#tA1l&aP`#k_AvsoB{ zyZK}W-fKxJp3Ask0ynW0E#zgSZd5ExY(OJoLceIZ5V}J2~Hbm#FthvkFM2V zz%vzW^?*M&}G75H#>xV5Y{QuCp8uDh&}6)EzO^;qP|f1FLifysVq_W(VzUa;@# zKh|qj@SK*vcj9%q9}RA*d2Ok1jSKa6R;!APu literal 0 HcmV?d00001 diff --git a/.sqlx/query-ab8dafa95af67dc06074e83e1ec61be2fe713637f883d175f9b279f0f2f8fd87.json b/.sqlx/query-ab8dafa95af67dc06074e83e1ec61be2fe713637f883d175f9b279f0f2f8fd87.json new file mode 100644 index 0000000000000000000000000000000000000000..24cf02ea61a9a3ae2a4e24caa5ebec68dd364bd4 GIT binary patch literal 712 zcmbtRO-sZu6ukFWgdD{~KX#i|5D!vOSP`q>L8PS3i;ZT}wI4`X_P?8t=H{Yk4}s2m zGxM0)2MA$SSBh={pCSBkzY!zgQv-iY(9aeuHpS&5IzdLS3}bR zn!K`>VCWoOH~|Jj(~H^&@3o+oY&tn@)u4fA3!r6ShyDh^EZtz5()COzDm5iE zSGf<5^A0MZcxUdrQDeHo%kbd0oTb^vUilN?ozeMw`N$JB;cxOTkYne^|JL_WSH~=p z-&xqCUfeF;(O!2yLT_5}nc-5rwxb3jySrqH)g&dYr76_+$Eh5^+y3z5eD!Pfa7%~Q z)JN-#QBLzUX;eeZfka7~5T0cTi^!Vibxd*|@|b6wWdsL@;0pnj Bt*HP2 literal 0 HcmV?d00001 diff --git a/.sqlx/query-b41855e635ac409559fa63cba4c1285034c573b86e3193da3995606dee412153.json b/.sqlx/query-b41855e635ac409559fa63cba4c1285034c573b86e3193da3995606dee412153.json new file mode 100644 index 0000000000000000000000000000000000000000..94419bd3f023b55d3557d0e840af795b0a075adb GIT binary patch literal 717 zcma)4O-lnY5WV+TgdD}g?q;)g1rgB|g{oK!9z;q$rZ$jfYc>m(;(s^EHejJ*b4bXW znfG31vK=9WC7&C%0(_3}%kxAzz^4KJ?7?m#*i4%189G6?)29byL93$+~429WV1SrBD&dM48o;)(chw8|<8 NQ07HW2_AiqegHQUl+*InWo?v`|c*`0v0B=4=p|S z-ru?0bC>}DIb9pF74RCs*O#So0$v9Bs~2`3#d=xat-uAiZ=Rok6`Jfj@b*wQHDIlA zw$)nLwc_9g+zz8$bj&ImkOzj9#)>R2DZ&+J6y-%$N=kT+P_dvDqqq_T6H?+U%q8Y?gi(g)k`M%E$Jq}> CL8-9- literal 0 HcmV?d00001 diff --git a/.sqlx/query-cbda6fd5137f3698537262772df22a0a66064e3416e4f5c89d8d83fa6c0536ad.json b/.sqlx/query-cbda6fd5137f3698537262772df22a0a66064e3416e4f5c89d8d83fa6c0536ad.json new file mode 100644 index 0000000000000000000000000000000000000000..fb83516f9c79c40890bf91f2363ec3b4d1cf5c32 GIT binary patch literal 367 zcmXv}O>2WN7{2=}Le4v=(P#%_hvC?uW6TY97^S=>Z)PBkozX)n{`V!(=8(Yioohk} zmEF<83F$qdpC5ZYA-xOm-;CoWg3Z2p`XU*5Zr|UC6Fth=pd;TeP1}%JOY%S-SC2#| zM%{(1tIzN$VleZ`IuHCrfNVr0Z?#!;2go~yQECguJJPUYJ#@O9@u;mD!lG9@(T!T- zdsvn945RRr~m)} diff --git a/.sqlx/query-e94ef5bc8b267d493375bb371dcfb7b09f6355ecbc8b6e1085d5f2f9a08cac3f.json b/.sqlx/query-e94ef5bc8b267d493375bb371dcfb7b09f6355ecbc8b6e1085d5f2f9a08cac3f.json new file mode 100644 index 0000000000000000000000000000000000000000..391ca72c3136de054678926d3710228e68bcc047 GIT binary patch literal 783 zcma)4T}#6-6n)>X2zeA4>$# zo_p@ey*&;9fF&*@+EI7|;OceGHHFs}{%WW?I53-M4{M;PK!@QKc+8hCKB&R{%Ade& zvB+}pyqqn-XCsN`l`J&cfMq`(I+22x;I`E>$G4{}&w6D;Q|d`~-b+bqqByo5kH(vE zM=H_mWNmB=o;N-9-yiG(Q`*$esy>cgHET(ZhubtZK@fo<~Cv3yI* zhn=$fcKM!m@C)r}uj#kGNV?f!s?Hl9|0RC0aZ*XGDj}#c13up*ysU|v(ue25JyPZu z(p1@vbn}8a-)yx30>^FV31uS$!on`I+Z{uqrd`{A0^irXogUnxdTUol(+On}CR03) slX8-VVG>~+CP7IUPVgvYaTrCESVl~P(KIR}HfAXrO$j0)gM-uH2Z9C0`~Uy| literal 0 HcmV?d00001 diff --git a/.sqlx/query-ee7da56331bece2efe21b55dbd5f420d3abb08358a1abe301dc7e08693fbef4d.json b/.sqlx/query-ee7da56331bece2efe21b55dbd5f420d3abb08358a1abe301dc7e08693fbef4d.json new file mode 100644 index 0000000000000000000000000000000000000000..c4ec08d2018529aad439bf793baad37af1945866 GIT binary patch literal 678 zcma)3!D@ss6ukQtA;;2#8g*^2WebHZrQ5xgB8hpaLX6uOp|b41H;D$i(4~4%ocCtt zF>{I#!kkr#c7X2@etX@u2Jo$ezedoL2e-TJ!vWo($NkGQ(je(H%qtv*TDQzmPnKdy zbuY(G4HkI!09poq7+hNJ=?=4$Uh`H_X(_SuogZwbBUG&ty}RH^nIgl>@Eo>gOSg}M zvj2wpg?91_z0f|uw^=1Ub`132ho{%XS07&Y%IIE7(ABkc$T}0B(#O1uk5t=c4QSU$ z$P4e=&&IgC{qB+{R-=@ZNmpj*PEa{Ou>I#}_O)-XhZ{OHt~!7Xr+Gn0!k~r}1f&Ve kbIy1!vNYy|G8UI4FKI#2I8`~BZ7g*IF8QI4{B$l761SM literal 0 HcmV?d00001 diff --git a/.sqlx/query-f75318134ec1facc3de6b04232cb28a92524b8f556840b76f76c8f317059e668.json b/.sqlx/query-f75318134ec1facc3de6b04232cb28a92524b8f556840b76f76c8f317059e668.json new file mode 100644 index 0000000000000000000000000000000000000000..88dc7d1903e253064c928e6ec7af5fd162667334 GIT binary patch literal 311 zcmXxeOG^VW6b0b@{EAD~UCblNq=JaxfD0GeR$P=aiN7c8=Y+4%5BIwUKBk~YcM5HfUe4{HJ2aC=*fu-(LHsmw zhFiE>!IC?(y#9NwGckp?$7a*O5-vLi2i-fB_Rn!QF6)z@j$w$fKcrJ4eaSwaIAWi4 zsYTtm_il_pucgahH%#73<1F+rO%aANvWd5FQykvZTT|e(T&|^q(^xnn^cHJKG4m`rs0;2VJIq7i@ zDFb|Lx@`x8$&cTbv6GI2$~Ugmrn(;ed=3-A;h4`6ePN_zqW=FF>2~<+6G43+y8X?D z*?Uwz2MPeWBs^ut diff --git a/config/lib/core.pkl b/config/lib/core.pkl new file mode 100644 index 0000000..d522e17 --- /dev/null +++ b/config/lib/core.pkl @@ -0,0 +1,12 @@ +import "./common.pkl" + +server: common.ServerConfig + +database: String + +permissions: common.PermissionsConfig + +logging: common.LoggingConfig + +/// Leave empty to allow all origins (will always respond with Origin and not "*") +origins: Listing diff --git a/emgauwa-controller.toml b/emgauwa-controller.toml deleted file mode 100644 index 6e27e0a..0000000 --- a/emgauwa-controller.toml +++ /dev/null @@ -1,60 +0,0 @@ -database = "sqlite://emgauwa-controller.sqlite" -name = "Emgauwa Controller" - -[core] -port = 4419 -host = "127.0.0.1" - -[logging] -level = "DEBUG" -file = "stdout" - -[[relays]] -driver = "gpio" -pin = 5 -inverted = 1 - -[[relays]] -driver = "gpio" -pin = 4 -inverted = 1 - -[[relays]] -driver = "gpio" -pin = 3 -inverted = 1 - -[[relays]] -driver = "gpio" -pin = 2 -inverted = 1 - -[[relays]] -driver = "gpio" -pin = 1 -inverted = 1 - -[[relays]] -driver = "gpio" -pin = 0 -inverted = 1 - -[[relays]] -driver = "gpio" -pin = 16 -inverted = 1 - -[[relays]] -driver = "gpio" -pin = 15 -inverted = 1 - -[[relays]] -driver = "piface" -pin = 1 -inverted = 0 - -[[relays]] -driver = "piface" -pin = 0 -inverted = 0 diff --git a/emgauwa-controller/src/main.rs b/emgauwa-controller/src/main.rs index c6920fa..600e924 100644 --- a/emgauwa-controller/src/main.rs +++ b/emgauwa-controller/src/main.rs @@ -4,7 +4,7 @@ use emgauwa_lib::db::{DbController, DbJunctionRelaySchedule, DbRelay, DbSchedule use emgauwa_lib::errors::EmgauwaError; use emgauwa_lib::models::{Controller, FromDbModel}; use emgauwa_lib::types::ControllerUid; -use emgauwa_lib::utils::init_logging; +use emgauwa_lib::utils::{drop_privileges, init_logging}; use sqlx::pool::PoolConnection; use sqlx::Sqlite; @@ -59,6 +59,9 @@ async fn create_this_relay( #[actix::main] async fn main() -> Result<(), std::io::Error> { let settings = settings::init()?; + + drop_privileges(&settings.permissions)?; + init_logging(&settings.logging.level)?; let pool = db::init(&settings.database) @@ -105,7 +108,7 @@ async fn main() -> Result<(), std::io::Error> { let url = format!( "ws://{}:{}/api/v1/ws/controllers", - settings.core.host, settings.core.port + settings.server.host, settings.server.port ); diff --git a/emgauwa-controller/src/settings.rs b/emgauwa-controller/src/settings.rs index d9b86e4..8e0da84 100644 --- a/emgauwa-controller/src/settings.rs +++ b/emgauwa-controller/src/settings.rs @@ -1,25 +1,9 @@ use emgauwa_lib::errors::EmgauwaError; -use emgauwa_lib::{constants, utils}; +use emgauwa_lib::settings; use serde_derive::Deserialize; use crate::driver::Driver; -#[derive(Clone, Debug, Deserialize)] -#[serde(default)] -#[allow(unused)] -pub struct Core { - pub host: String, - pub port: u16, -} - -#[derive(Clone, Debug, Deserialize)] -#[serde(default)] -#[allow(unused)] -pub struct Logging { - pub level: String, - pub file: String, -} - #[derive(Clone, Debug, Deserialize)] #[serde(default)] #[allow(unused)] @@ -35,9 +19,11 @@ pub struct Relay { #[serde(default)] #[allow(unused)] pub struct Settings { - pub core: Core, + pub server: settings::Server, pub database: String, - pub logging: Logging, + pub permissions: settings::Permissions, + pub logging: settings::Logging, + pub name: String, pub relays: Vec, } @@ -45,9 +31,11 @@ pub struct Settings { impl Default for Settings { fn default() -> Self { Settings { - core: Core::default(), - database: String::from("sqlite://emgauwa-controller.sqlite"), - logging: Logging::default(), + server: settings::Server::default(), + database: String::from("sqlite://_local/emgauwa-controller.sqlite"), + permissions: settings::Permissions::default(), + logging: settings::Logging::default(), + name: String::from("Emgauwa Controller"), relays: Vec::new(), } @@ -66,26 +54,8 @@ impl Default for Relay { } } -impl Default for Core { - fn default() -> Self { - Core { - host: String::from("127.0.0.1"), - port: constants::DEFAULT_PORT, - } - } -} - -impl Default for Logging { - fn default() -> Self { - Logging { - level: String::from("info"), - file: String::from("stdout"), - } - } -} - pub fn init() -> Result { - let mut settings: Settings = utils::load_settings("controller", "CONTROLLER")?; + let mut settings: Settings = settings::load("controller", "CONTROLLER")?; for (num, relay) in settings.relays.iter_mut().enumerate() { if relay.number.is_none() { diff --git a/emgauwa-core.toml b/emgauwa-core.toml deleted file mode 100644 index e2f54d6..0000000 --- a/emgauwa-core.toml +++ /dev/null @@ -1,15 +0,0 @@ -port = 4419 -host = "127.0.0.1" - -# Set to a user and a group to drop privileges to after binding to the port -#user = "emgauwa" -#group = "emgauwa" - -# Leave empty to allow all origins (will always respond with Origin and not "*") -#origins = ["http://localhost", "https://emgauwa.app"] - -database = "sqlite://emgauwa-core.sqlite" - -[logging] -level = "DEBUG" -file = "stdout" diff --git a/emgauwa-core/Cargo.toml b/emgauwa-core/Cargo.toml index 731bff4..db61748 100644 --- a/emgauwa-core/Cargo.toml +++ b/emgauwa-core/Cargo.toml @@ -24,4 +24,3 @@ serde_derive = "1.0" sqlx = { version = "0.7", features = ["sqlite", "runtime-tokio", "macros", "chrono"] } futures = "0.3.29" -libc = "0.2" diff --git a/emgauwa-core/build.rs b/emgauwa-core/build.rs index 41015be..9611aff 100644 --- a/emgauwa-core/build.rs +++ b/emgauwa-core/build.rs @@ -1,3 +1,3 @@ fn main() { - println!("cargo:rustc-env=DATABASE_URL=sqlite://emgauwa-core.sqlite") + println!("cargo:rustc-env=DATABASE_URL=sqlite://_local/emgauwa-core.sqlite") } diff --git a/emgauwa-core/src/main.rs b/emgauwa-core/src/main.rs index 10320cc..ba632af 100644 --- a/emgauwa-core/src/main.rs +++ b/emgauwa-core/src/main.rs @@ -6,10 +6,9 @@ use actix_web::middleware::TrailingSlash; use actix_web::{middleware, web, App, HttpServer}; use emgauwa_lib::db::DbController; use emgauwa_lib::errors::EmgauwaError; -use emgauwa_lib::utils::init_logging; +use emgauwa_lib::utils::{drop_privileges, init_logging}; use crate::app_state::AppState; -use crate::utils::drop_privileges; mod app_state; mod handlers; @@ -19,12 +18,12 @@ mod utils; #[actix_web::main] async fn main() -> Result<(), std::io::Error> { let settings = settings::init()?; + + let listener = TcpListener::bind(format!("{}:{}", settings.server.host, settings.server.port))?; + drop_privileges(&settings.permissions)?; + init_logging(&settings.logging.level)?; - let listener = TcpListener::bind(format!("{}:{}", settings.host, settings.port))?; - - drop_privileges(&settings)?; - let pool = emgauwa_lib::db::init(&settings.database).await?; let mut conn = pool.acquire().await.map_err(EmgauwaError::from)?; @@ -35,7 +34,11 @@ async fn main() -> Result<(), std::io::Error> { let app_state = AppState::new(pool.clone()).start(); - log::info!("Starting server on {}:{}", settings.host, settings.port); + log::info!( + "Starting server on {}:{}", + settings.server.host, + settings.server.port + ); HttpServer::new(move || { let cors = Cors::default().allow_any_method().allow_any_header(); diff --git a/emgauwa-core/src/settings.rs b/emgauwa-core/src/settings.rs index 115efa6..5277efa 100644 --- a/emgauwa-core/src/settings.rs +++ b/emgauwa-core/src/settings.rs @@ -1,57 +1,32 @@ use emgauwa_lib::errors::EmgauwaError; -use emgauwa_lib::{constants, utils}; +use emgauwa_lib::settings; use serde_derive::Deserialize; -#[derive(Clone, Debug, Deserialize)] -#[serde(default)] -#[allow(unused)] -pub struct Logging { - pub level: String, - pub file: String, -} - #[derive(Clone, Debug, Deserialize)] #[serde(default)] #[allow(unused)] pub struct Settings { + pub server: settings::Server, pub database: String, + pub permissions: settings::Permissions, + pub logging: settings::Logging, - pub host: String, - pub port: u16, pub origins: Vec, - - pub user: String, - pub group: String, - - pub logging: Logging, } impl Default for Settings { fn default() -> Self { Settings { - database: String::from("sqlite://emgauwa-core.sqlite"), + server: settings::Server::default(), + database: String::from("sqlite://_local/emgauwa-core.sqlite"), + permissions: settings::Permissions::default(), + logging: settings::Logging::default(), - host: String::from("127.0.0.1"), - port: constants::DEFAULT_PORT, origins: Vec::new(), - - user: String::from(""), - group: String::from(""), - - logging: Logging::default(), - } - } -} - -impl Default for Logging { - fn default() -> Self { - Logging { - level: String::from("info"), - file: String::from("stdout"), } } } pub fn init() -> Result { - utils::load_settings("core", "CORE") + settings::load("core", "CORE") } diff --git a/emgauwa-core/src/utils.rs b/emgauwa-core/src/utils.rs index 02f1d43..a35de53 100644 --- a/emgauwa-core/src/utils.rs +++ b/emgauwa-core/src/utils.rs @@ -1,8 +1,3 @@ -use std::ffi::CString; -use std::io::{Error, ErrorKind}; - -use crate::settings::Settings; - pub fn flatten_result(res: Result, E>) -> Result { match res { Ok(Ok(t)) => Ok(t), @@ -10,64 +5,3 @@ pub fn flatten_result(res: Result, E>) -> Result { Err(e) => Err(e), } } - -// https://blog.lxsang.me/post/id/28.0 -pub fn drop_privileges(settings: &Settings) -> Result<(), Error> { - log::info!( - "Dropping privileges to {}:{}", - settings.user, - settings.group - ); - - // the group id need to be set first, because, when the user privileges drop, - // we are unable to drop the group privileges - if !settings.group.is_empty() { - drop_privileges_group(&settings.group)?; - } - if !settings.user.is_empty() { - drop_privileges_user(&settings.user)?; - } - Ok(()) -} - -fn drop_privileges_group(group: &str) -> Result<(), Error> { - // get the gid from username - if let Ok(cstr) = CString::new(group.as_bytes()) { - let p = unsafe { libc::getgrnam(cstr.as_ptr()) }; - if p.is_null() { - log::error!("Unable to getgrnam of group: {}", group); - return Err(Error::last_os_error()); - } - if unsafe { libc::setgid((*p).gr_gid) } != 0 { - log::error!("Unable to setgid of group: {}", group); - return Err(Error::last_os_error()); - } - } else { - return Err(Error::new( - ErrorKind::Other, - "Cannot create CString from String (group)!", - )); - } - Ok(()) -} - -fn drop_privileges_user(user: &str) -> Result<(), Error> { - // get the uid from username - if let Ok(cstr) = CString::new(user.as_bytes()) { - let p = unsafe { libc::getpwnam(cstr.as_ptr()) }; - if p.is_null() { - log::error!("Unable to getpwnam of user: {}", user); - return Err(Error::last_os_error()); - } - if unsafe { libc::setuid((*p).pw_uid) } != 0 { - log::error!("Unable to setuid of user: {}", user); - return Err(Error::last_os_error()); - } - } else { - return Err(Error::new( - ErrorKind::Other, - "Cannot create CString from String (user)!", - )); - } - Ok(()) -} diff --git a/emgauwa-lib/Cargo.toml b/emgauwa-lib/Cargo.toml index bca69c9..d4ffd05 100644 --- a/emgauwa-lib/Cargo.toml +++ b/emgauwa-lib/Cargo.toml @@ -25,3 +25,4 @@ sqlx = { version = "0.7", features = ["sqlite", "runtime-tokio", "macros", "chro libsqlite3-sys = { version = "*", features = ["bundled"] } uuid = "1.6" futures = "0.3" +libc = "0.2" diff --git a/emgauwa-lib/build.rs b/emgauwa-lib/build.rs index 65d8d11..493491e 100644 --- a/emgauwa-lib/build.rs +++ b/emgauwa-lib/build.rs @@ -1,4 +1,4 @@ fn main() { println!("cargo:rerun-if-changed=migrations"); - println!("cargo:rustc-env=DATABASE_URL=sqlite://emgauwa-dev.sqlite"); + println!("cargo:rustc-env=DATABASE_URL=sqlite://_local/emgauwa-dev.sqlite"); } diff --git a/emgauwa-lib/src/lib.rs b/emgauwa-lib/src/lib.rs index ddaf738..f939d0c 100644 --- a/emgauwa-lib/src/lib.rs +++ b/emgauwa-lib/src/lib.rs @@ -2,5 +2,6 @@ pub mod constants; pub mod db; pub mod errors; pub mod models; +pub mod settings; pub mod types; pub mod utils; diff --git a/emgauwa-lib/src/settings.rs b/emgauwa-lib/src/settings.rs new file mode 100644 index 0000000..1e83244 --- /dev/null +++ b/emgauwa-lib/src/settings.rs @@ -0,0 +1,77 @@ +use serde_derive::Deserialize; + +use crate::constants; +use crate::errors::EmgauwaError; + +#[derive(Clone, Debug, Deserialize)] +#[serde(default)] +#[allow(unused)] +pub struct Server { + pub host: String, + pub port: u16, +} + +#[derive(Clone, Debug, Deserialize)] +#[serde(default)] +#[allow(unused)] +pub struct Logging { + pub level: String, + pub file: String, +} + +#[derive(Clone, Debug, Deserialize)] +#[serde(default)] +#[allow(unused)] +pub struct Permissions { + pub user: String, + pub group: String, +} + +impl Default for Server { + fn default() -> Self { + Server { + host: String::from("127.0.0.1"), + port: constants::DEFAULT_PORT, + } + } +} + +impl Default for Logging { + fn default() -> Self { + Logging { + level: String::from("info"), + file: String::from("stdout"), + } + } +} + +impl Default for Permissions { + fn default() -> Self { + Permissions { + user: String::from(""), + group: String::from(""), + } + } +} + +pub fn load(config_name: &str, env_prefix: &str) -> Result +where + for<'de> T: serde::Deserialize<'de>, +{ + // TODO: Add switch to only include local config if in development mode + let dev_file = + config::File::with_name(&format!("./_local/emgauwa-{}", config_name)).required(false); + let local_file = config::File::with_name(&format!("./emgauwa-{}", config_name)).required(false); + + config::Config::builder() + .add_source(dev_file) + .add_source(local_file) + .add_source( + config::Environment::with_prefix(&format!("EMGAUWA_{}", env_prefix)) + .prefix_separator("__") + .separator("__"), + ) + .build()? + .try_deserialize::() + .map_err(EmgauwaError::from) +} diff --git a/emgauwa-lib/src/utils.rs b/emgauwa-lib/src/utils.rs index 8c4f17e..b6419ad 100644 --- a/emgauwa-lib/src/utils.rs +++ b/emgauwa-lib/src/utils.rs @@ -1,3 +1,5 @@ +use std::ffi::CString; +use std::io::{Error, ErrorKind}; use std::str::FromStr; use chrono::Datelike; @@ -5,25 +7,9 @@ use log::LevelFilter; use simple_logger::SimpleLogger; use crate::errors::EmgauwaError; +use crate::settings::Permissions; use crate::types::Weekday; -pub fn load_settings(config_name: &str, env_prefix: &str) -> Result -where - for<'de> T: serde::Deserialize<'de>, -{ - let default_file = config::File::with_name(&format!("emgauwa-{}", config_name)).required(false); - - config::Config::builder() - .add_source(default_file) - .add_source( - config::Environment::with_prefix(&format!("EMGAUWA_{}", env_prefix)) - .prefix_separator("__") - .separator("__"), - ) - .build()? - .try_deserialize::() - .map_err(EmgauwaError::from) -} pub fn init_logging(level: &str) -> Result<(), EmgauwaError> { let log_level: LevelFilter = LevelFilter::from_str(level) @@ -38,6 +24,67 @@ pub fn init_logging(level: &str) -> Result<(), EmgauwaError> { Ok(()) } +// https://blog.lxsang.me/post/id/28.0 +pub fn drop_privileges(permissions: &Permissions) -> Result<(), Error> { + log::info!( + "Dropping privileges to {}:{}", + permissions.user, + permissions.group + ); + + // the group id need to be set first, because, when the user privileges drop, + // we are unable to drop the group privileges + if !permissions.group.is_empty() { + drop_privileges_group(&permissions.group)?; + } + if !permissions.user.is_empty() { + drop_privileges_user(&permissions.user)?; + } + Ok(()) +} + +fn drop_privileges_group(group: &str) -> Result<(), Error> { + // get the gid from username + if let Ok(cstr) = CString::new(group.as_bytes()) { + let p = unsafe { libc::getgrnam(cstr.as_ptr()) }; + if p.is_null() { + log::error!("Unable to getgrnam of group: {}", group); + return Err(Error::last_os_error()); + } + if unsafe { libc::setgid((*p).gr_gid) } != 0 { + log::error!("Unable to setgid of group: {}", group); + return Err(Error::last_os_error()); + } + } else { + return Err(Error::new( + ErrorKind::Other, + "Cannot create CString from String (group)!", + )); + } + Ok(()) +} + +fn drop_privileges_user(user: &str) -> Result<(), Error> { + // get the uid from username + if let Ok(cstr) = CString::new(user.as_bytes()) { + let p = unsafe { libc::getpwnam(cstr.as_ptr()) }; + if p.is_null() { + log::error!("Unable to getpwnam of user: {}", user); + return Err(Error::last_os_error()); + } + if unsafe { libc::setuid((*p).pw_uid) } != 0 { + log::error!("Unable to setuid of user: {}", user); + return Err(Error::last_os_error()); + } + } else { + return Err(Error::new( + ErrorKind::Other, + "Cannot create CString from String (user)!", + )); + } + Ok(()) +} + pub fn get_weekday() -> Weekday { (chrono::offset::Local::now() .date_naive()