From 69918fdc74a711f3146e3e20bce1fb978a90f03f Mon Sep 17 00:00:00 2001 From: Dennis Schmalacker Date: Thu, 22 May 2025 13:23:59 +0200 Subject: [PATCH] Add checkmk app build --- apps/contrib/checkmk/README.de.md | 69 +++++++++++ apps/contrib/checkmk/README.md | 69 +++++++++++ apps/contrib/checkmk/defaults.pkr.hcl | 63 ++++++++++ .../checkmk/files/opt/hcloud/checkmk_setup.sh | 110 ++++++++++++++++++ .../lib/cloud/scripts/per-instance/001_onboot | 7 ++ apps/contrib/checkmk/images/checkmk-logo.png | Bin 0 -> 29522 bytes apps/contrib/checkmk/images/logo_flat.svg | 1 + apps/contrib/checkmk/images/logo_full.svg | 1 + apps/contrib/checkmk/metadata.json | 16 +++ apps/contrib/checkmk/scripts/install.sh | 15 +++ apps/contrib/checkmk/template.pkr.hcl | 38 ++++++ apps/contrib/checkmk/test.sh | 21 ++++ 12 files changed, 410 insertions(+) create mode 100644 apps/contrib/checkmk/README.de.md create mode 100644 apps/contrib/checkmk/README.md create mode 100644 apps/contrib/checkmk/defaults.pkr.hcl create mode 100755 apps/contrib/checkmk/files/opt/hcloud/checkmk_setup.sh create mode 100755 apps/contrib/checkmk/files/var/lib/cloud/scripts/per-instance/001_onboot create mode 100644 apps/contrib/checkmk/images/checkmk-logo.png create mode 100644 apps/contrib/checkmk/images/logo_flat.svg create mode 100644 apps/contrib/checkmk/images/logo_full.svg create mode 100644 apps/contrib/checkmk/metadata.json create mode 100644 apps/contrib/checkmk/scripts/install.sh create mode 100644 apps/contrib/checkmk/template.pkr.hcl create mode 100644 apps/contrib/checkmk/test.sh diff --git a/apps/contrib/checkmk/README.de.md b/apps/contrib/checkmk/README.de.md new file mode 100644 index 0000000..1791264 --- /dev/null +++ b/apps/contrib/checkmk/README.de.md @@ -0,0 +1,69 @@ +# Hetzner Cloud Checkmk + + +
+ +[Checkmk](https://checkmk.com/) ist eine umfassende IT-Monitoring-Lösung, die eine einfache und schnelle Überwachung von Netzwerken, Servern, Anwendungen und Cloud-Umgebungen ermöglicht. + +[![Deploy to Hetzner Cloud](../../shared/images/deploy_to_hetzner.png)](https://console.hetzner.cloud/deploy/checkmk) + +Sie können Checkmk über die [Hetzner Cloud Console](https://console.hetzner.cloud) oder die [Hetzner Cloud API](https://docs.hetzner.cloud/#servers-create-a-server) installieren. + +## Getting Started + +Erstellen Sie sich Ihren Server wie gewohnt über die [Hetzner Cloud Console](https://console.hetzner.cloud). Alternativ zum Betriebssystem können Sie eine App wählen, die Sie gerne vorinstalliert hätten. + +Checkmk wird dann auf dem Server vorinstalliert, aber noch nicht aktiviert. + +Um Checkmk zu aktivieren, melden Sie sich bitte auf Ihrem Server an: + +- Per _SSH-Key_, falls Sie beim Erstellen Ihres Servers einen angegeben haben +- Per _root-Passwort_, das Sie beim Erstellen Ihres Servers per E-Mail von uns erhalten haben, wenn kein SSH-Key angegeben wurde + +Dadurch wird Checkmk aktiviert und die URL der Verwaltungsoberfläche angezeigt. + +## Hetzner Cloud API + +Anstelle der Hetzner Cloud Console kann zum Einrichten eines Checkmk Servers auch die Hetzner Cloud API genutzt werden. + +- Zum Beispiel per Curl-Befehl über die Kommandozeile + + ``` + curl \ + -X POST \ + -H "Authorization: Bearer $API_TOKEN" \ + -H "Content-Type: application/json" \ + -d '{"name":"my-checkmk-server", "server_type":"cpx11", "image":"checkmk"}' \ + 'https://api.hetzner.cloud/v1/servers' + ``` + +- Oder über [hcloud-cli](https://github.com/hetznercloud/cli) + + ``` + hcloud server create --name my-checkmk-server --type cpx11 --image checkmk + ``` + +## Image Inhalt + +### Betriebssystem + +- [x] Ubuntu 24.04 + +### Installierte Pakete + +Dieses Image enthält Checkmk und alle anderen aufgeführten Anwendungen als Pakete. + +| NAME | LIZENZ | +| ---------- | ------------------ | +| Checkmk | GPLv2 | + +## Links + +Weitere Informationen über die installierten Pakete erhalten Sie in den offiziellen Dokumentationen: + +- [Checkmk](https://docs.checkmk.com/latest/en/install_packages_debian.html) + +Weitere Informationen über Hetzner Cloud und Hetzner Cloud Apps erhalten Sie in unserer offiziellen Dokumentation: + +- [Hetzner Cloud Dokumentation](https://docs.hetzner.com/de/cloud/) +- [Hetzner Cloud API](https://docs.hetzner.cloud/) diff --git a/apps/contrib/checkmk/README.md b/apps/contrib/checkmk/README.md new file mode 100644 index 0000000..1ddc7eb --- /dev/null +++ b/apps/contrib/checkmk/README.md @@ -0,0 +1,69 @@ +# Hetzner Cloud Checkmk + + +
+ +[Checkmk](https://checkmk.com/) is a comprehensive IT monitoring solution that enables easy and fast monitoring of networks, servers, applications, and cloud environments. + +[![Deploy to Hetzner Cloud](../../shared/images/deploy_to_hetzner.png)](https://console.hetzner.cloud/deploy/checkmk) + +You can install Checkmk via the [Hetzner Cloud Console](https://console.hetzner.cloud) or the [Hetzner Cloud API](https://docs.hetzner.cloud/#servers-create-a-server). + +## Getting Started + +Create your server as usual using the [Hetzner Cloud Console](https://console.hetzner.cloud). As an alternative to the operating system, you can choose an app that you would like to have pre-installed. + +Checkmk will then be preinstalled on the server, but it will not yet be activated. + +To activate Checkmk, please log in to your server: + +- Use an _SSH key_ if you were provided one when you created your server. +- Use the _root-password_ which we sent to you via email when you created your server; use this if you did not get an SSH key. + +This will activate Checkmk and display the URL of the administration interface. + +## Hetzner Cloud API + +Instead of using the Hetzner Cloud Console, you can use the Hetzner Cloud API to set up a server with Checkmk. + +- For example, via a curl command from the command line: + + ``` + curl \ + -X POST \ + -H "Authorization: Bearer $API_TOKEN" \ + -H "Content-Type: application/json" \ + -d '{"name":"my-checkmk-server", "server_type":"cpx11", "image":"checkmk"}' \ + 'https://api.hetzner.cloud/v1/servers' + ``` + +- Or via [hcloud-cli](https://github.com/hetznercloud/cli) + + ``` + hcloud server create --name my-checkmk-server --type cpx11 --image checkmk + ``` + +## Image content + +### Operating system + +- [x] Ubuntu 24.04 + +### Installed packages + +This image contains Checkmk and all other listed applications as packages. + +| NAME | LICENSE | +| ---------- | ------------------ | +| Checkmk | GPLv2 | + +## Links + +For more information about the installed packages, see the official documentation: + +- [Checkmk](https://docs.checkmk.com/latest/en/install_packages_debian.html) + +For more information about Hetzner Cloud and Hetzner Cloud Apps, please see our official documentation: + +- [Hetzner Cloud Documentation](https://docs.hetzner.com/de/cloud/) +- [Hetzner Cloud API](https://docs.hetzner.cloud/) diff --git a/apps/contrib/checkmk/defaults.pkr.hcl b/apps/contrib/checkmk/defaults.pkr.hcl new file mode 100644 index 0000000..904ce88 --- /dev/null +++ b/apps/contrib/checkmk/defaults.pkr.hcl @@ -0,0 +1,63 @@ +packer { + required_plugins { + hcloud = { + version = ">= 1.5.0" + source = "github.com/hetznercloud/hcloud" + } + } +} + +variable "git-sha" { + type = string + default = "${env("CI_COMMIT_SHA")}" +} + +variable "snapshot_name" { + type = string + default = "packer-{{timestamp}}" +} + +variable "hcloud_api_token" { + type = string + default = "${env("HCLOUD_TOKEN")}" + sensitive = true +} + +variable "hcloud_upgrade_server_type" { + type = string + default = "${env("HCLOUD_SERVER_TYPE")}" + sensitive = true +} + +variable "hcloud_server_type" { + type = string + default = "${env("HCLOUD_SERVER_TYPE_BEFORE_UPSCALE")}" + sensitive = true +} + +variable "hcloud_server_location" { + type = string + default = "${env("HCLOUD_SERVER_LOCATION")}" + sensitive = true +} + +variable "ci_job_id" { + type = string + default = "${env("CI_JOB_ID")}" + sensitive = true +} + +source "hcloud" "autogenerated_1" { + image = var.hcloud_image + location = var.hcloud_server_location + server_name = "hcloud-app-builder-${var.app_name}-${var.ci_job_id}" + server_type = var.hcloud_server_type + upgrade_server_type = var.hcloud_upgrade_server_type + snapshot_labels = { + version = var.app_version + slug = "oneclick-${var.app_name}-${var.app_version}-${var.hcloud_image}" + } + snapshot_name = var.snapshot_name + ssh_username = "root" + token = var.hcloud_api_token +} diff --git a/apps/contrib/checkmk/files/opt/hcloud/checkmk_setup.sh b/apps/contrib/checkmk/files/opt/hcloud/checkmk_setup.sh new file mode 100755 index 0000000..52658f5 --- /dev/null +++ b/apps/contrib/checkmk/files/opt/hcloud/checkmk_setup.sh @@ -0,0 +1,110 @@ +#!/bin/bash +#set -x +# +# This will enable GitLab, configure it with user input +# and optionally set up LE. +# +cat <> /root/.bashrc <W73E8O<6 zxoszo@w?B_r+4-J>-TunBe(m$uIqU{ukpHG_vpo4HTe^ibd(1U95|tMy?e>{|Mey(Ym8z>3Htj+yAdW%im@FAn{Yq8fuyc5;h3CjJls37A1kH z!1jXRZ$ZbPa}*8=dQOndGsM3KzYltDA2@L3fa2|&TCNH6gEKCvm1q1%e;gg}L+|A* zL}eLEye(4VOv7(JZF^wUc&o{bS!wJp$xqf_^^Ue|)jsMR)(Aua614y^igcq!VHWW^h6vy~J(e zkvvye(S*d#!_Z+&VITM82DOAs5bVu=L9Uu*jOfeI_K@*k?O z$+yM-p;~Tm`UdR!>@#;iVp1(kIpD+;(X${2Zrzbx8)dWvbZ}}`tMt=OUo0E}9bEbB zO0@h7)ilE)!1`>t^niibJ?Nx&=VN_Xnb!?ajL7(>l+G_QR(tRalcUg4jHudqCPL_F z8!5nMHdYIV(I$;2!-*H>$hIb4iN4f#70SW`u0lyCpz!Wfyd5{Y2wnHXAqhI;t*&c* z1Z*#j#1NCs-k$vxbks&VdW#ru)wpdWaF@uiclF@Hc?cAVZg0=aHnio^65z!wNND=| z%oC0n@*A20kP7eJ*Abg(yN!JOcOl|BVp|_jLJa>Pp@50~7^Z+@!%5_Hyz1;TyGHGt z3S5SC7{v7GU0bz&6sQ0ld|a%^fUw(e5Hn6@U}KKk!OP_x>AD3v`!{unq{k_wqu`2y zDu~4p5{nfXB{f#(fVS&Sg7Af(U&dqWu2wReH-C?|9jS7ez(l-h?8 zAj<{CQtSgM!+I8-OD~q)86>60r)E`d+U9M#eel*Uw)X5ztoqG^kY9y5gdQk!4EC?1 z3l>!_s(AhjRF2bP>TgiFE$@;K;msRi%;zA>IgSf~%L8=)lwX@}f{REe>9XF8>8sJkot_8u=DtY$_ z_7!ZFIReoy9JoMttN64$sWZr2W_R&@?X<6JBACWspeR6sjOd!bK_7*{mp3F%?|x58 zyrQ{JjtmF$5m1bcgzE0+#6x&V%n6df?8&p`Qxf|~4A?0F(|sh~Nsd-meAhl^a4qs1KXCCq1mu*HDZ2tpp9I(YHB92> zY{h;8KZAg5?E?v$QS(7k`~q?j0ul{RBPCQ8L`k&sesOU$WF>dl)bA(qDO*_|q#K5d z1pVI0fua8>DW{RR+4GB%#|BzD9QIvO=@9Wd;o@#NJ`Z}Aq`G^o|MUN&5=;645cD<(KRbcJVSu4 z8L6J$DxWPcXe%7efeNT25kh0_Orqs2FNCIdR)v^Y-w7Y_^NfFC^H2i1FMXi1;ktCXY4&hxclen??^5PJ_G;#muTGu()k5c=X zpV?4`8k6J@Qll(n8%N_03>1+f<=y@EQqi=vdcg)z-4d^$22YK5!iYjn2Esn555^?e`1ed(Ato zMgEjr+BN%RzBjFmRd{~%;lrl@F!YR`)Z5A9B~x>!pbSD4y6=m{c;4H+!7-{*y{s)pQi@K;#R%`7FBe!p2Pr>J zU!4QVS>=Cjv!BVi4qY_7ABM}7RBJWwqp}L_L%-TzR^7&175Z~{394^%wRZSPP2fs! z;igetbC)jk8(xCQF-TSDNquIqg6hviQGuo5dl~Xj@+@t*JPG*O$fp=go*nAB-><_y znO&>7ZFJ@1)XfHJG(D3L=?hbb+(scp3~=^6l<*a7Ji#G{pgE3*>nY+dV&Q{ z{`KgdMjq}_`YdlcJH5rx-!gm4FL#Z`xHOH5AR&J^;zk&7@FEN1qYrL3_)G}-k>&!3 zLThNYYh*%6T=Bz&h=c((eB|3XcXt}1c=qh&(GqX|6B(89A$Uy~p8jkcLN0Ge=Ih3S zkb!L3UO{V?FQ-j2jFanR?}}>*_=){K5$b5rQ92fX_QQ#(0=T+FA=|Gr(^6>rppY6) z6++UFZ&SU{V!TZL3$?g9NDdz_P(p`CWmCUA&-M7+FM2wj!le^aL#iFSt%RX4zyB1H zaR1yd*lP(uR*~o3ryrt;LIuL!w*NCEiZ<$_SkYbo*ksV3qs7}EbcV-C;!uoWJDSrsz#h{z7@FEh@uz@o`#ax<6HjCy?Ak05%a!uJ_{ zSC8|2`)S7~%l4R7845Rnfb%B)s#oQSM6sU|z z3G5eHGBkKCp8pk$Ed>x?9@AAGb=@5*QkoQG!T>hi7h#)mjbZv@3PXv)~PXIqQQP ziq)=)iHORsQ2?u$&}0G%pamJWifd9gqk5!OZ!a7`-r2``6opjhnH!*c25I2^OGD^j z_ou8N1k@-buvNytlL=v5vbcJYw<@^;fkHO^0wM!n{OqDiO7SS%5brN{UJcNhbVG%5NyZ@N@a8xIwy5C*`7X8=N`R{@uXyOK05Vmu_YqizN3__t9 z{g1(W18*XRO6vbHnD$tpWA3H+!@pHHN*6 zU|SXOYWVJ@GT*-p7R`zE8A!yqu>Tnm5$96KAo)KAk6b4DvHiCnMm3L(-@cl&e)czv z0>d)My^^ZG-P6sVgTOs7%xZQ6|6_ixXA^Sz#6MXfY-~Eq*qZ-06YEb*XLIH3JO9jW zj}o3-mBil3e{gZ=WQg0)JW|0pPs6fZIUXGT=ZHCFkkl`Irm&nHCuk%NS- z;|MYXD%T4+&s90m)$@Lb$^#@BZrFzb=DHC`G68Z_l`m zO|#3p{|*@fb3Zowao*plG@7lwh&Q-~?IPs5ls5R+8 z<(Lu=HPHV&I6og`T4Io=juE`={<}?M4(6%|f7<$+mx7R}EV)Z6{}fGgK(NnlZ8X*a zd;CwYdY_t^X0rzT(_vL1wT<&i+5t-cTUBJ>1wm0+NA><`jopO;-Phv(cA)BvP6nNs zf}L)}W`5tdQRyvJ=69goSC>kSbVGrgc@zz+*v! zkQU9SQTk;;I72cn&DMeY@h;{~IC^TY+>w(N&hTNcwQuXlo*B)?&f{M4$BjNSW(KPD z4OpP4u~qMv`NVE57Y~|p?#Mco8@agXPszaxyrZ(X_>yc-&>fOZ>3l4xD&L#dzU-Qi zk<%xi>W?DKEPYc|?(G|tXUt*OO zirff=huT)Hp$MKzi&=vU4zE7?w@SS7sdySF;ln%ulumF|N}_cp2dXJ$F6~&!Pxl zUG58Nh>I-cetC%4_}<%Gj0+NLQYqWhaKC=aj1>#xEgw(-b5#sD=!uD_w%Psal~o{O z8OI~Wzp-0wFe5RsAzHP#-dvBlWh45X*IF4g?#P=EnIPv}iu5-^oTN)nf70iX>KIX- zgC8gh!7+$&j->VBaY+n7JBNH0)R1z_pvI2%z`F7- z-Ax-qv0!mhvk&WZ-V9FI8=6U&`bXVPZSG1-^wiUZ_Z|n|VPQ56js>nhmp-tU7R1p8 z87DR>SSx^iwN>tLbJN*bZKJH_Q*nsziA>wVLFWzR!j!@Bv>x4hD??sgoZR9-Gv|w! z9?{v_#|k*nIY;pwIEIxfDUO08EnGr6NV=ueX7yo86w=e7AQ8}u?e{Kfk{lF35iTuj z%d16mvft!Hb3yktG1@jlPTv=v*HnE-V%(F(mi)ws-x0J{0xN0__|UXJmC^%^7ceiW z2Pmn-b;5uMTUpj( zLDOb!2<#f`TKn~$GeNY9PfU1n7zq|9;qos7Py=wK+Lk~EM9RA(ceLq;OVfF&CL=Jn z9SULq-qtGZ0_zD+irp({>726mU9`hV8U^qR1MTGnv#vwbm(ObhFrM4N@~4wu>fX;| zL+6kqVsVBmV$R!@E?6Mi**v_~9ZpLDo{Nxh%i(^_!pzxF_&tZeID(Kh^2GZ)ZQ&y; zLY;qBDe|Fr+;DoGy_lXdyq6jZZH(Zk~J+tq+!8yZod+U8^8)K_6Z1y*g zGGm|j^EPtE)x#qQRW^KrXsk+GW)E~Z?Jtqj2# zGL=uU<0Va+KOg*jn(2hMv2D2_lzm7Kt zP;2tht-Q*8esF;ej~kKdR9ZQ2!iSpuu(yqqs!AJY zv3Q*)ocA11j3T@nD{DqhYbycu@$8>%;Of+%;GFk9gl3iWuc2o&{a;|KK$GI|X*;`5 zKeA$qG&ojMo4A8Fafa8+1KIG8CzE@srdAU&9z2zlF5S#zd)|%Xp#!k`r|J~4n?6Zh z@H+d0;yO1vbI-TA@YLX3TQ&EGLVL4?XM(ApX|B&2o!QhBgkO=rJXS=STjqD(dTsBORurbSjHLh zm1nZ!x1_m495s-2V^v*==vExhrC%@_>g-o8txqSR0B)@pT|<|?&w9VJKA&aIFo1>4 z>u6dmJx_}0^)i3#_IYeolAa868$izWb6k%p3#_f`tWz-ZM5VLPu- zwVIcwg?Z48NAQDUli=jX7lYBOOaQIVSm(^C?$chcd!5!Uwy=!q;x}kwGF&#eGvs?*PUA@C4=Onwn>~0%qbe<@j))v9 zK4z{LJa1IQFSnr_)qC;_+w0Nm-@ba-xE7oqOs&`5MOeN*vG_7x_JJxm;fK5h7ZuLh znew%;p}N1|e$g5WLx(hry~h&Eo|6|YV2YrvsQ$vrUlq8`kA+nh1UStGiGS`2=z1Uh zLM2lko#qi%Ib&WVgaEnT-irC>N zzxeZhTh#a(^G(0XS`giP3|z(zJ`nM&7_Fwa=n$OvX2M0JTwVLL8K#DU`jW-^>YqyeAus!ZDl=UU4D> zA}z}15ADXJEj@c5J|KOud@%l;BTep#f%p+x8cSGKQ4BD5n3$D28UY^DUPf(;b4)3^ zx1!!+6uLFw>W1ifk8(LuG#`)BzE167-r!$L;;M6x(G08M(FkNZF(GTJtBo7<8$WL6zvC|zUyq-qPJV~W zr`>NooLoPBi#ii3C65GXCGH%)6@gUXqglxK6!y?L+-k|#sl;K+^myVhPg$+X(h;3? z%-OA6xv7u_LwLbCfH?xWHk8D=-Idyf;grbQUFuT=U;YZ_hg-ZCL?^asVnnsnG#|Ib8yI+fNS|L@y zSo?T{byH|Xoh79bIOLP1)q8oZ#lVWBU*GPY#ShM*Gx|e;sw!_PGASM$dAod|MF(DR z5imv}&GNo3OBztu7**^*&DbA2vT?{?GPxBwKfdgc$iqal`I2DOrvNrXp_q7wxo-`# zT{31lcUH(xJaR53j4H3r{;2{S-}XLxaOm)k3vHY;bqn^+@GRY0T82!O%3TRcJ7<~| z*=#;56;^z9E$jxGaoo^$qdIQRH`CR>gV+PIil9U|QE6lv6e7tjODDC7v`3u&HLSv!rR2^WU~`AZxZ7cud8-Q}~Z zXBNcVWt(rq)jjj_b54BbZZiiQCz7=#f5rL^CTmWv*HU!^2@+0xK3##>%wJ~M%DW* zqHa$GvuZtVkY@x3mECE-$HiJ026X#LxLNo0!g729DrtWV@G>%I#e`Yb)z!kTRlLgN z^Md0e-L0nTyp=KEm9vwcKa_7K#}@`=Y%iSL?Bm?wV`8azg?N>SW4HjU)16vbPOd_o zG6>Ya{iOA414k);4cVyuZsNPrsT?0%J|k44uc}2ai*%scUC#a(;-!Xcd0W`8}I`E1~A|u#A4S{*!0@iQ!sGGT-3-BMd0t zG%{~dw8Yf&m$@VB?MgG`_1>`KEYm!6&R}XqK+U!gQSNytt4C z!EFm}3!M)<3}NWN>sqnrocbUOTZ5BrGRB^98Y2q<7cVIKA6B8!p#ZPa8jNaAD1&Ve zVg&~Lf40BbqU-jiQp{SA-COCUnW+?5Yrzf+M^!5iSxU_0#l2=hkkuM+p);XA$iN}A zkhG;GjrMrJUgSa?ezE#a4S_EN$XYjTRr+iP#`sW_%LwOM?)fA)(NpKu4kY0~mDY4| zY)#gOjT7j-<_D$^HskliGs{cf>{;H1I_6TLoa^^NIe6JA;3*24f|=_KJ;E#%_THqI zs#`awz=`8AR$nm5@TTos7okEw8Nl4rAjGLAoeCrhV?Fc%a8VsPma$!N zbuTKd4zs}M`l@ElC18#Bz(c_R@f$r(E)bo?=p4hvhXOROB>zdtlEeP$q2$n>5l zn!RS16CUDSxjwtLO=I@nS z$ye;FVhr7fWFnI2g}RQLoqV0fw0$%8GyOQN+wf^t_wgA9r;zI!Lb>iW7qh9qZ)<`j zM(0Np4SM37@#<(@5AvkN$IopNpeJX+hY_2&BrmK^FgUQyIFYu&5!KSA0?yRJHgsbu z*G=}On4Y}7SD^Y~(~wP05T@1&Edrx1>PX_W1BW7?sD{*FDrg=UTxoZ%dJp;Jd@NlTdt(#W8xqI$}Hx^0dSH;^=Hzt*6c?oe@Xv}Lwa}`{C2N!SfW=MYGRoQFBf=^O~K1sY7 zi=ezDp!G0f6vwl6XlO0CbMU!KE|qJ1qmj5+h9Mj;6X!AKLpE$oVLR3H$VhvI7CyRfXibX-&Q+&^nu6#kJF;*6PBnE zswd*b5%(m?Zm#r-+kTB2PR91CmC*VSl+m`iamxl9!iH($TNN3zzTvz{1sI${egbgf z2;v)#2l4XO(DO^G4(XoF8JtfTci-#4)lY(oe$Ok{ZD)k*kH(1%7k1IITRdhtH?p%X z(m|WbZg)&=g)JCOsn@L={SF`CWyDeD{~)%^+x?=y<3iqJfhD23RgdUPqE90*=_5R` z0PA8NYB;M#<)iFQ!K+=_3Ai=~I{E~N%i|p%doS2go}Q7Ys)`XrQ7*woMEO*w^QKSd zPAOh=(jF4WN!ULaHnHa@i~Ry7wItQ)t-`7Wiej2HlVPDm!&tTJM$|8c2Yxbu^zS8B5wAuzb7BG8BZwj#Pt{wt&4mQ2Gzp>Isr#l6 zyA?rf{2q(co2&LaZuswlWD8Co!6)WWCroSC)qG^qezpCa9O!;tdeUkkb|#jmQ>i2A zwia?VQa;IiVN6)9+MFO~b_WWkZyD{m2u#rkPZThrTSpkabY8YvcASwiNc0^k3R%52 zD?I~)o0!LMeex&!+<0jqC#HN7Vy{f@9*KUHwQQWP^EAkOMSn(7=3DE!pc^GJ4cUbM z+1z~SKzkYnaLtbf@{S;&8LrSjYMM#g|75V&wYSU2hs@B>i^mmrcnrbS$_LcJ#YK7g zb7x+&cp%l~VmctZB(SC7!EE;$#) zCaun)$%V8h05_g%rI6YP@B^2eN4w1Nos9CD^(TnhC={l4ga-vgWpt*MM&Fz5m|idy zI;yjbOS%L&nW5a<^o^Tpb?r?%s9*SW$iaIjIo=eV{S4G9*vv}6zjjyFt|v%FWgbj= za#4c5<=L`x_;lZ@%E_KSAB!Yp*elhA9!2oHALcf^*UE7%Z9}q_mJjwS56^J6|E@SO z0J+5-jzbUJ@!yO4^Nw#{&Dt|$Lt#YJi&Ub5o1@Da%@jS9fS4R4axUbWu;Cdi6Q8dI z8mxo6PhwXJ`V4fYdCHaGq8EW9C`^B12>!^4n`;bGTW_B1yz4;KK|3*Dj>V0vflA?{ zJe=gv!m?5v?ZImqplG?LFstxG2@jUb5jI)K+y?3I`0Mb!;X=M@n@( zcxfQ@nV-LXC-XG2iKINlZ=AnzQYDF=*S~YBI^&0{{Ino`^Q@#_(y$j%JLXZAAqTW7 z9L3M$@?&3nusR&n$~kJ>VtSTNQ-BzS`4?$Ct37Nfn7NXbnx%%5=cc|v6EUFusgz-f zFd6V%isi}IZZDS6q`PlweBEYwZEYzwzjz>+T`31?59o&$Na8PQ+)@7$f$1AbiU*!1 z|M*!}zj`+x_3HHp$~=x3Kph%)2}LS_ZY_8)-Mr+%=9LU|v{mOF7KACN##bWMO<(t% zfnEMJdaLt2=w`TSgLAX9wey&b$Aen)#*&LELK{DucRs4l_9@Qb>_p4W*$@-!Lg-$- zg*-=QMD)E2dJ`x@j5|H+UG;9Gp^C;qHf^hk)b|@YNFr0w?6xsE4_tQNQ=Is|#Bcs6 zpwD1|#j6Toq`LkswP0r>uvLU$01B4-JZQ4Lv99KHk6ROJI6r-+9^mT~x=8N*~TntbB?UvCa{h+cV>}XiPOYp?{Z?xC;-* zWVWs7Y>)O>OuYKRMy<_uK@qF~EbAW>z0Uml;2Oo@P%$dm&ot@j?CvmAknNSJB-Vs-~GK(UKg;)Vf6{5ozWpm3EFcQ;K(y_DxWG$&#mNb zGgp5bptOI*f}VrpeX6*3ft%Wsg0~tIg7viUXS8ST&3noj7vFEt)nIXs!b|QH>Rca3 zQ_;`?tPz-nk)#NqB&UgH!{C|L7;GRMaehU2@fH@g@w8|U`}MeUWZA7@s2ZHP%+rK0 z+r(z60;WakH}s?XX@B&4~}dJ#h$g+VSvO}bA8 znDAWnF>Y%*8U*$ziGCksHLDS9qYpXbf0a%5z>NX}0mgegXnkt%BDU)D3CD&r-Awp7 zB6v}nJ1FGB$dKv~ohGuvf@_MkbX#X5ix<+2RKNMkvVN0_C!)5lAt4HJ63uH_haL3r zC@Xur8Mx}Heodw#!q{I)mUpVmD5LfZ3bQ$qlmsZBO*IiJkl|3@PW0dYsPqDt^zZ|V z%W9Y6P(=n9Q!|F!t>${Ltpe9Ass1<$n8-}lT@snh&As7l^!+(weD31KR$6n#vacrs zF-(m()!(M9dra4|Y6M>b29yCz; zB3F)-b#y2WKFrX{Y-mO0^P}mHfd;s|CIl~xtEbuYVjg3&DpBjX#Da5U6?IL3_2FPK ziTe6Jl~Ej+6jS{3^<=zYbkKGJT0R&XPd6o}DnLEb!h#n*jPIhd%kp1(;a_8_$gIuqh*q^@^lhyaX(fM)7i3X9`i6q;kI|oD->H;5AIsng0H?^-aTmiyOBShM3H+Ptxo}} zPUU@uqNr(~p8V;a&3cX~bn7WW;(A=1t|!i_xGCzh^rXtuU<^8?-Zi)c7*0^7wLnYU zzu$Lj&3|<>s%b_`9n7HsEolL`=3x%#;g$}_v7oODXUsc{4_NJqsnpx0na~M1B^IJc z$Weyt;&%BzRx~E(wE9DLUO5ozW@j%qfQnRD^)pkFS%;wAypWu|)mpNVB|CooFg}gS z4r?w<(aPl}+wTBp)XXU$UmlJ!TYb~?9C~iM4xRK5vz|) z&$I2|Mw$-l=#ldt^B0FJQ=*&9h(rC5#ZZNr-H}b1qNsPDLrgQ#0>QZaCO5s3&7<1w zhMad$n4+KuJm>=Wxk+l>&LaWA#nv{}ow>IsVy)mt+79aFBj*QB3*>p2N|g5DlD5pQ z1dj}v3^hN4hUpTW02;}-S3_&pu?F|v=|)gFop`~79qfrj*5V8cQw)==&A7bOfGUo( zzIZy_%oufWjuNDx1wPEhrN-<2MDS(X&MAT~7W1{Ys%-h}2PfEocx7KQvKblaDqtu7SuzC)SN&Z+N)SwkEh)nf+w=v6Hg5?=Yu z{bjGtP=6-Ru0cje^Zl_#XOl0VEBMrJw8JLnwWV&vbGi9E-96bqbXEhoxZ=zE!QfmT zbn6*V_0W~2+kU@B?eK8!r8>GS1`u`h*j2XeeD`Lh=e;A}Sl;VQ2QA7nDF0w>-1&KV z_17(IIllHi#4e_-`spMB#mq^oM?B0#{kt+F0o@CLF>m>o8g<83u05et_#y`j^aL+o zm#pXR5DJ=b1!r{FI&S20FRnc}JxMVY4p@7I9i0Ms`+|+8L{zt&w@ibf?Z2=7_7+WV z<;syq_gbNci=r2R0jz$i6Ax>m4OhhUrIEitO(gmRWgyDu z2STPO6v0)Uiq%o-UVFEVlZZCf13Pw|X(*ugBEZaBJ`vB@TRqll&5aHW9=n)5z*-Vs zCWq&-5Id|NtF-XrcIKcW==wT~6nk!rloI3%s;86?3i9lnQ=wVB8 zd^fbAnthHW$L{RxToWXR7LIXXF%nn(NruemM!Yh7Z`8(fa(FV`jOuv=;iVt+#)=66 zdMt<=sn#5RXITzbzEraPS&ad+z6)z?o@ZF+&~wI zl}7-|rR{Lyod&-K{aL3F4V27~c$$mN;TLLcX2>t z%ni4I8$ESkM@QQvPvDXsblkgAULa;~Sp^ZKB5Kaz7_(Uf-3!fJtv9+&^mJ#h;H7yK zu3AO_T_CY<(g7~r_;k&S)tB&cwWn5Zn@jF}veQ|yHd}D>3VLp4dx3nrBCt zSM+QTupq+ui&yq}#b5`W9gJ+DDG4L|=DvC+mvdU|qAAmFvApe80~S0buHkF{J~dyV zr`XRqexfcFrA9`cyOCd^e^V-KZq_9ICIH^!v(ngsgxM^&*Q=5o0{NN!ML14>| z@QR}Av;L~zylCjo)<0lL$*>T%n-=(+5_z~fVSoic&)+Gt&tfaiPO7|s&pz=ZG_k6b z*Jz%F4Jpt5Upr{y4F7!+BCs&A@@OQwd3L2o3tm@Mk4xGnZd;SusJ)<)WWd4}>>~id zMirWUT<0S&1o^rNHcue|c@7Q^hk2?>C|b{=<+(hX8q-86P{6vg=g(IP;Hm;>=@pMl z5;d#y#cUqD06!(%sG_+b7z5M?ELSo~+-hJC<&lP_?A}0i4l^R^xnjw4Ulvw!r9+Biw6PF6qj@EOj=jbh%ubC>>Ea?Zm=@|GEJ^ z6*AsXYQ9yL&V|)yC5EJ6&aYd1O~31CIMjv{8F!gb1W6RKf0zx;9va)^vG$T1r+gZ5 z?IUlFM=9|IAl|3?6(N;Rxhv1%$i7rlYcKpj@J|K(c2{>Jiq_QBx~=>a5d@U-D$uR$Z@EDwiD*(fX=h!{F2{Ua~>g~X};=x!-ltN~{^ zZB}$qQrT?DV*J*{r5u3F=g(pc2cSx(O=HKWjo7)RI|Gg#)wvseiXgnU3bM9PSwgGF z7j|dwtgH5-pK;S)8DAZQtG*(JWf&A4peiKYHpgLr#H4ummO1MP{tQjqG^fb zXtK;8i9-;n)w5U+t%3TxC58i9|T4bzeW7kCY4^@8TA52~orbQI$CEI}$V9sJ4n^`yeTU`^oERNz&8iMbj(0iBL_ zJMvI@=}Mrj-?&;x-4%!`JNdFqI%};$DyB*;HXeGV|L+|7OnkstO;N!aLpVq!Ub;uD zFe`S1_RDpFfR#5<&|aoqiJB zf}g?V-{&=Ex4+zVp3>yr+@=E?!4xAZf$IO=$wFMs#38VffF6A3r?YjK;nn8-ND?F4Ew6{OFC@WejY|^nzVy#zP&k6eS`Pcso z0N2HE35S<8c=IB-m3A2F?WO>R4B`m(dm$wj1oU80pu8sdU@^Se{$=P{XYYMKk^u5_ z?MvrZ-V_lToY}YrG57_CL&7vQ(HiVObs9DqO zsXXk;a|!I=qPe^Ozt-On-&z{DP$-P+>F5c&+W7MoF@QU`d`(_WG5duR)liwpWy*i( zy6jXv)B@dG{uM%}jKYP--2xbB8+hd!n*9jAtjyz6O@-d{bKa}un|~+~wU3<}uMrZ5 zp-Ol*jiIqf`|17y%rtB=OaoI7Hll@Cc)RADsYB#*3J}dDqZhhL(9qCE#sBU$W;0BQ_*Tm&?DW#RZRaOrRcq45Ce8w_Yj zA@(szV>VG@hUN5^KE;g4H@(~ENfo~5##I>Zei4NUbPiYY zs9sa;zA;7k-U;xR8N^u1!-sKR-b*yZA47{6Ste2D4%}pYGw&aV1Fu4Z zr3yauAn8*ZXeUQpXHD4fwoN8(3MG|3x>*gE#h`i_rb7`nCunZHvDs!NNWOsN`ubk{ zD~Dsnza81#a9Q3=Ae1RDox`bIB`o|Z5GhN}>do!R9lea8b0Wu!%84aYzO=oUe%)F=_x zMRicQl`4x6cNI~@hDHXhJBxSj7#|>h@<8s7Y$UX2kWL_jACl5`cKZ0gX?rFD z>FhwgmG;i6O64InaT(Q91KWtpD3OM)cCmkHNMpr6AK4W-+SQ_UInB{PhBzhOKqHSL zo>aXqNwtZ(D?K&6bN1(-NgftS>R(V9@(wFsTJWZYH350Dg7RYK#xQn%nnKW3p@J3r{) z`UPBL?j$)YI5qm|aW~hs=&wyg+SlL=|Itp{I~4}>3Yolop-y}eY5rW~dTGGxxue9H zD;0W&Ha2uM&?UTy7ls{_O^FbU1sTamA3wD_ZBSu7RAn<_rg2H9fqJ-n31exwC&{~5 zfb3NXCn+lqZ{3LgFDuMzw64qYc|$E(1Z{o<|28ydgR{Flgfwo&0)D!BT{+QL(a2+K zjyw=TnJMV?WPRmq;+|K(<}B1QPQ?O(P?R|ym9C_?6xun$ZW2SlkCwk4sy3jaJyHg} zq7pv*rH>f6M0P~&=Q5G~%mQ(q0{ydx#+VfB9H`^-fUcRB?~|^er%KwNz(WH?FEx{;MUq%} zbP$s8Zi_%x4R&TTquZULpF3YtR|H=%9STx#phhB}MOnUBN^)gKPnEVmgoko}%ifoq zH=_6@*@)SOcIx3kv=}C1QUcFKr4HVzgp#F@wZWX@)#(Q5Vr;b8i(Bk>&;V(;HJs(4CYi!+<_VNz>M*l#ZWQF93d&Cs?F;?>k=SNPB^M`yxr`K>JG9GiQ= z_$6K*j%aE6_##zefo3%%0W#f<5!g44z#nOoA>+D=&U|*)Ur$B$zMuf_b+qzgA;Sk@ zlV$hVw@E(>oadmh&cuprM)SX&x0chXI*uJ=&UEsRfik&Y9Rw>T=w6lETtV|X*p>G> zN~W*a+`9{>^%DMm;V!S{v&w+A&jsJ}n9)cU^ZqrCV9Ip?7DVXl>Zm8svNR1t<1u4l z&|-VB-X*2+qli{gE0rQhxhQm^kM6@-i1b0#Y;lt~tK>vn((3gO&q$_I?bG*7=cg7& za8)q_2O#J1E3!_jUUoB?FAs9N-z~LmEooPQw{tOFHzZ|@ zcp`~_%U{JLB+$d>0-?qUhGea(xiPzX3b!W%PtA@scz@L_55f+=l{X#ec}Rd>(fsQ2 zTvB3-E0x&Y!Vyw;h$zI%`^D$pwAuxYZaJRbtYw2(K&bT6S73OH%#w}Jz9mgf%WR0e ze2T2oJcOia@1wA5{U0~_%~{a)PRXVIk`gFMcPN^Zn~{%*d|V02b&@@fB2bw-u|^QO zHx)0}a5$H=7d#Z~gzkY4!Bm@i!tQvDll8B@HEE%bMd}CVVgg2UZ zbEbslT~!{^*wp`}#vjLX8c-&wVNtVW+gCGau=A*d>|s0g9XRxz(+feW6Di~+B4G61 z1=t01{_-Y#joHm4!qkFt?YUzI^RmRBKvDO>@z4NNBt^H|EQviA!ZWzT(q`qD?;fuR zDg%P=4eWWwp+_J_)|1-@?|Z=UT4bKh?zXCzyo?#nS@(FUmK1oxX>&ePq7R-UKu!mC zD7F#@qUpyu$IW@^x!Yjq{_7u zP24LoE9oO{_rfrG28tA_1~ySea*L1{|T ziow!u&9tw{BeiH3z z8nlzu75(#cy04)3a5KG?$inkXcD7HrX=SK}#{IwczWfo&==)!(lqHHtS+gfaWj81a z*|$_OBU!RDmcdv{XhF85EGb)LU&q+8#FQl|OJ)#b&m-%^Sibj}dVjy)_vdf;{5JC} z=brOA%RTqr=icLlvIKir{s$$J&ucmUC4BSSPV@zk)T5Sm8-}l67j9L4+$xA%K*365-&s)})BWF9RW z3r0@BsRt0TTh>Vw*8NTW7Nj0DPMgZez2Vu1%YqH1#M*e4#l{QIlO@! zbX+_;=zsQM)wPRY8fZ_Z)~;0bj+}~#yTR~+GuV|9G1o!MuDAT7?O}Hm!r`Zl78as@ zrVes!;$UhjSu*%@S(5liF4GW}$M*Nx!3`4E33<_YtWjLa=3_4TVN8% zH&0B<#)DMubu1Z5(WsO&o*DV6|Cc%Zk(*MsRn)fwj;kJv6^YRfL&q*zOAdJGt!b^~x0D8ZGHlnwEVGOO`-}hK{uK z^WE0XzT;NQ9&rmBocwJPk%%T#qaj<&sN^mFszOjTw9QwDT4 zl;h8VM^Pt^$@eXX{1K}6_3mu|>)vRZ66Wi!!fw6__C2#dj9^SA9nyPW1fmid|NVme zEQEX_5fDwW)lhDfNN4G8gBs3&F>ayYT0T9!>Q>mT3!C>)<%GXOu1sHK3(d)a>CC63 z=wNzITqx}k1WSgW>^k*p@$ULplsmk*Tyj@Cx5qS#(sJVQ?&RR(--4m7jBV|LV`&w| zByy1@9ACdE7k_}`D@hnLs+kE$Va~*3yYr*gtM-dak#jls89%-;nXk+(WkC>uofDM{9lrLF2q} zK$26FnA#Ud4fzFUMO-9DP}jlD>wvk7J@`L+uWZHr8~!Y zB(D2JM=#iYs#h4gg{JKE2Wj%8Ib7Xg4bJ)+9{gj#8*T9(9u?e6A5e$GPYeh@8ETW& z_Zd!8K8nZVW8J^Df6=8=F}}66pxsa;Q+lw89kt)Ru2X~pawqVS>4q95?i%~1BdU*J zRSL)J%m8EyEx!aibg+IObZX4fuYTz46c6|8GmF23>NHpt@6DD{6Y^trtU8WCkLQN15WI`|VZW|c8WMYvI zVD16{cg>S?ldKK*`3ROw@%ZFL?;AJ2|6+Q_Xg57l^sYhsdwJ81iqH!+wW70*( zZq2epRPtMIRK*`HT$X!5d;sFm@#A|kHr01l@bFYBiNYKZR!u`L2uV-t%mHsYluM2U z73vLQ#5X?Qg)wT2o#@FuD{c6A-M6Qku}cM8bf2s7k7uGEwt)@soYx-yoZtPTHO@b3 zL466<1K^Pg>%z*3CKxz#G{vx1(lv?mV{()26FzNdPhA3J&d|xV_+5W;t!c;UX+HJy zpQ5g^Ae-~JSdi*H4$0rW!2c*D5Vhc}ij({fcb?yR3Nm2REha;0-UB*{VbPL!3JU=d ziuqa}{0^`7dRB$&H){Lz^IEL#726Pso+!rs!x#L={%3nKHqka}%n)Qf z?4Us+nB6RF{UM}w`XBcqBw>_2i0WX;u}-7q!c#S-@NA{JyDA&c?m~ajQ7ud-(lj3X?3vBafL@ZC3rFM6J^V zcVux4_3B99)dPWJ^u4iAaS&KOe})?4E-JGCTs>Nuqh7dMI4PJ(ITS= zB~&(Y@-0?oMS&BQoR%Mh4M zrnb7FS@UI|ZLRMMB+`Fig-V0cfONX+PbWuh|BDtwTlAZRJf9o`9Vj!fxN6(1?u;$7 z<8v30)={}|m00l;B#p;E$-{RQa17ZTA0pZIWUQ-0UU(Oj7y*%Ivs66EuLkI4uFTQ; zUuhhmcYoMBa_fvlMFg4ev`Z65y5$H1;&Oj*tmBuJsQYaWf|yChSgkW+lx9nf2<9l1 z4gatMH9!XvltsyqKxZQEjkJOx;|0qYHA}%~5?Y&c437P{jArGOvwr;ihHEn<`fd2g zs>+*h?C+mZwhQ(-_7O-_H~U_(tCuEzs+Gnrln2!dV`gcny<3^14RK{~k>5Wj>ex_U z5ABPlbR-a4_Nx|3t*464_!f5*9BNM2szY5P9^k+K<4vzvP6F0QHhu7%-WQKQhI6LM zt|)neRSoP&#=q*$UVv>sg{Z;bK>D_FwS!7%Lp@)9Naj0x?>yyh3|`NwL-x$sf`LzU z`_*FoMrU`wgj>a!Z?^iPS^cF?t(%>5QP^VJ{DK@FFhnO8!W{vJa`9(aVk=R~ShBMC zbhN4Zp?s4M?Egh9 zQMvdDOe{#0(u9Lz_ZqczDdsdO#cBg-JRgyFz|~?stFB{88AsatVl%Z`%_EY7$+? zkQy1g64@s4*u>wLKNn76=J;L?e|B{_QMPyavvGlgT;`}q_A3VPInlkd z_=nu7peLZwz5X(uh+s?~5P`cvWCHfy&=#zI0jP>RZ8A0Y%SZ%1*G^i{GmI2MBdsBS_Vn#2F#H?(Vo|VDdM{-337S z;fYfe*$-k939Vwj#D=1HtW$kwC#xWV^mfKS%>i~oIb7s9r7dY~15US7=U*dBK}u~x zTt9%<@eSBuyFI$5voZPZ+?yYw0T%3QRwnqA(hTB*>+9OLnVSvUl?jOIAP|XhGz0Bj zQKC(Ox}#%XN^CLnoZ{NqmYSnz72il9^GVJj7boHceU}ZYJM?=Q8>&`KiLMX7S#?Rw z;j;$CB(2gC55Aqsds?5zlGO@g^lVlmnPW zL0GO*A`*f9|EcSy4f0co6K|ZSh5ri_5@5f~+v*HTUN&gU8Aerx^Ny8R$YXPx|<_aDrek#-Up5MRNi%N`?Dx zsP0h=Po#uht-24EEgpM6ab{;n^)_^9w0wJthd)v+i51f6-7dd7-bdXD)=^-}4=Q_1 zhNmHSmZNIQPkC8`(QGxDZ-?)>LvbvaY~ai8nP-MU86_aLB?IeRn`_-vh^CRs~P>u#~hM>gvkDuitV(Rov^o8%1NUmsovB=vnpx~4KKE)ai-AE zR|SzoFqt$JF0E|Bv+l1~$mu51E6xhY9O_SLWmi9i+qttZ;u4(-omeQNs(rXZ zu~X~MlEQdsCN19uEVr}O6pt2b9P8I9SJEFS@(f^22 z2?!P_bTVx&nM18O1Wwxn3?cvC?E#NKfn~1B(JT$LVZt#ZegsR(Q?t!C*FBQwQi^w8 zsNPoHbr>o9Dz>0{QwPm@?M#YAcn!Odk9AsAaU=PxDV)5Ehah)pGY1*OQMtVY^{@a= z5uDfwJE+r}c@18iJYKD6D>D~V_8d%IxIEjKtFG}n?Q0!WRontPKDjaO9@-==)84b1!u#O zDv?cF1V~N&jr;qbc{*tQZVGTgB@+;($f;7sr@*`?>r~CoZhy(LI`56neKG-B+edDDd8I)a6lWrPsU~Q z*+u534mi|j?B$QACfBDuPPx42DLK9U$EPW)$)gmMZ_$(N{`n$tTqEz^O{obnacG|o z-;KzH`3tyd+AQW=>VOysj9|jLy0>Gz)&_oi*47EVVgK4>s{MnulyO{sd36#P;0?x) zczQZ$uQqKuqjCw`QVWzxT6SwZTc`SWIdbW5b&lb>+8^rwz^BHIWVYtKVE%z>MsGih4F9f`Xj<9X9T~{jUr=$&Syf?#JzVz5N z*_Epq45!Y~CV#3!8!t#g!n1t$Ru<-Eak-ExwGRpMg2I(eI3ETo_0F?gP)%aC7RDS( z((24DB%Jdk6-*d;YrdDnF%-5N@|t?)>ilU6a7I;w_>;EwG=pXn|Bt|RPtwoQU-m>{ z40okP{`DZ|{Lk;k=^yD1Eq?tJPql1H;XdkcWV}0JHO!~K!7Tx64-c2${_x+1r(^_h zjmLA9bl%%$c8bO0pWPCg>N8qZ)X&n$maS`R)P;}oYKp4gx0S~2>2QrA{mLEHNI(?R zI{d}D9XR3(;C78C>hnze(@bK0Gse-CVC4yxtGz^mt%E9yC&+y0 z6~&2y|9-ni;aE3xtn2{6>YIXjRNj;q)$-vlHz%+PO6RWg9w z2WsNhCpbeAdGq~{A*;cRf!a{{weC092`7Xxj<1@X&A~Tb3;c5Xo$XHtCHE)8BOJXA zyyvv;PED;7ss|ug`q2c;dGpEk%*)dh81&(W_#``L+6HQ7^r~v|^5@~-5hc!nOqn=WXe1ySHu{E9D?72D# zf>qm2PO5Qac_Ae`;%hx?5!LF}T{K31^YhsT0ZFLh9nTH5g?VLMZvW?BI*_VQ&%D?$ zuNgQzZ6fPpbik0=SlNLt{)uRaEg1(*9OkGEAaJQ0eDvKPwt2TAF zCIz9+cRYjn!_!+S*rctT;VY)!rnv(3mr`Z&OLz5!F&VYfYY7X7^T7<8yxZBbM|bo1 zhBN2AE&Nz|p{nkob*+K&RjaOSUl)dw(_m~zFV;shWmc~jS#$PP@|$%`XpJeMN|apT zzHjwJt1c*TlJmGaJP{c76VB8Hu0$y7;k*{xA7%9>wQR?$wbvo!6MlpoT-AM0zxOpA z{NSZ~G}~%dw93uul;LrI^~pRe@2(25=TZ4$%aX7A`pK7@<^dt2$Q*i16J0zQ<1jNz z(iDnl+fgFLgh^V&w$B=L&y4sD>P_FhXTlqk?AX_qr+7PeMP}8wU#t4|24U~BFfw$< z+5_%3YM7@6`49J9BsFjq?y9|NY2U@`_pPZ@#@l{+b#9He{FMJ3veme9k;EE#xIoe8+A90vPJ1OSA0tUF=)+MvwHYgQPp zw|_k!l!picXImUUzMmG$!144m^aN5%lQ`VxfTNP>)cHa8eBdgau7#386^l)ExB*7E z0bx*i;|l|flQEpc3*hMKLRDc5p6;b#0KUyyrHRG?kKzBfX_|fhFW{id{AXqpHN`52 z*R}qCWAQmD856!_Ux)d>=CmDwt<3b`e~*dzkHKN1tkOLE28R|;{Ku#$((R^8KRwv?Zj9w!aKck_I;15&0oP|HF||P?h62?TI_(@!s~$Rc2RJT(FCC$15od zplXjeSzXpAT=x;0(&sO`eMkM_G5C1K*A#py2qejc9E)1OhUlPr= zpk*Y{H^!`KboLgwAnjULC|bo`f@jRoO%Krgf)WR3{ac?j@0Zc67E_~YAKfuIAeeCqucnA2z&?5R%`npC^i8&8})nOz#JyOhqr28k+|8K z4vHwzRg9^3`Gj}AbguduD_C0vuDsr#=-%2fIBlDyAaTEm9xhHZ^|a4vJarEtd*CGJ zzDUy{4Sw+09y8BY?H^FMzQSGc`f6C5{dFhAKPp!3#oCH^gioZ8asX-!$aa3g<;rv* zB3sBEDS(BSpN7%Xs6fKX(}QsoP4GzCc;S}JUT3A5Z^wImK+Oue`r7jd9zknf5!UlI z!iC$Qq{YlJk)b1XSgtaQ;BfM`91u^bO-@`Ub&*NQWxz{d&3Fv3$+neZR4whEcl*t3B4m^$=ShPb;bOi?{zzsU-&e8^jiS}K!ZT)Qf> zw`vBE4rQ8`yn8!%zT)P@Ng)r*K=4crai~waxo1TDR{^)+xOoM*C9{o_d$3*xMrfg7PJxJ8hez+^4I4?F0G|h;DX`qMnfgS3{-cbif#uO9 zmRwTY$1C9h-2O|8?j=E6tuSExq4}PtaHmE+rm>)~#_I)d!J1QjDSJUU4Ly3;^1kGG z9!j7gc$pDbt|4r)P!y;S{(Rzg-)E6^eDDycM)bObU0L(gNJ^Rjd;u70V>_dx(aob(6x8+dt0}H_`#ygC4bP zw@YXAXdLoJN_{w19)oSj1wiDufD$Aj{}_1>Goo@*v>^xF;Yf^5GXeTZcx_~@f7GX+(?s>i#TR+D268a_v7Hq{Qkd? zl!$^_BZsO?YaQ9a$3ug~dV5f?%)cdKQ34nz(?_pGLX{_|IRj*_urb78@n<<|K;fkdTMZoc zl`rl0Mf)sb{iT*P+8bDdWN;F%m)qZ`W&t;Ia+80#`SPAcU-695&{2XL!dIyx*o?T zaDA*8F$q=OrkNYvN>L(yxHKEK9=azVfr*`rP<{)${#mh4B&iyjDbZ!LR8a1SB`6V}TsbU# z4KV-A#x}AeUX;-eyztBks7Qi~2Az70W&DENS<@$5m+z@VNOCgi&?;MiI>nz((e5TF=Z zcq~4}!5pUU%hp#4P1QdnCxiE6-D=jQb`p^=h2RrRaj}lhFy~fXXv(7bbKvZQR;lR5 zR}{{8qXTrIJl{A^HJ-l#;*tQ@TjKVGY!TpJ=y)T$Jx;s;G<+80M6(}S1V_-kAz6@^TU8}@{ z3s_IVL%Vz@yFhO^+!_#V54ZY$@tJ)Pm^D4AXO0K4)=jE3V;fUY66`#|k0c%lZO2Gsg@8v|$=hP8M&0V+8$11p+{C#?XJ>cN$zVDa z;nv0W(uGpT6F(4kiml<;-tc9zlx@fo$QxQ5O+Bai9M;Pi)^U`G;21dwJoyNfmlXr! ztMYzG@~`B-pW4L!mAomz=EtTRYq>n2I_=Yv6NxR^_0Ye~lPyb|sOUDgRnUKGyoz zs`6vj$$zaDyZu@J*J@+V*7CnrZ;GoL{%uwL?D(qASh~s)Iy!O|zWN`)#ET*4G^^nD z1++rWXht-j+(W0HZnHb@VMx1(TI>1SsQSp`x$CgP1+cyM0rZQTfByX0b2B2pqFq`u R4MZ \ No newline at end of file diff --git a/apps/contrib/checkmk/images/logo_full.svg b/apps/contrib/checkmk/images/logo_full.svg new file mode 100644 index 0000000..54d3e6d --- /dev/null +++ b/apps/contrib/checkmk/images/logo_full.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/contrib/checkmk/metadata.json b/apps/contrib/checkmk/metadata.json new file mode 100644 index 0000000..a9d4370 --- /dev/null +++ b/apps/contrib/checkmk/metadata.json @@ -0,0 +1,16 @@ +{ + "description_de": "Checkmk ist eine umfassende IT-Monitoring-Lösung, die eine einfache und schnelle Überwachung von Netzwerken, Servern, Anwendungen und Cloud-Umgebungen ermöglicht.", + "description_en": "Checkmk is a comprehensive IT monitoring solution that enables easy and fast monitoring of networks, servers, applications, and cloud environments.", + "documentation_url": "https://docs.checkmk.com/latest/en/install_packages_debian.html", + "name": "Checkmk", + "os_id": 161547269, + "packages": [ + { + "license": "GPLv2", + "name": "Checkmk" + } + ], + "recommended_server_type": 22, + "version": "2.4.0p2", + "maintainer": "Dennis Schmalacker " +} diff --git a/apps/contrib/checkmk/scripts/install.sh b/apps/contrib/checkmk/scripts/install.sh new file mode 100644 index 0000000..b3cf209 --- /dev/null +++ b/apps/contrib/checkmk/scripts/install.sh @@ -0,0 +1,15 @@ +#!/bin/bash +#set -x + +# Get the Checkmk pubkey to verify the +wget https://download.checkmk.com/checkmk/Check_MK-pubkey.gpg -O /tmp/Check_MK-pubkey.gpg +# Import key +gpg --import /tmp/Check_MK-pubkey.gpg + +# Download and add the Checkmk GPG key +wget https://download.checkmk.com/checkmk/${application_version}/check-mk-raw-${application_version}_0.noble_amd64.deb -O /tmp/check-mk-raw-${application_version}_0.noble_amd64.deb +# Install Checkmk +apt install -y /tmp/check-mk-raw-${application_version}_0.noble_amd64.deb + +# Install Certbot +apt install -y certbot python3-certbot-apache diff --git a/apps/contrib/checkmk/template.pkr.hcl b/apps/contrib/checkmk/template.pkr.hcl new file mode 100644 index 0000000..0bb123f --- /dev/null +++ b/apps/contrib/checkmk/template.pkr.hcl @@ -0,0 +1,38 @@ +variable "app_name" { + type = string + default = "checkmk" +} + +variable "app_version" { + type = string + default = "2.4.0p2" +} + +variable "hcloud_image" { + type = string + default = "ubuntu-24.04" +} + +build { + sources = ["source.hcloud.autogenerated_1"] + + provisioner "shell" { + inline = ["cloud-init status --wait --long"] + valid_exit_codes = [0, 2] + } + + provisioner "file" { + destination = "/opt/" + source = "apps/hetzner/checkmk/files/opt/" + } + + provisioner "file" { + destination = "/var/" + source = "apps/hetzner/checkmk/files/var/" + } + + provisioner "shell" { + environment_vars = ["application_version=${var.app_version}", "DEBIAN_FRONTEND=noninteractive", "LC_ALL=C", "LANG=en_US.UTF-8", "LC_CTYPE=en_US.UTF-8",] + scripts = ["apps/shared/scripts/apt-upgrade.sh", "apps/hetzner/checkmk/scripts/install.sh", "apps/shared/scripts/cleanup.sh"] + } +} diff --git a/apps/contrib/checkmk/test.sh b/apps/contrib/checkmk/test.sh new file mode 100644 index 0000000..78f7666 --- /dev/null +++ b/apps/contrib/checkmk/test.sh @@ -0,0 +1,21 @@ +#!/bin/bash + +# Test if Checkmk is installed +if ! dpkg -l | grep -q check-mk-raw; then + echo "Checkmk is not installed." + exit 1 +fi + +# Test if Checkmk service is running +if ! systemctl is-active --quiet omd; then + echo "Checkmk service is not running." + exit 1 +fi + +# Test if apache web interface is accessible +if ! curl -s --head http://localhost/ | grep "200 OK" > /dev/null; then + echo "apache web interface is not accessible." + exit 1 +fi + +echo "All tests passed. Checkmk is installed and running."