<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Posts on XGA</title><link>https://www.xga.ie/posts/</link><description>Recent content in Posts on XGA</description><generator>Hugo</generator><language>en-gb</language><lastBuildDate>Mon, 06 Jul 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://www.xga.ie/posts/index.xml" rel="self" type="application/rss+xml"/><item><title>MikroTik LTE modem configuration generator</title><link>https://www.xga.ie/posts/mikrotik-configuration-generator/</link><pubDate>Mon, 06 Jul 2026 00:00:00 +0000</pubDate><guid>https://www.xga.ie/posts/mikrotik-configuration-generator/</guid><description>&lt;h2 id="ai-disclaimer"&gt;
 AI Disclaimer
 &lt;a class="heading-link" href="#ai-disclaimer"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="Link to heading"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;Link to heading&lt;/span&gt;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;This tool was generated using Claude. The outputs from the tool were manually verified against existing tooling, then tested on a physical device before deployment.&lt;/p&gt;
&lt;h2 id="where-this-project-started"&gt;
 Where this project started
 &lt;a class="heading-link" href="#where-this-project-started"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="Link to heading"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;Link to heading&lt;/span&gt;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;The remote monitoring stack I manage utilises LTE modems which are connected to the device to be monitored.&lt;/p&gt;
&lt;p&gt;Each modem must be manually configured and tested before being shipped to site. Having a standardised configuration provides consistent troubleshooting steps if a device doesn’t work as planned.&lt;/p&gt;</description></item><item><title>Testing PGP email signing and encryption</title><link>https://www.xga.ie/posts/pgp-signing-emails/</link><pubDate>Fri, 03 Jul 2026 00:00:00 +0000</pubDate><guid>https://www.xga.ie/posts/pgp-signing-emails/</guid><description>&lt;h2 id="what-is-this-post"&gt;
 What is this post?
 &lt;a class="heading-link" href="#what-is-this-post"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="Link to heading"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;Link to heading&lt;/span&gt;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;This post contains a few hints to prove PGP encryption is working on Thunderbird or your PGP mail client of choice. This post is not a guide for configuring PGP or Thunderbird.&lt;/p&gt;
&lt;h2 id="background"&gt;
 Background
 &lt;a class="heading-link" href="#background"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="Link to heading"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;Link to heading&lt;/span&gt;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Email isn&amp;rsquo;t secure and we shouldn&amp;rsquo;t trust a thing we receive. We should know that by now. If you don&amp;rsquo;t, &lt;a href="https://jrs-s.net/2025/10/30/please-stop-trusting-email/" class="external-link" target="_blank" rel="noopener"&gt;see this article from Jim Salter&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Monitor Restic backups with Healthchecks.io</title><link>https://www.xga.ie/posts/restic-sftp-backup-healthchecks/</link><pubDate>Sat, 27 Jun 2026 00:00:00 +0000</pubDate><guid>https://www.xga.ie/posts/restic-sftp-backup-healthchecks/</guid><description>&lt;p&gt;This script is used on Linux hosts to complete additional offsite file backups as part of our larger DR plan. It has several features:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;File backup and prune jobs&lt;/li&gt;
