<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>sanifair.xyz</title>
    <link>https://blog.sanifair.xyz/</link>
    <description>some Blog, about any</description>
    <pubDate>Wed, 30 Sep 2026 00:23:05 +0200</pubDate>
    <item>
      <title>Podman and Secrets - a Odyssee</title>
      <link>https://blog.sanifair.xyz/podman-and-secrets-a-odyssee</link>
      <description>&lt;![CDATA[We all deal with sensitive information when working with computer systems. Sysadmins move SSH keys around and web developers need to worry about API tokens. The problem with sensitive information is that it&#39;s sensitive, meaning that it could cause a security disaster if it were to somehow fall into the wrong hands. Containers are no exception to this issue—users need to utilize sensitive information inside containers while also needing to keep the sensitive information safe. [1]!--more--&#xA;&#xA;you can create secrets on a easy way.&#xA;$ echo &#34;secretdata&#34;   secretfile.txt&#xA;$ podman secret create secretname secretfile.txt&#xA;e17465c9772b38f336fc4cbac&#xA;&#xA;you can use the created secret easy, too&#xA;$ podman run --secret secretname --name foo alpine cat /run/secrets/secretname secretdata&#xA;&#xA;actually there are only 2 ways to use this secrets. &#xA;&#xA;from local environment variable to container, as file&#xA;from secret manager to container, as file&#xA;&#xA;no nice way to get the secret direct to your container environment.&#xA;&#xA;So far, so good.&#xA;&#xA;a other way to create&#xA;is to read from stdin with This way you have no traces in bash history.&#xA;$ read -s SECRET &amp;&amp; echo -n $SECRET | podman secret create --replace MYSECRET - &amp;&amp; unset SECRET &#xA;&#xA;a other way to inject&#xA;is to possible by composers &#39;command&#39; or &#39;entrypoint&#39; directive.&#xA;services:&#xA;  myservice:&#xA;...&#xA;  command: bash -c &#39;declare -x MYSECRET=$(cat /run/secrets/MYSECRET) &amp;&amp; ./start-up.sh&#39;&#xA;  secrets:&#xA;      MYSECRET&#xA;...&#xA;secrets:&#xA;  MYSECRET:&#xA;    external: true&#xA;&#xA;how it works&#xA;after inserting the secret over read it will be echoed without a newline (-n) and passed to &#xA;In the compose file is the initial command replaced by the import of the key and followed from the start command.&#xA;&#xA;You can get the command / entrypoint by using&#xA;command / entrypoint line.&#xA;&#xA;The secret injection use bash to declare the content of your secret-file in the enviroment-variable name you like to have.&#xA;&#xA;Thats it!&#xA;&#xA;[1] https://www.redhat.com/en/blog/new-podman-secrets-command]]&gt;</description>
      <content:encoded><![CDATA[<p>We all deal with sensitive information when working with computer systems. Sysadmins move SSH keys around and web developers need to worry about API tokens. The problem with sensitive information is that it&#39;s sensitive, meaning that it could cause a security disaster if it were to somehow fall into the wrong hands. Containers are no exception to this issue—users need to utilize sensitive information inside containers while also needing to keep the sensitive information safe. [1]</p>

<p>you can create secrets on a easy way.</p>

<pre><code class="language-compose">$ echo &#34;secretdata&#34; &gt; secretfile.txt
$ podman secret create secretname secretfile.txt
e17465c9772b38f336fc4cbac
</code></pre>

<p>you can use the created secret easy, too</p>

<pre><code class="language-compose">$ podman run --secret secretname --name foo alpine cat /run/secrets/secretname secretdata
</code></pre>

<p>actually there are only 2 ways to use this secrets.</p>
<ol><li>from local environment variable to container, as file</li>
<li>from secret manager to container, as file</li></ol>

<p>no nice way to get the secret direct to your container environment.</p>

<p>So far, so good.</p>

<h2 id="a-other-way-to-create" id="a-other-way-to-create">a other way to create</h2>

<p>is to read from stdin with <code>read -s SECRET</code>.
This way you have no traces in bash history.</p>

<pre><code>$ read -s SECRET &amp;&amp; echo -n $SECRET | podman secret create --replace MYSECRET - &amp;&amp; unset SECRET 
</code></pre>

<h2 id="a-other-way-to-inject" id="a-other-way-to-inject">a other way to inject</h2>

<p>is to possible by composers &#39;command&#39; or &#39;entrypoint&#39; directive.</p>

<pre><code>services:
  myservice:
...
  command: bash -c &#39;declare -x MYSECRET=$(cat /run/secrets/MYSECRET) &amp;&amp; ./start-up.sh&#39;
  secrets:
      - MYSECRET
...
secrets:
  MYSECRET:
    external: true
</code></pre>

<h2 id="how-it-works" id="how-it-works">how it works</h2>

<p>after inserting the secret over read it will be echoed without a newline (-n) and passed to <code>podman secret create --replace MYSECRET -</code>. This (—replace existing key) creates the key from stdin (–) you want to use in your compose.</p>

<p>In the compose file is the initial command replaced by the import of the key and followed from the start command.</p>

<p>You can get the command / entrypoint by using
<code>docker inspect RUNNING_CONTAINER_NAME  --format=&#39;ENTRYPOINT: {{.Config.Entrypoint}} CMD: {{.Config.Cmd}}&#39;</code> and append them to the “new”
command / entrypoint line.</p>

<p>The secret injection use bash to declare the content of your secret-file in the enviroment-variable name you like to have.</p>

<p>Thats it!</p>

<p>[1] <a href="https://www.redhat.com/en/blog/new-podman-secrets-command" rel="nofollow">https://www.redhat.com/en/blog/new-podman-secrets-command</a></p>
]]></content:encoded>
      <guid>https://blog.sanifair.xyz/podman-and-secrets-a-odyssee</guid>
      <pubDate>Sat, 30 May 2026 23:04:46 +0200</pubDate>
    </item>
    <item>
      <title>Bitwarden, SSH-Keys and -Agent under MacOS</title>
      <link>https://blog.sanifair.xyz/bitwarden-ssh-keys-and-agent-under-macos</link>
      <description>&lt;![CDATA[along time i was looking for a #Passwordmanager how synchronize my Passwords, Pass- and SSH-Keys.&#xA;At the begin with #Bitwarden, i was lucky that he synchronized my Passwords. Later my Pass-Keys, too.&#xA;&#xA;But since 2025.1.2 #Bitwarden can Manage SSH-Keys and provide a SSH-Agent, too.!--more--&#xA;&#xA;On MacOS it is necessary, that you configure the SSH-Agent that have to be used.&#xA;Bitwarden provides the Information within a excellent Documentation.&#xA;&#xA;Long Story short, for the Store-Version of Bitwarden:&#xA;&#xA;Add the following Line to your .xxxrc or .xxxprofile -file to link to the Bitwarden-SSH-Agent and re-open your commandline.&#xA;&#xA;export SSHAUTHSOCK=~/Library/Containers/com.bitwarden.desktop/Data/.bitwarden-ssh-agent.sock&#xA;&#xA;After them, and the enabled Function in Bitwarden, you can use Bitwardens SSH-Agent with your synchronized Keys.&#xA;&#xA;Thats it!]]&gt;</description>
      <content:encoded><![CDATA[<p>along time i was looking for a <a href="https://blog.sanifair.xyz/tag:Passwordmanager" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">Passwordmanager</span></a> how synchronize my Passwords, Pass- and SSH-Keys.
At the begin with <a href="https://blog.sanifair.xyz/tag:Bitwarden" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">Bitwarden</span></a>, i was lucky that he synchronized my Passwords. Later my Pass-Keys, too.</p>

<p>But since 2025.1.2 <a href="https://blog.sanifair.xyz/tag:Bitwarden" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">Bitwarden</span></a> can Manage SSH-Keys and provide a SSH-Agent, too.</p>

<p>On MacOS it is necessary, that you configure the SSH-Agent that have to be used.
Bitwarden provides the Information within a excellent <a href="https://bitwarden.com/help/ssh-agent/#configure-bitwarden-ssh-agent" rel="nofollow">Documentation</a>.</p>

<p>Long Story short, for the Store-Version of Bitwarden:</p>

<p>Add the following Line to your .xxxrc or .xxxprofile -file to link to the Bitwarden-SSH-Agent and re-open your commandline.</p>

<pre><code class="language-bash">export SSH_AUTH_SOCK=~/Library/Containers/com.bitwarden.desktop/Data/.bitwarden-ssh-agent.sock
</code></pre>

<p>After them, and the enabled Function in Bitwarden, you can use Bitwardens SSH-Agent with your synchronized Keys.</p>

<p>Thats it!</p>
]]></content:encoded>
      <guid>https://blog.sanifair.xyz/bitwarden-ssh-keys-and-agent-under-macos</guid>
      <pubDate>Wed, 02 Jul 2025 18:13:19 +0200</pubDate>
    </item>
    <item>
      <title>Sieve Mailfilter - filter to folder</title>
      <link>https://blog.sanifair.xyz/sieve-mailfilter-filter-to-folder</link>
      <description>&lt;![CDATA[As allready wrote, #Sieve Mailfilter and how to have fun, today i show a sniped to filter Mails from whole Domains or single-Sender to a folder. !--more--&#xA;&#xA;split the TLD from E-Mail-Address&#xA;set Domain&#xA;if envelope :domain :matches &#34;from&#34; &#34;.&#34; {&#xA;  set :lower &#34;domain&#34; &#34;${1}-${2}&#34;;&#xA;}&#xA;With this Information we are able to the Domain for later use.&#xA;&#xA;split the localuser-Part and replace dots (.) by minus (-)&#xA;set from, replace . with -&#xA;if envelope :localpart :matches &#34;from&#34; &#34;..&#34; {&#xA;  set :lower &#34;localuser&#34; &#34;${1}-${2}-${3}&#34;;&#xA;}&#xA;elsif envelope :localpart :matches &#34;from&#34; &#34;.&#34; {&#xA;  set :lower &#34;localuser&#34; &#34;${1}-${2}&#34;;&#xA;}&#xA;elsif envelope :localpart :matches &#34;from&#34; &#34;&#34; {&#xA;  set :lower &#34;localuser&#34; &#34;${1}&#34;;&#xA;}&#xA;With this we have a localuser part&#xA;&#xA;at leased we try to find the right directory for the E-Mail to send in&#xA;domain in INBOX&#xA;if mailboxexists &#34;INBOX.${domain}&#34; {&#xA;  fileinto &#34;INBOX.${domain}&#34;;&#xA;  stop;&#xA;}&#xA;E-Mail in INBOX&#xA;if mailboxexists &#34;INBOX.${localuser}+${domain}&#34; {&#xA;  fileinto &#34;INBOX.${localuser}+${domain}&#34;;&#xA;  stop;&#xA;}&#xA;Notice: a Plus-Sign (+) will be used at At-Sign (@) in the folder-structure.&#xA;&#xA;In this example will all incoming mails sorted in Folder if there is a folder by Domain or fully sender Address in INBOX.&#xA;&#xA;Have fun ;)]]&gt;</description>
      <content:encoded><![CDATA[<p>As allready wrote, <a href="https://blog.sanifair.xyz/sieve-mailfiler-and-how-to-have-fun" rel="nofollow"><a href="https://blog.sanifair.xyz/tag:Sieve" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">Sieve</span></a> Mailfilter and how to have fun</a>, today i show a sniped to filter Mails from whole Domains or single-Sender to a folder. </p>
<ol><li><p>split the TLD from E-Mail-Address</p>

<pre><code>#set Domain
if envelope :domain :matches &#34;from&#34; &#34;*.*&#34; {
set :lower &#34;domain&#34; &#34;${1}-${2}&#34;;
}
</code></pre>

<p>With this Information we are able to the Domain for later use.</p></li>

<li><p>split the localuser-Part and replace dots (.) by minus (–)</p>

<pre><code>#set from, replace . with -
if envelope :localpart :matches &#34;from&#34; &#34;*.*.*&#34; {
set :lower &#34;localuser&#34; &#34;${1}-${2}-${3}&#34;;
}
elsif envelope :localpart :matches &#34;from&#34; &#34;*.*&#34; {
set :lower &#34;localuser&#34; &#34;${1}-${2}&#34;;
}
elsif envelope :localpart :matches &#34;from&#34; &#34;*&#34; {
set :lower &#34;localuser&#34; &#34;${1}&#34;;
}
</code></pre>

<p>With this we have a localuser part</p></li>

<li><p>at leased we try to find the right directory for the E-Mail to send in</p>

<pre><code># domain in INBOX
if mailboxexists &#34;INBOX.${domain}&#34; {
fileinto &#34;INBOX.${domain}&#34;;
stop;
}
# E-Mail in INBOX
if mailboxexists &#34;INBOX.${localuser}+${domain}&#34; {
fileinto &#34;INBOX.${localuser}+${domain}&#34;;
stop;
}
</code></pre>

<p>Notice: a Plus-Sign (+) will be used at At-Sign (@) in the folder-structure.</p></li></ol>

<p>In this example will all incoming mails sorted in Folder if there is a folder by Domain or fully sender Address in INBOX.</p>

<p>Have fun ;)</p>
]]></content:encoded>
      <guid>https://blog.sanifair.xyz/sieve-mailfilter-filter-to-folder</guid>
      <pubDate>Sun, 15 Dec 2024 18:38:49 +0100</pubDate>
    </item>
    <item>
      <title>Lockerer Kürbiskuchen von Julia Child’s Tante Helen, via Julia Moskin</title>
      <link>https://blog.sanifair.xyz/lockerer-kurbiskuchen-von-julia-childs-tante-helen-via-julia-moskin-1</link>
      <description>&lt;![CDATA[translated by Cpt.Sanifair!--more-- from [1]&#xA;&#xA;---&#xA;&#xA;Ofen, 230-190°C&#xA;ca 30min Arbeit&#xA;ca 60min Backzeit&#xA;&#xA;---&#xA;&#xA;Zutaten, für 1 - 2 Kuchen&#xA;&#xA;| Menge | Bezeichnung |&#xA;| :--- | :--- |&#xA;| 4 | große Eier |&#xA;| 2 | Kürbispüree 450ml (900ml) [2] |&#xA;| 200g | leicht brauner Zucker |&#xA;| 230g | Zucker |&#xA;|   | Salz ohne Zusätze |&#xA;| 3 EL |  Sirup |&#xA;| 3 EL | (optional) bourbon or dark rum |&#xA;|  3 TL |geriebener Zimt |&#xA;|  3 TL  |geriebener Ingwer|&#xA;|  1/4 TL | geriebenes Muskat|&#xA;|  1/4 TL |geriebene Nelken |&#xA;|  250g | Süße Sahne |&#xA;|  180ml  | Milch |&#xA;| 2x 23cm oderbr1x 30cm | Tortenschale (ungebacken) |&#xA;&#xA;---&#xA;&#xA;Den Ofen auf 230°C vorheizen, Eier trennen und bereit stellen&#xA;&#xA;Vermengen (im Mixer / Schüssel mit Rückgerät):&#xA;Zucker, 1 TL Salz, Rum (optional), Sirup, Zimt, Ingwer, Muskat, Nelken, Eigelb, Sahne, Milch bis ein cremiges Püree entstanden ist&#xA;&#xA;Das Eiweiß in einer Schale schaumig schlagen, 1 pr. Salz zugeben. Im weiteren in die Masse (2) unterheben.&#xA;&#xA;unverzüglich in die Tortenschalen füllen, im Ofen backen bis eine leicht goldene Kruste entsteht, da nach den Ofen auf 190°C reduzieren und 25-30 Minuten backen lassen. (Die Mitte kann leicht feucht bleiben, wenn die Kruste zu braun wird, dann mit Abdecken)&#xA;&#xA;Nach dem backen im Ofen 20-30 Minuten abkühlen lassen. &#xA;&#xA;Wird warm Serviert, oder gut eingepackt im Kühlschrank zwei Tage haltbar (bei Zimmertemperatur servieren).&#xA;&#xA;[1] https://food52.com/recipes/86591-julia-child-fluffy-pumpkin-pie-recipe/&#xA;[2] https://biancazapatka.com/de/kuerbispueree-3-arten-der-zubereitung/]]&gt;</description>
      <content:encoded><![CDATA[<p>translated by Cpt.Sanifair from [1]</p>

<hr>
<ul><li>Ofen, 230-190°C</li>
<li>ca 30min Arbeit</li>
<li>ca 60min Backzeit</li></ul>

<hr>

<h1 id="zutaten-für-1-2-kuchen" id="zutaten-für-1-2-kuchen">Zutaten, für 1 – 2 Kuchen</h1>

<table>
<thead>
<tr>
<th align="left">Menge</th>
<th align="left">Bezeichnung</th>
</tr>
</thead>

<tbody>
<tr>
<td align="left">4</td>
<td align="left">große Eier</td>
</tr>

<tr>
<td align="left">2</td>
<td align="left">Kürbispüree 450ml (900ml) [2]</td>
</tr>

<tr>
<td align="left">200g</td>
<td align="left">leicht brauner Zucker</td>
</tr>

<tr>
<td align="left">230g</td>
<td align="left">Zucker</td>
</tr>

<tr>
<td align="left"></td>
<td align="left">Salz ohne Zusätze</td>
</tr>

<tr>
<td align="left">3 EL</td>
<td align="left">Sirup</td>
</tr>

<tr>
<td align="left">3 EL</td>
<td align="left">(optional) bourbon or dark rum</td>
</tr>

<tr>
<td align="left">3 TL</td>
<td align="left">geriebener Zimt</td>
</tr>

<tr>
<td align="left">3 TL</td>
<td align="left">geriebener Ingwer</td>
</tr>

<tr>
<td align="left">¼ TL</td>
<td align="left">geriebenes Muskat</td>
</tr>

<tr>
<td align="left">¼ TL</td>
<td align="left">geriebene Nelken</td>
</tr>

<tr>
<td align="left">250g</td>
<td align="left">Süße Sahne</td>
</tr>

<tr>
<td align="left">180ml</td>
<td align="left">Milch</td>
</tr>

<tr>
<td align="left">2x 23cm oder<br>1x 30cm</td>
<td align="left">Tortenschale (ungebacken)</td>
</tr>
</tbody>
</table>

<hr>
<ol><li><p>Den Ofen auf 230°C vorheizen, Eier trennen und bereit stellen</p></li>

<li><p>Vermengen (im Mixer / Schüssel mit Rückgerät):
Zucker, 1 TL Salz, Rum (optional), Sirup, Zimt, Ingwer, Muskat, Nelken, Eigelb, Sahne, Milch bis ein cremiges Püree entstanden ist</p></li>

<li><p>Das Eiweiß in einer Schale schaumig schlagen, 1 pr. Salz zugeben. Im weiteren in die Masse (2) unterheben.</p></li>

<li><p>unverzüglich in die Tortenschalen füllen, im Ofen backen bis eine leicht goldene Kruste entsteht, da nach den Ofen auf 190°C reduzieren und 25-30 Minuten backen lassen. (Die Mitte kann leicht feucht bleiben, wenn die Kruste zu braun wird, dann mit Abdecken)</p></li>

<li><p>Nach dem backen im Ofen 20-30 Minuten abkühlen lassen.</p></li></ol>

<p>Wird warm Serviert, oder gut eingepackt im Kühlschrank zwei Tage haltbar (bei Zimmertemperatur servieren).</p>

<p>[1] <a href="https://food52.com/recipes/86591-julia-child-fluffy-pumpkin-pie-recipe/" rel="nofollow">https://food52.com/recipes/86591-julia-child-fluffy-pumpkin-pie-recipe/</a>
[2] <a href="https://biancazapatka.com/de/kuerbispueree-3-arten-der-zubereitung/" rel="nofollow">https://biancazapatka.com/de/kuerbispueree-3-arten-der-zubereitung/</a></p>
]]></content:encoded>
      <guid>https://blog.sanifair.xyz/lockerer-kurbiskuchen-von-julia-childs-tante-helen-via-julia-moskin-1</guid>
      <pubDate>Sun, 13 Oct 2024 19:42:47 +0200</pubDate>
    </item>
    <item>
      <title>Its implemented!11</title>
      <link>https://blog.sanifair.xyz/its-implemented-11</link>
      <description>&lt;![CDATA[In May i begun to work on a Project how i want to use #Crowdin for translations. And tried to display the translation progress as easy as fuck.&#xA;&#xA;Crowdin offers Badgets per Language, but they used !--more--an indexed #json #array. The #Badget jsonpath query select a specific, hardcoded index. In case the index change - you are fucked.&#xA;&#xA;So i invent a solution for a working jsonpath query and offered #Crowdin to implement it. And they did!&#xA;&#xA;old style&#xA;bevor the solution was implemented the query for languages looks like&#xA;$.progress.(n).data.translationProgress&#xA;$.progress.(n).data.approvalProgress&#xA;&#xA;new style&#xA;the new jsonpath query is&#xA;$.progress[?(@.data.languageId==%27%bs%27%)].data.translationProgress&#xA;$.progress[?(@.data.languageId==%27%bs%27%)].data.approvalProgress&#xA;&#xA;you need to notice, thats needed to escape the &#39; char as %27% to get it working.&#xA;&#xA;Hopefully you can enjoy the new &#34;feature&#34;!&#xA;&#xA;]]&gt;</description>
      <content:encoded><![CDATA[<p>In May i begun to work on a Project how i want to use <a href="https://blog.sanifair.xyz/tag:Crowdin" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">Crowdin</span></a> for translations. And tried to display the translation progress as easy as fuck.</p>

<p>Crowdin offers Badgets per Language, but they used an indexed <a href="https://blog.sanifair.xyz/tag:json" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">json</span></a> <a href="https://blog.sanifair.xyz/tag:array" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">array</span></a>. The <a href="https://blog.sanifair.xyz/tag:Badget" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">Badget</span></a> jsonpath query select a specific, hardcoded index. In case the index change – you are fucked.</p>

<p>So i invent a solution for a working jsonpath query and offered <a href="https://blog.sanifair.xyz/tag:Crowdin" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">Crowdin</span></a> to implement it. And they did!</p>

<h3 id="old-style" id="old-style">old style</h3>

<p>bevor the solution was implemented the query for languages looks like</p>

<pre><code class="language-json">$.progress.(n).data.translationProgress
$.progress.(n).data.approvalProgress
</code></pre>

<h3 id="new-style" id="new-style">new style</h3>

<p>the new jsonpath query is</p>

<pre><code class="language-json">$.progress[?(@.data.languageId==%27%bs%27%)].data.translationProgress
$.progress[?(@.data.languageId==%27%bs%27%)].data.approvalProgress
</code></pre>

<p>you need to notice, thats needed to escape the &#39; char as %27% to get it working.</p>

<p>Hopefully you can enjoy the new “feature”!</p>
]]></content:encoded>
      <guid>https://blog.sanifair.xyz/its-implemented-11</guid>
      <pubDate>Thu, 22 Jun 2023 10:53:49 +0200</pubDate>
    </item>
    <item>
      <title>github action Repository basename</title>
      <link>https://blog.sanifair.xyz/github-action-repository-basename</link>
      <description>&lt;![CDATA[#Github #actions help you to #automate Processes (CI/CD).&#xA;&#xA;In my Example I need the #Basename of a #Repository. &#xA;!--more--&#xA;As you know, actions are saved in your Repository under the Path:&#xA;.github/workflows/workflow.yaml&#xA;&#xA;        #get Repository basename, use with ${{ env.REPONAME }}&#xA;      name: get Repository name&#xA;        run: |&#xA;          echo &#34;REPONAME=$(basename ${{ github.repository }})&#34;     $GITHUBENV&#xA;&#xA;        # echo target repository basename&#xA;      name: fetch translations&#xA;        run: &#xA;          echp ${{ env.REPONAME }}&#xA;&#xA;If found this working Solution on StackOverflow [1]&#xA;&#xA;[1] https://stackoverflow.com/a/71799882]]&gt;</description>
      <content:encoded><![CDATA[<p><a href="https://blog.sanifair.xyz/tag:Github" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">Github</span></a> <a href="https://blog.sanifair.xyz/tag:actions" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">actions</span></a> help you to <a href="https://blog.sanifair.xyz/tag:automate" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">automate</span></a> Processes (CI/CD).</p>

<p>In my Example I need the <a href="https://blog.sanifair.xyz/tag:Basename" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">Basename</span></a> of a <a href="https://blog.sanifair.xyz/tag:Repository" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">Repository</span></a>.

As you know, actions are saved in your Repository under the Path:
<code>.github/workflows/workflow.yaml</code></p>

<pre><code class="language-yaml">        #get Repository basename, use with ${{ env.REPO_NAME }}
      - name: get Repository name
        run: |
          echo &#34;REPO_NAME=$(basename ${{ github.repository }})&#34; &gt;&gt; $GITHUB_ENV


        # echo target repository basename
      - name: fetch translations
        run: 
          echp ${{ env.REPO_NAME }}
</code></pre>

<p>If found this working Solution on StackOverflow [1]</p>

<p>[1] <a href="https://stackoverflow.com/a/71799882" rel="nofollow">https://stackoverflow.com/a/71799882</a></p>
]]></content:encoded>
      <guid>https://blog.sanifair.xyz/github-action-repository-basename</guid>
      <pubDate>Tue, 16 May 2023 03:23:11 +0200</pubDate>
    </item>
    <item>
      <title>github action commit to remote repository</title>
      <link>https://blog.sanifair.xyz/github-action-commit-to-remote-repository</link>
      <description>&lt;![CDATA[#Github #actions help you to #automate Processes (CI/CD).&#xA;&#xA;In my Example I tried to checkout source code, scan for Strings, append found Strings to a File and commit changes to separate repository.&#xA;!--more--&#xA;&#xA;As you know, actions are saved in your Repository under the Path:&#xA;.github/workflows/workflow.yaml&#xA;&#xA;steps:&#xA;        # check out source repository&#xA;      name: checkout source repository (this)&#xA;        uses: actions/checkout@v3&#xA;&#xA;        # check out target repository&#xA;      name: checkout target&#xA;        uses: actions/checkout@v3&#xA;        with: &#xA;          repository: example/target&#xA;          ssh-key: ${{ secrets.DEPLOY_SECRET }}&#xA;&#xA;        # do your thing...&#xA;      name: do things&#xA;        run: modify files in target...&#xA;&#xA;      # commit to target repository&#xA;      name: commit changes&#xA;        uses: stefanzweifel/git-auto-commit-action@v4&#xA;        with:&#xA;          repository: example/target&#xA;&#xA;Explanation:&#xA;-1. Checkout run with &#34;example/source&#34;&#xA;-2․ Checkout run with &#34;example/target&#34;&#xA;  used &#34;with&#34;:&#xA;    repository to Checkout a other Repo&#xA;    ssh-key for authentication (Deploy Key for target)&#xA;-3. commit Changes, if found &#xA;&#xA;Good luck! ]]&gt;</description>
      <content:encoded><![CDATA[<p><a href="https://blog.sanifair.xyz/tag:Github" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">Github</span></a> <a href="https://blog.sanifair.xyz/tag:actions" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">actions</span></a> help you to <a href="https://blog.sanifair.xyz/tag:automate" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">automate</span></a> Processes (CI/CD).</p>

<p>In my Example I tried to checkout source code, scan for Strings, append found Strings to a File and commit changes to separate repository.
</p>

<p>As you know, actions are saved in your Repository under the Path:
<code>.github/workflows/workflow.yaml</code></p>

<pre><code class="language-yaml">steps:
        # check out source repository
      - name: checkout source repository (this)
        uses: actions/checkout@v3

        # check out target repository
      - name: checkout target
        uses: actions/checkout@v3
        with: 
          repository: example/target
          ssh-key: ${{ secrets.DEPLOY_SECRET }}

        # do your thing...
      - name: do things
        run: modify files in target...

      # commit to target repository
      - name: commit changes
        uses: stefanzweifel/git-auto-commit-action@v4
        with:
          repository: example/target
</code></pre>

<p>Explanation:
-1. Checkout run with “example/source”
-2․ Checkout run with “example/target”
  – used “with”:
    – repository to Checkout a other Repo
    – ssh-key for authentication (Deploy Key for target)
-3. commit Changes, if found</p>

<p>Good luck!</p>
]]></content:encoded>
      <guid>https://blog.sanifair.xyz/github-action-commit-to-remote-repository</guid>
      <pubDate>Mon, 15 May 2023 20:47:27 +0200</pubDate>
    </item>
    <item>
      <title>Sieve Mailfiler (and how to have fun)</title>
      <link>https://blog.sanifair.xyz/sieve-mailfiler-and-how-to-have-fun</link>
      <description>&lt;![CDATA[Sieve &#34;An Email Filtering Language&#34;, specified by RFC5228 [1].&#xA;&#xA;The Focus of #Sieve points to #simplicity, #independency and #expandability from access method or platform. Sieve-Scripts run already in the Process of #Mail delivery on #Server-Side. Sieve supports #Plugins, like #LDAP.&#xA;&#xA;!--more--&#xA;&#xA;Archiving Mails (like Mailinglists) by Date [2]:&#xA;require [&#34;variables&#34;,&#34;date&#34;,&#34;fileinto&#34;,&#34;mailbox&#34;];&#xA;&#xA;Extract date info&#xA;if currentdate :matches &#34;year&#34; &#34;&#34; { set &#34;year&#34; &#34;${1}&#34;; }&#xA;if currentdate :matches &#34;month&#34; &#34;&#34; { set &#34;month&#34; &#34;${1}&#34;; }&#xA;&#xA;Archive Dovecot mailing list items by year and month.&#xA;Create folder when it does not exist.&#xA;if header :is &#34;list-id&#34; &#34;dovecot.dovecot.org&#34; {&#xA;  fileinto :create &#34;INBOX.Lists.${year}.${month}.dovecot&#34;;&#xA;}&#xA;&#xA;Sort Mails by Sender&#xA;Mails from a mailing list will be put into the folder &#34;mailinglist&#34;&#xA;require &#34;copy&#34;;&#xA;require &#34;mailbox&#34;;&#xA;require &#34;imap4flags&#34;;&#xA;require &#34;fileinto&#34;;&#xA;if address :is [&#34;From&#34;, &#34;To&#34;] &#34;mailinglist@example.com&#34; {&#xA;  fileinto &#34;INBOX/mailinglist&#34;;&#xA;}&#xA;&#xA;And many, many, many more possibilitys for Mailbox-Filter 24.&#xA;&#xA;And there is a great Editor [6], too!&#xA;&#xA;Sieve Editor [6]&#xA;https://github.com/thsmi/sieve&#xA;&#xA;Sieve is a powerful scripting language for server-side mail filtering. It is intended to be used with IMAP which is ubiquitous. Many IMAP Servers are capable of running Sieve filters. Sieve stores and runs all scripts on the server-side.&#xA;&#xA;Now there is the dilemma – you have access to a server supporting Sieve but how do you manage your scripts on this server?&#xA;&#xA;You can use Telnet for this purpose, but that is far too uncomfortable, not applicable for a normal user and almost impossible with secure connections. Wouldn’t it be great to activate, edit, delete and add Sieve scripts with a convenient interface? That is exactly what this sieve editor offers…&#xA;&#xA;[1] https://www.rfc-editor.org/rfc/rfc5228&#xA;[2] https://doc.dovecot.org/configurationmanual/sieve/examples/#archiving-a-mailinglist-by-date&#xA;[3] https://en.wikipedia.org/wiki/Sieve(mailfilteringlanguage)&#xA;[4] https://p5r.uk/blog/2011/sieve-tutorial.html&#xA;[5] https://support.tigertech.net/sieve&#xA;[6] https://github.com/thsmi/sieve#sieve-editor]]&gt;</description>
      <content:encoded><![CDATA[<p><a href="https://blog.sanifair.xyz/tag:Sieve" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">Sieve</span></a> “An Email Filtering Language”, specified by RFC5228 [1].</p>

<p>The Focus of <a href="https://blog.sanifair.xyz/tag:Sieve" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">Sieve</span></a> points to <a href="https://blog.sanifair.xyz/tag:simplicity" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">simplicity</span></a>, <a href="https://blog.sanifair.xyz/tag:independency" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">independency</span></a> and <a href="https://blog.sanifair.xyz/tag:expandability" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">expandability</span></a> from access method or platform. Sieve-Scripts run already in the Process of <a href="https://blog.sanifair.xyz/tag:Mail" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">Mail</span></a> delivery on <a href="https://blog.sanifair.xyz/tag:Server" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">Server</span></a>-Side. Sieve supports <a href="https://blog.sanifair.xyz/tag:Plugins" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">Plugins</span></a>, like <a href="https://blog.sanifair.xyz/tag:LDAP" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">LDAP</span></a>.</p>



<h4 id="archiving-mails-like-mailinglists-by-date-2" id="archiving-mails-like-mailinglists-by-date-2">Archiving Mails (like Mailinglists) by Date [2]:</h4>

<pre><code class="language-sieve">require [&#34;variables&#34;,&#34;date&#34;,&#34;fileinto&#34;,&#34;mailbox&#34;];

# Extract date info
if currentdate :matches &#34;year&#34; &#34;*&#34; { set &#34;year&#34; &#34;${1}&#34;; }
if currentdate :matches &#34;month&#34; &#34;*&#34; { set &#34;month&#34; &#34;${1}&#34;; }

# Archive Dovecot mailing list items by year and month.
# Create folder when it does not exist.
if header :is &#34;list-id&#34; &#34;dovecot.dovecot.org&#34; {
  fileinto :create &#34;INBOX.Lists.${year}.${month}.dovecot&#34;;
}
</code></pre>

<h4 id="sort-mails-by-sender" id="sort-mails-by-sender">Sort Mails by Sender</h4>

<pre><code class="language-sieve"># Mails from a mailing list will be put into the folder &#34;mailinglist&#34;
require &#34;copy&#34;;
require &#34;mailbox&#34;;
require &#34;imap4flags&#34;;
require &#34;fileinto&#34;;
if address :is [&#34;From&#34;, &#34;To&#34;] &#34;mailinglist@example.com&#34; {
  fileinto &#34;INBOX/mailinglist&#34;;
}
</code></pre>

<p>And many, many, many more possibilitys for Mailbox-Filter [2][3][4][5].</p>

<p>And there is a great Editor [6], too!</p>

<h4 id="sieve-editor-6" id="sieve-editor-6">Sieve Editor [6]</h4>

<p><a href="https://github.com/thsmi/sieve" rel="nofollow">https://github.com/thsmi/sieve</a></p>

<pre><code>Sieve is a powerful scripting language for server-side mail filtering. It is intended to be used with IMAP which is ubiquitous. Many IMAP Servers are capable of running Sieve filters. Sieve stores and runs all scripts on the server-side.

Now there is the dilemma – you have access to a server supporting Sieve but how do you manage your scripts on this server?

You can use Telnet for this purpose, but that is far too uncomfortable, not applicable for a normal user and almost impossible with secure connections. Wouldn’t it be great to activate, edit, delete and add Sieve scripts with a convenient interface? That is exactly what this sieve editor offers…
</code></pre>

<p>[1] <a href="https://www.rfc-editor.org/rfc/rfc5228" rel="nofollow">https://www.rfc-editor.org/rfc/rfc5228</a>
[2] <a href="https://doc.dovecot.org/configuration_manual/sieve/examples/#archiving-a-mailinglist-by-date" rel="nofollow">https://doc.dovecot.org/configuration_manual/sieve/examples/#archiving-a-mailinglist-by-date</a>
[3] <a href="https://en.wikipedia.org/wiki/Sieve_(mail_filtering_language" rel="nofollow">https://en.wikipedia.org/wiki/Sieve_(mail_filtering_language</a>)
[4] <a href="https://p5r.uk/blog/2011/sieve-tutorial.html" rel="nofollow">https://p5r.uk/blog/2011/sieve-tutorial.html</a>
[5] <a href="https://support.tigertech.net/sieve" rel="nofollow">https://support.tigertech.net/sieve</a>
[6] <a href="https://github.com/thsmi/sieve#sieve-editor" rel="nofollow">https://github.com/thsmi/sieve#sieve-editor</a></p>
]]></content:encoded>
      <guid>https://blog.sanifair.xyz/sieve-mailfiler-and-how-to-have-fun</guid>
      <pubDate>Thu, 11 May 2023 10:33:35 +0200</pubDate>
    </item>
    <item>
      <title>Filezilla &#34;portable&#34; </title>
      <link>https://blog.sanifair.xyz/filezilla-portable</link>
      <description>&lt;![CDATA[or #howto use #filezilla without any installation.&#xA;!--more--&#xA;&#xA;Download the latest #FileZilla Version (non-installer) &#xA;copy ./docs/fzdefaults.xml.example to ./fzdefaults.xml&#xA;set &#34;Config Location&#34; to &#34;./&#34;&#xA;&#xA;FileZilla3&#xA;  Settings&#xA;    Setting name=&#34;Config Location&#34;.//Setting&#xA;  /Settings&#xA;/FileZilla3&#xA;&#xA;and you are ready to go with #FileZilla&#xA;&#xA; https://filezilla-project.org/download.php?show_all=1]]&gt;</description>
      <content:encoded><![CDATA[<p>or <a href="https://blog.sanifair.xyz/tag:howto" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">howto</span></a> use <a href="https://blog.sanifair.xyz/tag:filezilla" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">filezilla</span></a> without any installation.
</p>
<ol><li>Download the latest <a href="https://blog.sanifair.xyz/tag:FileZilla" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">FileZilla</span></a> Version (non-installer) [^1]</li>
<li>copy ./docs/fzdefaults.xml.example to ./fzdefaults.xml</li>
<li>set “Config Location” to “./”</li></ol>

<pre><code class="language-xml">&lt;FileZilla3&gt;
  &lt;Settings&gt;
    &lt;Setting name=&#34;Config Location&#34;&gt;./&lt;/Setting&gt;
  &lt;/Settings&gt;
&lt;/FileZilla3&gt;
</code></pre>

<p>and you are ready to go with <a href="https://blog.sanifair.xyz/tag:FileZilla" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">FileZilla</span></a></p>

<p>[^1] <a href="https://filezilla-project.org/download.php?show_all=1" rel="nofollow">https://filezilla-project.org/download.php?show_all=1</a></p>
]]></content:encoded>
      <guid>https://blog.sanifair.xyz/filezilla-portable</guid>
      <pubDate>Wed, 05 Apr 2023 18:17:12 +0200</pubDate>
    </item>
    <item>
      <title>Update a Docker-Image on Synologys DSM</title>
      <link>https://blog.sanifair.xyz/update-a-docker-image-on-synologys-dsm</link>
      <description>&lt;![CDATA[In just a few steps to an actuall Image.&#xA;&#xA;!--more--&#xA;&#xA;open Docker on your DSM and go to your Registrie&#xA;search your Image and Download the latest Version&#xA;switch to your Container Overview, stop and reset your Container&#xA;Run the Container again&#xA;&#xA;Docker on DSM will now use the (newer) downloaded Image.&#xA;&#xA;Good Luck!&#xA;&#xA; https://mariushosting.com/synology-how-to-update-docker-image/&#xA;&#xA;]]&gt;</description>
      <content:encoded><![CDATA[<p>In just a few steps to an actuall Image.</p>


<ol><li>open Docker on your DSM and go to your Registrie</li>
<li>search your Image and Download the latest Version</li>
<li>switch to your Container Overview, stop and reset your Container</li>
<li>Run the Container again</li></ol>

<p>Docker on DSM will now use the (newer) downloaded Image.</p>

<p>Good Luck!</p>

<p>[^1] <a href="https://mariushosting.com/synology-how-to-update-docker-image/" rel="nofollow">https://mariushosting.com/synology-how-to-update-docker-image/</a></p>
]]></content:encoded>
      <guid>https://blog.sanifair.xyz/update-a-docker-image-on-synologys-dsm</guid>
      <pubDate>Tue, 21 Mar 2023 19:19:19 +0100</pubDate>
    </item>
  </channel>
</rss>