&lt;li&gt;Integrated monitoring on Healthchecks.io, including &lt;code&gt;start&lt;/code&gt;, &lt;code&gt;success&lt;/code&gt; and &lt;code&gt;failure&lt;/code&gt; messages.&lt;/li&gt;
&lt;li&gt;Multiple attempts to complete both backups and prunes in case of failure.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;#!/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8be9fd;font-style:italic"&gt;eval&lt;/span&gt; &lt;span style="color:#f1fa8c"&gt;`&lt;/span&gt;ssh-agent -s&lt;span style="color:#f1fa8c"&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ssh-add /root/.ssh/rem-bkups
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8be9fd;font-style:italic"&gt;export&lt;/span&gt; &lt;span style="color:#8be9fd;font-style:italic"&gt;RESTIC_REPOSITORY&lt;/span&gt;&lt;span style="color:#ff79c6"&gt;=&lt;/span&gt;&lt;span style="color:#f1fa8c"&gt;&amp;#34;sftp:username@host:/data/directory&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8be9fd;font-style:italic"&gt;export&lt;/span&gt; &lt;span style="color:#8be9fd;font-style:italic"&gt;RESTIC_PASSWORD&lt;/span&gt;&lt;span style="color:#ff79c6"&gt;=&lt;/span&gt;&lt;span style="color:#f1fa8c"&gt;&amp;#34;12345&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8be9fd;font-style:italic"&gt;HC&lt;/span&gt;&lt;span style="color:#ff79c6"&gt;=&lt;/span&gt;&lt;span style="color:#f1fa8c"&gt;&amp;#34;https://hc-ping.com/12345&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8be9fd;font-style:italic"&gt;MAX_ATTEMPTS&lt;/span&gt;&lt;span style="color:#ff79c6"&gt;=&lt;/span&gt;&lt;span style="color:#bd93f9"&gt;3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8be9fd;font-style:italic"&gt;RETRY_DELAY&lt;/span&gt;&lt;span style="color:#ff79c6"&gt;=&lt;/span&gt;&lt;span style="color:#bd93f9"&gt;60&lt;/span&gt; &lt;span style="color:#6272a4"&gt;# seconds between attempts&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6272a4"&gt;# Generic retry wrapper: retries the given command up to MAX_ATTEMPTS times&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;run_with_retries&lt;span style="color:#ff79c6"&gt;()&lt;/span&gt; &lt;span style="color:#ff79c6"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#8be9fd;font-style:italic"&gt;local&lt;/span&gt; &lt;span style="color:#8be9fd;font-style:italic"&gt;label&lt;/span&gt;&lt;span style="color:#ff79c6"&gt;=&lt;/span&gt;&lt;span style="color:#f1fa8c"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#8be9fd;font-style:italic"&gt;$1&lt;/span&gt;&lt;span style="color:#f1fa8c"&gt;&amp;#34;&lt;/span&gt;; &lt;span style="color:#8be9fd;font-style:italic"&gt;shift&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#8be9fd;font-style:italic"&gt;local&lt;/span&gt; &lt;span style="color:#8be9fd;font-style:italic"&gt;attempt&lt;/span&gt;&lt;span style="color:#ff79c6"&gt;=&lt;/span&gt;&lt;span style="color:#bd93f9"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;while&lt;/span&gt; &lt;span style="color:#ff79c6"&gt;[&lt;/span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#8be9fd;font-style:italic"&gt;$attempt&lt;/span&gt;&lt;span style="color:#f1fa8c"&gt;&amp;#34;&lt;/span&gt; -le &lt;span style="color:#f1fa8c"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#8be9fd;font-style:italic"&gt;$MAX_ATTEMPTS&lt;/span&gt;&lt;span style="color:#f1fa8c"&gt;&amp;#34;&lt;/span&gt; &lt;span style="color:#ff79c6"&gt;]&lt;/span&gt;; &lt;span style="color:#ff79c6"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#8be9fd;font-style:italic"&gt;echo&lt;/span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#8be9fd;font-style:italic"&gt;$label&lt;/span&gt;&lt;span style="color:#f1fa8c"&gt;: attempt &lt;/span&gt;&lt;span style="color:#8be9fd;font-style:italic"&gt;$attempt&lt;/span&gt;&lt;span style="color:#f1fa8c"&gt; of &lt;/span&gt;&lt;span style="color:#8be9fd;font-style:italic"&gt;$MAX_ATTEMPTS&lt;/span&gt;&lt;span style="color:#f1fa8c"&gt; at &lt;/span&gt;&lt;span style="color:#ff79c6"&gt;$(&lt;/span&gt;date&lt;span style="color:#ff79c6"&gt;)&lt;/span&gt;&lt;span style="color:#f1fa8c"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;if&lt;/span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#8be9fd;font-style:italic"&gt;$@&lt;/span&gt;&lt;span style="color:#f1fa8c"&gt;&amp;#34;&lt;/span&gt;; &lt;span style="color:#ff79c6"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#8be9fd;font-style:italic"&gt;echo&lt;/span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#8be9fd;font-style:italic"&gt;$label&lt;/span&gt;&lt;span style="color:#f1fa8c"&gt; succeeded on attempt &lt;/span&gt;&lt;span style="color:#8be9fd;font-style:italic"&gt;$attempt&lt;/span&gt;&lt;span style="color:#f1fa8c"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;return&lt;/span&gt; &lt;span style="color:#bd93f9"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#8be9fd;font-style:italic"&gt;echo&lt;/span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#8be9fd;font-style:italic"&gt;$label&lt;/span&gt;&lt;span style="color:#f1fa8c"&gt; failed on attempt &lt;/span&gt;&lt;span style="color:#8be9fd;font-style:italic"&gt;$attempt&lt;/span&gt;&lt;span style="color:#f1fa8c"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#8be9fd;font-style:italic"&gt;attempt&lt;/span&gt;&lt;span style="color:#ff79c6"&gt;=&lt;/span&gt;&lt;span style="color:#ff79c6"&gt;$((&lt;/span&gt;attempt &lt;span style="color:#ff79c6"&gt;+&lt;/span&gt; &lt;span style="color:#bd93f9"&gt;1&lt;/span&gt;&lt;span style="color:#ff79c6"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;[&lt;/span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#8be9fd;font-style:italic"&gt;$attempt&lt;/span&gt;&lt;span style="color:#f1fa8c"&gt;&amp;#34;&lt;/span&gt; -le &lt;span style="color:#f1fa8c"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#8be9fd;font-style:italic"&gt;$MAX_ATTEMPTS&lt;/span&gt;&lt;span style="color:#f1fa8c"&gt;&amp;#34;&lt;/span&gt; &lt;span style="color:#ff79c6"&gt;]&lt;/span&gt; &lt;span style="color:#ff79c6"&gt;&amp;amp;&amp;amp;&lt;/span&gt; sleep &lt;span style="color:#f1fa8c"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#8be9fd;font-style:italic"&gt;$RETRY_DELAY&lt;/span&gt;&lt;span style="color:#f1fa8c"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;done&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#8be9fd;font-style:italic"&gt;echo&lt;/span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#8be9fd;font-style:italic"&gt;$label&lt;/span&gt;&lt;span style="color:#f1fa8c"&gt; failed after &lt;/span&gt;&lt;span style="color:#8be9fd;font-style:italic"&gt;$MAX_ATTEMPTS&lt;/span&gt;&lt;span style="color:#f1fa8c"&gt; attempts&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;return&lt;/span&gt; &lt;span style="color:#bd93f9"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;do_backup&lt;span style="color:#ff79c6"&gt;()&lt;/span&gt; &lt;span style="color:#ff79c6"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; restic backup &lt;span style="color:#f1fa8c"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; /home &lt;span style="color:#f1fa8c"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; /etc &lt;span style="color:#f1fa8c"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; /opt &lt;span style="color:#f1fa8c"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; /var/www &lt;span style="color:#f1fa8c"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --verbose
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;do_prune&lt;span style="color:#ff79c6"&gt;()&lt;/span&gt; &lt;span style="color:#ff79c6"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; restic forget &lt;span style="color:#f1fa8c"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --keep-last &lt;span style="color:#bd93f9"&gt;1&lt;/span&gt; &lt;span style="color:#f1fa8c"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --keep-daily &lt;span style="color:#bd93f9"&gt;2&lt;/span&gt; &lt;span style="color:#f1fa8c"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --keep-weekly &lt;span style="color:#bd93f9"&gt;3&lt;/span&gt; &lt;span style="color:#f1fa8c"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --keep-monthly &lt;span style="color:#bd93f9"&gt;4&lt;/span&gt; &lt;span style="color:#f1fa8c"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --prune
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8be9fd;font-style:italic"&gt;echo&lt;/span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#34;Starting system backup at &lt;/span&gt;&lt;span style="color:#ff79c6"&gt;$(&lt;/span&gt;date&lt;span style="color:#ff79c6"&gt;)&lt;/span&gt;&lt;span style="color:#f1fa8c"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;curl -fsS &lt;span style="color:#f1fa8c"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#8be9fd;font-style:italic"&gt;$HC&lt;/span&gt;&lt;span style="color:#f1fa8c"&gt;/start&amp;#34;&lt;/span&gt; &amp;gt;/dev/null 2&amp;gt;&amp;amp;&lt;span style="color:#bd93f9"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6272a4"&gt;# Only signal HC success if BOTH backup and prune succeed&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;if&lt;/span&gt; run_with_retries &lt;span style="color:#f1fa8c"&gt;&amp;#34;Backup&amp;#34;&lt;/span&gt; do_backup &lt;span style="color:#ff79c6"&gt;&amp;amp;&amp;amp;&lt;/span&gt; run_with_retries &lt;span style="color:#f1fa8c"&gt;&amp;#34;Prune&amp;#34;&lt;/span&gt; do_prune; &lt;span style="color:#ff79c6"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#8be9fd;font-style:italic"&gt;echo&lt;/span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#34;System backup completed at &lt;/span&gt;&lt;span style="color:#ff79c6"&gt;$(&lt;/span&gt;date&lt;span style="color:#ff79c6"&gt;)&lt;/span&gt;&lt;span style="color:#f1fa8c"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; curl -fsS &lt;span style="color:#f1fa8c"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#8be9fd;font-style:italic"&gt;$HC&lt;/span&gt;&lt;span style="color:#f1fa8c"&gt;&amp;#34;&lt;/span&gt; &amp;gt;/dev/null 2&amp;gt;&amp;amp;&lt;span style="color:#bd93f9"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#8be9fd;font-style:italic"&gt;echo&lt;/span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#34;System backup or prune failed at &lt;/span&gt;&lt;span style="color:#ff79c6"&gt;$(&lt;/span&gt;date&lt;span style="color:#ff79c6"&gt;)&lt;/span&gt;&lt;span style="color:#f1fa8c"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; curl -fsS &lt;span style="color:#f1fa8c"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#8be9fd;font-style:italic"&gt;$HC&lt;/span&gt;&lt;span style="color:#f1fa8c"&gt;/fail&amp;#34;&lt;/span&gt; &amp;gt;/dev/null 2&amp;gt;&amp;amp;&lt;span style="color:#bd93f9"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#8be9fd;font-style:italic"&gt;exit&lt;/span&gt; &lt;span style="color:#bd93f9"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Incorrect timezones on new Teams and Outlook accounts</title><link>https://www.xga.ie/posts/microsoft-teams-outlook-timezones/</link><pubDate>Mon, 13 Apr 2026 00:00:00 +0000</pubDate><guid>https://www.xga.ie/posts/microsoft-teams-outlook-timezones/</guid><description>&lt;p&gt;When adding new users to a Microsoft tenant, it seems to be creating the users with Pacific time, giving incorrect working hours on Teams and causing issues with Outlook calendar events&lt;/p&gt;
&lt;p&gt;Connect from a non-admin PS prompt:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8be9fd;font-style:italic"&gt;Import-Module&lt;/span&gt; -Name ExchangeOnlineManagement
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8be9fd;font-style:italic"&gt;Connect-ExchangeOnline&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Check time-zones for all users:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8be9fd;font-style:italic"&gt;Get-Mailbox&lt;/span&gt; | &lt;span style="color:#8be9fd;font-style:italic"&gt;Where &lt;/span&gt;{&lt;span style="color:#8be9fd;font-style:italic"&gt;$_&lt;/span&gt;.RecipientTypeDetails &lt;span style="color:#ff79c6"&gt;-eq&lt;/span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#34;UserMailbox&amp;#34;&lt;/span&gt;} | &lt;span style="color:#8be9fd;font-style:italic"&gt;get-MailboxCalendarConfiguration&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Check timezone for single user:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8be9fd;font-style:italic"&gt;Get-MailboxCalendarConfiguration&lt;/span&gt; -Identity &lt;span style="color:#8be9fd;font-style:italic"&gt;$emailAddr&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Set the timezone for a user:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8be9fd;font-style:italic"&gt;Set-MailboxCalendarConfiguration&lt;/span&gt; -Identity &lt;span style="color:#8be9fd;font-style:italic"&gt;$user&lt;/span&gt; -WorkingHoursTimeZone &lt;span style="color:#f1fa8c"&gt;&amp;#34;GMT Standard Time&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Changes take effect fairly quickly.&lt;/p&gt;</description></item><item><title>External Link: A320 Virtual Cockpit ✈</title><link>https://www.xga.ie/posts/external-a320-virtual/</link><pubDate>Wed, 01 Jan 2025 00:00:00 +0000</pubDate><guid>https://www.xga.ie/posts/external-a320-virtual/</guid><description/></item><item><title>External Link: A330 Virtual Cockpit ✈</title><link>https://www.xga.ie/posts/external-a330-virtual/</link><pubDate>Wed, 01 Jan 2025 00:00:00 +0000</pubDate><guid>https://www.xga.ie/posts/external-a330-virtual/</guid><description/></item><item><title>Zabbix DNS Caching</title><link>https://www.xga.ie/posts/zabbix-dns-caching/</link><pubDate>Mon, 30 Dec 2024 00:00:00 +0000</pubDate><guid>https://www.xga.ie/posts/zabbix-dns-caching/</guid><description>&lt;p&gt;DNS resolution started to feel a bit laggy recently, most notable on iOS devices. When I went down the troubleshooting rabbit-hole, I found a large number of DNS queries from the Zabbix monitoring infrastructure.&lt;/p&gt;
&lt;p&gt;Of the 37 hosts that are monitored by Zabbix, only 16 have DNS lookups for the hostnames.
This caused multiple lookups per second for each host - thousands of entries per 10 minutes.&lt;/p&gt;
&lt;figure&gt;&lt;img src="https://www.xga.ie/posts/zabbix-dns-caching/image.png"
 alt="Effect of DNS caching" width="100%"&gt;&lt;figcaption&gt;
 &lt;p&gt;Effect of DNS caching&lt;/p&gt;</description></item><item><title>Missing snapshot on Hik-Connect</title><link>https://www.xga.ie/posts/hik-connect-missing-snapshots/</link><pubDate>Tue, 10 Dec 2024 00:00:00 +0000</pubDate><guid>https://www.xga.ie/posts/hik-connect-missing-snapshots/</guid><description>&lt;p&gt;A recent project had us reset a Hikvision video intercom system after an upgrade and created a new issue that we hadn&amp;rsquo;t seen before.&lt;/p&gt;
&lt;p&gt;The client encountered an issue where snapshots were no longer sent to the Hik-Connect application when a caller pressed the button on the video intercom.&lt;/p&gt;
&lt;p&gt;This can be resolved by changing a setting on the master indoor station:&lt;/p&gt;
&lt;p&gt;Go to Settings -&amp;gt; Preference -&amp;gt; Shortcut Setting -&amp;gt; &lt;em&gt;Enable Snap Shot&lt;/em&gt;.&lt;/p&gt;</description></item><item><title>High BGP CPU usage on Mikrotik CHR</title><link>https://www.xga.ie/posts/mikrotik-bgp-high-cpu/</link><pubDate>Thu, 04 May 2023 00:00:00 +0000</pubDate><guid>https://www.xga.ie/posts/mikrotik-bgp-high-cpu/</guid><description>&lt;p&gt;While experimenting with BGP using Mikrotik Cloud Hosted Routers (CHR) on low-power, shared X86 hardware, it became apparent that CPU usage was an issue with full feeds.&lt;/p&gt;
&lt;h2 id="before"&gt;
 Before
 &lt;a class="heading-link" href="#before"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="Link to heading"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;Link to heading&lt;/span&gt;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;The router was handling approximately 420-thousand IPv6 routes on a single CPU.
When I tried to view the routes in WinBox or SSH, the CPU would go to 100% and remain there, leaving the router unresponsive until rebooted.&lt;/p&gt;</description></item></channel></rss>