<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de-x-formal">
	<id>http://wiki.frank-wulf.de/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Wulf</id>
	<title>wiki.frank-wulf.de - Benutzerbeiträge [de-formal]</title>
	<link rel="self" type="application/atom+xml" href="http://wiki.frank-wulf.de/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Wulf"/>
	<link rel="alternate" type="text/html" href="http://wiki.frank-wulf.de/index.php/Spezial:Beitr%C3%A4ge/Wulf"/>
	<updated>2026-05-13T13:12:51Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>http://wiki.frank-wulf.de/index.php?title=Access_from_Internet_with_dedicated_IP_address&amp;diff=672</id>
		<title>Access from Internet with dedicated IP address</title>
		<link rel="alternate" type="text/html" href="http://wiki.frank-wulf.de/index.php?title=Access_from_Internet_with_dedicated_IP_address&amp;diff=672"/>
		<updated>2025-09-14T07:31:39Z</updated>

		<summary type="html">&lt;p&gt;Wulf: Die Seite wurde neu angelegt: „=== Description === This solution requires renting a VPS server which comes with a static public IP address, costs are starting at 1 Euro per month (in 2024 at ionos.de or strato.de). As this server is used only to forward data from the internet to the local server and back to the internet, the cheapest offer will most likely be sufficient. The local server will be connected to the VPS server using a VPN tunnel. All traffic aiming the public IP address of…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Description ===&lt;br /&gt;
This solution requires renting a VPS server which comes with a static public IP address, costs are starting at 1 Euro per month (in 2024 at ionos.de or strato.de). As this server is used only to forward data from the internet to the local server and back to the internet, the cheapest offer will most likely be sufficient. The local server will be connected to the VPS server using a VPN tunnel. All traffic aiming the public IP address of the VPS server is then being forwarded to the local server through this tunnel. Results from the local server are sent back through the tunnel to the VPS server and from there to the respective sender.&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;big&amp;gt;Internet&amp;lt;/big&amp;gt; &amp;lt;―――――(Public IP 85.215.213.68)―――――&amp;gt; &amp;lt;big&amp;gt;VPS server&amp;lt;/big&amp;gt; &amp;lt;―――――(VPN tunnel 192.168.142.x)―――――&amp;gt; &amp;lt;big&amp;gt;Local server&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Basically the VPN connection is triggered automatically by the client (local server). Hence the local server is permanently accessable from the internet. Security settings are maintained in the local network like fail2ban and firewall rules to protect the local server against external attacks.&lt;br /&gt;
&lt;br /&gt;
=== Terminology ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|! style=&amp;quot;text-align:center; font-weight:bold; background-color:Moccasin&amp;quot;| Term&lt;br /&gt;
! style=&amp;quot;text-align:center; font-weight:bold; background-color:Moccasin&amp;quot;| Description&lt;br /&gt;
|-&lt;br /&gt;
|VPS Server&lt;br /&gt;
|Virtual Private Server with a static public IP address assigned&lt;br /&gt;
|-&lt;br /&gt;
|Local Server&lt;br /&gt;
|Server in local network (192.168.141.1)&lt;br /&gt;
|-&lt;br /&gt;
|IP subnet for local network&lt;br /&gt;
|192.168.141.0/24&lt;br /&gt;
|-&lt;br /&gt;
|IP subnet for VPN tunnel&lt;br /&gt;
|192.168.142.1/32 (VPS server)&lt;br /&gt;
192.168.142.100/32 (local server)&lt;br /&gt;
|-&lt;br /&gt;
|Static public IP address&lt;br /&gt;
|85.215.213.68&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;Configuration&amp;lt;/big&amp;gt;&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For the Wireguard VPN tunnel maintain the firewall rules on the VPS server to open port 51820 for incoming UDP traffic:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
! style=&amp;quot;text-align:center; font-weight:bold; background-color:Cornsilk&amp;quot;| Action&lt;br /&gt;
! style=&amp;quot;text-align:center; font-weight:bold; background-color:Cornsilk&amp;quot;| Allowed IP&lt;br /&gt;
! style=&amp;quot;text-align:center; font-weight:bold; background-color:Cornsilk&amp;quot;| Protocol&lt;br /&gt;
! style=&amp;quot;text-align:center; font-weight:bold; background-color:Cornsilk&amp;quot;| Port(s)&lt;br /&gt;
! style=&amp;quot;text-align:center; font-weight:bold; background-color:Cornsilk&amp;quot;| Description&lt;br /&gt;
|-&lt;br /&gt;
|Allow&lt;br /&gt;
|All&lt;br /&gt;
|TCP&lt;br /&gt;
|22&lt;br /&gt;
|&#039;&#039;default&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|Allow&lt;br /&gt;
|All&lt;br /&gt;
|TCP&lt;br /&gt;
|80&lt;br /&gt;
|&#039;&#039;default&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|Allow&lt;br /&gt;
|All&lt;br /&gt;
|TCP&lt;br /&gt;
|443&lt;br /&gt;
|&#039;&#039;default&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|Allow&lt;br /&gt;
|All&lt;br /&gt;
|TCP&lt;br /&gt;
|8443&lt;br /&gt;
|&#039;&#039;default&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|Allow&lt;br /&gt;
|All&lt;br /&gt;
|TCP&lt;br /&gt;
|8447&lt;br /&gt;
|&#039;&#039;default&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Allow&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;All&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;UDP&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;51820&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Wireguard&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Enable packet forwarding for IPv4 in file &#039;&#039;&#039;/etc/sysctl.conf&#039;&#039;&#039;:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color: silver; background: black;&amp;quot;&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
# Uncomment the next line to enable packet forwarding for IPv4&lt;br /&gt;
net.ipv4.ip_forward=1&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Enable the changes made in &#039;&#039;&#039;/etc/sysctl.conf&#039;&#039;&#039;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sysctl -p&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Install Wireguard VPN software on both VPS server and local server:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
apt install wireguard&lt;br /&gt;
mkdir --mode=700 /etc/wireguard&lt;br /&gt;
chown root:root /etc/wireguard&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Generate server key pair on both VPS server and local server:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /etc/wireguard&lt;br /&gt;
umask 077; wg genkey | tee privatekey | wg pubkey &amp;gt; publickey&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Create config file &#039;&#039;&#039;/etc/wireguard/wg0.conf&#039;&#039;&#039; on VPS server:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color: silver; background: black;&amp;quot;&amp;gt;&lt;br /&gt;
[Interface]&lt;br /&gt;
PrivateKey = &amp;lt;Private key from VPS server&amp;gt;&lt;br /&gt;
ListenPort = 51820&lt;br /&gt;
Address = 192.168.142.1/24&lt;br /&gt;
PostUp = iptables -t nat -A PREROUTING -p tcp -d 85.215.213.68 -j DNAT --to 192.168.142.100&lt;br /&gt;
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o ens6 -j MASQUERADE&lt;br /&gt;
PostDown = iptables -t nat -D PREROUTING -p tcp -d 85.215.213.68 -j DNAT --to 192.168.142.100&lt;br /&gt;
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o ens6 -j MASQUERADE&lt;br /&gt;
&lt;br /&gt;
[Peer]&lt;br /&gt;
PublicKey = &amp;lt;Public key from local server&amp;gt;&lt;br /&gt;
AllowedIPs = 192.168.142.100/32&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Create config file &#039;&#039;&#039;/etc/wireguard/wg0.conf&#039;&#039;&#039; on local server:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color: silver; background: black;&amp;quot;&amp;gt;&lt;br /&gt;
[Interface]&lt;br /&gt;
PrivateKey = &amp;lt;Private key from local server&amp;gt;&lt;br /&gt;
Address = 192.168.142.100/24&lt;br /&gt;
&lt;br /&gt;
[Peer]&lt;br /&gt;
PublicKey = &amp;lt;Public key from VPS server&amp;gt;&lt;br /&gt;
AllowedIPs = 0.0.0.0/0&lt;br /&gt;
Endpoint = 85.215.213.68:51820&lt;br /&gt;
PersistentKeepalive = 25&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Edit file &#039;&#039;&#039;&#039;&#039;/etc/systemd/resolved.conf&#039;&#039;&#039;&#039;&#039;:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; highlight=&amp;quot;15-20&amp;quot;&amp;gt;&lt;br /&gt;
#  This file is part of systemd.&lt;br /&gt;
#&lt;br /&gt;
#  systemd is free software; you can redistribute it and/or modify it&lt;br /&gt;
#  under the terms of the GNU Lesser General Public License as published by&lt;br /&gt;
#  the Free Software Foundation; either version 2.1 of the License, or&lt;br /&gt;
#  (at your option) any later version.&lt;br /&gt;
#&lt;br /&gt;
# Entries in this file show the compile time defaults.&lt;br /&gt;
# You can change settings by editing this file.&lt;br /&gt;
# Defaults can be restored by simply deleting this file.&lt;br /&gt;
#&lt;br /&gt;
# See resolved.conf(5) for details&lt;br /&gt;
&lt;br /&gt;
[Resolve]&lt;br /&gt;
#&amp;gt;&amp;gt;&amp;gt;2024-10-30 Frank Wulf&lt;br /&gt;
#DNS=&lt;br /&gt;
DNS=192.168.141.10&lt;br /&gt;
#FallbackDNS=&lt;br /&gt;
FallbackDNS=1.1.1.1 1.0.0.1&lt;br /&gt;
#&amp;lt;&amp;lt;&amp;lt;2024-10-30 Frank Wulf&lt;br /&gt;
#Domains=&lt;br /&gt;
#LLMNR=no&lt;br /&gt;
#MulticastDNS=no&lt;br /&gt;
#DNSSEC=no&lt;br /&gt;
#DNSOverTLS=no&lt;br /&gt;
#Cache=no-negative&lt;br /&gt;
#DNSStubListener=yes&lt;br /&gt;
#ReadEtcHosts=yes&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Enable VPN interface to start at boot time on both VPS server and local server, then start the interface:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
systemctl enable wg-quick@wg0&lt;br /&gt;
systemctl start wg-quick@wg0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Wulf</name></author>
	</entry>
	<entry>
		<id>http://wiki.frank-wulf.de/index.php?title=Server&amp;diff=671</id>
		<title>Server</title>
		<link rel="alternate" type="text/html" href="http://wiki.frank-wulf.de/index.php?title=Server&amp;diff=671"/>
		<updated>2025-09-14T07:30:51Z</updated>

		<summary type="html">&lt;p&gt;Wulf: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;*[[Access from Internet with dedicated IP address]]&lt;br /&gt;
*[[Bacula Backup Solution]]&lt;br /&gt;
*[[Configuration]]&lt;br /&gt;
*[[Fail2ban]]&lt;br /&gt;
*[[Fancontrol]]&lt;br /&gt;
*[[Internet Speedtest]]&lt;br /&gt;
*[[ioBroker]]&lt;br /&gt;
*[[MediaWiki]]&lt;br /&gt;
*[[PHP]]&lt;br /&gt;
*[[phpMyAdmin]]&lt;br /&gt;
*[[Signal Messenger]]&lt;br /&gt;
*[[Wake on LAN and remote shutdown]]&lt;br /&gt;
*[[Hardware Monitoring]]&lt;br /&gt;
*[[Hardware]]&lt;/div&gt;</summary>
		<author><name>Wulf</name></author>
	</entry>
	<entry>
		<id>http://wiki.frank-wulf.de/index.php?title=Wiki.frank-wulf.de:Impressum&amp;diff=669</id>
		<title>Wiki.frank-wulf.de:Impressum</title>
		<link rel="alternate" type="text/html" href="http://wiki.frank-wulf.de/index.php?title=Wiki.frank-wulf.de:Impressum&amp;diff=669"/>
		<updated>2024-11-09T09:59:19Z</updated>

		<summary type="html">&lt;p&gt;Wulf: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&#039;impressum&#039;&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Angaben gemäß § 5 TMG und verantwortlich für den Inhalt nach § 55 Abs. 2 RStV:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Frank Wulf&amp;lt;br&amp;gt; &lt;br /&gt;
Im Langen Weg 4&amp;lt;br&amp;gt; &lt;br /&gt;
51580 Reichshof&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Kontakt:&amp;lt;/strong&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Telefon: +49 2297 9026467&amp;lt;br&amp;gt;&lt;br /&gt;
Telefax: +49 2297 9026468&amp;lt;br&amp;gt;&lt;br /&gt;
E-Mail: info@frank-wulf.de&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Haftungsausschluss: &amp;lt;/strong&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;strong&amp;gt;Haftung für Inhalte&amp;lt;/strong&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Die Inhalte unserer Seiten wurden mit größter Sorgfalt erstellt. Für die Richtigkeit, Vollständigkeit und Aktualität der Inhalte können wir jedoch keine Gewähr übernehmen. Als Diensteanbieter sind wir gemäß § 7 Abs.1 TMG für eigene Inhalte auf diesen Seiten nach den allgemeinen Gesetzen verantwortlich. Nach §§ 8 bis 10 TMG sind wir als Diensteanbieter jedoch nicht verpflichtet, übermittelte oder gespeicherte fremde Informationen zu überwachen oder nach Umständen zu forschen, die auf eine rechtswidrige Tätigkeit hinweisen. Verpflichtungen zur Entfernung oder Sperrung der Nutzung von Informationen nach den allgemeinen Gesetzen bleiben hiervon unberührt. Eine diesbezügliche Haftung ist jedoch erst ab dem Zeitpunkt der Kenntnis einer konkreten Rechtsverletzung möglich. Bei Bekanntwerden von entsprechenden Rechtsverletzungen werden wir diese Inhalte umgehend entfernen.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;strong&amp;gt;Haftung für Links&amp;lt;/strong&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Unser Angebot enthält Links zu externen Webseiten Dritter, auf deren Inhalte wir keinen Einfluss haben. Deshalb können wir für diese fremden Inhalte auch keine Gewähr übernehmen. Für die Inhalte der verlinkten Seiten ist stets der jeweilige Anbieter oder Betreiber der Seiten verantwortlich. Die verlinkten Seiten wurden zum Zeitpunkt der Verlinkung auf mögliche Rechtsverstöße überprüft. Rechtswidrige Inhalte waren zum Zeitpunkt der Verlinkung nicht erkennbar. Eine permanente inhaltliche Kontrolle der verlinkten Seiten ist jedoch ohne konkrete Anhaltspunkte einer Rechtsverletzung nicht zumutbar. Bei Bekanntwerden von Rechtsverletzungen werden wir derartige Links umgehend entfernen.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;strong&amp;gt;Urheberrecht&amp;lt;/strong&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Die durch die Seitenbetreiber erstellten Inhalte und Werke auf diesen Seiten unterliegen dem deutschen Urheberrecht. Die Vervielfältigung, Bearbeitung, Verbreitung und jede Art der Verwertung außerhalb der Grenzen des Urheberrechtes bedürfen der schriftlichen Zustimmung des jeweiligen Autors bzw. Erstellers. Downloads und Kopien dieser Seite sind nur für den privaten, nicht kommerziellen Gebrauch gestattet. Soweit die Inhalte auf dieser Seite nicht vom Betreiber erstellt wurden, werden die Urheberrechte Dritter beachtet. Insbesondere werden Inhalte Dritter als solche gekennzeichnet. Sollten Sie trotzdem auf eine Urheberrechtsverletzung aufmerksam werden, bitten wir um einen entsprechenden Hinweis. Bei Bekanntwerden von Rechtsverletzungen werden wir derartige Inhalte umgehend entfernen.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Impressum vom [http://www.impressum-generator.de impressum-generator.de] der [http://www.kanzlei-hasselbach.de/rechtsanwalt-arbeitsrecht-bonn/ Rechtsanwältin Franziska Hasselbach, Bonn]&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Wulf</name></author>
	</entry>
	<entry>
		<id>http://wiki.frank-wulf.de/index.php?title=Wiki.frank-wulf.de:Impressum&amp;diff=668</id>
		<title>Wiki.frank-wulf.de:Impressum</title>
		<link rel="alternate" type="text/html" href="http://wiki.frank-wulf.de/index.php?title=Wiki.frank-wulf.de:Impressum&amp;diff=668"/>
		<updated>2024-11-06T10:26:25Z</updated>

		<summary type="html">&lt;p&gt;Wulf: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&#039;impressum&#039;&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Angaben gemäß § 5 TMG und verantwortlich für den Inhalt nach § 55 Abs. 2 RStV:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Frank Wulf&amp;lt;br&amp;gt; &lt;br /&gt;
Im Langen Weg 4&amp;lt;br&amp;gt; &lt;br /&gt;
51580 Reichshof&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Kontakt:&amp;lt;/strong&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Telefon: +49 2297 9099910&amp;lt;br&amp;gt;&lt;br /&gt;
Telefax: +49 2297 9099924&amp;lt;br&amp;gt;&lt;br /&gt;
E-Mail: info@frank-wulf.de&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Haftungsausschluss: &amp;lt;/strong&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;strong&amp;gt;Haftung für Inhalte&amp;lt;/strong&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Die Inhalte unserer Seiten wurden mit größter Sorgfalt erstellt. Für die Richtigkeit, Vollständigkeit und Aktualität der Inhalte können wir jedoch keine Gewähr übernehmen. Als Diensteanbieter sind wir gemäß § 7 Abs.1 TMG für eigene Inhalte auf diesen Seiten nach den allgemeinen Gesetzen verantwortlich. Nach §§ 8 bis 10 TMG sind wir als Diensteanbieter jedoch nicht verpflichtet, übermittelte oder gespeicherte fremde Informationen zu überwachen oder nach Umständen zu forschen, die auf eine rechtswidrige Tätigkeit hinweisen. Verpflichtungen zur Entfernung oder Sperrung der Nutzung von Informationen nach den allgemeinen Gesetzen bleiben hiervon unberührt. Eine diesbezügliche Haftung ist jedoch erst ab dem Zeitpunkt der Kenntnis einer konkreten Rechtsverletzung möglich. Bei Bekanntwerden von entsprechenden Rechtsverletzungen werden wir diese Inhalte umgehend entfernen.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;strong&amp;gt;Haftung für Links&amp;lt;/strong&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Unser Angebot enthält Links zu externen Webseiten Dritter, auf deren Inhalte wir keinen Einfluss haben. Deshalb können wir für diese fremden Inhalte auch keine Gewähr übernehmen. Für die Inhalte der verlinkten Seiten ist stets der jeweilige Anbieter oder Betreiber der Seiten verantwortlich. Die verlinkten Seiten wurden zum Zeitpunkt der Verlinkung auf mögliche Rechtsverstöße überprüft. Rechtswidrige Inhalte waren zum Zeitpunkt der Verlinkung nicht erkennbar. Eine permanente inhaltliche Kontrolle der verlinkten Seiten ist jedoch ohne konkrete Anhaltspunkte einer Rechtsverletzung nicht zumutbar. Bei Bekanntwerden von Rechtsverletzungen werden wir derartige Links umgehend entfernen.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;strong&amp;gt;Urheberrecht&amp;lt;/strong&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Die durch die Seitenbetreiber erstellten Inhalte und Werke auf diesen Seiten unterliegen dem deutschen Urheberrecht. Die Vervielfältigung, Bearbeitung, Verbreitung und jede Art der Verwertung außerhalb der Grenzen des Urheberrechtes bedürfen der schriftlichen Zustimmung des jeweiligen Autors bzw. Erstellers. Downloads und Kopien dieser Seite sind nur für den privaten, nicht kommerziellen Gebrauch gestattet. Soweit die Inhalte auf dieser Seite nicht vom Betreiber erstellt wurden, werden die Urheberrechte Dritter beachtet. Insbesondere werden Inhalte Dritter als solche gekennzeichnet. Sollten Sie trotzdem auf eine Urheberrechtsverletzung aufmerksam werden, bitten wir um einen entsprechenden Hinweis. Bei Bekanntwerden von Rechtsverletzungen werden wir derartige Inhalte umgehend entfernen.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Impressum vom [http://www.impressum-generator.de impressum-generator.de] der [http://www.kanzlei-hasselbach.de/rechtsanwalt-arbeitsrecht-bonn/ Rechtsanwältin Franziska Hasselbach, Bonn]&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Wulf</name></author>
	</entry>
	<entry>
		<id>http://wiki.frank-wulf.de/index.php?title=Hardware_Monitoring&amp;diff=664</id>
		<title>Hardware Monitoring</title>
		<link rel="alternate" type="text/html" href="http://wiki.frank-wulf.de/index.php?title=Hardware_Monitoring&amp;diff=664"/>
		<updated>2024-10-28T10:35:41Z</updated>

		<summary type="html">&lt;p&gt;Wulf: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__FORCETOC__&lt;br /&gt;
==Shell script &#039;&#039;&#039;/usr/bin/fwsysmon&#039;&#039;&#039;==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
#&lt;br /&gt;
# Author:  Frank Wulf&lt;br /&gt;
# Version: 1.5 (2024-10-17)&lt;br /&gt;
#&lt;br /&gt;
# This program detects the following system values and writes&lt;br /&gt;
# them into a database:&lt;br /&gt;
# - Temperatures of room, mainboard, CPU and hard disks&lt;br /&gt;
# - Status of hard disks (active or sleeping)&lt;br /&gt;
# - Fan speeds&lt;br /&gt;
# - System load&lt;br /&gt;
# - Power consumption&lt;br /&gt;
#&lt;br /&gt;
# Version history:&lt;br /&gt;
# 1.0   2017-10-04   Initial release&lt;br /&gt;
# 1.1   2018-09-07   Replaced pcsensor program with newer version&lt;br /&gt;
# 1.2   2019-04-20   Changed logic to build the SQL command&lt;br /&gt;
# 1.3   2020-04-20   Changed logic for process list and building comment&lt;br /&gt;
# 1.4   2020-10-17   Replaced USB temperature sensor with smart plug sensor&lt;br /&gt;
# 1.5   2024-10-17   Add power consumption of server&lt;br /&gt;
&lt;br /&gt;
## Offset for room temperature sensor (value will be subtracted from Celsius)&lt;br /&gt;
#calib=2&lt;br /&gt;
&lt;br /&gt;
# Minimum percentage of CPU usage for processes shown in comment field&lt;br /&gt;
tmin=10&lt;br /&gt;
&lt;br /&gt;
# Determine load average for last 1, 5 and 15 minutes&lt;br /&gt;
i=0&lt;br /&gt;
for loadavg in `cat /proc/loadavg`; do&lt;br /&gt;
  let i+=1&lt;br /&gt;
  if [ $i -le 3 ]; then load[$i]=$loadavg; fi&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
# Build comment field with processes reaching minimum percentage&lt;br /&gt;
i=0&lt;br /&gt;
while read process; do&lt;br /&gt;
  let i+=1&lt;br /&gt;
  tpcnt[$i]=`echo &amp;quot;$process&amp;quot;|awk &#039;{printf $9}&#039;`&lt;br /&gt;
  tproc[$i]=`echo &amp;quot;$process&amp;quot;|awk &#039;{printf $12}&#039;`&lt;br /&gt;
  if (( $(echo &amp;quot;${tpcnt[$i]} &amp;gt;= $tmin&amp;quot; | bc -l) )); then&lt;br /&gt;
    if [ $i -eq 1 ]; then&lt;br /&gt;
      comment=&amp;quot;${tpcnt[$i]}%=${tproc[$i]}&amp;quot;&lt;br /&gt;
    else&lt;br /&gt;
      comment=&amp;quot;${comment}; ${tpcnt[$i]}%=${tproc[$i]}&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
  else&lt;br /&gt;
    break&lt;br /&gt;
  fi&lt;br /&gt;
done &amp;lt;&amp;lt;&amp;lt;`top -b -n 1|grep -v &amp;quot;top$&amp;quot;|sed &#039;1,7d&#039;|sed &#039;5,$d&#039;`&lt;br /&gt;
&lt;br /&gt;
# Get status and temperatures of hard disks&lt;br /&gt;
i=0&lt;br /&gt;
while read temp; do&lt;br /&gt;
  let i+=1&lt;br /&gt;
  if `echo $temp|grep -qv &amp;quot;sleeping&amp;quot;`; then&lt;br /&gt;
    status_hdd[$i]=&amp;quot;Active&amp;quot;&lt;br /&gt;
    temp_hdd[$i]=`echo $temp|cut -c1-2`&lt;br /&gt;
  else&lt;br /&gt;
    status_hdd[$i]=&amp;quot;Sleeping&amp;quot;&lt;br /&gt;
    temp_hdd[$i]=0&lt;br /&gt;
  fi&lt;br /&gt;
done &amp;lt;&amp;lt;&amp;lt;`hddtemp /dev/sd? 2&amp;gt;&amp;amp;1|grep &amp;quot;^/dev&amp;quot;|grep -v &amp;quot;sda&amp;quot;|sort|cut -d: -f3|cut -c2-`&lt;br /&gt;
&lt;br /&gt;
while [ $i -lt 5 ]; do&lt;br /&gt;
    let i+=1&lt;br /&gt;
    status_hdd[$i]=&amp;quot;Not available&amp;quot;&lt;br /&gt;
    temp_hdd[$i]=0&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
# Get system temperatures and fan speeds&lt;br /&gt;
while read line; do&lt;br /&gt;
  case `echo $line|cut -d: -f1` in&lt;br /&gt;
    &amp;quot;SYSTIN&amp;quot;) temp_sys=`echo &amp;quot;$line&amp;quot;|cut -c26-29`;;&lt;br /&gt;
    &amp;quot;CPUTIN&amp;quot;) temp_cpu_ext=`echo &amp;quot;$line&amp;quot;|cut -c26-29`;;&lt;br /&gt;
    &amp;quot;Package id 0&amp;quot;) temp_cpu_int=`echo &amp;quot;$line&amp;quot;|cut -c17-20`;;&lt;br /&gt;
    &amp;quot;Core 0&amp;quot;) temp_core0=`echo &amp;quot;$line&amp;quot;|cut -c17-20`;;&lt;br /&gt;
    &amp;quot;Core 1&amp;quot;) temp_core1=`echo &amp;quot;$line&amp;quot;|cut -c17-20`;;&lt;br /&gt;
    &amp;quot;Core 2&amp;quot;) temp_core2=`echo &amp;quot;$line&amp;quot;|cut -c17-20`;;&lt;br /&gt;
    &amp;quot;Core 3&amp;quot;) temp_core3=`echo &amp;quot;$line&amp;quot;|cut -c17-20`;;&lt;br /&gt;
    # The sequence of the fans provided by &amp;quot;sensors&amp;quot; is different&lt;br /&gt;
    # to the sequence in the database.&lt;br /&gt;
    &amp;quot;fan1&amp;quot;) speed_fan4=`echo &amp;quot;$line&amp;quot;|cut -c24-28`;;&lt;br /&gt;
    &amp;quot;fan2&amp;quot;) speed_fan1=`echo &amp;quot;$line&amp;quot;|cut -c24-28`;;&lt;br /&gt;
    &amp;quot;fan3&amp;quot;) speed_fan2=`echo &amp;quot;$line&amp;quot;|cut -c24-28`;;&lt;br /&gt;
    &amp;quot;fan4&amp;quot;) speed_fan3=`echo &amp;quot;$line&amp;quot;|cut -c24-28`;;&lt;br /&gt;
    &amp;quot;fan5&amp;quot;) speed_fan5=`echo &amp;quot;$line&amp;quot;|cut -c24-28`;;&lt;br /&gt;
  esac&lt;br /&gt;
done &amp;lt;&amp;lt;&amp;lt;`sensors -A nct6791-isa-0290 coretemp-isa-0000`&lt;br /&gt;
&lt;br /&gt;
# Get actual power consumption from smart plug&lt;br /&gt;
power=`iobroker state getvalue fritzdect.0.DECT_116300171650.power`&lt;br /&gt;
&lt;br /&gt;
# Get room temperature (up to 5 attempts)&lt;br /&gt;
temp_room=&#039;0&#039;&lt;br /&gt;
#for i in {1..5}&lt;br /&gt;
#do&lt;br /&gt;
#  temp_room=`pcsensor -s$calib`&lt;br /&gt;
#  if [ &amp;quot;$temp_room&amp;quot; == &amp;quot;&amp;quot; ]; then&lt;br /&gt;
#    # Wait five seconds and try again&lt;br /&gt;
#    sleep 5&lt;br /&gt;
#  else&lt;br /&gt;
#    break&lt;br /&gt;
#  fi&lt;br /&gt;
#done&lt;br /&gt;
temp_room=`iobroker state getvalue fritzdect.0.DECT_116300171650.celsius`&lt;br /&gt;
&lt;br /&gt;
# Fill timestamp field&lt;br /&gt;
timestamp=`date +&#039;%Y-%m-%d %H:%M:%S&#039;`&lt;br /&gt;
&lt;br /&gt;
# Insert data into database&lt;br /&gt;
sql=&amp;quot;INSERT INTO fw_values (timestamp,temp_room,temp_sys,temp_cpu_ext,&amp;quot;&lt;br /&gt;
sql+=&amp;quot;temp_cpu_int,temp_core0,temp_core1,temp_core2,temp_core3,&amp;quot;&lt;br /&gt;
sql+=&amp;quot;status_hdd1,status_hdd2,status_hdd3,status_hdd4,status_hdd5,&amp;quot;&lt;br /&gt;
sql+=&amp;quot;temp_hdd1,temp_hdd2,temp_hdd3,temp_hdd4,temp_hdd5,&amp;quot;&lt;br /&gt;
sql+=&amp;quot;speed_fan1,speed_fan2,speed_fan3,speed_fan4,speed_fan5,&amp;quot;&lt;br /&gt;
sql+=&amp;quot;load01,load05,load15,power,comment) VALUES (&amp;quot;&lt;br /&gt;
sql+=&amp;quot;\&amp;quot;$timestamp\&amp;quot;, \&amp;quot;$temp_room\&amp;quot;, \&amp;quot;$temp_sys\&amp;quot;, \&amp;quot;$temp_cpu_ext\&amp;quot;, &amp;quot;&lt;br /&gt;
sql+=&amp;quot;\&amp;quot;$temp_cpu_int\&amp;quot;, \&amp;quot;$temp_core0\&amp;quot;, \&amp;quot;$temp_core1\&amp;quot;, \&amp;quot;$temp_core2\&amp;quot;, &amp;quot;&lt;br /&gt;
sql+=&amp;quot;\&amp;quot;$temp_core3\&amp;quot;, \&amp;quot;${status_hdd[1]}\&amp;quot;, \&amp;quot;${status_hdd[2]}\&amp;quot;, &amp;quot;&lt;br /&gt;
sql+=&amp;quot;\&amp;quot;${status_hdd[3]}\&amp;quot;, \&amp;quot;${status_hdd[4]}\&amp;quot;, \&amp;quot;${status_hdd[5]}\&amp;quot;, &amp;quot;&lt;br /&gt;
sql+=&amp;quot;\&amp;quot;${temp_hdd[1]}\&amp;quot;, \&amp;quot;${temp_hdd[2]}\&amp;quot;, \&amp;quot;${temp_hdd[3]}\&amp;quot;, &amp;quot;&lt;br /&gt;
sql+=&amp;quot;\&amp;quot;${temp_hdd[4]}\&amp;quot;, \&amp;quot;${temp_hdd[5]}\&amp;quot;, &amp;quot;&lt;br /&gt;
sql+=&amp;quot;\&amp;quot;$speed_fan1\&amp;quot;, \&amp;quot;$speed_fan2\&amp;quot;, \&amp;quot;$speed_fan3\&amp;quot;, &amp;quot;&lt;br /&gt;
sql+=&amp;quot;\&amp;quot;$speed_fan4\&amp;quot;, \&amp;quot;$speed_fan5\&amp;quot;, &amp;quot;&lt;br /&gt;
sql+=&amp;quot;\&amp;quot;${load[1]}\&amp;quot;, \&amp;quot;${load[2]}\&amp;quot;, \&amp;quot;${load[3]}\&amp;quot;, &amp;quot;&lt;br /&gt;
sql+=&amp;quot;\&amp;quot;$power\&amp;quot;, \&amp;quot;$comment\&amp;quot;)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
mysql --login-path=fwsysmon -D fwsysmon -e &amp;quot;$sql&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
==Notes==&lt;br /&gt;
By default the Linux kernel claims the TEMPer device as a keyboard (HID device). When that happens, the program &#039;&#039;&#039;&#039;&#039;pcsensor&#039;&#039;&#039;&#039;&#039; is not able to set the configuration and communicate with it.&lt;br /&gt;
&lt;br /&gt;
An error occurs and is shown in logfile &#039;&#039;&#039;/var/log/kern.log&#039;&#039;&#039;:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
usbfs: USBDEVFS_CONTROL failed cmd pcsensor rqt 128 rq 6 len 255 ret -71&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;To prevent this we have to add a kernel parameter in &#039;&#039;&#039;/etc/default/grub&#039;&#039;&#039;:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#&amp;gt;&amp;gt;&amp;gt;2019-04-19 Frank Wulf&lt;br /&gt;
#GRUB_CMDLINE_LINUX_DEFAULT=&amp;quot;&amp;quot;&lt;br /&gt;
GRUB_CMDLINE_LINUX_DEFAULT=&amp;quot;usbhid.quirks=0x0c45:0x7401:0x4&amp;quot;&lt;br /&gt;
#&amp;lt;&amp;lt;&amp;lt;2019-04-19 Frank Wulf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Wulf</name></author>
	</entry>
	<entry>
		<id>http://wiki.frank-wulf.de/index.php?title=Hardware_Monitoring&amp;diff=662</id>
		<title>Hardware Monitoring</title>
		<link rel="alternate" type="text/html" href="http://wiki.frank-wulf.de/index.php?title=Hardware_Monitoring&amp;diff=662"/>
		<updated>2024-10-17T09:52:21Z</updated>

		<summary type="html">&lt;p&gt;Wulf: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__FORCETOC__&lt;br /&gt;
==Shell script &#039;&#039;&#039;/usr/bin/fwsysmon&#039;&#039;&#039;==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
#&lt;br /&gt;
# Author:  Frank Wulf&lt;br /&gt;
# Version: 1.5 (2024-10-17)&lt;br /&gt;
#&lt;br /&gt;
# This program detects the following system values and writes&lt;br /&gt;
# them into a database:&lt;br /&gt;
# - Temperatures of room, mainboard, CPU and hard disks&lt;br /&gt;
# - Status of hard disks (active or sleeping)&lt;br /&gt;
# - Fan speeds&lt;br /&gt;
# - System load&lt;br /&gt;
# - Power consumption&lt;br /&gt;
#&lt;br /&gt;
# Version history:&lt;br /&gt;
# 1.0   2017-10-04   Initial release&lt;br /&gt;
# 1.1   2018-09-07   Replaced pcsensor program with newer version&lt;br /&gt;
# 1.2   2019-04-20   Changed logic to build the SQL command&lt;br /&gt;
# 1.3   2020-04-20   Changed logic for process list and building comment&lt;br /&gt;
# 1.4   2020-10-17   Replaced USB temperature sensor with smart plug sensor&lt;br /&gt;
# 1.5   2024-10-17   Add power consumption of server&lt;br /&gt;
&lt;br /&gt;
## Offset for room temperature sensor (value will be subtracted from Celsius)&lt;br /&gt;
#calib=2&lt;br /&gt;
&lt;br /&gt;
# Minimum percentage of CPU usage for processes shown in comment field&lt;br /&gt;
tmin=10&lt;br /&gt;
&lt;br /&gt;
# Determine load average for last 1, 5 and 15 minutes&lt;br /&gt;
i=0&lt;br /&gt;
for loadavg in `cat /proc/loadavg`; do&lt;br /&gt;
  let i+=1&lt;br /&gt;
  if [ $i -le 3 ]; then load[$i]=$loadavg; fi&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
# Build comment field with processes reaching minimum percentage&lt;br /&gt;
i=0&lt;br /&gt;
while read process; do&lt;br /&gt;
  let i+=1&lt;br /&gt;
  tpcnt[$i]=`echo &amp;quot;$process&amp;quot;|awk &#039;{printf $9}&#039;`&lt;br /&gt;
  tproc[$i]=`echo &amp;quot;$process&amp;quot;|awk &#039;{printf $12}&#039;`&lt;br /&gt;
  if (( $(echo &amp;quot;${tpcnt[$i]} &amp;gt;= $tmin&amp;quot; | bc -l) )); then&lt;br /&gt;
    if [ $i -eq 1 ]; then&lt;br /&gt;
      comment=&amp;quot;${tpcnt[$i]}%=${tproc[$i]}&amp;quot;&lt;br /&gt;
    else&lt;br /&gt;
      comment=&amp;quot;${comment}; ${tpcnt[$i]}%=${tproc[$i]}&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
  else&lt;br /&gt;
    break&lt;br /&gt;
  fi&lt;br /&gt;
done &amp;lt;&amp;lt;&amp;lt;`top -b -n 1|grep -v &amp;quot;top$&amp;quot;|sed &#039;1,7d&#039;|sed &#039;5,$d&#039;`&lt;br /&gt;
&lt;br /&gt;
# Get status and temperatures of hard disks&lt;br /&gt;
i=0&lt;br /&gt;
while read temp; do&lt;br /&gt;
  let i+=1&lt;br /&gt;
  if `echo $temp|grep -qv &amp;quot;sleeping&amp;quot;`; then&lt;br /&gt;
    status_hdd[$i]=&amp;quot;Active&amp;quot;&lt;br /&gt;
    temp_hdd[$i]=`echo $temp|cut -c1-2`&lt;br /&gt;
  else&lt;br /&gt;
    status_hdd[$i]=&amp;quot;Sleeping&amp;quot;&lt;br /&gt;
    temp_hdd[$i]=0&lt;br /&gt;
  fi&lt;br /&gt;
done &amp;lt;&amp;lt;&amp;lt;`hddtemp /dev/sd? 2&amp;gt;&amp;amp;1|grep &amp;quot;^/dev&amp;quot;|grep -v &amp;quot;sda&amp;quot;|sort|cut -d: -f3|cut -c2-`&lt;br /&gt;
&lt;br /&gt;
while [ $i -lt 5 ]; do&lt;br /&gt;
    let i+=1&lt;br /&gt;
    status_hdd[$i]=&amp;quot;Not available&amp;quot;&lt;br /&gt;
    temp_hdd[$i]=0&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
# Get system temperatures and fan speeds&lt;br /&gt;
while read line; do&lt;br /&gt;
  case `echo $line|cut -d: -f1` in&lt;br /&gt;
    &amp;quot;SYSTIN&amp;quot;) temp_sys=`echo &amp;quot;$line&amp;quot;|cut -c26-29`;;&lt;br /&gt;
    &amp;quot;CPUTIN&amp;quot;) temp_cpu_ext=`echo &amp;quot;$line&amp;quot;|cut -c26-29`;;&lt;br /&gt;
    &amp;quot;Package id 0&amp;quot;) temp_cpu_int=`echo &amp;quot;$line&amp;quot;|cut -c17-20`;;&lt;br /&gt;
    &amp;quot;Core 0&amp;quot;) temp_core0=`echo &amp;quot;$line&amp;quot;|cut -c17-20`;;&lt;br /&gt;
    &amp;quot;Core 1&amp;quot;) temp_core1=`echo &amp;quot;$line&amp;quot;|cut -c17-20`;;&lt;br /&gt;
    &amp;quot;Core 2&amp;quot;) temp_core2=`echo &amp;quot;$line&amp;quot;|cut -c17-20`;;&lt;br /&gt;
    &amp;quot;Core 3&amp;quot;) temp_core3=`echo &amp;quot;$line&amp;quot;|cut -c17-20`;;&lt;br /&gt;
    # The sequence of the fans provided by &amp;quot;sensors&amp;quot; is different&lt;br /&gt;
    # to the sequence in the database.&lt;br /&gt;
    &amp;quot;fan1&amp;quot;) speed_fan4=`echo &amp;quot;$line&amp;quot;|cut -c24-28`;;&lt;br /&gt;
    &amp;quot;fan2&amp;quot;) speed_fan1=`echo &amp;quot;$line&amp;quot;|cut -c24-28`;;&lt;br /&gt;
    &amp;quot;fan3&amp;quot;) speed_fan2=`echo &amp;quot;$line&amp;quot;|cut -c24-28`;;&lt;br /&gt;
    &amp;quot;fan4&amp;quot;) speed_fan3=`echo &amp;quot;$line&amp;quot;|cut -c24-28`;;&lt;br /&gt;
    &amp;quot;fan5&amp;quot;) speed_fan5=`echo &amp;quot;$line&amp;quot;|cut -c24-28`;;&lt;br /&gt;
  esac&lt;br /&gt;
done &amp;lt;&amp;lt;&amp;lt;`sensors -A nct6791-isa-0290 coretemp-isa-0000`&lt;br /&gt;
&lt;br /&gt;
# Get actual power consumption from smart plug&lt;br /&gt;
power=`iobroker state getvalue fritzdect.0.DECT_116300171650.power`&lt;br /&gt;
&lt;br /&gt;
# Get room temperature (up to 5 attempts)&lt;br /&gt;
temp_room=&#039;0&#039;&lt;br /&gt;
#for i in {1..5}&lt;br /&gt;
#do&lt;br /&gt;
#  temp_room=`pcsensor -s$calib`&lt;br /&gt;
#  if [ &amp;quot;$temp_room&amp;quot; == &amp;quot;&amp;quot; ]; then&lt;br /&gt;
#    # Wait five seconds and try again&lt;br /&gt;
#    sleep 5&lt;br /&gt;
#  else&lt;br /&gt;
#    break&lt;br /&gt;
#  fi&lt;br /&gt;
#done&lt;br /&gt;
temp_room=`iobroker state getvalue fritzdect.0.DECT_116300171650.celsius`&lt;br /&gt;
&lt;br /&gt;
# Fill timestamp field&lt;br /&gt;
timestamp=`date +&#039;%Y-%m-%d %H:%M:%S&#039;`&lt;br /&gt;
&lt;br /&gt;
# Insert data into database&lt;br /&gt;
sql=&amp;quot;INSERT INTO fw_values (timestamp,temp_room,temp_sys,temp_cpu_ext,&amp;quot;&lt;br /&gt;
sql+=&amp;quot;temp_cpu_int,temp_core0,temp_core1,temp_core2,temp_core3,&amp;quot;&lt;br /&gt;
sql+=&amp;quot;status_hdd1,status_hdd2,status_hdd3,status_hdd4,status_hdd5,&amp;quot;&lt;br /&gt;
sql+=&amp;quot;temp_hdd1,temp_hdd2,temp_hdd3,temp_hdd4,temp_hdd5,&amp;quot;&lt;br /&gt;
sql+=&amp;quot;speed_fan1,speed_fan2,speed_fan3,speed_fan4,speed_fan5,&amp;quot;&lt;br /&gt;
sql+=&amp;quot;load01,load05,load15,power,comment) VALUES (&amp;quot;&lt;br /&gt;
sql+=&amp;quot;\&amp;quot;$timestamp\&amp;quot;, \&amp;quot;$temp_room\&amp;quot;, \&amp;quot;$temp_sys\&amp;quot;, \&amp;quot;$temp_cpu_ext\&amp;quot;, &amp;quot;&lt;br /&gt;
sql+=&amp;quot;\&amp;quot;$temp_cpu_int\&amp;quot;, \&amp;quot;$temp_core0\&amp;quot;, \&amp;quot;$temp_core1\&amp;quot;, \&amp;quot;$temp_core2\&amp;quot;, &amp;quot;&lt;br /&gt;
sql+=&amp;quot;\&amp;quot;$temp_core3\&amp;quot;, \&amp;quot;${status_hdd[1]}\&amp;quot;, \&amp;quot;${status_hdd[2]}\&amp;quot;, &amp;quot;&lt;br /&gt;
sql+=&amp;quot;\&amp;quot;${status_hdd[3]}\&amp;quot;, \&amp;quot;${status_hdd[4]}\&amp;quot;, \&amp;quot;${status_hdd[5]}\&amp;quot;, &amp;quot;&lt;br /&gt;
sql+=&amp;quot;\&amp;quot;${temp_hdd[1]}\&amp;quot;, \&amp;quot;${temp_hdd[2]}\&amp;quot;, \&amp;quot;${temp_hdd[3]}\&amp;quot;, &amp;quot;&lt;br /&gt;
sql+=&amp;quot;\&amp;quot;${temp_hdd[4]}\&amp;quot;, \&amp;quot;${temp_hdd[5]}\&amp;quot;, &amp;quot;&lt;br /&gt;
sql+=&amp;quot;\&amp;quot;$speed_fan1\&amp;quot;, \&amp;quot;$speed_fan2\&amp;quot;, \&amp;quot;$speed_fan3\&amp;quot;, &amp;quot;&lt;br /&gt;
sql+=&amp;quot;\&amp;quot;$speed_fan4\&amp;quot;, \&amp;quot;$speed_fan5\&amp;quot;, &amp;quot;&lt;br /&gt;
sql+=&amp;quot;\&amp;quot;${load[1]}\&amp;quot;, \&amp;quot;${load[2]}\&amp;quot;, \&amp;quot;${load[3]}\&amp;quot;, &amp;quot;&lt;br /&gt;
sql+=&amp;quot;\&amp;quot;$power\&amp;quot;, \&amp;quot;$comment\&amp;quot;)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
mysql --login-path=fwsysmon -D fwsysmon -e &amp;quot;$sql&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
==Notes==&lt;br /&gt;
By default the Linux kernel claims the TEMPer device as a keyboard (HID device). When that happens, the program &#039;&#039;&#039;&#039;&#039;pcsensor&#039;&#039;&#039;&#039;&#039; is not able to set the configuration and communicate with it.&lt;br /&gt;
&lt;br /&gt;
An error occurs and is shown in logfile &#039;&#039;&#039;/var/log/kern.log&#039;&#039;&#039;:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
usbfs: USBDEVFS_CONTROL failed cmd pcsensor rqt 128 rq 6 len 255 ret -71&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;To prevent this we have to add a kernel parameter in &#039;&#039;&#039;/etc/default/grub&#039;&#039;&#039;:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#&amp;gt;&amp;gt;&amp;gt;2019-04-19 Frank wulf&lt;br /&gt;
#GRUB_CMDLINE_LINUX_DEFAULT=&amp;quot;&amp;quot;&lt;br /&gt;
GRUB_CMDLINE_LINUX_DEFAULT=&amp;quot;usbhid.quirks=0x0c45:0x7401:0x4&amp;quot;&lt;br /&gt;
#&amp;lt;&amp;lt;&amp;lt;2019-04-19 Frank Wulf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Wulf</name></author>
	</entry>
	<entry>
		<id>http://wiki.frank-wulf.de/index.php?title=Fail2ban&amp;diff=643</id>
		<title>Fail2ban</title>
		<link rel="alternate" type="text/html" href="http://wiki.frank-wulf.de/index.php?title=Fail2ban&amp;diff=643"/>
		<updated>2024-10-10T14:24:34Z</updated>

		<summary type="html">&lt;p&gt;Wulf: /* Shell script fwfail2ban */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__FORCETOC__&lt;br /&gt;
=Fail2Ban Installation from GitHub=&lt;br /&gt;
&lt;br /&gt;
In case an existing Fail2Ban server is running:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;sudo service fail2ban stop&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Download Fail2Ban from GitHub:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;export VERSION=0.10.0&lt;br /&gt;
wget https://github.com/fail2ban/fail2ban/archive/&amp;quot;${VERSION}&amp;quot;.tar.gz -O fail2ban-&amp;quot;${VERSION}&amp;quot;.tar.gz&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unpack and install:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;sudo tar -zxpvf fail2ban-&amp;quot;${VERSION}&amp;quot;.tar.gz&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;cd fail2ban-&amp;quot;${VERSION}&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;sudo python setup.py install&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
This will install Fail2Ban into the python library directory. The executable scripts are placed into /usr/local/bin and configuration under /etc/fail2ban.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Enable fail2ban as an automatic service:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;sudo cp files/debian-initd /etc/init.d/fail2ban&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;sudo update-rc.d fail2ban defaults&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;sudo service fail2ban start&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Changes in configuration=&lt;br /&gt;
Avoid banning IPs from local network (file /etc/fail2ban/jail.conf)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; highlight=&amp;quot;5-7&amp;quot;&amp;gt;# &amp;quot;ignoreip&amp;quot; can be a list of IP addresses, CIDR masks or DNS hosts. Fail2ban&lt;br /&gt;
# will not ban a host which matches an address in this list. Several addresses&lt;br /&gt;
# can be defined using space (and/or comma) separator.&lt;br /&gt;
#ignoreip = 127.0.0.1/8 ::1&lt;br /&gt;
#&amp;gt;&amp;gt;&amp;gt;2019-04-13 Frank Wulf&lt;br /&gt;
ignoreip = 127.0.0.1/8 192.168.141.0/24&lt;br /&gt;
#&amp;lt;&amp;lt;&amp;lt;2019-04-13 Frank Wulf&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Adjust regular expression for SSH rules (file /etc/fail2ban/filter.d/sshd.conf)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; highlight=&amp;quot;22-24&amp;quot;&amp;gt;cmnfailre = ^[aA]uthentication (?:failure|error|failed) for &amp;lt;F-USER&amp;gt;.*&amp;lt;/F-USER&amp;gt; from &amp;lt;HOST&amp;gt;( via \S+)?%(__suff)s$&lt;br /&gt;
            ^User not known to the underlying authentication module for &amp;lt;F-USER&amp;gt;.*&amp;lt;/F-USER&amp;gt; from &amp;lt;HOST&amp;gt;%(__suff)s$&lt;br /&gt;
            ^Failed publickey for invalid user &amp;lt;F-USER&amp;gt;(?P&amp;lt;cond_user&amp;gt;\S+)|(?:(?! from ).)*?&amp;lt;/F-USER&amp;gt; from &amp;lt;HOST&amp;gt;%(__on_port_opt)s(?: ssh\d*)?(?(cond_user): |(?:(?:(?! from ).)*)$)&lt;br /&gt;
            ^Failed \b(?!publickey)\S+ for (?P&amp;lt;cond_inv&amp;gt;invalid user )?&amp;lt;F-USER&amp;gt;(?P&amp;lt;cond_user&amp;gt;\S+)|(?(cond_inv)(?:(?! from ).)*?|[^:]+)&amp;lt;/F-USER&amp;gt; from &amp;lt;HOST&amp;gt;%(__on_port_opt)s(?: ssh\d*)?(?(cond_user): |(?:(?:(?! from ).)*)$)&lt;br /&gt;
            ^&amp;lt;F-USER&amp;gt;ROOT&amp;lt;/F-USER&amp;gt; LOGIN REFUSED FROM &amp;lt;HOST&amp;gt;&lt;br /&gt;
            ^[iI](?:llegal|nvalid) user &amp;lt;F-USER&amp;gt;.*?&amp;lt;/F-USER&amp;gt; from &amp;lt;HOST&amp;gt;%(__suff)s$&lt;br /&gt;
            ^User &amp;lt;F-USER&amp;gt;.+&amp;lt;/F-USER&amp;gt; from &amp;lt;HOST&amp;gt; not allowed because not listed in AllowUsers%(__suff)s$&lt;br /&gt;
            ^User &amp;lt;F-USER&amp;gt;.+&amp;lt;/F-USER&amp;gt; from &amp;lt;HOST&amp;gt; not allowed because listed in DenyUsers%(__suff)s$&lt;br /&gt;
            ^User &amp;lt;F-USER&amp;gt;.+&amp;lt;/F-USER&amp;gt; from &amp;lt;HOST&amp;gt; not allowed because not in any group%(__suff)s$&lt;br /&gt;
            ^refused connect from \S+ \(&amp;lt;HOST&amp;gt;\)&lt;br /&gt;
            ^Received &amp;lt;F-MLFFORGET&amp;gt;disconnect&amp;lt;/F-MLFFORGET&amp;gt; from &amp;lt;HOST&amp;gt;%(__on_port_opt)s:\s*3: .*: Auth fail%(__suff)s$&lt;br /&gt;
            ^User &amp;lt;F-USER&amp;gt;.+&amp;lt;/F-USER&amp;gt; from &amp;lt;HOST&amp;gt; not allowed because a group is listed in DenyGroups%(__suff)s$&lt;br /&gt;
            ^User &amp;lt;F-USER&amp;gt;.+&amp;lt;/F-USER&amp;gt; from &amp;lt;HOST&amp;gt; not allowed because none of user&#039;s groups are listed in AllowGroups%(__suff)s$&lt;br /&gt;
            ^&amp;lt;F-NOFAIL&amp;gt;%(__pam_auth)s\(sshd:auth\):\s+authentication failure;&amp;lt;/F-NOFAIL&amp;gt;(?:\s+(?:(?:logname|e?uid|tty)=\S*)){0,4}\s+ruser=&amp;lt;F-ALT_USER&amp;gt;\S*&amp;lt;/F-ALT_USER&amp;gt;\s+rhost=&amp;lt;HOST&amp;gt;(?:\s+user=&amp;lt;F-USER&amp;gt;\S*&amp;lt;/F-USER&amp;gt;)?%(__suff)s$&lt;br /&gt;
            ^(error: )?maximum authentication attempts exceeded for &amp;lt;F-USER&amp;gt;.*&amp;lt;/F-USER&amp;gt; from &amp;lt;HOST&amp;gt;%(__on_port_opt)s(?: ssh\d*)?%(__suff)s$&lt;br /&gt;
            ^User &amp;lt;F-USER&amp;gt;.+&amp;lt;/F-USER&amp;gt; not allowed because account is locked%(__suff)s&lt;br /&gt;
            ^&amp;lt;F-MLFFORGET&amp;gt;Disconnecting&amp;lt;/F-MLFFORGET&amp;gt;(?: from)?(?: (?:invalid|authenticating)) user &amp;lt;F-USER&amp;gt;\S+&amp;lt;/F-USER&amp;gt; &amp;lt;HOST&amp;gt;%(__on_port_opt)s:\s*Change of username or service not allowed:\s*.*\[preauth\]\s*$&lt;br /&gt;
            ^&amp;lt;F-MLFFORGET&amp;gt;Disconnecting&amp;lt;/F-MLFFORGET&amp;gt;: Too many authentication failures(?: for &amp;lt;F-USER&amp;gt;.+?&amp;lt;/F-USER&amp;gt;)?%(__suff)s$&lt;br /&gt;
            ^&amp;lt;F-NOFAIL&amp;gt;Received &amp;lt;F-MLFFORGET&amp;gt;disconnect&amp;lt;/F-MLFFORGET&amp;gt;&amp;lt;/F-NOFAIL&amp;gt; from &amp;lt;HOST&amp;gt;%(__on_port_opt)s:\s*11:&lt;br /&gt;
            ^&amp;lt;F-NOFAIL&amp;gt;Connection &amp;lt;F-MLFFORGET&amp;gt;closed&amp;lt;/F-MLFFORGET&amp;gt;&amp;lt;/F-NOFAIL&amp;gt; by%(__authng_user)s &amp;lt;HOST&amp;gt;&amp;lt;mdrp-&amp;lt;mode&amp;gt;-suff-onclosed&amp;gt;&lt;br /&gt;
            ^&amp;lt;F-MLFFORGET&amp;gt;&amp;lt;F-MLFGAINED&amp;gt;Accepted \w+&amp;lt;/F-MLFGAINED&amp;gt;&amp;lt;/F-MLFFORGET&amp;gt; for &amp;lt;F-USER&amp;gt;\S+&amp;lt;/F-USER&amp;gt; from &amp;lt;HOST&amp;gt;(?:\s|$)&lt;br /&gt;
#&amp;gt;&amp;gt;&amp;gt;2018-09-11 Frank Wulf&lt;br /&gt;
            ^Disconnected from &amp;lt;HOST&amp;gt;%(__on_port_opt)s\s+\[preauth\]\s*$&lt;br /&gt;
#&amp;lt;&amp;lt;&amp;lt;2018-09-11 Frank Wulf&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Using IP sets instead of iptables rules=&lt;br /&gt;
&lt;br /&gt;
=== Difference between iptables and IP sets ===&lt;br /&gt;
By default Fail2Ban uses iptables rules to block IP addresses. These rules are processed sequentially and can therefore result in slow response time due to a large number of entries.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;iptables -S&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Result:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;-P INPUT ACCEPT&lt;br /&gt;
-P FORWARD ACCEPT&lt;br /&gt;
-P OUTPUT ACCEPT&lt;br /&gt;
-N f2b-sshd&lt;br /&gt;
-A INPUT -p tcp -m multiport --dports 22 -j f2b-sshd&lt;br /&gt;
-A f2b-sshd -s 120.52.56.124/32 -j REJECT --reject-with icmp-port-unreachable&lt;br /&gt;
-A f2b-sshd -s 116.193.161.242/32 -j REJECT --reject-with icmp-port-unreachable&lt;br /&gt;
-A f2b-sshd -s 14.215.237.205/32 -j REJECT --reject-with icmp-port-unreachable&lt;br /&gt;
-A f2b-sshd -s 118.244.238.18/32 -j REJECT --reject-with icmp-port-unreachable&lt;br /&gt;
-A f2b-sshd -s 155.133.82.12/32 -j REJECT --reject-with icmp-port-unreachable&lt;br /&gt;
-A f2b-sshd -s 49.4.6.132/32 -j REJECT --reject-with icmp-port-unreachable&lt;br /&gt;
-A f2b-sshd -s 118.244.206.22/32 -j REJECT --reject-with icmp-port-unreachable&lt;br /&gt;
-A f2b-sshd -s 61.132.29.162/32 -j REJECT --reject-with icmp-port-unreachable&lt;br /&gt;
-A f2b-sshd -s 192.160.102.169/32 -j REJECT --reject-with icmp-port-unreachable&lt;br /&gt;
-A f2b-sshd -s 162.247.72.213/32 -j REJECT --reject-with icmp-port-unreachable&lt;br /&gt;
-A f2b-sshd -s 149.56.223.241/32 -j REJECT --reject-with icmp-port-unreachable&lt;br /&gt;
-A f2b-sshd -s 27.255.79.82/32 -j REJECT --reject-with icmp-port-unreachable&lt;br /&gt;
-A f2b-sshd -s 211.104.171.220/32 -j REJECT --reject-with icmp-port-unreachable&lt;br /&gt;
-A f2b-sshd -s 187.252.208.82/32 -j REJECT --reject-with icmp-port-unreachable&lt;br /&gt;
-A f2b-sshd -s 116.6.49.126/32 -j REJECT --reject-with icmp-port-unreachable&lt;br /&gt;
-A f2b-sshd -j RETURN&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Since Linux Kernel 2.6 there is an option to use so-called IP sets to hold big amount of IP addresses in the memory. This technique uses hashtables to store and search IP adresses and is therefore much more efficient than parsing sequentially through the iptables rules.&lt;br /&gt;
&lt;br /&gt;
=== Shell script &#039;&#039;&#039;&#039;&#039;fwfail2ban&#039;&#039;&#039;&#039;&#039; ===&lt;br /&gt;
The following shell script &#039;&#039;&#039;&#039;&#039;fwfail2ban&#039;&#039;&#039;&#039;&#039; moves IP addresses from the iptables rules to an IP set:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
#&lt;br /&gt;
# Author:  Frank Wulf&lt;br /&gt;
# Version: 1.3 (2022-03-01)&lt;br /&gt;
#&lt;br /&gt;
# This program moves iptables entries created by fail2ban to&lt;br /&gt;
# an IP set in the Linux Kernel. Advantage is that ipset uses&lt;br /&gt;
# a hashtable to store/fetch IP addresses and thus the IP lookup&lt;br /&gt;
# is much more efficient and faster than sequentially parsing&lt;br /&gt;
# the iptables rules.&lt;br /&gt;
#&lt;br /&gt;
# Version history:&lt;br /&gt;
# 1.0   2017-10-04   Initial release&lt;br /&gt;
# 1.1   2019-04-19   Add DELETE command for new database table &amp;quot;bips&amp;quot;&lt;br /&gt;
# 1.2   2020-04-16   Replace &amp;quot;DELETE from db&amp;quot; logic by &amp;quot;fail2ban unban --all&amp;quot;&lt;br /&gt;
# 1.3   2022-03-01   Add logic to handle ipsets reaching maximum number of elements&lt;br /&gt;
&lt;br /&gt;
# Get program name to be used as prefix&lt;br /&gt;
pfx=$(basename $0)&lt;br /&gt;
&lt;br /&gt;
# Temporary files&lt;br /&gt;
chn=/tmp/$pfx.chn&lt;br /&gt;
out=/tmp/$pfx.out&lt;br /&gt;
&lt;br /&gt;
# Get fail2ban database&lt;br /&gt;
db=`confget -f /etc/fail2ban/fail2ban.conf dbfile`&lt;br /&gt;
&lt;br /&gt;
# Get all chains created by fail2ban&lt;br /&gt;
iptables -S|grep &amp;quot;^\-A f2b-&amp;quot;|awk &#039;{print $2}&#039;|sed &amp;quot;s/f2b-//&amp;quot;|sort -u &amp;gt;$chn&lt;br /&gt;
&lt;br /&gt;
while read chain; do&lt;br /&gt;
&lt;br /&gt;
  # Build the ipset if not exist&lt;br /&gt;
  ipset -exist create $pfx-$chain hash:ip timeout 0&lt;br /&gt;
&lt;br /&gt;
  # Build the iptables rules to use ipset if not exist&lt;br /&gt;
  for i in INPUT FORWARD; do&lt;br /&gt;
    if ! `iptables -C $i -m set --match-set $pfx-$chain src -j DROP 1&amp;gt;/dev/null 2&amp;gt;&amp;amp;1`; then&lt;br /&gt;
      iptables -I $i -m set --match-set $pfx-$chain src -j DROP&lt;br /&gt;
    fi&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
  # Get banned IP addresses from iptables&lt;br /&gt;
  iptables -L f2b-$chain -v -n|grep -E &#039;[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}&#039;|awk &#039;{print $8}&#039;|grep -v &#039;0\.0\.0\.0&#039; &amp;gt;$out&lt;br /&gt;
&lt;br /&gt;
  # Get bantime from fail2ban configuration&lt;br /&gt;
  bantime=`confget -f /etc/fail2ban/jail.local -s $chain bantime`&lt;br /&gt;
&lt;br /&gt;
  while read ipaddr; do&lt;br /&gt;
    sw_ipset=1&lt;br /&gt;
    # If bantime is not persistent then the timeout for ipset needs to be&lt;br /&gt;
    # adjusted depending on the time when fail2ban has banned the IP address.&lt;br /&gt;
    if [ &amp;quot;$bantime&amp;quot; == &amp;quot;&amp;quot; -o &amp;quot;$bantime&amp;quot; == &amp;quot;-1&amp;quot; ]; then&lt;br /&gt;
      timeout=0&lt;br /&gt;
    else&lt;br /&gt;
      timeofban=`sqlite3 -batch $db &amp;quot;SELECT timeofban FROM bans WHERE jail = &#039;$chain&#039; AND ip = &#039;$ipaddr&#039; LIMIT 1&amp;quot;`&lt;br /&gt;
      timeout=$(($bantime - (`date +%s` - $timeofban)))&lt;br /&gt;
      if [ $timeout -le 0 ]; then&lt;br /&gt;
        # Bantime has exceeded (should happen only if fail2ban is unbanning an IP address&lt;br /&gt;
        # right during the runtime of this program).&lt;br /&gt;
        sw_ipset=0&lt;br /&gt;
      fi&lt;br /&gt;
    fi&lt;br /&gt;
    if [ $sw_ipset -eq 1 ]; then&lt;br /&gt;
      # Check if ipset has reached maximum number of elements&lt;br /&gt;
      maxelem=`ipset list -t $pfx-$chain | grep &amp;quot;maxelem&amp;quot;|awk &#039;{print $7}&#039;`&lt;br /&gt;
      numelem=`ipset list -t $pfx-$chain | grep &amp;quot;Number of entries&amp;quot;|awk -F: &#039;{print $2}&#039;`&lt;br /&gt;
&lt;br /&gt;
      if [ `echo &amp;quot;$maxelem - $numelem&amp;quot; | bc` -lt 1 ]; then&lt;br /&gt;
        # ipset is full =&amp;gt; rename with date stamp and create new one&lt;br /&gt;
&lt;br /&gt;
        # Remove iptables rules to enable renaming of ipset&lt;br /&gt;
        for i in INPUT FORWARD; do&lt;br /&gt;
          iptables -D $i -m set --match-set $pfx-$chain src -j DROP&lt;br /&gt;
        done&lt;br /&gt;
&lt;br /&gt;
        oldset=$pfx-$chain-`date +&#039;%Y%m%d&#039;`&lt;br /&gt;
        ipset rename $pfx-$chain $oldset&lt;br /&gt;
        ipset create $pfx-$chain hash:ip timeout 0&lt;br /&gt;
&lt;br /&gt;
        # Build the iptables rules to use old and new ipset&lt;br /&gt;
        for i in INPUT FORWARD; do&lt;br /&gt;
          iptables -I $i -m set --match-set $oldset src -j DROP&lt;br /&gt;
          iptables -I $i -m set --match-set $pfx-$chain src -j DROP&lt;br /&gt;
        done&lt;br /&gt;
      fi&lt;br /&gt;
&lt;br /&gt;
      # Add IP address to ipset&lt;br /&gt;
      ipset add $pfx-$chain $ipaddr timeout $timeout 1&amp;gt;/dev/null 2&amp;gt;&amp;amp;1&lt;br /&gt;
    fi&lt;br /&gt;
  done &amp;lt;$out&lt;br /&gt;
&lt;br /&gt;
  # Flush all rules in this chain created by fail2ban&lt;br /&gt;
  iptables -F f2b-$chain&lt;br /&gt;
&lt;br /&gt;
done &amp;lt;$chn&lt;br /&gt;
&lt;br /&gt;
# Remove temporary files&lt;br /&gt;
rm $out 1&amp;gt;/dev/null 2&amp;gt;&amp;amp;1&lt;br /&gt;
rm $chn 1&amp;gt;/dev/null 2&amp;gt;&amp;amp;1&lt;br /&gt;
&lt;br /&gt;
# &amp;quot;Unban&amp;quot; all IP addresses to clear iptables rules as the entries are now in the IP set.&lt;br /&gt;
/usr/local/bin/fail2ban-client unban --all  1&amp;gt;/dev/null 2&amp;gt;&amp;amp;1&lt;br /&gt;
&lt;br /&gt;
# Save IP set to enable restoring after reboot&lt;br /&gt;
ipset save -f /etc/iptables/rules.ipset&lt;br /&gt;
&lt;br /&gt;
# Save iptables to enable restoring after reboot, the entries created&lt;br /&gt;
# by fail2ban are filtered, those will be restored by fail2ban itself.&lt;br /&gt;
iptables-save | grep -v &amp;quot;^\-A.*f2b-&amp;quot; &amp;gt;/etc/iptables/rules.v4&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The script runs once a day via cron. During the day fail2ban bans IP addresses with iptables rules which are then moved at 0:00 o&#039;clock to an IP set.&lt;br /&gt;
&lt;br /&gt;
By default both iptables rules and IP sets are hold in the memory and get lost during a reboot. Therefore the script saves the data which then can be automatically restored after a reboot.&lt;/div&gt;</summary>
		<author><name>Wulf</name></author>
	</entry>
	<entry>
		<id>http://wiki.frank-wulf.de/index.php?title=Fail2ban&amp;diff=642</id>
		<title>Fail2ban</title>
		<link rel="alternate" type="text/html" href="http://wiki.frank-wulf.de/index.php?title=Fail2ban&amp;diff=642"/>
		<updated>2024-10-10T14:23:00Z</updated>

		<summary type="html">&lt;p&gt;Wulf: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__FORCETOC__&lt;br /&gt;
=Fail2Ban Installation from GitHub=&lt;br /&gt;
&lt;br /&gt;
In case an existing Fail2Ban server is running:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;sudo service fail2ban stop&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Download Fail2Ban from GitHub:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;export VERSION=0.10.0&lt;br /&gt;
wget https://github.com/fail2ban/fail2ban/archive/&amp;quot;${VERSION}&amp;quot;.tar.gz -O fail2ban-&amp;quot;${VERSION}&amp;quot;.tar.gz&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unpack and install:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;sudo tar -zxpvf fail2ban-&amp;quot;${VERSION}&amp;quot;.tar.gz&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;cd fail2ban-&amp;quot;${VERSION}&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;sudo python setup.py install&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
This will install Fail2Ban into the python library directory. The executable scripts are placed into /usr/local/bin and configuration under /etc/fail2ban.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Enable fail2ban as an automatic service:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;sudo cp files/debian-initd /etc/init.d/fail2ban&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;sudo update-rc.d fail2ban defaults&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;sudo service fail2ban start&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Changes in configuration=&lt;br /&gt;
Avoid banning IPs from local network (file /etc/fail2ban/jail.conf)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; highlight=&amp;quot;5-7&amp;quot;&amp;gt;# &amp;quot;ignoreip&amp;quot; can be a list of IP addresses, CIDR masks or DNS hosts. Fail2ban&lt;br /&gt;
# will not ban a host which matches an address in this list. Several addresses&lt;br /&gt;
# can be defined using space (and/or comma) separator.&lt;br /&gt;
#ignoreip = 127.0.0.1/8 ::1&lt;br /&gt;
#&amp;gt;&amp;gt;&amp;gt;2019-04-13 Frank Wulf&lt;br /&gt;
ignoreip = 127.0.0.1/8 192.168.141.0/24&lt;br /&gt;
#&amp;lt;&amp;lt;&amp;lt;2019-04-13 Frank Wulf&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Adjust regular expression for SSH rules (file /etc/fail2ban/filter.d/sshd.conf)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; highlight=&amp;quot;22-24&amp;quot;&amp;gt;cmnfailre = ^[aA]uthentication (?:failure|error|failed) for &amp;lt;F-USER&amp;gt;.*&amp;lt;/F-USER&amp;gt; from &amp;lt;HOST&amp;gt;( via \S+)?%(__suff)s$&lt;br /&gt;
            ^User not known to the underlying authentication module for &amp;lt;F-USER&amp;gt;.*&amp;lt;/F-USER&amp;gt; from &amp;lt;HOST&amp;gt;%(__suff)s$&lt;br /&gt;
            ^Failed publickey for invalid user &amp;lt;F-USER&amp;gt;(?P&amp;lt;cond_user&amp;gt;\S+)|(?:(?! from ).)*?&amp;lt;/F-USER&amp;gt; from &amp;lt;HOST&amp;gt;%(__on_port_opt)s(?: ssh\d*)?(?(cond_user): |(?:(?:(?! from ).)*)$)&lt;br /&gt;
            ^Failed \b(?!publickey)\S+ for (?P&amp;lt;cond_inv&amp;gt;invalid user )?&amp;lt;F-USER&amp;gt;(?P&amp;lt;cond_user&amp;gt;\S+)|(?(cond_inv)(?:(?! from ).)*?|[^:]+)&amp;lt;/F-USER&amp;gt; from &amp;lt;HOST&amp;gt;%(__on_port_opt)s(?: ssh\d*)?(?(cond_user): |(?:(?:(?! from ).)*)$)&lt;br /&gt;
            ^&amp;lt;F-USER&amp;gt;ROOT&amp;lt;/F-USER&amp;gt; LOGIN REFUSED FROM &amp;lt;HOST&amp;gt;&lt;br /&gt;
            ^[iI](?:llegal|nvalid) user &amp;lt;F-USER&amp;gt;.*?&amp;lt;/F-USER&amp;gt; from &amp;lt;HOST&amp;gt;%(__suff)s$&lt;br /&gt;
            ^User &amp;lt;F-USER&amp;gt;.+&amp;lt;/F-USER&amp;gt; from &amp;lt;HOST&amp;gt; not allowed because not listed in AllowUsers%(__suff)s$&lt;br /&gt;
            ^User &amp;lt;F-USER&amp;gt;.+&amp;lt;/F-USER&amp;gt; from &amp;lt;HOST&amp;gt; not allowed because listed in DenyUsers%(__suff)s$&lt;br /&gt;
            ^User &amp;lt;F-USER&amp;gt;.+&amp;lt;/F-USER&amp;gt; from &amp;lt;HOST&amp;gt; not allowed because not in any group%(__suff)s$&lt;br /&gt;
            ^refused connect from \S+ \(&amp;lt;HOST&amp;gt;\)&lt;br /&gt;
            ^Received &amp;lt;F-MLFFORGET&amp;gt;disconnect&amp;lt;/F-MLFFORGET&amp;gt; from &amp;lt;HOST&amp;gt;%(__on_port_opt)s:\s*3: .*: Auth fail%(__suff)s$&lt;br /&gt;
            ^User &amp;lt;F-USER&amp;gt;.+&amp;lt;/F-USER&amp;gt; from &amp;lt;HOST&amp;gt; not allowed because a group is listed in DenyGroups%(__suff)s$&lt;br /&gt;
            ^User &amp;lt;F-USER&amp;gt;.+&amp;lt;/F-USER&amp;gt; from &amp;lt;HOST&amp;gt; not allowed because none of user&#039;s groups are listed in AllowGroups%(__suff)s$&lt;br /&gt;
            ^&amp;lt;F-NOFAIL&amp;gt;%(__pam_auth)s\(sshd:auth\):\s+authentication failure;&amp;lt;/F-NOFAIL&amp;gt;(?:\s+(?:(?:logname|e?uid|tty)=\S*)){0,4}\s+ruser=&amp;lt;F-ALT_USER&amp;gt;\S*&amp;lt;/F-ALT_USER&amp;gt;\s+rhost=&amp;lt;HOST&amp;gt;(?:\s+user=&amp;lt;F-USER&amp;gt;\S*&amp;lt;/F-USER&amp;gt;)?%(__suff)s$&lt;br /&gt;
            ^(error: )?maximum authentication attempts exceeded for &amp;lt;F-USER&amp;gt;.*&amp;lt;/F-USER&amp;gt; from &amp;lt;HOST&amp;gt;%(__on_port_opt)s(?: ssh\d*)?%(__suff)s$&lt;br /&gt;
            ^User &amp;lt;F-USER&amp;gt;.+&amp;lt;/F-USER&amp;gt; not allowed because account is locked%(__suff)s&lt;br /&gt;
            ^&amp;lt;F-MLFFORGET&amp;gt;Disconnecting&amp;lt;/F-MLFFORGET&amp;gt;(?: from)?(?: (?:invalid|authenticating)) user &amp;lt;F-USER&amp;gt;\S+&amp;lt;/F-USER&amp;gt; &amp;lt;HOST&amp;gt;%(__on_port_opt)s:\s*Change of username or service not allowed:\s*.*\[preauth\]\s*$&lt;br /&gt;
            ^&amp;lt;F-MLFFORGET&amp;gt;Disconnecting&amp;lt;/F-MLFFORGET&amp;gt;: Too many authentication failures(?: for &amp;lt;F-USER&amp;gt;.+?&amp;lt;/F-USER&amp;gt;)?%(__suff)s$&lt;br /&gt;
            ^&amp;lt;F-NOFAIL&amp;gt;Received &amp;lt;F-MLFFORGET&amp;gt;disconnect&amp;lt;/F-MLFFORGET&amp;gt;&amp;lt;/F-NOFAIL&amp;gt; from &amp;lt;HOST&amp;gt;%(__on_port_opt)s:\s*11:&lt;br /&gt;
            ^&amp;lt;F-NOFAIL&amp;gt;Connection &amp;lt;F-MLFFORGET&amp;gt;closed&amp;lt;/F-MLFFORGET&amp;gt;&amp;lt;/F-NOFAIL&amp;gt; by%(__authng_user)s &amp;lt;HOST&amp;gt;&amp;lt;mdrp-&amp;lt;mode&amp;gt;-suff-onclosed&amp;gt;&lt;br /&gt;
            ^&amp;lt;F-MLFFORGET&amp;gt;&amp;lt;F-MLFGAINED&amp;gt;Accepted \w+&amp;lt;/F-MLFGAINED&amp;gt;&amp;lt;/F-MLFFORGET&amp;gt; for &amp;lt;F-USER&amp;gt;\S+&amp;lt;/F-USER&amp;gt; from &amp;lt;HOST&amp;gt;(?:\s|$)&lt;br /&gt;
#&amp;gt;&amp;gt;&amp;gt;2018-09-11 Frank Wulf&lt;br /&gt;
            ^Disconnected from &amp;lt;HOST&amp;gt;%(__on_port_opt)s\s+\[preauth\]\s*$&lt;br /&gt;
#&amp;lt;&amp;lt;&amp;lt;2018-09-11 Frank Wulf&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Using IP sets instead of iptables rules=&lt;br /&gt;
==Difference between iptables and IP sets==&lt;br /&gt;
By default Fail2Ban uses iptables rules to block IP addresses. These rules are processed sequentially and can therefore result in slow response time due to a large number of entries.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;iptables -S&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Result:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;-P INPUT ACCEPT&lt;br /&gt;
-P FORWARD ACCEPT&lt;br /&gt;
-P OUTPUT ACCEPT&lt;br /&gt;
-N f2b-sshd&lt;br /&gt;
-A INPUT -p tcp -m multiport --dports 22 -j f2b-sshd&lt;br /&gt;
-A f2b-sshd -s 120.52.56.124/32 -j REJECT --reject-with icmp-port-unreachable&lt;br /&gt;
-A f2b-sshd -s 116.193.161.242/32 -j REJECT --reject-with icmp-port-unreachable&lt;br /&gt;
-A f2b-sshd -s 14.215.237.205/32 -j REJECT --reject-with icmp-port-unreachable&lt;br /&gt;
-A f2b-sshd -s 118.244.238.18/32 -j REJECT --reject-with icmp-port-unreachable&lt;br /&gt;
-A f2b-sshd -s 155.133.82.12/32 -j REJECT --reject-with icmp-port-unreachable&lt;br /&gt;
-A f2b-sshd -s 49.4.6.132/32 -j REJECT --reject-with icmp-port-unreachable&lt;br /&gt;
-A f2b-sshd -s 118.244.206.22/32 -j REJECT --reject-with icmp-port-unreachable&lt;br /&gt;
-A f2b-sshd -s 61.132.29.162/32 -j REJECT --reject-with icmp-port-unreachable&lt;br /&gt;
-A f2b-sshd -s 192.160.102.169/32 -j REJECT --reject-with icmp-port-unreachable&lt;br /&gt;
-A f2b-sshd -s 162.247.72.213/32 -j REJECT --reject-with icmp-port-unreachable&lt;br /&gt;
-A f2b-sshd -s 149.56.223.241/32 -j REJECT --reject-with icmp-port-unreachable&lt;br /&gt;
-A f2b-sshd -s 27.255.79.82/32 -j REJECT --reject-with icmp-port-unreachable&lt;br /&gt;
-A f2b-sshd -s 211.104.171.220/32 -j REJECT --reject-with icmp-port-unreachable&lt;br /&gt;
-A f2b-sshd -s 187.252.208.82/32 -j REJECT --reject-with icmp-port-unreachable&lt;br /&gt;
-A f2b-sshd -s 116.6.49.126/32 -j REJECT --reject-with icmp-port-unreachable&lt;br /&gt;
-A f2b-sshd -j RETURN&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Since Linux Kernel 2.6 there is an option to use so-called IP sets to hold big amount of IP addresses in the memory. This technique uses hashtables to store and search IP adresses and is therefore much more efficient than parsing sequentially through the iptables rules.&lt;br /&gt;
&lt;br /&gt;
==Shell script fwfail2ban==&lt;br /&gt;
The following shell script &#039;&#039;&#039;&#039;&#039;fwfail2ban&#039;&#039;&#039;&#039;&#039; moves IP addresses from the iptables rules to an IP set:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
#&lt;br /&gt;
# Author:  Frank Wulf&lt;br /&gt;
# Version: 1.3 (2022-03-01)&lt;br /&gt;
#&lt;br /&gt;
# This program moves iptables entries created by fail2ban to&lt;br /&gt;
# an IP set in the Linux Kernel. Advantage is that ipset uses&lt;br /&gt;
# a hashtable to store/fetch IP addresses and thus the IP lookup&lt;br /&gt;
# is much more efficient and faster than sequentially parsing&lt;br /&gt;
# the iptables rules.&lt;br /&gt;
#&lt;br /&gt;
# Version history:&lt;br /&gt;
# 1.0   2017-10-04   Initial release&lt;br /&gt;
# 1.1   2019-04-19   Add DELETE command for new database table &amp;quot;bips&amp;quot;&lt;br /&gt;
# 1.2   2020-04-16   Replace &amp;quot;DELETE from db&amp;quot; logic by &amp;quot;fail2ban unban --all&amp;quot;&lt;br /&gt;
# 1.3   2022-03-01   Add logic to handle ipsets reaching maximum number of elements&lt;br /&gt;
&lt;br /&gt;
# Get program name to be used as prefix&lt;br /&gt;
pfx=$(basename $0)&lt;br /&gt;
&lt;br /&gt;
# Temporary files&lt;br /&gt;
chn=/tmp/$pfx.chn&lt;br /&gt;
out=/tmp/$pfx.out&lt;br /&gt;
&lt;br /&gt;
# Get fail2ban database&lt;br /&gt;
db=`confget -f /etc/fail2ban/fail2ban.conf dbfile`&lt;br /&gt;
&lt;br /&gt;
# Get all chains created by fail2ban&lt;br /&gt;
iptables -S|grep &amp;quot;^\-A f2b-&amp;quot;|awk &#039;{print $2}&#039;|sed &amp;quot;s/f2b-//&amp;quot;|sort -u &amp;gt;$chn&lt;br /&gt;
&lt;br /&gt;
while read chain; do&lt;br /&gt;
&lt;br /&gt;
  # Build the ipset if not exist&lt;br /&gt;
  ipset -exist create $pfx-$chain hash:ip timeout 0&lt;br /&gt;
&lt;br /&gt;
  # Build the iptables rules to use ipset if not exist&lt;br /&gt;
  for i in INPUT FORWARD; do&lt;br /&gt;
    if ! `iptables -C $i -m set --match-set $pfx-$chain src -j DROP 1&amp;gt;/dev/null 2&amp;gt;&amp;amp;1`; then&lt;br /&gt;
      iptables -I $i -m set --match-set $pfx-$chain src -j DROP&lt;br /&gt;
    fi&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
  # Get banned IP addresses from iptables&lt;br /&gt;
  iptables -L f2b-$chain -v -n|grep -E &#039;[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}&#039;|awk &#039;{print $8}&#039;|grep -v &#039;0\.0\.0\.0&#039; &amp;gt;$out&lt;br /&gt;
&lt;br /&gt;
  # Get bantime from fail2ban configuration&lt;br /&gt;
  bantime=`confget -f /etc/fail2ban/jail.local -s $chain bantime`&lt;br /&gt;
&lt;br /&gt;
  while read ipaddr; do&lt;br /&gt;
    sw_ipset=1&lt;br /&gt;
    # If bantime is not persistent then the timeout for ipset needs to be&lt;br /&gt;
    # adjusted depending on the time when fail2ban has banned the IP address.&lt;br /&gt;
    if [ &amp;quot;$bantime&amp;quot; == &amp;quot;&amp;quot; -o &amp;quot;$bantime&amp;quot; == &amp;quot;-1&amp;quot; ]; then&lt;br /&gt;
      timeout=0&lt;br /&gt;
    else&lt;br /&gt;
      timeofban=`sqlite3 -batch $db &amp;quot;SELECT timeofban FROM bans WHERE jail = &#039;$chain&#039; AND ip = &#039;$ipaddr&#039; LIMIT 1&amp;quot;`&lt;br /&gt;
      timeout=$(($bantime - (`date +%s` - $timeofban)))&lt;br /&gt;
      if [ $timeout -le 0 ]; then&lt;br /&gt;
        # Bantime has exceeded (should happen only if fail2ban is unbanning an IP address&lt;br /&gt;
        # right during the runtime of this program).&lt;br /&gt;
        sw_ipset=0&lt;br /&gt;
      fi&lt;br /&gt;
    fi&lt;br /&gt;
    if [ $sw_ipset -eq 1 ]; then&lt;br /&gt;
      # Check if ipset has reached maximum number of elements&lt;br /&gt;
      maxelem=`ipset list -t $pfx-$chain | grep &amp;quot;maxelem&amp;quot;|awk &#039;{print $7}&#039;`&lt;br /&gt;
      numelem=`ipset list -t $pfx-$chain | grep &amp;quot;Number of entries&amp;quot;|awk -F: &#039;{print $2}&#039;`&lt;br /&gt;
&lt;br /&gt;
      if [ `echo &amp;quot;$maxelem - $numelem&amp;quot; | bc` -lt 1 ]; then&lt;br /&gt;
        # ipset is full =&amp;gt; rename with date stamp and create new one&lt;br /&gt;
&lt;br /&gt;
        # Remove iptables rules to enable renaming of ipset&lt;br /&gt;
        for i in INPUT FORWARD; do&lt;br /&gt;
          iptables -D $i -m set --match-set $pfx-$chain src -j DROP&lt;br /&gt;
        done&lt;br /&gt;
&lt;br /&gt;
        oldset=$pfx-$chain-`date +&#039;%Y%m%d&#039;`&lt;br /&gt;
        ipset rename $pfx-$chain $oldset&lt;br /&gt;
        ipset create $pfx-$chain hash:ip timeout 0&lt;br /&gt;
&lt;br /&gt;
        # Build the iptables rules to use old and new ipset&lt;br /&gt;
        for i in INPUT FORWARD; do&lt;br /&gt;
          iptables -I $i -m set --match-set $oldset src -j DROP&lt;br /&gt;
          iptables -I $i -m set --match-set $pfx-$chain src -j DROP&lt;br /&gt;
        done&lt;br /&gt;
      fi&lt;br /&gt;
&lt;br /&gt;
      # Add IP address to ipset&lt;br /&gt;
      ipset add $pfx-$chain $ipaddr timeout $timeout 1&amp;gt;/dev/null 2&amp;gt;&amp;amp;1&lt;br /&gt;
    fi&lt;br /&gt;
  done &amp;lt;$out&lt;br /&gt;
&lt;br /&gt;
  # Flush all rules in this chain created by fail2ban&lt;br /&gt;
  iptables -F f2b-$chain&lt;br /&gt;
&lt;br /&gt;
done &amp;lt;$chn&lt;br /&gt;
&lt;br /&gt;
# Remove temporary files&lt;br /&gt;
rm $out 1&amp;gt;/dev/null 2&amp;gt;&amp;amp;1&lt;br /&gt;
rm $chn 1&amp;gt;/dev/null 2&amp;gt;&amp;amp;1&lt;br /&gt;
&lt;br /&gt;
# &amp;quot;Unban&amp;quot; all IP addresses to clear iptables rules as the entries are now in the IP set.&lt;br /&gt;
/usr/local/bin/fail2ban-client unban --all  1&amp;gt;/dev/null 2&amp;gt;&amp;amp;1&lt;br /&gt;
&lt;br /&gt;
# Save IP set to enable restoring after reboot&lt;br /&gt;
ipset save -f /etc/iptables/rules.ipset&lt;br /&gt;
&lt;br /&gt;
# Save iptables to enable restoring after reboot, the entries created&lt;br /&gt;
# by fail2ban are filtered, those will be restored by fail2ban itself.&lt;br /&gt;
iptables-save | grep -v &amp;quot;^\-A.*f2b-&amp;quot; &amp;gt;/etc/iptables/rules.v4&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The script runs once a day via cron. During the day fail2ban bans IP addresses with iptables rules which are then moved at 0:00 o&#039;clock to an IP set.&lt;br /&gt;
&lt;br /&gt;
By default both iptables rules and IP sets are hold in the memory and get lost during a reboot. Therefore the script saves the data which then can be automatically restored after a reboot.&lt;/div&gt;</summary>
		<author><name>Wulf</name></author>
	</entry>
	<entry>
		<id>http://wiki.frank-wulf.de/index.php?title=Fail2ban&amp;diff=641</id>
		<title>Fail2ban</title>
		<link rel="alternate" type="text/html" href="http://wiki.frank-wulf.de/index.php?title=Fail2ban&amp;diff=641"/>
		<updated>2024-10-10T14:03:48Z</updated>

		<summary type="html">&lt;p&gt;Wulf: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__FORCETOC__&lt;br /&gt;
=Fail2Ban Installation from GitHub=&lt;br /&gt;
&lt;br /&gt;
In case an existing Fail2Ban server is running:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;sudo service fail2ban stop&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Download Fail2Ban from GitHub:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;export VERSION=0.10.0&lt;br /&gt;
wget https://github.com/fail2ban/fail2ban/archive/&amp;quot;${VERSION}&amp;quot;.tar.gz -O fail2ban-&amp;quot;${VERSION}&amp;quot;.tar.gz&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unpack and install:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;sudo tar -zxpvf fail2ban-&amp;quot;${VERSION}&amp;quot;.tar.gz&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;cd fail2ban-&amp;quot;${VERSION}&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;sudo python setup.py install&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
This will install Fail2Ban into the python library directory. The executable scripts are placed into /usr/local/bin and configuration under /etc/fail2ban.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Enable fail2ban as an automatic service:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;sudo cp files/debian-initd /etc/init.d/fail2ban&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;sudo update-rc.d fail2ban defaults&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;sudo service fail2ban start&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Changes in configuration=&lt;br /&gt;
Avoid banning IPs from local network (file /etc/fail2ban/jail.conf)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; highlight=&amp;quot;5-7&amp;quot;&amp;gt;# &amp;quot;ignoreip&amp;quot; can be a list of IP addresses, CIDR masks or DNS hosts. Fail2ban&lt;br /&gt;
# will not ban a host which matches an address in this list. Several addresses&lt;br /&gt;
# can be defined using space (and/or comma) separator.&lt;br /&gt;
#ignoreip = 127.0.0.1/8 ::1&lt;br /&gt;
#&amp;gt;&amp;gt;&amp;gt;2019-04-13 Frank Wulf&lt;br /&gt;
ignoreip = 127.0.0.1/8 192.168.141.0/24&lt;br /&gt;
#&amp;lt;&amp;lt;&amp;lt;2019-04-13 Frank Wulf&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Adjust regular expression for SSH rules (file /etc/fail2ban/filter.d/sshd.conf)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; highlight=&amp;quot;22-24&amp;quot;&amp;gt;cmnfailre = ^[aA]uthentication (?:failure|error|failed) for &amp;lt;F-USER&amp;gt;.*&amp;lt;/F-USER&amp;gt; from &amp;lt;HOST&amp;gt;( via \S+)?%(__suff)s$&lt;br /&gt;
            ^User not known to the underlying authentication module for &amp;lt;F-USER&amp;gt;.*&amp;lt;/F-USER&amp;gt; from &amp;lt;HOST&amp;gt;%(__suff)s$&lt;br /&gt;
            ^Failed publickey for invalid user &amp;lt;F-USER&amp;gt;(?P&amp;lt;cond_user&amp;gt;\S+)|(?:(?! from ).)*?&amp;lt;/F-USER&amp;gt; from &amp;lt;HOST&amp;gt;%(__on_port_opt)s(?: ssh\d*)?(?(cond_user): |(?:(?:(?! from ).)*)$)&lt;br /&gt;
            ^Failed \b(?!publickey)\S+ for (?P&amp;lt;cond_inv&amp;gt;invalid user )?&amp;lt;F-USER&amp;gt;(?P&amp;lt;cond_user&amp;gt;\S+)|(?(cond_inv)(?:(?! from ).)*?|[^:]+)&amp;lt;/F-USER&amp;gt; from &amp;lt;HOST&amp;gt;%(__on_port_opt)s(?: ssh\d*)?(?(cond_user): |(?:(?:(?! from ).)*)$)&lt;br /&gt;
            ^&amp;lt;F-USER&amp;gt;ROOT&amp;lt;/F-USER&amp;gt; LOGIN REFUSED FROM &amp;lt;HOST&amp;gt;&lt;br /&gt;
            ^[iI](?:llegal|nvalid) user &amp;lt;F-USER&amp;gt;.*?&amp;lt;/F-USER&amp;gt; from &amp;lt;HOST&amp;gt;%(__suff)s$&lt;br /&gt;
            ^User &amp;lt;F-USER&amp;gt;.+&amp;lt;/F-USER&amp;gt; from &amp;lt;HOST&amp;gt; not allowed because not listed in AllowUsers%(__suff)s$&lt;br /&gt;
            ^User &amp;lt;F-USER&amp;gt;.+&amp;lt;/F-USER&amp;gt; from &amp;lt;HOST&amp;gt; not allowed because listed in DenyUsers%(__suff)s$&lt;br /&gt;
            ^User &amp;lt;F-USER&amp;gt;.+&amp;lt;/F-USER&amp;gt; from &amp;lt;HOST&amp;gt; not allowed because not in any group%(__suff)s$&lt;br /&gt;
            ^refused connect from \S+ \(&amp;lt;HOST&amp;gt;\)&lt;br /&gt;
            ^Received &amp;lt;F-MLFFORGET&amp;gt;disconnect&amp;lt;/F-MLFFORGET&amp;gt; from &amp;lt;HOST&amp;gt;%(__on_port_opt)s:\s*3: .*: Auth fail%(__suff)s$&lt;br /&gt;
            ^User &amp;lt;F-USER&amp;gt;.+&amp;lt;/F-USER&amp;gt; from &amp;lt;HOST&amp;gt; not allowed because a group is listed in DenyGroups%(__suff)s$&lt;br /&gt;
            ^User &amp;lt;F-USER&amp;gt;.+&amp;lt;/F-USER&amp;gt; from &amp;lt;HOST&amp;gt; not allowed because none of user&#039;s groups are listed in AllowGroups%(__suff)s$&lt;br /&gt;
            ^&amp;lt;F-NOFAIL&amp;gt;%(__pam_auth)s\(sshd:auth\):\s+authentication failure;&amp;lt;/F-NOFAIL&amp;gt;(?:\s+(?:(?:logname|e?uid|tty)=\S*)){0,4}\s+ruser=&amp;lt;F-ALT_USER&amp;gt;\S*&amp;lt;/F-ALT_USER&amp;gt;\s+rhost=&amp;lt;HOST&amp;gt;(?:\s+user=&amp;lt;F-USER&amp;gt;\S*&amp;lt;/F-USER&amp;gt;)?%(__suff)s$&lt;br /&gt;
            ^(error: )?maximum authentication attempts exceeded for &amp;lt;F-USER&amp;gt;.*&amp;lt;/F-USER&amp;gt; from &amp;lt;HOST&amp;gt;%(__on_port_opt)s(?: ssh\d*)?%(__suff)s$&lt;br /&gt;
            ^User &amp;lt;F-USER&amp;gt;.+&amp;lt;/F-USER&amp;gt; not allowed because account is locked%(__suff)s&lt;br /&gt;
            ^&amp;lt;F-MLFFORGET&amp;gt;Disconnecting&amp;lt;/F-MLFFORGET&amp;gt;(?: from)?(?: (?:invalid|authenticating)) user &amp;lt;F-USER&amp;gt;\S+&amp;lt;/F-USER&amp;gt; &amp;lt;HOST&amp;gt;%(__on_port_opt)s:\s*Change of username or service not allowed:\s*.*\[preauth\]\s*$&lt;br /&gt;
            ^&amp;lt;F-MLFFORGET&amp;gt;Disconnecting&amp;lt;/F-MLFFORGET&amp;gt;: Too many authentication failures(?: for &amp;lt;F-USER&amp;gt;.+?&amp;lt;/F-USER&amp;gt;)?%(__suff)s$&lt;br /&gt;
            ^&amp;lt;F-NOFAIL&amp;gt;Received &amp;lt;F-MLFFORGET&amp;gt;disconnect&amp;lt;/F-MLFFORGET&amp;gt;&amp;lt;/F-NOFAIL&amp;gt; from &amp;lt;HOST&amp;gt;%(__on_port_opt)s:\s*11:&lt;br /&gt;
            ^&amp;lt;F-NOFAIL&amp;gt;Connection &amp;lt;F-MLFFORGET&amp;gt;closed&amp;lt;/F-MLFFORGET&amp;gt;&amp;lt;/F-NOFAIL&amp;gt; by%(__authng_user)s &amp;lt;HOST&amp;gt;&amp;lt;mdrp-&amp;lt;mode&amp;gt;-suff-onclosed&amp;gt;&lt;br /&gt;
            ^&amp;lt;F-MLFFORGET&amp;gt;&amp;lt;F-MLFGAINED&amp;gt;Accepted \w+&amp;lt;/F-MLFGAINED&amp;gt;&amp;lt;/F-MLFFORGET&amp;gt; for &amp;lt;F-USER&amp;gt;\S+&amp;lt;/F-USER&amp;gt; from &amp;lt;HOST&amp;gt;(?:\s|$)&lt;br /&gt;
#&amp;gt;&amp;gt;&amp;gt;2018-09-11 Frank Wulf&lt;br /&gt;
            ^Disconnected from &amp;lt;HOST&amp;gt;%(__on_port_opt)s\s+\[preauth\]\s*$&lt;br /&gt;
#&amp;lt;&amp;lt;&amp;lt;2018-09-11 Frank Wulf&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Using IP sets instead of iptables rules=&lt;br /&gt;
By default Fail2Ban uses iptables rules to block IP addresses.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;iptables -S&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Result:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;-P INPUT ACCEPT&lt;br /&gt;
-P FORWARD ACCEPT&lt;br /&gt;
-P OUTPUT ACCEPT&lt;br /&gt;
-N f2b-sshd&lt;br /&gt;
-A INPUT -p tcp -m multiport --dports 22 -j f2b-sshd&lt;br /&gt;
-A f2b-sshd -s 120.52.56.124/32 -j REJECT --reject-with icmp-port-unreachable&lt;br /&gt;
-A f2b-sshd -s 116.193.161.242/32 -j REJECT --reject-with icmp-port-unreachable&lt;br /&gt;
-A f2b-sshd -s 14.215.237.205/32 -j REJECT --reject-with icmp-port-unreachable&lt;br /&gt;
-A f2b-sshd -s 118.244.238.18/32 -j REJECT --reject-with icmp-port-unreachable&lt;br /&gt;
-A f2b-sshd -s 155.133.82.12/32 -j REJECT --reject-with icmp-port-unreachable&lt;br /&gt;
-A f2b-sshd -s 49.4.6.132/32 -j REJECT --reject-with icmp-port-unreachable&lt;br /&gt;
-A f2b-sshd -s 118.244.206.22/32 -j REJECT --reject-with icmp-port-unreachable&lt;br /&gt;
-A f2b-sshd -s 61.132.29.162/32 -j REJECT --reject-with icmp-port-unreachable&lt;br /&gt;
-A f2b-sshd -s 192.160.102.169/32 -j REJECT --reject-with icmp-port-unreachable&lt;br /&gt;
-A f2b-sshd -s 162.247.72.213/32 -j REJECT --reject-with icmp-port-unreachable&lt;br /&gt;
-A f2b-sshd -s 149.56.223.241/32 -j REJECT --reject-with icmp-port-unreachable&lt;br /&gt;
-A f2b-sshd -s 27.255.79.82/32 -j REJECT --reject-with icmp-port-unreachable&lt;br /&gt;
-A f2b-sshd -s 211.104.171.220/32 -j REJECT --reject-with icmp-port-unreachable&lt;br /&gt;
-A f2b-sshd -s 187.252.208.82/32 -j REJECT --reject-with icmp-port-unreachable&lt;br /&gt;
-A f2b-sshd -s 116.6.49.126/32 -j REJECT --reject-with icmp-port-unreachable&lt;br /&gt;
-A f2b-sshd -j RETURN&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Since Linux Kernel 2.6 there is an option to use so-called IP sets to hold big amount of IP addresses in the memory. This technique uses hashtables to store and search IP adresses and is therefore much more efficient than parsing sequentially through the iptables rules.&lt;br /&gt;
&lt;br /&gt;
The following shell script &#039;&#039;&#039;&#039;&#039;fwfail2ban&#039;&#039;&#039;&#039;&#039; moves IP addresses from the iptables rules to an IP set:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
#&lt;br /&gt;
# Author:  Frank Wulf&lt;br /&gt;
# Version: 1.3 (2022-03-01)&lt;br /&gt;
#&lt;br /&gt;
# This program moves iptables entries created by fail2ban to&lt;br /&gt;
# an IP set in the Linux Kernel. Advantage is that ipset uses&lt;br /&gt;
# a hashtable to store/fetch IP addresses and thus the IP lookup&lt;br /&gt;
# is much more efficient and faster than sequentially parsing&lt;br /&gt;
# the iptables rules.&lt;br /&gt;
#&lt;br /&gt;
# Version history:&lt;br /&gt;
# 1.0   2017-10-04   Initial release&lt;br /&gt;
# 1.1   2019-04-19   Add DELETE command for new database table &amp;quot;bips&amp;quot;&lt;br /&gt;
# 1.2   2020-04-16   Replace &amp;quot;DELETE from db&amp;quot; logic by &amp;quot;fail2ban unban --all&amp;quot;&lt;br /&gt;
# 1.3   2022-03-01   Add logic to handle ipsets reaching maximum number of elements&lt;br /&gt;
&lt;br /&gt;
# Get program name to be used as prefix&lt;br /&gt;
pfx=$(basename $0)&lt;br /&gt;
&lt;br /&gt;
# Temporary files&lt;br /&gt;
chn=/tmp/$pfx.chn&lt;br /&gt;
out=/tmp/$pfx.out&lt;br /&gt;
&lt;br /&gt;
# Get fail2ban database&lt;br /&gt;
db=`confget -f /etc/fail2ban/fail2ban.conf dbfile`&lt;br /&gt;
&lt;br /&gt;
# Get all chains created by fail2ban&lt;br /&gt;
iptables -S|grep &amp;quot;^\-A f2b-&amp;quot;|awk &#039;{print $2}&#039;|sed &amp;quot;s/f2b-//&amp;quot;|sort -u &amp;gt;$chn&lt;br /&gt;
&lt;br /&gt;
while read chain; do&lt;br /&gt;
&lt;br /&gt;
  # Build the ipset if not exist&lt;br /&gt;
  ipset -exist create $pfx-$chain hash:ip timeout 0&lt;br /&gt;
&lt;br /&gt;
  # Build the iptables rules to use ipset if not exist&lt;br /&gt;
  for i in INPUT FORWARD; do&lt;br /&gt;
    if ! `iptables -C $i -m set --match-set $pfx-$chain src -j DROP 1&amp;gt;/dev/null 2&amp;gt;&amp;amp;1`; then&lt;br /&gt;
      iptables -I $i -m set --match-set $pfx-$chain src -j DROP&lt;br /&gt;
    fi&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
  # Get banned IP addresses from iptables&lt;br /&gt;
  iptables -L f2b-$chain -v -n|grep -E &#039;[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}&#039;|awk &#039;{print $8}&#039;|grep -v &#039;0\.0\.0\.0&#039; &amp;gt;$out&lt;br /&gt;
&lt;br /&gt;
  # Get bantime from fail2ban configuration&lt;br /&gt;
  bantime=`confget -f /etc/fail2ban/jail.local -s $chain bantime`&lt;br /&gt;
&lt;br /&gt;
  while read ipaddr; do&lt;br /&gt;
    sw_ipset=1&lt;br /&gt;
    # If bantime is not persistent then the timeout for ipset needs to be&lt;br /&gt;
    # adjusted depending on the time when fail2ban has banned the IP address.&lt;br /&gt;
    if [ &amp;quot;$bantime&amp;quot; == &amp;quot;&amp;quot; -o &amp;quot;$bantime&amp;quot; == &amp;quot;-1&amp;quot; ]; then&lt;br /&gt;
      timeout=0&lt;br /&gt;
    else&lt;br /&gt;
      timeofban=`sqlite3 -batch $db &amp;quot;SELECT timeofban FROM bans WHERE jail = &#039;$chain&#039; AND ip = &#039;$ipaddr&#039; LIMIT 1&amp;quot;`&lt;br /&gt;
      timeout=$(($bantime - (`date +%s` - $timeofban)))&lt;br /&gt;
      if [ $timeout -le 0 ]; then&lt;br /&gt;
        # Bantime has exceeded (should happen only if fail2ban is unbanning an IP address&lt;br /&gt;
        # right during the runtime of this program).&lt;br /&gt;
        sw_ipset=0&lt;br /&gt;
      fi&lt;br /&gt;
    fi&lt;br /&gt;
    if [ $sw_ipset -eq 1 ]; then&lt;br /&gt;
      # Check if ipset has reached maximum number of elements&lt;br /&gt;
      maxelem=`ipset list -t $pfx-$chain | grep &amp;quot;maxelem&amp;quot;|awk &#039;{print $7}&#039;`&lt;br /&gt;
      numelem=`ipset list -t $pfx-$chain | grep &amp;quot;Number of entries&amp;quot;|awk -F: &#039;{print $2}&#039;`&lt;br /&gt;
&lt;br /&gt;
      if [ `echo &amp;quot;$maxelem - $numelem&amp;quot; | bc` -lt 1 ]; then&lt;br /&gt;
        # ipset is full =&amp;gt; rename with date stamp and create new one&lt;br /&gt;
&lt;br /&gt;
        # Remove iptables rules to enable renaming of ipset&lt;br /&gt;
        for i in INPUT FORWARD; do&lt;br /&gt;
          iptables -D $i -m set --match-set $pfx-$chain src -j DROP&lt;br /&gt;
        done&lt;br /&gt;
&lt;br /&gt;
        oldset=$pfx-$chain-`date +&#039;%Y%m%d&#039;`&lt;br /&gt;
        ipset rename $pfx-$chain $oldset&lt;br /&gt;
        ipset create $pfx-$chain hash:ip timeout 0&lt;br /&gt;
&lt;br /&gt;
        # Build the iptables rules to use old and new ipset&lt;br /&gt;
        for i in INPUT FORWARD; do&lt;br /&gt;
          iptables -I $i -m set --match-set $oldset src -j DROP&lt;br /&gt;
          iptables -I $i -m set --match-set $pfx-$chain src -j DROP&lt;br /&gt;
        done&lt;br /&gt;
      fi&lt;br /&gt;
&lt;br /&gt;
      # Add IP address to ipset&lt;br /&gt;
      ipset add $pfx-$chain $ipaddr timeout $timeout 1&amp;gt;/dev/null 2&amp;gt;&amp;amp;1&lt;br /&gt;
    fi&lt;br /&gt;
  done &amp;lt;$out&lt;br /&gt;
&lt;br /&gt;
  # Flush all rules in this chain created by fail2ban&lt;br /&gt;
  iptables -F f2b-$chain&lt;br /&gt;
&lt;br /&gt;
done &amp;lt;$chn&lt;br /&gt;
&lt;br /&gt;
# Remove temporary files&lt;br /&gt;
rm $out 1&amp;gt;/dev/null 2&amp;gt;&amp;amp;1&lt;br /&gt;
rm $chn 1&amp;gt;/dev/null 2&amp;gt;&amp;amp;1&lt;br /&gt;
&lt;br /&gt;
# &amp;quot;Unban&amp;quot; all IP addresses to clear iptables rules as the entries are now in the IP set.&lt;br /&gt;
/usr/local/bin/fail2ban-client unban --all  1&amp;gt;/dev/null 2&amp;gt;&amp;amp;1&lt;br /&gt;
&lt;br /&gt;
# Save IP set to enable restoring after reboot&lt;br /&gt;
ipset save -f /etc/iptables/rules.ipset&lt;br /&gt;
&lt;br /&gt;
# Save iptables to enable restoring after reboot, the entries created&lt;br /&gt;
# by fail2ban are filtered, those will be restored by fail2ban itself.&lt;br /&gt;
iptables-save | grep -v &amp;quot;^\-A.*f2b-&amp;quot; &amp;gt;/etc/iptables/rules.v4&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The script runs once a day via cron. During the day fail2ban bans IP addresses with iptables rules which are then moved at 0:00 o&#039;clock to an IP set.&lt;br /&gt;
&lt;br /&gt;
By default both iptables rules and IP sets are hold in the memory and get lost during a reboot. Therefore the script saves the data which then can be automatically restored after a reboot.&lt;/div&gt;</summary>
		<author><name>Wulf</name></author>
	</entry>
	<entry>
		<id>http://wiki.frank-wulf.de/index.php?title=Internet_Speedtest&amp;diff=638</id>
		<title>Internet Speedtest</title>
		<link rel="alternate" type="text/html" href="http://wiki.frank-wulf.de/index.php?title=Internet_Speedtest&amp;diff=638"/>
		<updated>2024-10-07T23:57:05Z</updated>

		<summary type="html">&lt;p&gt;Wulf: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__FORCETOC__&lt;br /&gt;
===Shell script &#039;&#039;&#039;&#039;&#039;/usr/bin/fwspeedtest&#039;&#039;&#039;&#039;&#039;===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
#&lt;br /&gt;
# Author:  Frank Wulf&lt;br /&gt;
# Version: 1.6 (2024-10-01)&lt;br /&gt;
#&lt;br /&gt;
# This script measures the internet speed by using Ookla speedtest tool.&lt;br /&gt;
#&lt;br /&gt;
# In regards to the conversion rules described in&lt;br /&gt;
# https://help.speedtest.net/hc/en-us/articles/360039162713-What-do-mbps-and-kbps-mean-&lt;br /&gt;
# the following calculations are used:&lt;br /&gt;
# 1 kilobit = 1000 bits&lt;br /&gt;
# 1 megabit = 1000 kilobits&lt;br /&gt;
# 1 Mbyte   = 8 megabits&lt;br /&gt;
#&lt;br /&gt;
# Version history:&lt;br /&gt;
# 1.0   2020-04-11   Initial release&lt;br /&gt;
# 1.1   2020-04-18   Changed to best-of-three mode&lt;br /&gt;
# 1.2   2020-04-24   Extended time between tests to 15 minutes&lt;br /&gt;
# 1.3   2020-06-08   Fixed issue when &amp;quot;packet loss&amp;quot; is not available&lt;br /&gt;
# 1.4   2020-06-10   Adjusted conversion rules&lt;br /&gt;
# 1.5   2020-12-23   Added parameter &amp;quot;accept-gdpr&amp;quot; to Ookla speedtest call&lt;br /&gt;
# 1.6   2024-10-01   VPN service name is now dynamic&lt;br /&gt;
&lt;br /&gt;
runs=2&lt;br /&gt;
#tarif=&amp;quot;Telekom Zuhause L&amp;quot;&lt;br /&gt;
#tarif=&amp;quot;o2 Testkarte Online&amp;quot;&lt;br /&gt;
tarif=&amp;quot;freenet FUNK unlimited&amp;quot;&lt;br /&gt;
#vpn_service=&amp;quot;openvpn&amp;quot;&lt;br /&gt;
vpn_service=&amp;quot;wg-quick@wg0&amp;quot;&lt;br /&gt;
exclude=0&lt;br /&gt;
comment=&amp;quot;&amp;quot;&lt;br /&gt;
out=/tmp/fwspeedtest.out&lt;br /&gt;
&lt;br /&gt;
if [ -f &amp;quot;$out&amp;quot; ]; then&lt;br /&gt;
  rm $out 1&amp;gt;/dev/null 2&amp;gt;&amp;amp;1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Run the speedtest &amp;lt;runs&amp;gt; times without VPN connection&lt;br /&gt;
for i in `eval echo {1..$runs}`&lt;br /&gt;
do&lt;br /&gt;
  # Check if VPN connection is active&lt;br /&gt;
  systemctl status $vpn_service 1&amp;gt;/dev/null 2&amp;gt;&amp;amp;1&lt;br /&gt;
  if [ $? -eq 0 ]; then&lt;br /&gt;
    vpn_active=1&lt;br /&gt;
    # Stop VPN connection&lt;br /&gt;
    systemctl stop $vpn_service&lt;br /&gt;
    sleep 5&lt;br /&gt;
  else&lt;br /&gt;
    vpn_active=0&lt;br /&gt;
  fi&lt;br /&gt;
&lt;br /&gt;
  # Fill timestamp field&lt;br /&gt;
  timestamp[$i]=`date +&#039;%Y-%m-%d %H:%M:%S&#039;`&lt;br /&gt;
&lt;br /&gt;
  # Run speedtest&lt;br /&gt;
  /usr/bin/speedtest speedtest --accept-gdpr --format=csv &amp;gt;&amp;gt;$out&lt;br /&gt;
  retcode=$?&lt;br /&gt;
&lt;br /&gt;
  if [ $vpn_active -eq 1 ]; then&lt;br /&gt;
    # Start VPN connection&lt;br /&gt;
    systemctl start $vpn_service&lt;br /&gt;
  fi&lt;br /&gt;
&lt;br /&gt;
  if [ &amp;quot;$retcode&amp;quot; -ne 0 ]; then&lt;br /&gt;
    exit 1&lt;br /&gt;
  fi&lt;br /&gt;
&lt;br /&gt;
  if [ $i -lt $runs ]; then&lt;br /&gt;
    # Wait 15 seconds between two speedtests&lt;br /&gt;
    sleep 15&lt;br /&gt;
  fi&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
download_max=0&lt;br /&gt;
i=0&lt;br /&gt;
&lt;br /&gt;
while read line; do&lt;br /&gt;
  i=$((i+1))&lt;br /&gt;
  download_new=`echo &amp;quot;$line&amp;quot;|awk -F &#039;^ *&amp;quot;|&amp;quot; *, *&amp;quot;|&amp;quot; *$&#039; &#039;{ print $7 }&#039;`&lt;br /&gt;
  if [ $download_new -gt $download_max ]; then&lt;br /&gt;
    # Download rate is faster than previous ones&lt;br /&gt;
    download=$download_new&lt;br /&gt;
    server_id=`echo &amp;quot;$line&amp;quot;|awk -F &#039;^ *&amp;quot;|&amp;quot; *, *&amp;quot;|&amp;quot; *$&#039; &#039;{ print $3 }&#039;`&lt;br /&gt;
    server_name=`echo &amp;quot;$line&amp;quot;|awk -F &#039;^ *&amp;quot;|&amp;quot; *, *&amp;quot;|&amp;quot; *$&#039; &#039;{ print $2 }&#039;`&lt;br /&gt;
    latency=`echo &amp;quot;$line&amp;quot;|awk -F &#039;^ *&amp;quot;|&amp;quot; *, *&amp;quot;|&amp;quot; *$&#039; &#039;{ print $4 }&#039;`&lt;br /&gt;
    jitter=`echo &amp;quot;$line&amp;quot;|awk -F &#039;^ *&amp;quot;|&amp;quot; *, *&amp;quot;|&amp;quot; *$&#039; &#039;{ print $5 }&#039;`&lt;br /&gt;
    packet_loss=`echo &amp;quot;$line&amp;quot;|awk -F &#039;^ *&amp;quot;|&amp;quot; *, *&amp;quot;|&amp;quot; *$&#039; &#039;{ print $6 }&#039;`&lt;br /&gt;
    download=`echo &amp;quot;$line&amp;quot;|awk -F &#039;^ *&amp;quot;|&amp;quot; *, *&amp;quot;|&amp;quot; *$&#039; &#039;{ print $7 }&#039;`&lt;br /&gt;
    upload=`echo &amp;quot;$line&amp;quot;|awk -F &#039;^ *&amp;quot;|&amp;quot; *, *&amp;quot;|&amp;quot; *$&#039; &#039;{ print $8 }&#039;`&lt;br /&gt;
    download_used=`echo &amp;quot;$line&amp;quot;|awk -F &#039;^ *&amp;quot;|&amp;quot; *, *&amp;quot;|&amp;quot; *$&#039; &#039;{ print $9 }&#039;`&lt;br /&gt;
    upload_used=`echo &amp;quot;$line&amp;quot;|awk -F &#039;^ *&amp;quot;|&amp;quot; *, *&amp;quot;|&amp;quot; *$&#039; &#039;{ print $10 }&#039;`&lt;br /&gt;
    url=`echo &amp;quot;$line&amp;quot;|awk -F &#039;^ *&amp;quot;|&amp;quot; *, *&amp;quot;|&amp;quot; *$&#039; &#039;{ print $11 }&#039;`&lt;br /&gt;
    download_max=$download&lt;br /&gt;
    row=$i&lt;br /&gt;
  fi&lt;br /&gt;
&lt;br /&gt;
  if [ $i -eq $runs ]; then&lt;br /&gt;
    # Round values for latency. jitter and packet_loss&lt;br /&gt;
    latency=`echo &amp;quot;scale=2; ($latency + 0.005) / 1&amp;quot; | bc`&lt;br /&gt;
    jitter=`echo &amp;quot;scale=2; ($jitter + 0.005) / 1&amp;quot; | bc`&lt;br /&gt;
    if [ $packet_loss == &amp;quot;N/A&amp;quot; ]; then&lt;br /&gt;
      packet_loss=0&lt;br /&gt;
    else&lt;br /&gt;
      packet_loss=`echo &amp;quot;scale=1; ($packet_loss + 0.05) / 1&amp;quot; | bc`&lt;br /&gt;
    fi&lt;br /&gt;
&lt;br /&gt;
    # Convert download/upload speed from bytes per second to Mbps and round values&lt;br /&gt;
    download=`echo &amp;quot;scale=8; $download * 8 / 1000000&amp;quot; | bc`&lt;br /&gt;
    download=`echo &amp;quot;scale=2; ($download + 0.005) / 1&amp;quot; | bc`&lt;br /&gt;
    upload=`echo &amp;quot;scale=8; $upload * 8 / 1000000&amp;quot; | bc`&lt;br /&gt;
    upload=`echo &amp;quot;scale=2; ($upload + 0.005) / 1&amp;quot; | bc`&lt;br /&gt;
&lt;br /&gt;
    # Convert used bytes to MBytes and round values&lt;br /&gt;
    download_used=`echo &amp;quot;scale=8; $download_used / 1000000&amp;quot; | bc`&lt;br /&gt;
    download_used=`echo &amp;quot;scale=1; ($download_used + 0.05) / 1&amp;quot; | bc`&lt;br /&gt;
    upload_used=`echo &amp;quot;scale=8; $upload_used / 1000000&amp;quot; | bc`&lt;br /&gt;
    upload_used=`echo &amp;quot;scale=1; ($upload_used + 0.05) / 1&amp;quot; | bc`&lt;br /&gt;
&lt;br /&gt;
    vpn_active=0&lt;br /&gt;
&lt;br /&gt;
    # Fill timestamp field&lt;br /&gt;
    timestamp=${timestamp[$row]}&lt;br /&gt;
&lt;br /&gt;
    # Insert data into database&lt;br /&gt;
    sql=&amp;quot;INSERT INTO fw_speedtest (timestamp,server_id,server_name,latency,&amp;quot;&lt;br /&gt;
    sql+=&amp;quot;jitter,packet_loss,download,upload,download_used,upload_used,&amp;quot;&lt;br /&gt;
    sql+=&amp;quot;vpn_active,tarif,exclude,comment,url) VALUES (&amp;quot;&lt;br /&gt;
    sql+=&amp;quot;\&amp;quot;$timestamp\&amp;quot;, \&amp;quot;$server_id\&amp;quot;, \&amp;quot;$server_name\&amp;quot;, \&amp;quot;$latency\&amp;quot;, &amp;quot;&lt;br /&gt;
    sql+=&amp;quot;\&amp;quot;$jitter\&amp;quot;, \&amp;quot;$packet_loss\&amp;quot;, \&amp;quot;$download\&amp;quot;, \&amp;quot;$upload\&amp;quot;, &amp;quot;&lt;br /&gt;
    sql+=&amp;quot;\&amp;quot;$download_used\&amp;quot;, \&amp;quot;$upload_used\&amp;quot;, \&amp;quot;$vpn_active\&amp;quot;, &amp;quot;&lt;br /&gt;
    sql+=&amp;quot;\&amp;quot;$tarif\&amp;quot;, \&amp;quot;$exclude\&amp;quot;, \&amp;quot;$comment\&amp;quot;,\&amp;quot;$url\&amp;quot;)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    mysql --login-path=fwsysmon -D fwsysmon -e &amp;quot;$sql&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  fi&lt;br /&gt;
&lt;br /&gt;
done &amp;lt;&amp;lt;&amp;lt;`cat $out`&lt;br /&gt;
&lt;br /&gt;
exit 0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Scheduling Speedtest with systemd ===&lt;br /&gt;
* &#039;&#039;&#039;Service Unit file &#039;&#039;/lib/systemd/system/fwspeedtest.service&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Internet speedtest&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=oneshot&lt;br /&gt;
ExecStart=/usr/bin/fwspeedtest&lt;br /&gt;
User=root&lt;br /&gt;
Group=root&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Timer Unit file &#039;&#039;/lib/systemd/system/fwspeedtest.timer&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Run Internet speedtest&lt;br /&gt;
&lt;br /&gt;
[Timer]&lt;br /&gt;
OnCalendar=*-*-* 18:00&lt;br /&gt;
RandomizedDelaySec=12h&lt;br /&gt;
Persistent=true&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=timers.target&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Wulf</name></author>
	</entry>
	<entry>
		<id>http://wiki.frank-wulf.de/index.php?title=Internet_Speedtest&amp;diff=637</id>
		<title>Internet Speedtest</title>
		<link rel="alternate" type="text/html" href="http://wiki.frank-wulf.de/index.php?title=Internet_Speedtest&amp;diff=637"/>
		<updated>2024-10-07T21:09:48Z</updated>

		<summary type="html">&lt;p&gt;Wulf: /* Shell script /usr/bin/fwspeedtest */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__FORCETOC__&lt;br /&gt;
===Shell script &#039;&#039;&#039;&#039;&#039;/usr/bin/fwspeedtest&#039;&#039;&#039;&#039;&#039;===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
#&lt;br /&gt;
# Author:  Frank Wulf&lt;br /&gt;
# Version: 1.6 (2024-10-01)&lt;br /&gt;
#&lt;br /&gt;
# This script measures the internet speed by using Ookla speedtest tool.&lt;br /&gt;
#&lt;br /&gt;
# In regards to the conversion rules described in&lt;br /&gt;
# https://help.speedtest.net/hc/en-us/articles/360039162713-What-do-mbps-and-kbps-mean-&lt;br /&gt;
# the following calculations are used:&lt;br /&gt;
# 1 kilobit = 1000 bits&lt;br /&gt;
# 1 megabit = 1000 kilobits&lt;br /&gt;
# 1 Mbyte   = 8 megabits&lt;br /&gt;
&lt;br /&gt;
runs=2&lt;br /&gt;
#tarif=&amp;quot;Telekom Zuhause L&amp;quot;&lt;br /&gt;
#tarif=&amp;quot;o2 Testkarte Online&amp;quot;&lt;br /&gt;
tarif=&amp;quot;freenet FUNK unlimited&amp;quot;&lt;br /&gt;
#vpn_service=&amp;quot;openvpn&amp;quot;&lt;br /&gt;
vpn_service=&amp;quot;wg-quick@wg0&amp;quot;&lt;br /&gt;
exclude=0&lt;br /&gt;
comment=&amp;quot;&amp;quot;&lt;br /&gt;
out=/tmp/fwspeedtest.out&lt;br /&gt;
&lt;br /&gt;
if [ -f &amp;quot;$out&amp;quot; ]; then&lt;br /&gt;
  rm $out 1&amp;gt;/dev/null 2&amp;gt;&amp;amp;1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Run the speedtest &amp;lt;runs&amp;gt; times without VPN connection&lt;br /&gt;
for i in `eval echo {1..$runs}`&lt;br /&gt;
do&lt;br /&gt;
  # Check if VPN connection is active&lt;br /&gt;
  systemctl status $vpn_service 1&amp;gt;/dev/null 2&amp;gt;&amp;amp;1&lt;br /&gt;
  if [ $? -eq 0 ]; then&lt;br /&gt;
    vpn_active=1&lt;br /&gt;
    # Stop VPN connection&lt;br /&gt;
    systemctl stop $vpn_service&lt;br /&gt;
    sleep 5&lt;br /&gt;
  else&lt;br /&gt;
    vpn_active=0&lt;br /&gt;
  fi&lt;br /&gt;
&lt;br /&gt;
  # Fill timestamp field&lt;br /&gt;
  timestamp[$i]=`date +&#039;%Y-%m-%d %H:%M:%S&#039;`&lt;br /&gt;
&lt;br /&gt;
  # Run speedtest&lt;br /&gt;
  /usr/bin/speedtest speedtest --accept-gdpr --format=csv &amp;gt;&amp;gt;$out&lt;br /&gt;
  retcode=$?&lt;br /&gt;
&lt;br /&gt;
  if [ $vpn_active -eq 1 ]; then&lt;br /&gt;
    # Start VPN connection&lt;br /&gt;
    systemctl start $vpn_service&lt;br /&gt;
  fi&lt;br /&gt;
&lt;br /&gt;
  if [ &amp;quot;$retcode&amp;quot; -ne 0 ]; then&lt;br /&gt;
    exit 1&lt;br /&gt;
  fi&lt;br /&gt;
&lt;br /&gt;
  if [ $i -lt $runs ]; then&lt;br /&gt;
    # Wait 15 seconds between two speedtests&lt;br /&gt;
    sleep 15&lt;br /&gt;
  fi&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
download_max=0&lt;br /&gt;
i=0&lt;br /&gt;
&lt;br /&gt;
while read line; do&lt;br /&gt;
  i=$((i+1))&lt;br /&gt;
  download_new=`echo &amp;quot;$line&amp;quot;|awk -F &#039;^ *&amp;quot;|&amp;quot; *, *&amp;quot;|&amp;quot; *$&#039; &#039;{ print $7 }&#039;`&lt;br /&gt;
  if [ $download_new -gt $download_max ]; then&lt;br /&gt;
    # Download rate is faster than previous ones&lt;br /&gt;
    download=$download_new&lt;br /&gt;
    server_id=`echo &amp;quot;$line&amp;quot;|awk -F &#039;^ *&amp;quot;|&amp;quot; *, *&amp;quot;|&amp;quot; *$&#039; &#039;{ print $3 }&#039;`&lt;br /&gt;
    server_name=`echo &amp;quot;$line&amp;quot;|awk -F &#039;^ *&amp;quot;|&amp;quot; *, *&amp;quot;|&amp;quot; *$&#039; &#039;{ print $2 }&#039;`&lt;br /&gt;
    latency=`echo &amp;quot;$line&amp;quot;|awk -F &#039;^ *&amp;quot;|&amp;quot; *, *&amp;quot;|&amp;quot; *$&#039; &#039;{ print $4 }&#039;`&lt;br /&gt;
    jitter=`echo &amp;quot;$line&amp;quot;|awk -F &#039;^ *&amp;quot;|&amp;quot; *, *&amp;quot;|&amp;quot; *$&#039; &#039;{ print $5 }&#039;`&lt;br /&gt;
    packet_loss=`echo &amp;quot;$line&amp;quot;|awk -F &#039;^ *&amp;quot;|&amp;quot; *, *&amp;quot;|&amp;quot; *$&#039; &#039;{ print $6 }&#039;`&lt;br /&gt;
    download=`echo &amp;quot;$line&amp;quot;|awk -F &#039;^ *&amp;quot;|&amp;quot; *, *&amp;quot;|&amp;quot; *$&#039; &#039;{ print $7 }&#039;`&lt;br /&gt;
    upload=`echo &amp;quot;$line&amp;quot;|awk -F &#039;^ *&amp;quot;|&amp;quot; *, *&amp;quot;|&amp;quot; *$&#039; &#039;{ print $8 }&#039;`&lt;br /&gt;
    download_used=`echo &amp;quot;$line&amp;quot;|awk -F &#039;^ *&amp;quot;|&amp;quot; *, *&amp;quot;|&amp;quot; *$&#039; &#039;{ print $9 }&#039;`&lt;br /&gt;
    upload_used=`echo &amp;quot;$line&amp;quot;|awk -F &#039;^ *&amp;quot;|&amp;quot; *, *&amp;quot;|&amp;quot; *$&#039; &#039;{ print $10 }&#039;`&lt;br /&gt;
    url=`echo &amp;quot;$line&amp;quot;|awk -F &#039;^ *&amp;quot;|&amp;quot; *, *&amp;quot;|&amp;quot; *$&#039; &#039;{ print $11 }&#039;`&lt;br /&gt;
    download_max=$download&lt;br /&gt;
    row=$i&lt;br /&gt;
  fi&lt;br /&gt;
&lt;br /&gt;
  if [ $i -eq $runs ]; then&lt;br /&gt;
    # Round values for latency. jitter and packet_loss&lt;br /&gt;
    latency=`echo &amp;quot;scale=2; ($latency + 0.005) / 1&amp;quot; | bc`&lt;br /&gt;
    jitter=`echo &amp;quot;scale=2; ($jitter + 0.005) / 1&amp;quot; | bc`&lt;br /&gt;
    if [ $packet_loss == &amp;quot;N/A&amp;quot; ]; then&lt;br /&gt;
      packet_loss=0&lt;br /&gt;
    else&lt;br /&gt;
      packet_loss=`echo &amp;quot;scale=1; ($packet_loss + 0.05) / 1&amp;quot; | bc`&lt;br /&gt;
    fi&lt;br /&gt;
&lt;br /&gt;
    # Convert download/upload speed from bytes per second to Mbps and round values&lt;br /&gt;
    download=`echo &amp;quot;scale=8; $download * 8 / 1000000&amp;quot; | bc`&lt;br /&gt;
    download=`echo &amp;quot;scale=2; ($download + 0.005) / 1&amp;quot; | bc`&lt;br /&gt;
    upload=`echo &amp;quot;scale=8; $upload * 8 / 1000000&amp;quot; | bc`&lt;br /&gt;
    upload=`echo &amp;quot;scale=2; ($upload + 0.005) / 1&amp;quot; | bc`&lt;br /&gt;
&lt;br /&gt;
    # Convert used bytes to MBytes and round values&lt;br /&gt;
    download_used=`echo &amp;quot;scale=8; $download_used / 1000000&amp;quot; | bc`&lt;br /&gt;
    download_used=`echo &amp;quot;scale=1; ($download_used + 0.05) / 1&amp;quot; | bc`&lt;br /&gt;
    upload_used=`echo &amp;quot;scale=8; $upload_used / 1000000&amp;quot; | bc`&lt;br /&gt;
    upload_used=`echo &amp;quot;scale=1; ($upload_used + 0.05) / 1&amp;quot; | bc`&lt;br /&gt;
&lt;br /&gt;
    vpn_active=0&lt;br /&gt;
&lt;br /&gt;
    # Fill timestamp field&lt;br /&gt;
    timestamp=${timestamp[$row]}&lt;br /&gt;
&lt;br /&gt;
    # Insert data into database&lt;br /&gt;
    sql=&amp;quot;INSERT INTO fw_speedtest (timestamp,server_id,server_name,latency,&amp;quot;&lt;br /&gt;
    sql+=&amp;quot;jitter,packet_loss,download,upload,download_used,upload_used,&amp;quot;&lt;br /&gt;
    sql+=&amp;quot;vpn_active,tarif,exclude,comment,url) VALUES (&amp;quot;&lt;br /&gt;
    sql+=&amp;quot;\&amp;quot;$timestamp\&amp;quot;, \&amp;quot;$server_id\&amp;quot;, \&amp;quot;$server_name\&amp;quot;, \&amp;quot;$latency\&amp;quot;, &amp;quot;&lt;br /&gt;
    sql+=&amp;quot;\&amp;quot;$jitter\&amp;quot;, \&amp;quot;$packet_loss\&amp;quot;, \&amp;quot;$download\&amp;quot;, \&amp;quot;$upload\&amp;quot;, &amp;quot;&lt;br /&gt;
    sql+=&amp;quot;\&amp;quot;$download_used\&amp;quot;, \&amp;quot;$upload_used\&amp;quot;, \&amp;quot;$vpn_active\&amp;quot;, &amp;quot;&lt;br /&gt;
    sql+=&amp;quot;\&amp;quot;$tarif\&amp;quot;, \&amp;quot;$exclude\&amp;quot;, \&amp;quot;$comment\&amp;quot;,\&amp;quot;$url\&amp;quot;)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    mysql --login-path=fwsysmon -D fwsysmon -e &amp;quot;$sql&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  fi&lt;br /&gt;
&lt;br /&gt;
done &amp;lt;&amp;lt;&amp;lt;`cat $out`&lt;br /&gt;
&lt;br /&gt;
exit 0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Scheduling Speedtest with systemd ===&lt;br /&gt;
* &#039;&#039;&#039;Service Unit file &#039;&#039;/lib/systemd/system/fwspeedtest.service&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Internet speedtest&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=oneshot&lt;br /&gt;
ExecStart=/usr/bin/fwspeedtest&lt;br /&gt;
User=root&lt;br /&gt;
Group=root&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Timer Unit file &#039;&#039;/lib/systemd/system/fwspeedtest.timer&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Run Internet speedtest&lt;br /&gt;
&lt;br /&gt;
[Timer]&lt;br /&gt;
OnCalendar=*-*-* 18:00&lt;br /&gt;
RandomizedDelaySec=12h&lt;br /&gt;
Persistent=true&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=timers.target&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Wulf</name></author>
	</entry>
	<entry>
		<id>http://wiki.frank-wulf.de/index.php?title=Server&amp;diff=628</id>
		<title>Server</title>
		<link rel="alternate" type="text/html" href="http://wiki.frank-wulf.de/index.php?title=Server&amp;diff=628"/>
		<updated>2024-10-02T09:18:32Z</updated>

		<summary type="html">&lt;p&gt;Wulf: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;*[[Access from Internet with dedicated IP]]&lt;br /&gt;
*[[Bacula Backup Solution]]&lt;br /&gt;
*[[Configuration]]&lt;br /&gt;
*[[Fail2ban]]&lt;br /&gt;
*[[Fancontrol]]&lt;br /&gt;
*[[Internet Speedtest]]&lt;br /&gt;
*[[ioBroker]]&lt;br /&gt;
*[[MediaWiki]]&lt;br /&gt;
*[[PHP]]&lt;br /&gt;
*[[phpMyAdmin]]&lt;br /&gt;
*[[Signal Messenger]]&lt;br /&gt;
*[[Wake on LAN and remote shutdown]]&lt;br /&gt;
*[[Hardware Monitoring]]&lt;br /&gt;
*[[Hardware]]&lt;/div&gt;</summary>
		<author><name>Wulf</name></author>
	</entry>
	<entry>
		<id>http://wiki.frank-wulf.de/index.php?title=Internet_Speedtest&amp;diff=627</id>
		<title>Internet Speedtest</title>
		<link rel="alternate" type="text/html" href="http://wiki.frank-wulf.de/index.php?title=Internet_Speedtest&amp;diff=627"/>
		<updated>2024-10-01T13:34:22Z</updated>

		<summary type="html">&lt;p&gt;Wulf: /* Shell script /usr/bin/fwspeedtest */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__FORCETOC__&lt;br /&gt;
===Shell script &#039;&#039;&#039;&#039;&#039;/usr/bin/fwspeedtest&#039;&#039;&#039;&#039;&#039;===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
#&lt;br /&gt;
# Author:  Frank Wulf&lt;br /&gt;
# Version: 1.6 (2024-10-01)&lt;br /&gt;
#&lt;br /&gt;
# This script measures the internet speed by using Ookla speedtest tool.&lt;br /&gt;
#&lt;br /&gt;
# In regards to the conversion rules described in&lt;br /&gt;
# https://help.speedtest.net/hc/en-us/articles/360039162713-What-do-mbps-and-kbp&lt;br /&gt;
# the following calculations are used:&lt;br /&gt;
# 1 kilobit = 1000 bits&lt;br /&gt;
# 1 megabit = 1000 kilobits&lt;br /&gt;
# 1 Mbyte   = 8 megabits&lt;br /&gt;
&lt;br /&gt;
runs=2&lt;br /&gt;
#tarif=&amp;quot;Telekom Zuhause L&amp;quot;&lt;br /&gt;
#tarif=&amp;quot;o2 Testkarte Online&amp;quot;&lt;br /&gt;
tarif=&amp;quot;freenet FUNK unlimited&amp;quot;&lt;br /&gt;
#vpn_service=&amp;quot;openvpn&amp;quot;&lt;br /&gt;
vpn_service=&amp;quot;wg-quick@wg0&amp;quot;&lt;br /&gt;
exclude=0&lt;br /&gt;
comment=&amp;quot;&amp;quot;&lt;br /&gt;
out=/tmp/fwspeedtest.out&lt;br /&gt;
&lt;br /&gt;
if [ -f &amp;quot;$out&amp;quot; ]; then&lt;br /&gt;
  rm $out 1&amp;gt;/dev/null 2&amp;gt;&amp;amp;1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Run the speedtest &amp;lt;runs&amp;gt; times without VPN connection&lt;br /&gt;
for i in `eval echo {1..$runs}`&lt;br /&gt;
do&lt;br /&gt;
  # Check if VPN connection is active&lt;br /&gt;
  systemctl status $vpn_service 1&amp;gt;/dev/null 2&amp;gt;&amp;amp;1&lt;br /&gt;
  if [ $? -eq 0 ]; then&lt;br /&gt;
    vpn_active=1&lt;br /&gt;
    # Stop VPN connection&lt;br /&gt;
    systemctl stop $vpn_service&lt;br /&gt;
    sleep 5&lt;br /&gt;
  else&lt;br /&gt;
    vpn_active=0&lt;br /&gt;
  fi&lt;br /&gt;
&lt;br /&gt;
  # Fill timestamp field&lt;br /&gt;
  timestamp[$i]=`date +&#039;%Y-%m-%d %H:%M:%S&#039;`&lt;br /&gt;
&lt;br /&gt;
  # Run speedtest&lt;br /&gt;
  /usr/bin/speedtest speedtest --accept-gdpr --format=csv &amp;gt;&amp;gt;$out&lt;br /&gt;
  retcode=$?&lt;br /&gt;
&lt;br /&gt;
  if [ $vpn_active -eq 1 ]; then&lt;br /&gt;
    # Start VPN connection&lt;br /&gt;
    systemctl start $vpn_service&lt;br /&gt;
  fi&lt;br /&gt;
&lt;br /&gt;
  if [ &amp;quot;$retcode&amp;quot; -ne 0 ]; then&lt;br /&gt;
    exit 1&lt;br /&gt;
  fi&lt;br /&gt;
&lt;br /&gt;
  if [ $i -lt $runs ]; then&lt;br /&gt;
    # Wait 15 seconds between two speedtests&lt;br /&gt;
    sleep 15&lt;br /&gt;
  fi&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
download_max=0&lt;br /&gt;
i=0&lt;br /&gt;
&lt;br /&gt;
while read line; do&lt;br /&gt;
  i=$((i+1))&lt;br /&gt;
  download_new=`echo &amp;quot;$line&amp;quot;|awk -F &#039;^ *&amp;quot;|&amp;quot; *, *&amp;quot;|&amp;quot; *$&#039; &#039;{ print $7 }&#039;`&lt;br /&gt;
  if [ $download_new -gt $download_max ]; then&lt;br /&gt;
    # Download rate is faster than previous ones&lt;br /&gt;
    download=$download_new&lt;br /&gt;
    server_id=`echo &amp;quot;$line&amp;quot;|awk -F &#039;^ *&amp;quot;|&amp;quot; *, *&amp;quot;|&amp;quot; *$&#039; &#039;{ print $3 }&#039;`&lt;br /&gt;
    server_name=`echo &amp;quot;$line&amp;quot;|awk -F &#039;^ *&amp;quot;|&amp;quot; *, *&amp;quot;|&amp;quot; *$&#039; &#039;{ print $2 }&#039;`&lt;br /&gt;
    latency=`echo &amp;quot;$line&amp;quot;|awk -F &#039;^ *&amp;quot;|&amp;quot; *, *&amp;quot;|&amp;quot; *$&#039; &#039;{ print $4 }&#039;`&lt;br /&gt;
    jitter=`echo &amp;quot;$line&amp;quot;|awk -F &#039;^ *&amp;quot;|&amp;quot; *, *&amp;quot;|&amp;quot; *$&#039; &#039;{ print $5 }&#039;`&lt;br /&gt;
    packet_loss=`echo &amp;quot;$line&amp;quot;|awk -F &#039;^ *&amp;quot;|&amp;quot; *, *&amp;quot;|&amp;quot; *$&#039; &#039;{ print $6 }&#039;`&lt;br /&gt;
    download=`echo &amp;quot;$line&amp;quot;|awk -F &#039;^ *&amp;quot;|&amp;quot; *, *&amp;quot;|&amp;quot; *$&#039; &#039;{ print $7 }&#039;`&lt;br /&gt;
    upload=`echo &amp;quot;$line&amp;quot;|awk -F &#039;^ *&amp;quot;|&amp;quot; *, *&amp;quot;|&amp;quot; *$&#039; &#039;{ print $8 }&#039;`&lt;br /&gt;
    download_used=`echo &amp;quot;$line&amp;quot;|awk -F &#039;^ *&amp;quot;|&amp;quot; *, *&amp;quot;|&amp;quot; *$&#039; &#039;{ print $9 }&#039;`&lt;br /&gt;
    upload_used=`echo &amp;quot;$line&amp;quot;|awk -F &#039;^ *&amp;quot;|&amp;quot; *, *&amp;quot;|&amp;quot; *$&#039; &#039;{ print $10 }&#039;`&lt;br /&gt;
    url=`echo &amp;quot;$line&amp;quot;|awk -F &#039;^ *&amp;quot;|&amp;quot; *, *&amp;quot;|&amp;quot; *$&#039; &#039;{ print $11 }&#039;`&lt;br /&gt;
    download_max=$download&lt;br /&gt;
    row=$i&lt;br /&gt;
  fi&lt;br /&gt;
&lt;br /&gt;
  if [ $i -eq $runs ]; then&lt;br /&gt;
    # Round values for latency. jitter and packet_loss&lt;br /&gt;
    latency=`echo &amp;quot;scale=2; ($latency + 0.005) / 1&amp;quot; | bc`&lt;br /&gt;
    jitter=`echo &amp;quot;scale=2; ($jitter + 0.005) / 1&amp;quot; | bc`&lt;br /&gt;
    if [ $packet_loss == &amp;quot;N/A&amp;quot; ]; then&lt;br /&gt;
      packet_loss=0&lt;br /&gt;
    else&lt;br /&gt;
      packet_loss=`echo &amp;quot;scale=1; ($packet_loss + 0.05) / 1&amp;quot; | bc`&lt;br /&gt;
    fi&lt;br /&gt;
&lt;br /&gt;
    # Convert download/upload speed from bytes per second to Mbps and round valu&lt;br /&gt;
    download=`echo &amp;quot;scale=8; $download * 8 / 1000000&amp;quot; | bc`&lt;br /&gt;
    download=`echo &amp;quot;scale=2; ($download + 0.005) / 1&amp;quot; | bc`&lt;br /&gt;
    upload=`echo &amp;quot;scale=8; $upload * 8 / 1000000&amp;quot; | bc`&lt;br /&gt;
    upload=`echo &amp;quot;scale=2; ($upload + 0.005) / 1&amp;quot; | bc`&lt;br /&gt;
&lt;br /&gt;
    # Convert used bytes to MBytes and round values&lt;br /&gt;
    download_used=`echo &amp;quot;scale=8; $download_used / 1000000&amp;quot; | bc`&lt;br /&gt;
    download_used=`echo &amp;quot;scale=1; ($download_used + 0.05) / 1&amp;quot; | bc`&lt;br /&gt;
    upload_used=`echo &amp;quot;scale=8; $upload_used / 1000000&amp;quot; | bc`&lt;br /&gt;
    upload_used=`echo &amp;quot;scale=1; ($upload_used + 0.05) / 1&amp;quot; | bc`&lt;br /&gt;
&lt;br /&gt;
    vpn_active=0&lt;br /&gt;
&lt;br /&gt;
    # Fill timestamp field&lt;br /&gt;
    timestamp=${timestamp[$row]}&lt;br /&gt;
&lt;br /&gt;
    # Insert data into database&lt;br /&gt;
    sql=&amp;quot;INSERT INTO fw_speedtest (timestamp,server_id,server_name,latency,&amp;quot;&lt;br /&gt;
    sql+=&amp;quot;jitter,packet_loss,download,upload,download_used,upload_used,&amp;quot;&lt;br /&gt;
    sql+=&amp;quot;vpn_active,tarif,exclude,comment,url) VALUES (&amp;quot;&lt;br /&gt;
    sql+=&amp;quot;\&amp;quot;$timestamp\&amp;quot;, \&amp;quot;$server_id\&amp;quot;, \&amp;quot;$server_name\&amp;quot;, \&amp;quot;$latency\&amp;quot;, &amp;quot;&lt;br /&gt;
    sql+=&amp;quot;\&amp;quot;$jitter\&amp;quot;, \&amp;quot;$packet_loss\&amp;quot;, \&amp;quot;$download\&amp;quot;, \&amp;quot;$upload\&amp;quot;, &amp;quot;&lt;br /&gt;
    sql+=&amp;quot;\&amp;quot;$download_used\&amp;quot;, \&amp;quot;$upload_used\&amp;quot;, \&amp;quot;$vpn_active\&amp;quot;, &amp;quot;&lt;br /&gt;
    sql+=&amp;quot;\&amp;quot;$tarif\&amp;quot;, \&amp;quot;$exclude\&amp;quot;, \&amp;quot;$comment\&amp;quot;,\&amp;quot;$url\&amp;quot;)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    mysql --login-path=fwsysmon -D fwsysmon -e &amp;quot;$sql&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  fi&lt;br /&gt;
&lt;br /&gt;
done &amp;lt;&amp;lt;&amp;lt;`cat $out`&lt;br /&gt;
&lt;br /&gt;
exit 0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Scheduling Speedtest with systemd ===&lt;br /&gt;
* &#039;&#039;&#039;Service Unit file &#039;&#039;/lib/systemd/system/fwspeedtest.service&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Internet speedtest&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=oneshot&lt;br /&gt;
ExecStart=/usr/bin/fwspeedtest&lt;br /&gt;
User=root&lt;br /&gt;
Group=root&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Timer Unit file &#039;&#039;/lib/systemd/system/fwspeedtest.timer&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Run Internet speedtest&lt;br /&gt;
&lt;br /&gt;
[Timer]&lt;br /&gt;
OnCalendar=*-*-* 18:00&lt;br /&gt;
RandomizedDelaySec=12h&lt;br /&gt;
Persistent=true&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=timers.target&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Wulf</name></author>
	</entry>
	<entry>
		<id>http://wiki.frank-wulf.de/index.php?title=Wiki.frank-wulf.de:Impressum&amp;diff=626</id>
		<title>Wiki.frank-wulf.de:Impressum</title>
		<link rel="alternate" type="text/html" href="http://wiki.frank-wulf.de/index.php?title=Wiki.frank-wulf.de:Impressum&amp;diff=626"/>
		<updated>2024-06-22T11:27:34Z</updated>

		<summary type="html">&lt;p&gt;Wulf: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&#039;impressum&#039;&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Angaben gemäß § 5 TMG und verantwortlich für den Inhalt nach § 55 Abs. 2 RStV:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Frank Wulf&amp;lt;br&amp;gt; &lt;br /&gt;
Im Langen Weg 4&amp;lt;br&amp;gt; &lt;br /&gt;
51580 Reichshof&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Kontakt:&amp;lt;/strong&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Telefon: +49 2297 9093557&amp;lt;br&amp;gt;&lt;br /&gt;
Telefax: +49 2297 9093559&amp;lt;br&amp;gt;&lt;br /&gt;
E-Mail: info@frank-wulf.de&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Haftungsausschluss: &amp;lt;/strong&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;strong&amp;gt;Haftung für Inhalte&amp;lt;/strong&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Die Inhalte unserer Seiten wurden mit größter Sorgfalt erstellt. Für die Richtigkeit, Vollständigkeit und Aktualität der Inhalte können wir jedoch keine Gewähr übernehmen. Als Diensteanbieter sind wir gemäß § 7 Abs.1 TMG für eigene Inhalte auf diesen Seiten nach den allgemeinen Gesetzen verantwortlich. Nach §§ 8 bis 10 TMG sind wir als Diensteanbieter jedoch nicht verpflichtet, übermittelte oder gespeicherte fremde Informationen zu überwachen oder nach Umständen zu forschen, die auf eine rechtswidrige Tätigkeit hinweisen. Verpflichtungen zur Entfernung oder Sperrung der Nutzung von Informationen nach den allgemeinen Gesetzen bleiben hiervon unberührt. Eine diesbezügliche Haftung ist jedoch erst ab dem Zeitpunkt der Kenntnis einer konkreten Rechtsverletzung möglich. Bei Bekanntwerden von entsprechenden Rechtsverletzungen werden wir diese Inhalte umgehend entfernen.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;strong&amp;gt;Haftung für Links&amp;lt;/strong&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Unser Angebot enthält Links zu externen Webseiten Dritter, auf deren Inhalte wir keinen Einfluss haben. Deshalb können wir für diese fremden Inhalte auch keine Gewähr übernehmen. Für die Inhalte der verlinkten Seiten ist stets der jeweilige Anbieter oder Betreiber der Seiten verantwortlich. Die verlinkten Seiten wurden zum Zeitpunkt der Verlinkung auf mögliche Rechtsverstöße überprüft. Rechtswidrige Inhalte waren zum Zeitpunkt der Verlinkung nicht erkennbar. Eine permanente inhaltliche Kontrolle der verlinkten Seiten ist jedoch ohne konkrete Anhaltspunkte einer Rechtsverletzung nicht zumutbar. Bei Bekanntwerden von Rechtsverletzungen werden wir derartige Links umgehend entfernen.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;strong&amp;gt;Urheberrecht&amp;lt;/strong&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Die durch die Seitenbetreiber erstellten Inhalte und Werke auf diesen Seiten unterliegen dem deutschen Urheberrecht. Die Vervielfältigung, Bearbeitung, Verbreitung und jede Art der Verwertung außerhalb der Grenzen des Urheberrechtes bedürfen der schriftlichen Zustimmung des jeweiligen Autors bzw. Erstellers. Downloads und Kopien dieser Seite sind nur für den privaten, nicht kommerziellen Gebrauch gestattet. Soweit die Inhalte auf dieser Seite nicht vom Betreiber erstellt wurden, werden die Urheberrechte Dritter beachtet. Insbesondere werden Inhalte Dritter als solche gekennzeichnet. Sollten Sie trotzdem auf eine Urheberrechtsverletzung aufmerksam werden, bitten wir um einen entsprechenden Hinweis. Bei Bekanntwerden von Rechtsverletzungen werden wir derartige Inhalte umgehend entfernen.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Impressum vom [http://www.impressum-generator.de impressum-generator.de] der [http://www.kanzlei-hasselbach.de/rechtsanwalt-arbeitsrecht-bonn/ Rechtsanwältin Franziska Hasselbach, Bonn]&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Wulf</name></author>
	</entry>
	<entry>
		<id>http://wiki.frank-wulf.de/index.php?title=Wiki.frank-wulf.de:Impressum&amp;diff=625</id>
		<title>Wiki.frank-wulf.de:Impressum</title>
		<link rel="alternate" type="text/html" href="http://wiki.frank-wulf.de/index.php?title=Wiki.frank-wulf.de:Impressum&amp;diff=625"/>
		<updated>2024-06-22T11:25:50Z</updated>

		<summary type="html">&lt;p&gt;Wulf: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&#039;impressum&#039;&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Angaben gemäß § 5 TMG und verantwortlich für den Inhalt nach § 55 Abs. 2 RStV:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Frank Wulf&amp;lt;br&amp;gt; &lt;br /&gt;
Im Langen Weg 4&amp;lt;br&amp;gt; &lt;br /&gt;
51580 Reichshof&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Kontakt:&amp;lt;/strong&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Telefon: +49 2297 9093557&amp;lt;br&amp;gt;&lt;br /&gt;
Telefax: +49 2297 9093559&amp;lt;br&amp;gt;&lt;br /&gt;
E-Mail: info@frank-wulf.de&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
{|&lt;br /&gt;
|+ Text der Überschrift&lt;br /&gt;
|-&lt;br /&gt;
| Telefon: || +49 2297 9093557&lt;br /&gt;
|-&lt;br /&gt;
| Fax: || +49 2297 9093559&lt;br /&gt;
|-&lt;br /&gt;
| E-Mail: || info@frank-wulf.de&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Haftungsausschluss: &amp;lt;/strong&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;strong&amp;gt;Haftung für Inhalte&amp;lt;/strong&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Die Inhalte unserer Seiten wurden mit größter Sorgfalt erstellt. Für die Richtigkeit, Vollständigkeit und Aktualität der Inhalte können wir jedoch keine Gewähr übernehmen. Als Diensteanbieter sind wir gemäß § 7 Abs.1 TMG für eigene Inhalte auf diesen Seiten nach den allgemeinen Gesetzen verantwortlich. Nach §§ 8 bis 10 TMG sind wir als Diensteanbieter jedoch nicht verpflichtet, übermittelte oder gespeicherte fremde Informationen zu überwachen oder nach Umständen zu forschen, die auf eine rechtswidrige Tätigkeit hinweisen. Verpflichtungen zur Entfernung oder Sperrung der Nutzung von Informationen nach den allgemeinen Gesetzen bleiben hiervon unberührt. Eine diesbezügliche Haftung ist jedoch erst ab dem Zeitpunkt der Kenntnis einer konkreten Rechtsverletzung möglich. Bei Bekanntwerden von entsprechenden Rechtsverletzungen werden wir diese Inhalte umgehend entfernen.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;strong&amp;gt;Haftung für Links&amp;lt;/strong&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Unser Angebot enthält Links zu externen Webseiten Dritter, auf deren Inhalte wir keinen Einfluss haben. Deshalb können wir für diese fremden Inhalte auch keine Gewähr übernehmen. Für die Inhalte der verlinkten Seiten ist stets der jeweilige Anbieter oder Betreiber der Seiten verantwortlich. Die verlinkten Seiten wurden zum Zeitpunkt der Verlinkung auf mögliche Rechtsverstöße überprüft. Rechtswidrige Inhalte waren zum Zeitpunkt der Verlinkung nicht erkennbar. Eine permanente inhaltliche Kontrolle der verlinkten Seiten ist jedoch ohne konkrete Anhaltspunkte einer Rechtsverletzung nicht zumutbar. Bei Bekanntwerden von Rechtsverletzungen werden wir derartige Links umgehend entfernen.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;strong&amp;gt;Urheberrecht&amp;lt;/strong&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Die durch die Seitenbetreiber erstellten Inhalte und Werke auf diesen Seiten unterliegen dem deutschen Urheberrecht. Die Vervielfältigung, Bearbeitung, Verbreitung und jede Art der Verwertung außerhalb der Grenzen des Urheberrechtes bedürfen der schriftlichen Zustimmung des jeweiligen Autors bzw. Erstellers. Downloads und Kopien dieser Seite sind nur für den privaten, nicht kommerziellen Gebrauch gestattet. Soweit die Inhalte auf dieser Seite nicht vom Betreiber erstellt wurden, werden die Urheberrechte Dritter beachtet. Insbesondere werden Inhalte Dritter als solche gekennzeichnet. Sollten Sie trotzdem auf eine Urheberrechtsverletzung aufmerksam werden, bitten wir um einen entsprechenden Hinweis. Bei Bekanntwerden von Rechtsverletzungen werden wir derartige Inhalte umgehend entfernen.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Impressum vom [http://www.impressum-generator.de impressum-generator.de] der [http://www.kanzlei-hasselbach.de/rechtsanwalt-arbeitsrecht-bonn/ Rechtsanwältin Franziska Hasselbach, Bonn]&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Wulf</name></author>
	</entry>
	<entry>
		<id>http://wiki.frank-wulf.de/index.php?title=Avoid_hard_drives_spinning_up_by_writing_file_access_times&amp;diff=624</id>
		<title>Avoid hard drives spinning up by writing file access times</title>
		<link rel="alternate" type="text/html" href="http://wiki.frank-wulf.de/index.php?title=Avoid_hard_drives_spinning_up_by_writing_file_access_times&amp;diff=624"/>
		<updated>2023-08-03T20:18:51Z</updated>

		<summary type="html">&lt;p&gt;Wulf: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;It looks like some directories like &amp;lt;code&amp;gt;lost+found&amp;lt;/code&amp;gt; are accessed on a regular basis. This can result in unwanted spinning ups of sleeping hard drives, because file access times are written to the drives even when files/directories are only read.&lt;br /&gt;
&lt;br /&gt;
To avoid this behaviour the hard drive can be mounted using &amp;quot;noatime&amp;quot; parameter in file &amp;lt;code&amp;gt;/etc/fstab&amp;lt;/code&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color: silver; background: black;&amp;quot;&amp;gt;&lt;br /&gt;
# /etc/fstab: static file system information.&lt;br /&gt;
#&lt;br /&gt;
# Use &#039;blkid&#039; to print the universally unique identifier for a&lt;br /&gt;
# device; this may be used with UUID= as a more robust way to name devices&lt;br /&gt;
# that works even if disks are added and removed. See fstab(5).&lt;br /&gt;
#&lt;br /&gt;
# &amp;lt;file system&amp;gt;                                 &amp;lt;mount point&amp;gt;   &amp;lt;type&amp;gt;  &amp;lt;options&amp;gt;               &amp;lt;dump&amp;gt;  &amp;lt;pass&amp;gt;&lt;br /&gt;
UUID=baf190b5-71ae-4c5b-b171-ce01c8a2c44f       /               ext4    errors=remount-ro       0       1&lt;br /&gt;
UUID=cca60f8e-245a-4408-9892-76816641582e       none            swap    sw                      0       0&lt;br /&gt;
# Backup Disk 1&lt;br /&gt;
#UUID=b226cecb-a2e8-4869-ab6d-fa835d3125c6      /srv/backup     ext4    defaults                0       0&lt;br /&gt;
# Backup Disk 2&lt;br /&gt;
#UUID=16f9d7f6-5298-425d-909b-01523df0ff67      /srv/backup     ext4    defaults                0       0&lt;br /&gt;
# Backup Disk 3 (installed 2023-08-01)&lt;br /&gt;
UUID=e581fe6d-ce7a-40a5-a57f-0c51cd72d636       /srv/backup     ext4    defaults,noatime        0       0&lt;br /&gt;
UUID=3f618a06-971e-4fcf-aa8a-baa1e08d93e6       /srv/data       ext4    defaults                0       0&lt;br /&gt;
UUID=a3b4ca89-4ca1-49d5-96d5-b32d65d5fa07       /srv/nas        ext4    defaults                0       0&lt;br /&gt;
UUID=f3303f64-d334-4439-ae63-d5f7831e9937       /srv/cloud-data ext4    defaults                0       0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Wulf</name></author>
	</entry>
	<entry>
		<id>http://wiki.frank-wulf.de/index.php?title=Avoid_hard_drives_spinning_up_by_writing_file_access_times&amp;diff=623</id>
		<title>Avoid hard drives spinning up by writing file access times</title>
		<link rel="alternate" type="text/html" href="http://wiki.frank-wulf.de/index.php?title=Avoid_hard_drives_spinning_up_by_writing_file_access_times&amp;diff=623"/>
		<updated>2023-08-03T20:17:33Z</updated>

		<summary type="html">&lt;p&gt;Wulf: Die Seite wurde neu angelegt: „It looks like some directories like &amp;lt;code&amp;gt;lost+found&amp;lt;/code&amp;gt; are accessed on a regular basis. This can result in unwanted spinning ups of sleeping hard drives, because file access times are written to the drives even when files/directories are only read.  To avoid this behaviour the hard drive can be mounted using &amp;quot;noatime&amp;quot; parameter in file &amp;lt;code&amp;gt;/etc/fstab&amp;lt;/code&amp;gt;.“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;It looks like some directories like &amp;lt;code&amp;gt;lost+found&amp;lt;/code&amp;gt; are accessed on a regular basis. This can result in unwanted spinning ups of sleeping hard drives, because file access times are written to the drives even when files/directories are only read.&lt;br /&gt;
&lt;br /&gt;
To avoid this behaviour the hard drive can be mounted using &amp;quot;noatime&amp;quot; parameter in file &amp;lt;code&amp;gt;/etc/fstab&amp;lt;/code&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Wulf</name></author>
	</entry>
	<entry>
		<id>http://wiki.frank-wulf.de/index.php?title=Configuration&amp;diff=622</id>
		<title>Configuration</title>
		<link rel="alternate" type="text/html" href="http://wiki.frank-wulf.de/index.php?title=Configuration&amp;diff=622"/>
		<updated>2023-08-03T20:03:26Z</updated>

		<summary type="html">&lt;p&gt;Wulf: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* [[Avoid hard drives spinning up by SSH Login]]&lt;br /&gt;
* [[Avoid hard drives spinning up by writing file access times]]&lt;br /&gt;
* [[Switch off internal power management for Seagate hard drives]]&lt;br /&gt;
* [[Suppress &amp;quot;No mail&amp;quot; message after SSH Login]]&lt;br /&gt;
* [[Changes/Adjustments after Upgrade from Ubuntu 18.04.6 to 20.04.1]]&lt;/div&gt;</summary>
		<author><name>Wulf</name></author>
	</entry>
	<entry>
		<id>http://wiki.frank-wulf.de/index.php?title=Switch_off_internal_power_management_for_Seagate_hard_drives&amp;diff=621</id>
		<title>Switch off internal power management for Seagate hard drives</title>
		<link rel="alternate" type="text/html" href="http://wiki.frank-wulf.de/index.php?title=Switch_off_internal_power_management_for_Seagate_hard_drives&amp;diff=621"/>
		<updated>2023-08-03T19:59:49Z</updated>

		<summary type="html">&lt;p&gt;Wulf: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;&amp;lt;big&amp;gt;Install openSeaChest&amp;lt;/big&amp;gt;&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
* openSeaChest uses meson and ninja to build.&lt;br /&gt;
* Install the 3rd party dependencies.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
apt-get install python3 python3-pip python3-setuptools python3-wheel ninja-build&lt;br /&gt;
pip3 install --user meson&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Download and compile openSeaChest.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /usr/src&lt;br /&gt;
git clone --recurse-submodules -j8 https://github.com/Seagate/openSeaChest.git&lt;br /&gt;
cd openSeaChest&lt;br /&gt;
/root/.local/bin/meson --buildtype=release builddir&lt;br /&gt;
ninja -C builddir&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* All the binaries are now located inside the builddir directory.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /usr/src/openSeaChest/builddir&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Scan devcices to determine the right handle.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
./openSeaChest_Basics --scan&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Output:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color: silver; background: black;&amp;quot;&amp;gt;&lt;br /&gt;
root@fwserv1:/usr/src/openSeaChest/builddir# ./openSeaChest_Basics --scan&lt;br /&gt;
==========================================================================================&lt;br /&gt;
 openSeaChest_Basics - openSeaChest drive utilities - NVMe Enabled&lt;br /&gt;
 Copyright (c) 2014-2023 Seagate Technology LLC and/or its Affiliates, All Rights Reserved&lt;br /&gt;
 openSeaChest_Basics Version: 3.5.4-6_1_0 X86_64&lt;br /&gt;
 Build Date: Aug  3 2023&lt;br /&gt;
 Today: Thu Aug  3 21:41:08 2023        User: root&lt;br /&gt;
==========================================================================================&lt;br /&gt;
Vendor   Handle       Model Number            Serial Number          FwRev&lt;br /&gt;
ATA      /dev/sg0     INTEL SSDSA2M120G2GC    CVPO043402H6120QGN     2CV102M3&lt;br /&gt;
ATA      /dev/sg1     HGST HUH721010ALE600    7JJ4NKUC               LHGNT21D&lt;br /&gt;
ATA      /dev/sg2     SanDisk SDSSDA-1T00     2013E7447107           411040RL&lt;br /&gt;
ATA      /dev/sg3     HGST HUH721010ALE600    2TGV3G0D               LHGNT384&lt;br /&gt;
ATA      /dev/sg4     ST20000NM007D-3DJ103    ZVTAR0QE               SB2A&lt;br /&gt;
&lt;br /&gt;
root@fwserv1:/usr/src/openSeaChest/builddir#&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;In this case the handle is /dev/sg4&#039;&#039;&#039;&#039;&#039;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
* Show EPC (Extended Power Condition) settings.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
./openSeaChest_PowerControl -d /dev/sg4 --showEPCSettings&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Output:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color: silver; background: black;&amp;quot;&amp;gt;&lt;br /&gt;
root@fwserv1:/usr/src/openSeaChest/builddir# ./openSeaChest_PowerControl -d /dev/sg4 --showEPCSettings&lt;br /&gt;
==========================================================================================&lt;br /&gt;
 openSeaChest_PowerControl - openSeaChest drive utilities - NVMe Enabled&lt;br /&gt;
 Copyright (c) 2014-2023 Seagate Technology LLC and/or its Affiliates, All Rights Reserved&lt;br /&gt;
 openSeaChest_PowerControl Version: 3.4.0-6_1_0 X86_64&lt;br /&gt;
 Build Date: Aug  3 2023&lt;br /&gt;
 Today: Thu Aug  3 21:48:32 2023        User: root&lt;br /&gt;
==========================================================================================&lt;br /&gt;
&lt;br /&gt;
/dev/sg4 - ST20000NM007D-3DJ103 - ZVTAR0QE - SB2A - ATA&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===EPC Settings===&lt;br /&gt;
        * = timer is enabled&lt;br /&gt;
        C column = Changeable&lt;br /&gt;
        S column = Savable&lt;br /&gt;
        All times are in 100 milliseconds&lt;br /&gt;
&lt;br /&gt;
Name       Current Timer Default Timer Saved Timer   Recovery Time C S&lt;br /&gt;
Idle A     *1            *1            *1            1             Y Y&lt;br /&gt;
Idle B     *1200         *1200         *1200         4             Y Y&lt;br /&gt;
Idle C      0             6000          6000         20            Y Y&lt;br /&gt;
Standby Z   0             9000          9000         110           Y Y&lt;br /&gt;
&lt;br /&gt;
root@fwserv1:/usr/src/openSeaChest/builddir#&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Disable EPC and Power balance feature.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
./openSeaChest_PowerControl -d /dev/sg4 --EPCfeature disable&lt;br /&gt;
./openSeaChest_PowerControl -d /dev/sg4 --powerBalanceFeature disable&lt;br /&gt;
./openSeaChest_PowerControl -d /dev/sg4 --showEPCSettings&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Output:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color: silver; background: black;&amp;quot;&amp;gt;&lt;br /&gt;
root@fwserv1:/usr/src/openSeaChest/builddir# ./openSeaChest_PowerControl -d /dev/sg4 --showEPCSettings&lt;br /&gt;
==========================================================================================&lt;br /&gt;
 openSeaChest_PowerControl - openSeaChest drive utilities - NVMe Enabled&lt;br /&gt;
 Copyright (c) 2014-2023 Seagate Technology LLC and/or its Affiliates, All Rights Reserved&lt;br /&gt;
 openSeaChest_PowerControl Version: 3.4.0-6_1_0 X86_64&lt;br /&gt;
 Build Date: Aug  3 2023&lt;br /&gt;
 Today: Thu Aug  3 21:54:49 2023        User: root&lt;br /&gt;
==========================================================================================&lt;br /&gt;
&lt;br /&gt;
/dev/sg4 - ST20000NM007D-3DJ103 - ZVTAR0QE - SB2A - ATA&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===EPC Settings===&lt;br /&gt;
        * = timer is enabled&lt;br /&gt;
        C column = Changeable&lt;br /&gt;
        S column = Savable&lt;br /&gt;
        All times are in 100 milliseconds&lt;br /&gt;
&lt;br /&gt;
Name       Current Timer Default Timer Saved Timer   Recovery Time C S&lt;br /&gt;
Idle A      0            *1            *1            1             Y Y&lt;br /&gt;
Idle B      0            *1200         *1200         4             Y Y&lt;br /&gt;
Idle C      0             6000          6000         20            Y Y&lt;br /&gt;
Standby Z   0             9000          9000         110           Y Y&lt;br /&gt;
&lt;br /&gt;
root@fwserv1:/usr/src/openSeaChest/builddir#&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Wulf</name></author>
	</entry>
	<entry>
		<id>http://wiki.frank-wulf.de/index.php?title=Switch_off_internal_power_management_for_Seagate_hard_drives&amp;diff=620</id>
		<title>Switch off internal power management for Seagate hard drives</title>
		<link rel="alternate" type="text/html" href="http://wiki.frank-wulf.de/index.php?title=Switch_off_internal_power_management_for_Seagate_hard_drives&amp;diff=620"/>
		<updated>2023-08-03T19:57:49Z</updated>

		<summary type="html">&lt;p&gt;Wulf: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;&amp;lt;big&amp;gt;Install openSeaChest&amp;lt;/big&amp;gt;&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
* openSeaChest uses meson and ninja to build.&lt;br /&gt;
* Install the 3rd party dependencies.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
apt-get install python3 python3-pip python3-setuptools python3-wheel ninja-build&lt;br /&gt;
pip3 install --user meson&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Download and compile openSeaChest.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /usr/src&lt;br /&gt;
git clone --recurse-submodules -j8 https://github.com/Seagate/openSeaChest.git&lt;br /&gt;
cd openSeaChest&lt;br /&gt;
/root/.local/bin/meson --buildtype=release builddir&lt;br /&gt;
ninja -C builddir&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* All the binaries are now located inside the builddir directory.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /usr/src/openSeaChest/builddir&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Scan devcices to determine the right handle.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
./openSeaChest_Basics --scan&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Output:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color: silver; background: black;&amp;quot;&amp;gt;&lt;br /&gt;
root@fwserv1:/usr/src/openSeaChest/builddir# ./openSeaChest_Basics --scan&lt;br /&gt;
==========================================================================================&lt;br /&gt;
 openSeaChest_Basics - openSeaChest drive utilities - NVMe Enabled&lt;br /&gt;
 Copyright (c) 2014-2023 Seagate Technology LLC and/or its Affiliates, All Rights Reserved&lt;br /&gt;
 openSeaChest_Basics Version: 3.5.4-6_1_0 X86_64&lt;br /&gt;
 Build Date: Aug  3 2023&lt;br /&gt;
 Today: Thu Aug  3 21:41:08 2023        User: root&lt;br /&gt;
==========================================================================================&lt;br /&gt;
Vendor   Handle       Model Number            Serial Number          FwRev&lt;br /&gt;
ATA      /dev/sg0     INTEL SSDSA2M120G2GC    CVPO043402H6120QGN     2CV102M3&lt;br /&gt;
ATA      /dev/sg1     HGST HUH721010ALE600    7JJ4NKUC               LHGNT21D&lt;br /&gt;
ATA      /dev/sg2     SanDisk SDSSDA-1T00     2013E7447107           411040RL&lt;br /&gt;
ATA      /dev/sg3     HGST HUH721010ALE600    2TGV3G0D               LHGNT384&lt;br /&gt;
ATA      /dev/sg4     ST20000NM007D-3DJ103    ZVTAR0QE               SB2A&lt;br /&gt;
&lt;br /&gt;
root@fwserv1:/usr/src/openSeaChest/builddir#&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;In this case the handle is /dev/sg4&#039;&#039;&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
* Show EPC (Extended Power Condition) settings.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
./openSeaChest_PowerControl -d /dev/sg4 --showEPCSettings&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Output:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color: silver; background: black;&amp;quot;&amp;gt;&lt;br /&gt;
root@fwserv1:/usr/src/openSeaChest/builddir# ./openSeaChest_PowerControl -d /dev/sg4 --showEPCSettings&lt;br /&gt;
==========================================================================================&lt;br /&gt;
 openSeaChest_PowerControl - openSeaChest drive utilities - NVMe Enabled&lt;br /&gt;
 Copyright (c) 2014-2023 Seagate Technology LLC and/or its Affiliates, All Rights Reserved&lt;br /&gt;
 openSeaChest_PowerControl Version: 3.4.0-6_1_0 X86_64&lt;br /&gt;
 Build Date: Aug  3 2023&lt;br /&gt;
 Today: Thu Aug  3 21:48:32 2023        User: root&lt;br /&gt;
==========================================================================================&lt;br /&gt;
&lt;br /&gt;
/dev/sg4 - ST20000NM007D-3DJ103 - ZVTAR0QE - SB2A - ATA&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===EPC Settings===&lt;br /&gt;
        * = timer is enabled&lt;br /&gt;
        C column = Changeable&lt;br /&gt;
        S column = Savable&lt;br /&gt;
        All times are in 100 milliseconds&lt;br /&gt;
&lt;br /&gt;
Name       Current Timer Default Timer Saved Timer   Recovery Time C S&lt;br /&gt;
Idle A     *1            *1            *1            1             Y Y&lt;br /&gt;
Idle B     *1200         *1200         *1200         4             Y Y&lt;br /&gt;
Idle C      0             6000          6000         20            Y Y&lt;br /&gt;
Standby Z   0             9000          9000         110           Y Y&lt;br /&gt;
&lt;br /&gt;
root@fwserv1:/usr/src/openSeaChest/builddir#&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Disable EPC and Power balance feature.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
./openSeaChest_PowerControl -d /dev/sg4 --EPCfeature disable&lt;br /&gt;
./openSeaChest_PowerControl -d /dev/sg4 --powerBalanceFeature disable&lt;br /&gt;
./openSeaChest_PowerControl -d /dev/sg4 --showEPCSettings&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Output:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color: silver; background: black;&amp;quot;&amp;gt;&lt;br /&gt;
root@fwserv1:/usr/src/openSeaChest/builddir# ./openSeaChest_PowerControl -d /dev/sg4 --showEPCSettings&lt;br /&gt;
==========================================================================================&lt;br /&gt;
 openSeaChest_PowerControl - openSeaChest drive utilities - NVMe Enabled&lt;br /&gt;
 Copyright (c) 2014-2023 Seagate Technology LLC and/or its Affiliates, All Rights Reserved&lt;br /&gt;
 openSeaChest_PowerControl Version: 3.4.0-6_1_0 X86_64&lt;br /&gt;
 Build Date: Aug  3 2023&lt;br /&gt;
 Today: Thu Aug  3 21:54:49 2023        User: root&lt;br /&gt;
==========================================================================================&lt;br /&gt;
&lt;br /&gt;
/dev/sg4 - ST20000NM007D-3DJ103 - ZVTAR0QE - SB2A - ATA&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===EPC Settings===&lt;br /&gt;
        * = timer is enabled&lt;br /&gt;
        C column = Changeable&lt;br /&gt;
        S column = Savable&lt;br /&gt;
        All times are in 100 milliseconds&lt;br /&gt;
&lt;br /&gt;
Name       Current Timer Default Timer Saved Timer   Recovery Time C S&lt;br /&gt;
Idle A      0            *1            *1            1             Y Y&lt;br /&gt;
Idle B      0            *1200         *1200         4             Y Y&lt;br /&gt;
Idle C      0             6000          6000         20            Y Y&lt;br /&gt;
Standby Z   0             9000          9000         110           Y Y&lt;br /&gt;
&lt;br /&gt;
root@fwserv1:/usr/src/openSeaChest/builddir#&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Wulf</name></author>
	</entry>
	<entry>
		<id>http://wiki.frank-wulf.de/index.php?title=Switch_off_internal_power_management_for_Seagate_hard_drives&amp;diff=619</id>
		<title>Switch off internal power management for Seagate hard drives</title>
		<link rel="alternate" type="text/html" href="http://wiki.frank-wulf.de/index.php?title=Switch_off_internal_power_management_for_Seagate_hard_drives&amp;diff=619"/>
		<updated>2023-08-03T19:56:28Z</updated>

		<summary type="html">&lt;p&gt;Wulf: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;&amp;lt;big&amp;gt;Install openSeaChest&amp;lt;/big&amp;gt;&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
* openSeaChest uses meson and ninja to build.&lt;br /&gt;
* Install the 3rd party dependencies.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
apt-get install python3 python3-pip python3-setuptools python3-wheel ninja-build&lt;br /&gt;
pip3 install --user meson&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Download and compile openSeaChest&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /usr/src&lt;br /&gt;
git clone --recurse-submodules -j8 https://github.com/Seagate/openSeaChest.git&lt;br /&gt;
cd openSeaChest&lt;br /&gt;
/root/.local/bin/meson --buildtype=release builddir&lt;br /&gt;
ninja -C builddir&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* All the binaries are now located inside the builddir directory&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /usr/src/openSeaChest/builddir&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Scan devcices to determine the right handle&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
./openSeaChest_Basics --scan&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Output&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color: silver; background: black;&amp;quot;&amp;gt;&lt;br /&gt;
root@fwserv1:/usr/src/openSeaChest/builddir# ./openSeaChest_Basics --scan&lt;br /&gt;
==========================================================================================&lt;br /&gt;
 openSeaChest_Basics - openSeaChest drive utilities - NVMe Enabled&lt;br /&gt;
 Copyright (c) 2014-2023 Seagate Technology LLC and/or its Affiliates, All Rights Reserved&lt;br /&gt;
 openSeaChest_Basics Version: 3.5.4-6_1_0 X86_64&lt;br /&gt;
 Build Date: Aug  3 2023&lt;br /&gt;
 Today: Thu Aug  3 21:41:08 2023        User: root&lt;br /&gt;
==========================================================================================&lt;br /&gt;
Vendor   Handle       Model Number            Serial Number          FwRev&lt;br /&gt;
ATA      /dev/sg0     INTEL SSDSA2M120G2GC    CVPO043402H6120QGN     2CV102M3&lt;br /&gt;
ATA      /dev/sg1     HGST HUH721010ALE600    7JJ4NKUC               LHGNT21D&lt;br /&gt;
ATA      /dev/sg2     SanDisk SDSSDA-1T00     2013E7447107           411040RL&lt;br /&gt;
ATA      /dev/sg3     HGST HUH721010ALE600    2TGV3G0D               LHGNT384&lt;br /&gt;
ATA      /dev/sg4     ST20000NM007D-3DJ103    ZVTAR0QE               SB2A&lt;br /&gt;
&lt;br /&gt;
root@fwserv1:/usr/src/openSeaChest/builddir#&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;In this case the handle is /dev/sg4&#039;&#039;&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
* Show EPC (Extended Power Condition) settings&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
./openSeaChest_PowerControl -d /dev/sg4 --showEPCSettings&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Output&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color: silver; background: black;&amp;quot;&amp;gt;&lt;br /&gt;
root@fwserv1:/usr/src/openSeaChest/builddir# ./openSeaChest_PowerControl -d /dev/sg4 --showEPCSettings&lt;br /&gt;
==========================================================================================&lt;br /&gt;
 openSeaChest_PowerControl - openSeaChest drive utilities - NVMe Enabled&lt;br /&gt;
 Copyright (c) 2014-2023 Seagate Technology LLC and/or its Affiliates, All Rights Reserved&lt;br /&gt;
 openSeaChest_PowerControl Version: 3.4.0-6_1_0 X86_64&lt;br /&gt;
 Build Date: Aug  3 2023&lt;br /&gt;
 Today: Thu Aug  3 21:48:32 2023        User: root&lt;br /&gt;
==========================================================================================&lt;br /&gt;
&lt;br /&gt;
/dev/sg4 - ST20000NM007D-3DJ103 - ZVTAR0QE - SB2A - ATA&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===EPC Settings===&lt;br /&gt;
        * = timer is enabled&lt;br /&gt;
        C column = Changeable&lt;br /&gt;
        S column = Savable&lt;br /&gt;
        All times are in 100 milliseconds&lt;br /&gt;
&lt;br /&gt;
Name       Current Timer Default Timer Saved Timer   Recovery Time C S&lt;br /&gt;
Idle A     *1            *1            *1            1             Y Y&lt;br /&gt;
Idle B     *1200         *1200         *1200         4             Y Y&lt;br /&gt;
Idle C      0             6000          6000         20            Y Y&lt;br /&gt;
Standby Z   0             9000          9000         110           Y Y&lt;br /&gt;
&lt;br /&gt;
root@fwserv1:/usr/src/openSeaChest/builddir#&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Disable EPC and Power balance feature&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
./openSeaChest_PowerControl -d /dev/sg4 --EPCfeature disable&lt;br /&gt;
./openSeaChest_PowerControl -d /dev/sg4 --powerBalanceFeature disable&lt;br /&gt;
./openSeaChest_PowerControl -d /dev/sg4 --showEPCSettings&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Output&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color: silver; background: black;&amp;quot;&amp;gt;&lt;br /&gt;
root@fwserv1:/usr/src/openSeaChest/builddir# ./openSeaChest_PowerControl -d /dev/sg4 --showEPCSettings&lt;br /&gt;
==========================================================================================&lt;br /&gt;
 openSeaChest_PowerControl - openSeaChest drive utilities - NVMe Enabled&lt;br /&gt;
 Copyright (c) 2014-2023 Seagate Technology LLC and/or its Affiliates, All Rights Reserved&lt;br /&gt;
 openSeaChest_PowerControl Version: 3.4.0-6_1_0 X86_64&lt;br /&gt;
 Build Date: Aug  3 2023&lt;br /&gt;
 Today: Thu Aug  3 21:54:49 2023        User: root&lt;br /&gt;
==========================================================================================&lt;br /&gt;
&lt;br /&gt;
/dev/sg4 - ST20000NM007D-3DJ103 - ZVTAR0QE - SB2A - ATA&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===EPC Settings===&lt;br /&gt;
        * = timer is enabled&lt;br /&gt;
        C column = Changeable&lt;br /&gt;
        S column = Savable&lt;br /&gt;
        All times are in 100 milliseconds&lt;br /&gt;
&lt;br /&gt;
Name       Current Timer Default Timer Saved Timer   Recovery Time C S&lt;br /&gt;
Idle A      0            *1            *1            1             Y Y&lt;br /&gt;
Idle B      0            *1200         *1200         4             Y Y&lt;br /&gt;
Idle C      0             6000          6000         20            Y Y&lt;br /&gt;
Standby Z   0             9000          9000         110           Y Y&lt;br /&gt;
&lt;br /&gt;
root@fwserv1:/usr/src/openSeaChest/builddir#&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Wulf</name></author>
	</entry>
	<entry>
		<id>http://wiki.frank-wulf.de/index.php?title=Switch_off_internal_power_management_for_Seagate_hard_drives&amp;diff=618</id>
		<title>Switch off internal power management for Seagate hard drives</title>
		<link rel="alternate" type="text/html" href="http://wiki.frank-wulf.de/index.php?title=Switch_off_internal_power_management_for_Seagate_hard_drives&amp;diff=618"/>
		<updated>2023-08-03T19:33:13Z</updated>

		<summary type="html">&lt;p&gt;Wulf: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Install openSeaChest===&amp;lt;br&amp;gt;&lt;br /&gt;
* openSeaChest uses meson and ninja to build.&lt;br /&gt;
* Install the 3rd party dependencies.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
apt-get install python3 python3-pip python3-setuptools python3-wheel ninja-build&lt;br /&gt;
pip3 install --user meson&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Download and compile openSeaChest&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /usr/src&lt;br /&gt;
git clone --recurse-submodules -j8 https://github.com/Seagate/openSeaChest.git&lt;br /&gt;
cd openSeaChest&lt;br /&gt;
/root/.local/bin/meson --buildtype=release builddir&lt;br /&gt;
ninja -C builddir&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
cd builddir&amp;lt;br&amp;gt;&lt;br /&gt;
./openSeaChest_Basics --scan&amp;lt;br&amp;gt;&lt;br /&gt;
./openSeaChest_PowerControl -d /dev/sg4 --showEPCSettings&amp;lt;br&amp;gt;&lt;br /&gt;
./openSeaChest_PowerControl -d /dev/sg4 --EPCfeature disable&amp;lt;br&amp;gt;&lt;br /&gt;
./openSeaChest_PowerControl -d /dev/sg4 --powerBalanceFeature disable&lt;br /&gt;
./openSeaChest_PowerControl -d /dev/sg4 --showEPCSettings&lt;/div&gt;</summary>
		<author><name>Wulf</name></author>
	</entry>
	<entry>
		<id>http://wiki.frank-wulf.de/index.php?title=Switch_off_internal_power_management_for_Seagate_hard_drives&amp;diff=617</id>
		<title>Switch off internal power management for Seagate hard drives</title>
		<link rel="alternate" type="text/html" href="http://wiki.frank-wulf.de/index.php?title=Switch_off_internal_power_management_for_Seagate_hard_drives&amp;diff=617"/>
		<updated>2023-08-03T19:29:05Z</updated>

		<summary type="html">&lt;p&gt;Wulf: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Install openSeaChest&amp;lt;br&amp;gt;&lt;br /&gt;
* openSeaChest uses meson and ninja to build.&lt;br /&gt;
* Install the 3rd party dependencies.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;github-dark&amp;quot;&amp;gt;&lt;br /&gt;
apt-get install python3 python3-pip python3-setuptools python3-wheel ninja-build&lt;br /&gt;
pip3 install --user meson&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
cd /usr/src&amp;lt;br&amp;gt;&lt;br /&gt;
git clone --recurse-submodules -j8 https://github.com/Seagate/openSeaChest.git&amp;lt;br&amp;gt;&lt;br /&gt;
cd openSeaChest&amp;lt;br&amp;gt;&lt;br /&gt;
/root/.local/bin/meson --buildtype=release builddir&amp;lt;br&amp;gt;&lt;br /&gt;
ninja -C builddir&amp;lt;br&amp;gt;&lt;br /&gt;
cd builddir&amp;lt;br&amp;gt;&lt;br /&gt;
./openSeaChest_Basics --scan&amp;lt;br&amp;gt;&lt;br /&gt;
./openSeaChest_PowerControl -d /dev/sg4 --showEPCSettings&amp;lt;br&amp;gt;&lt;br /&gt;
./openSeaChest_PowerControl -d /dev/sg4 --EPCfeature disable&amp;lt;br&amp;gt;&lt;br /&gt;
./openSeaChest_PowerControl -d /dev/sg4 --powerBalanceFeature disable&lt;br /&gt;
./openSeaChest_PowerControl -d /dev/sg4 --showEPCSettings&lt;/div&gt;</summary>
		<author><name>Wulf</name></author>
	</entry>
	<entry>
		<id>http://wiki.frank-wulf.de/index.php?title=Configuration&amp;diff=616</id>
		<title>Configuration</title>
		<link rel="alternate" type="text/html" href="http://wiki.frank-wulf.de/index.php?title=Configuration&amp;diff=616"/>
		<updated>2023-08-03T19:14:20Z</updated>

		<summary type="html">&lt;p&gt;Wulf: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* [[Avoid hard drives spinning up by SSH Login]]&lt;br /&gt;
* [[Switch off internal power management for Seagate hard drives]]&lt;br /&gt;
* [[Suppress &amp;quot;No mail&amp;quot; message after SSH Login]]&lt;br /&gt;
* [[Changes/Adjustments after Upgrade from Ubuntu 18.04.6 to 20.04.1]]&lt;/div&gt;</summary>
		<author><name>Wulf</name></author>
	</entry>
	<entry>
		<id>http://wiki.frank-wulf.de/index.php?title=Switch_off_internal_power_management_for_Seagate_hard_drives&amp;diff=615</id>
		<title>Switch off internal power management for Seagate hard drives</title>
		<link rel="alternate" type="text/html" href="http://wiki.frank-wulf.de/index.php?title=Switch_off_internal_power_management_for_Seagate_hard_drives&amp;diff=615"/>
		<updated>2023-08-03T11:43:51Z</updated>

		<summary type="html">&lt;p&gt;Wulf: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Install openSeaChest&amp;lt;br&amp;gt;&lt;br /&gt;
* openSeaChest uses meson and ninja to build.&lt;br /&gt;
* Install the 3rd party dependencies.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;code class=&amp;quot;language-bash hljs&amp;quot;&amp;gt;$ sudo apt-get install python3 python3-pip python3-setuptools python3-wheel ninja-build&lt;br /&gt;
$ pip3 install --user meson&lt;br /&gt;
&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Compile openSeaChest.&amp;lt;/li&amp;gt;&lt;br /&gt;
apt-get install python3 python3-pip python3-setuptools python3-wheel ninja-build&amp;lt;br&amp;gt;&lt;br /&gt;
pip3 install --user meson&amp;lt;br&amp;gt;&lt;br /&gt;
cd /usr/src&amp;lt;br&amp;gt;&lt;br /&gt;
git clone --recurse-submodules -j8 https://github.com/Seagate/openSeaChest.git&amp;lt;br&amp;gt;&lt;br /&gt;
cd openSeaChest&amp;lt;br&amp;gt;&lt;br /&gt;
/root/.local/bin/meson --buildtype=release builddir&amp;lt;br&amp;gt;&lt;br /&gt;
ninja -C builddir&amp;lt;br&amp;gt;&lt;br /&gt;
cd builddir&amp;lt;br&amp;gt;&lt;br /&gt;
./openSeaChest_Basics --scan&amp;lt;br&amp;gt;&lt;br /&gt;
./openSeaChest_PowerControl -d /dev/sg4 --showEPCSettings&amp;lt;br&amp;gt;&lt;br /&gt;
./openSeaChest_PowerControl -d /dev/sg4 --EPCfeature disable&amp;lt;br&amp;gt;&lt;br /&gt;
./openSeaChest_PowerControl -d /dev/sg4 --powerBalanceFeature disable&lt;br /&gt;
./openSeaChest_PowerControl -d /dev/sg4 --showEPCSettings&lt;/div&gt;</summary>
		<author><name>Wulf</name></author>
	</entry>
	<entry>
		<id>http://wiki.frank-wulf.de/index.php?title=Switch_off_internal_power_management_for_Seagate_hard_drives&amp;diff=614</id>
		<title>Switch off internal power management for Seagate hard drives</title>
		<link rel="alternate" type="text/html" href="http://wiki.frank-wulf.de/index.php?title=Switch_off_internal_power_management_for_Seagate_hard_drives&amp;diff=614"/>
		<updated>2023-08-03T11:29:52Z</updated>

		<summary type="html">&lt;p&gt;Wulf: Die Seite wurde neu angelegt: „apt-get install python3 python3-pip python3-setuptools python3-wheel ninja-build&amp;lt;br&amp;gt; pip3 install --user meson&amp;lt;br&amp;gt; cd /usr/src&amp;lt;br&amp;gt; git clone --recurse-submodules -j8 https://github.com/Seagate/openSeaChest.git&amp;lt;br&amp;gt; cd openSeaChest&amp;lt;br&amp;gt; /root/.local/bin/meson --buildtype=release builddir&amp;lt;br&amp;gt; ninja -C builddir&amp;lt;br&amp;gt; cd builddir&amp;lt;br&amp;gt; ./openSeaChest_Basics --scan&amp;lt;br&amp;gt; ./openSeaChest_PowerControl -d /dev/sg4 --showEPCSettings&amp;lt;br&amp;gt; ./openSeaChest_PowerControl -d /dev/…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;apt-get install python3 python3-pip python3-setuptools python3-wheel ninja-build&amp;lt;br&amp;gt;&lt;br /&gt;
pip3 install --user meson&amp;lt;br&amp;gt;&lt;br /&gt;
cd /usr/src&amp;lt;br&amp;gt;&lt;br /&gt;
git clone --recurse-submodules -j8 https://github.com/Seagate/openSeaChest.git&amp;lt;br&amp;gt;&lt;br /&gt;
cd openSeaChest&amp;lt;br&amp;gt;&lt;br /&gt;
/root/.local/bin/meson --buildtype=release builddir&amp;lt;br&amp;gt;&lt;br /&gt;
ninja -C builddir&amp;lt;br&amp;gt;&lt;br /&gt;
cd builddir&amp;lt;br&amp;gt;&lt;br /&gt;
./openSeaChest_Basics --scan&amp;lt;br&amp;gt;&lt;br /&gt;
./openSeaChest_PowerControl -d /dev/sg4 --showEPCSettings&amp;lt;br&amp;gt;&lt;br /&gt;
./openSeaChest_PowerControl -d /dev/sg4 --EPCfeature disable&amp;lt;br&amp;gt;&lt;br /&gt;
./openSeaChest_PowerControl -d /dev/sg4 --powerBalanceFeature disable&lt;br /&gt;
./openSeaChest_PowerControl -d /dev/sg4 --showEPCSettings&lt;/div&gt;</summary>
		<author><name>Wulf</name></author>
	</entry>
	<entry>
		<id>http://wiki.frank-wulf.de/index.php?title=Configuration&amp;diff=613</id>
		<title>Configuration</title>
		<link rel="alternate" type="text/html" href="http://wiki.frank-wulf.de/index.php?title=Configuration&amp;diff=613"/>
		<updated>2023-08-03T11:23:20Z</updated>

		<summary type="html">&lt;p&gt;Wulf: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* [[Avoid hard drives spinning up by SSH Login]]&lt;br /&gt;
* [[Suppress &amp;quot;No mail&amp;quot; message after SSH Login]]&lt;br /&gt;
* [[Changes/Adjustments after Upgrade from Ubuntu 18.04.6 to 20.04.1]]&lt;br /&gt;
* [[Switch off internal power management for Seagate hard drives]]&lt;/div&gt;</summary>
		<author><name>Wulf</name></author>
	</entry>
	<entry>
		<id>http://wiki.frank-wulf.de/index.php?title=Configuration&amp;diff=612</id>
		<title>Configuration</title>
		<link rel="alternate" type="text/html" href="http://wiki.frank-wulf.de/index.php?title=Configuration&amp;diff=612"/>
		<updated>2023-08-03T11:21:44Z</updated>

		<summary type="html">&lt;p&gt;Wulf: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* [[Avoid hard drives spinning up by SSH Login]]&lt;br /&gt;
* [[Suppress &amp;quot;No mail&amp;quot; message after SSH Login]]&lt;br /&gt;
* [[Changes/Adjustments after Upgrade from Ubuntu 18.04.6 to 20.04.1]]&lt;br /&gt;
* [[Switch off internal power management for Seagate hard disks]]&lt;/div&gt;</summary>
		<author><name>Wulf</name></author>
	</entry>
	<entry>
		<id>http://wiki.frank-wulf.de/index.php?title=Since_October_2017&amp;diff=611</id>
		<title>Since October 2017</title>
		<link rel="alternate" type="text/html" href="http://wiki.frank-wulf.de/index.php?title=Since_October_2017&amp;diff=611"/>
		<updated>2023-08-03T07:33:27Z</updated>

		<summary type="html">&lt;p&gt;Wulf: /* Hard Disks */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Caption: &amp;lt;span style=&amp;quot;background:cornsilk&amp;quot;&amp;gt;&#039;&#039;Changed&#039;&#039;&amp;lt;/span&amp;gt; / &amp;lt;span style=&amp;quot;background:palegreen&amp;quot;&amp;gt;&#039;&#039;Added&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Processor, Mainboard, Memory===&lt;br /&gt;
[[Datei:ASUS-Z87-Pro-Top.jpg|miniatur|253x253px|&amp;lt;span style=&amp;quot;background-color:cornsilk&amp;quot;&amp;gt;Asus Z87-PRO&amp;lt;/span&amp;gt;]]&lt;br /&gt;
*Processor: Intel i5-4690T (Quadcore, Base Frequency 2.50 GHz, Turbo Frequency 3.50 GHz, TDP 45W, LGA 1150), DOP 2015-07-15, Price 229.90 €&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span style=&amp;quot;background:cornsilk&amp;quot;&amp;gt;Mainboard: Asus Z87-PRO (C2), DOP 2013-08-27, Price 159.54 €&amp;lt;ref name=&amp;quot;Mainboard&amp;quot; /&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Memory: 16 GB (2 x 8GB Corsair Vengeance DDR3 1600 MHz, CML16GX3M2A1600C9), DOP 2015-07-20, Price 103.93 €&lt;br /&gt;
&lt;br /&gt;
===Hard Disks===&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Datei:20170824-123007-1974.jpg|&amp;lt;s&amp;gt;WD Red 4 TB No. 1&amp;lt;/s&amp;gt;&lt;br /&gt;
Datei:20170824-122856-1972.jpg|&amp;lt;s&amp;gt;WD Red 4 TB No. 2&amp;lt;/s&amp;gt;&lt;br /&gt;
Datei:20170824-123048-1976.jpg|HGST Ultrastar 10 TB No. 1&lt;br /&gt;
Datei:18-05-10 10-28-21 2259.jpg|&amp;lt;span style=&amp;quot;background-color:palegreen&amp;quot;&amp;gt;HGST Ultrastar 10 TB No. 2&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Type !! Model !! Size !! Interface !! RPM !! Transfer Rate !! MTBF hrs !! Watt Act/Idle/Sleep !! Specs || DOP&lt;br /&gt;
!Price&lt;br /&gt;
|-&lt;br /&gt;
| Intel SSD X25-M&lt;br /&gt;
| SSDSA2M120 &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 120 GB &lt;br /&gt;
| SATA 3 GB/s &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | - &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | (r/w) 250/100 MB/s&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 1.2 Mio.&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 3.0 / 0.06 / na&lt;br /&gt;
| [[Media:Ssd-intel-mlc.pdf|ssd-intel-mic.pdf]]&lt;br /&gt;
| 2011-02-18&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 205.89 €&lt;br /&gt;
|- style=&amp;quot;background-color:palegreen&amp;quot;&lt;br /&gt;
| SanDisk SSD PLUS&lt;br /&gt;
| SDSSDA-1T00-G26&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 1 TB &lt;br /&gt;
| SATA 6 GB/s &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | - &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | (r/w) 535/450 MB/s&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 1.75 Mio.&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |&lt;br /&gt;
| [[Media:Sandisk-ssd-plus.pdf|Sandisk-ssd-plus.pdf]]&lt;br /&gt;
| 2020-06-14&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 89,99 €&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;s&amp;gt;Western Digital Red&amp;lt;/s&amp;gt;&lt;br /&gt;
| &amp;lt;s&amp;gt;WD40EFRX-68W&amp;lt;/s&amp;gt;&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | &amp;lt;s&amp;gt;4 TB&amp;lt;/s&amp;gt; &lt;br /&gt;
| &amp;lt;s&amp;gt;SATA 6 GB/s&amp;lt;/s&amp;gt; &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | &amp;lt;s&amp;gt;5,400&amp;lt;/s&amp;gt; &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | &amp;lt;s&amp;gt;150 MB/s&amp;lt;/s&amp;gt;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | &amp;lt;s&amp;gt;1.0 Mio.&amp;lt;/s&amp;gt;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | &amp;lt;s&amp;gt;4.5 / 3.3 / 0.4&amp;lt;/s&amp;gt;&lt;br /&gt;
| [[Media:2879-800002.pdf|&amp;lt;s&amp;gt;2879-800002.pdf&amp;lt;/s&amp;gt;]]&lt;br /&gt;
| &amp;lt;s&amp;gt;2013-10-16&amp;lt;/s&amp;gt;&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | &amp;lt;s&amp;gt;159.78 €&amp;lt;/s&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;s&amp;gt;Western Digital Red&amp;lt;/s&amp;gt;&lt;br /&gt;
| &amp;lt;s&amp;gt;WD40EFRX-68W&amp;lt;/s&amp;gt;&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; |&amp;lt;s&amp;gt;4 TB&amp;lt;/s&amp;gt;&lt;br /&gt;
| &amp;lt;s&amp;gt;SATA 6 GB/s&amp;lt;/s&amp;gt;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |&amp;lt;s&amp;gt;5,400&amp;lt;/s&amp;gt;&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; |&amp;lt;s&amp;gt;150 MB/s&amp;lt;/s&amp;gt;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |&amp;lt;s&amp;gt;1.0 Mio.&amp;lt;/s&amp;gt;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |&amp;lt;s&amp;gt;4.5 / 3.3 / 0.4&amp;lt;/s&amp;gt;&lt;br /&gt;
| [[Media:2879-800002.pdf|&amp;lt;s&amp;gt;2879-800002.pdf&amp;lt;/s&amp;gt;]]&lt;br /&gt;
| &amp;lt;s&amp;gt;2015-07-20&amp;lt;/s&amp;gt;&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | &amp;lt;s&amp;gt;168.66&amp;lt;/s&amp;gt; €&lt;br /&gt;
|-&lt;br /&gt;
| HGST Ultrastar He10&lt;br /&gt;
| HUH721010AL &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 10 TB &lt;br /&gt;
| SATA 6 GB/s &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 7,200 &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 249 MB/s&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 2.5 Mio.&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 6.8 / 5.0 / 0.5&lt;br /&gt;
| [[Media:Ultrastar-He10-DS.pdf|Ultrastar-He10-DS.pdf]]&lt;br /&gt;
| 2017-08-22&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 325.14 €&lt;br /&gt;
|- style=&amp;quot;background-color:palegreen&amp;quot;&lt;br /&gt;
| HGST Ultrastar He10&lt;br /&gt;
| HUH721010AL &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 10 TB &lt;br /&gt;
| SATA 6 GB/s &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 7,200 &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 249 MB/s&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 2.5 Mio.&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 6.8 / 5.0 / 0.5&lt;br /&gt;
| [[Media:Ultrastar-He10-DS.pdf|Ultrastar-He10-DS.pdf]]&lt;br /&gt;
| 2018-03-19&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 313.87 €&lt;br /&gt;
|- style=&amp;quot;background-color:palegreen&amp;quot;&lt;br /&gt;
| Seagate Exos X20&lt;br /&gt;
| ST20000NM007D&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 20 TB &lt;br /&gt;
| SATA 6 GB/s &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 7,200 &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 285 MB/s&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 2.5 Mio.&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 9.4 / 5.4 / 0.9&lt;br /&gt;
| [[Media:Exos-x20-DS2080.pdf|Exos-x20-DS2080.pdf]]&lt;br /&gt;
| 2023-07-31&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 315.80 €&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Cooling===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Type !! Model !! Size !! RPM !! m³/h !! Watt || DOP&lt;br /&gt;
!Price&lt;br /&gt;
|-&lt;br /&gt;
| CPU Cooler &lt;br /&gt;
| Arctic Freezer 13 CO &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 92 mm &lt;br /&gt;
| 600 - 2,000 &lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 2.28&lt;br /&gt;
| 2015-07-31&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 29.99 €&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|-&lt;br /&gt;
| Chassis Fan (Front left)&lt;br /&gt;
| Arctic F12 PWM PST CO &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 120 mm &lt;br /&gt;
| 600 - 1,350 &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 125.7 &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 2.64&lt;br /&gt;
| 2015-07-31&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 10.09 €&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|- style=&amp;quot;background-color:palegreen&amp;quot;&lt;br /&gt;
| Chassis Fan (Front right)&lt;br /&gt;
| Arctic F12 PWM PST CO &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 120 mm &lt;br /&gt;
| 600 - 1,350&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 125.7 &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 2.64&lt;br /&gt;
| 2017-10-09&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 3.69 € &amp;lt;ref name=&amp;quot;Fan&amp;quot; /&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Chassis Fan (Rear left)&lt;br /&gt;
| Arctic F8 PWM PST CO &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 80 mm &lt;br /&gt;
| 850 - 2,000 &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 52.7 &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 1.68&lt;br /&gt;
| 2015-07-30&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 5.90 €&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|- style=&amp;quot;background-color:cornsilk&amp;quot;&lt;br /&gt;
| Chassis Fan (Rear right)&lt;br /&gt;
| Arctic F8 PWM PST CO &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 80 mm &lt;br /&gt;
| 850 - 2,000 &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 52.7 &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 1.68&lt;br /&gt;
| 2017-11-16&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 5.14 €&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Case and Power Supply===&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Datei:11-182-566-30.jpg|Front&lt;br /&gt;
Datei:544427 0 8194306.jpg|Front open&lt;br /&gt;
Datei:4u5-3.jpg|Interieur&lt;br /&gt;
Datei:17c.jpg|&amp;lt;span style=&amp;quot;background-color:palegreen&amp;quot;&amp;gt;HDD Cage&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
*Case: Codegen 4U-500 Server Case, DOP around 2005&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span style=&amp;quot;background-color:palegreen&amp;quot;&amp;gt;HDD Cage: Icy Dock Black Vortex MB074SP-1B, DOP 2017-10-09, Price 73.56 €&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Power Supply: Seasonic S12II-330 (SS-330GB), 330 Watt, 80plus, 120 mm Single-Fan, DOP around 2008&lt;br /&gt;
&lt;br /&gt;
===External Hardware===&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Datei:5637.jpg|USRobotics 5637&lt;br /&gt;
Datei:016303.jpg|Gold TEMPer&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
*USB Modem 56K USRobotics (Model USR5637), DOP 2017-05-23, Price 14.49 €&lt;br /&gt;
&lt;br /&gt;
*USB PC Thermometer (Model Gold TEMPer), DOP 2017-04-19, Price 6.49 €&lt;br /&gt;
&lt;br /&gt;
===Notes===&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;Mainboard&amp;quot;&amp;gt;Mainboard was taken from a desktop computer because it has eight SATA ports and six fan connectors whereas the Asus H81M-PLUS has only four SATA ports and two fan connectors. The replacement for the desktop computer is an Asus H87-PLUS purchased on eBay.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;Fan&amp;quot;&amp;gt;Replacement for the standard fan of the HDD Cage.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;/div&gt;</summary>
		<author><name>Wulf</name></author>
	</entry>
	<entry>
		<id>http://wiki.frank-wulf.de/index.php?title=Since_October_2017&amp;diff=610</id>
		<title>Since October 2017</title>
		<link rel="alternate" type="text/html" href="http://wiki.frank-wulf.de/index.php?title=Since_October_2017&amp;diff=610"/>
		<updated>2023-08-03T07:32:27Z</updated>

		<summary type="html">&lt;p&gt;Wulf: /* Hard Disks */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Caption: &amp;lt;span style=&amp;quot;background:cornsilk&amp;quot;&amp;gt;&#039;&#039;Changed&#039;&#039;&amp;lt;/span&amp;gt; / &amp;lt;span style=&amp;quot;background:palegreen&amp;quot;&amp;gt;&#039;&#039;Added&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Processor, Mainboard, Memory===&lt;br /&gt;
[[Datei:ASUS-Z87-Pro-Top.jpg|miniatur|253x253px|&amp;lt;span style=&amp;quot;background-color:cornsilk&amp;quot;&amp;gt;Asus Z87-PRO&amp;lt;/span&amp;gt;]]&lt;br /&gt;
*Processor: Intel i5-4690T (Quadcore, Base Frequency 2.50 GHz, Turbo Frequency 3.50 GHz, TDP 45W, LGA 1150), DOP 2015-07-15, Price 229.90 €&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span style=&amp;quot;background:cornsilk&amp;quot;&amp;gt;Mainboard: Asus Z87-PRO (C2), DOP 2013-08-27, Price 159.54 €&amp;lt;ref name=&amp;quot;Mainboard&amp;quot; /&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Memory: 16 GB (2 x 8GB Corsair Vengeance DDR3 1600 MHz, CML16GX3M2A1600C9), DOP 2015-07-20, Price 103.93 €&lt;br /&gt;
&lt;br /&gt;
===Hard Disks===&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Datei:20170824-123007-1974.jpg|WD Red 4 TB No. 1&lt;br /&gt;
Datei:20170824-122856-1972.jpg|WD Red 4 TB No. 2&lt;br /&gt;
Datei:20170824-123048-1976.jpg|HGST Ultrastar 10 TB No. 1&lt;br /&gt;
Datei:18-05-10 10-28-21 2259.jpg|&amp;lt;span style=&amp;quot;background-color:palegreen&amp;quot;&amp;gt;HGST Ultrastar 10 TB No. 2&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Type !! Model !! Size !! Interface !! RPM !! Transfer Rate !! MTBF hrs !! Watt Act/Idle/Sleep !! Specs || DOP&lt;br /&gt;
!Price&lt;br /&gt;
|-&lt;br /&gt;
| Intel SSD X25-M&lt;br /&gt;
| SSDSA2M120 &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 120 GB &lt;br /&gt;
| SATA 3 GB/s &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | - &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | (r/w) 250/100 MB/s&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 1.2 Mio.&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 3.0 / 0.06 / na&lt;br /&gt;
| [[Media:Ssd-intel-mlc.pdf|ssd-intel-mic.pdf]]&lt;br /&gt;
| 2011-02-18&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 205.89 €&lt;br /&gt;
|- style=&amp;quot;background-color:palegreen&amp;quot;&lt;br /&gt;
| SanDisk SSD PLUS&lt;br /&gt;
| SDSSDA-1T00-G26&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 1 TB &lt;br /&gt;
| SATA 6 GB/s &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | - &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | (r/w) 535/450 MB/s&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 1.75 Mio.&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |&lt;br /&gt;
| [[Media:Sandisk-ssd-plus.pdf|Sandisk-ssd-plus.pdf]]&lt;br /&gt;
| 2020-06-14&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 89,99 €&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;s&amp;gt;Western Digital Red&amp;lt;/s&amp;gt;&lt;br /&gt;
| &amp;lt;s&amp;gt;WD40EFRX-68W&amp;lt;/s&amp;gt;&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | &amp;lt;s&amp;gt;4 TB&amp;lt;/s&amp;gt; &lt;br /&gt;
| &amp;lt;s&amp;gt;SATA 6 GB/s&amp;lt;/s&amp;gt; &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | &amp;lt;s&amp;gt;5,400&amp;lt;/s&amp;gt; &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | &amp;lt;s&amp;gt;150 MB/s&amp;lt;/s&amp;gt;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | &amp;lt;s&amp;gt;1.0 Mio.&amp;lt;/s&amp;gt;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | &amp;lt;s&amp;gt;4.5 / 3.3 / 0.4&amp;lt;/s&amp;gt;&lt;br /&gt;
| [[Media:2879-800002.pdf|&amp;lt;s&amp;gt;2879-800002.pdf&amp;lt;/s&amp;gt;]]&lt;br /&gt;
| &amp;lt;s&amp;gt;2013-10-16&amp;lt;/s&amp;gt;&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | &amp;lt;s&amp;gt;159.78 €&amp;lt;/s&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;s&amp;gt;Western Digital Red&amp;lt;/s&amp;gt;&lt;br /&gt;
| &amp;lt;s&amp;gt;WD40EFRX-68W&amp;lt;/s&amp;gt;&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; |&amp;lt;s&amp;gt;4 TB&amp;lt;/s&amp;gt;&lt;br /&gt;
| &amp;lt;s&amp;gt;SATA 6 GB/s&amp;lt;/s&amp;gt;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |&amp;lt;s&amp;gt;5,400&amp;lt;/s&amp;gt;&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; |&amp;lt;s&amp;gt;150 MB/s&amp;lt;/s&amp;gt;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |&amp;lt;s&amp;gt;1.0 Mio.&amp;lt;/s&amp;gt;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |&amp;lt;s&amp;gt;4.5 / 3.3 / 0.4&amp;lt;/s&amp;gt;&lt;br /&gt;
| [[Media:2879-800002.pdf|&amp;lt;s&amp;gt;2879-800002.pdf&amp;lt;/s&amp;gt;]]&lt;br /&gt;
| &amp;lt;s&amp;gt;2015-07-20&amp;lt;/s&amp;gt;&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | &amp;lt;s&amp;gt;168.66&amp;lt;/s&amp;gt; €&lt;br /&gt;
|-&lt;br /&gt;
| HGST Ultrastar He10&lt;br /&gt;
| HUH721010AL &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 10 TB &lt;br /&gt;
| SATA 6 GB/s &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 7,200 &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 249 MB/s&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 2.5 Mio.&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 6.8 / 5.0 / 0.5&lt;br /&gt;
| [[Media:Ultrastar-He10-DS.pdf|Ultrastar-He10-DS.pdf]]&lt;br /&gt;
| 2017-08-22&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 325.14 €&lt;br /&gt;
|- style=&amp;quot;background-color:palegreen&amp;quot;&lt;br /&gt;
| HGST Ultrastar He10&lt;br /&gt;
| HUH721010AL &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 10 TB &lt;br /&gt;
| SATA 6 GB/s &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 7,200 &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 249 MB/s&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 2.5 Mio.&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 6.8 / 5.0 / 0.5&lt;br /&gt;
| [[Media:Ultrastar-He10-DS.pdf|Ultrastar-He10-DS.pdf]]&lt;br /&gt;
| 2018-03-19&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 313.87 €&lt;br /&gt;
|- style=&amp;quot;background-color:palegreen&amp;quot;&lt;br /&gt;
| Seagate Exos X20&lt;br /&gt;
| ST20000NM007D&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 20 TB &lt;br /&gt;
| SATA 6 GB/s &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 7,200 &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 285 MB/s&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 2.5 Mio.&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 9.4 / 5.4 / 0.9&lt;br /&gt;
| [[Media:Exos-x20-DS2080.pdf|Exos-x20-DS2080.pdf]]&lt;br /&gt;
| 2023-07-31&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 315.80 €&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Cooling===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Type !! Model !! Size !! RPM !! m³/h !! Watt || DOP&lt;br /&gt;
!Price&lt;br /&gt;
|-&lt;br /&gt;
| CPU Cooler &lt;br /&gt;
| Arctic Freezer 13 CO &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 92 mm &lt;br /&gt;
| 600 - 2,000 &lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 2.28&lt;br /&gt;
| 2015-07-31&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 29.99 €&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|-&lt;br /&gt;
| Chassis Fan (Front left)&lt;br /&gt;
| Arctic F12 PWM PST CO &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 120 mm &lt;br /&gt;
| 600 - 1,350 &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 125.7 &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 2.64&lt;br /&gt;
| 2015-07-31&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 10.09 €&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|- style=&amp;quot;background-color:palegreen&amp;quot;&lt;br /&gt;
| Chassis Fan (Front right)&lt;br /&gt;
| Arctic F12 PWM PST CO &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 120 mm &lt;br /&gt;
| 600 - 1,350&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 125.7 &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 2.64&lt;br /&gt;
| 2017-10-09&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 3.69 € &amp;lt;ref name=&amp;quot;Fan&amp;quot; /&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Chassis Fan (Rear left)&lt;br /&gt;
| Arctic F8 PWM PST CO &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 80 mm &lt;br /&gt;
| 850 - 2,000 &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 52.7 &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 1.68&lt;br /&gt;
| 2015-07-30&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 5.90 €&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|- style=&amp;quot;background-color:cornsilk&amp;quot;&lt;br /&gt;
| Chassis Fan (Rear right)&lt;br /&gt;
| Arctic F8 PWM PST CO &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 80 mm &lt;br /&gt;
| 850 - 2,000 &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 52.7 &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 1.68&lt;br /&gt;
| 2017-11-16&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 5.14 €&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Case and Power Supply===&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Datei:11-182-566-30.jpg|Front&lt;br /&gt;
Datei:544427 0 8194306.jpg|Front open&lt;br /&gt;
Datei:4u5-3.jpg|Interieur&lt;br /&gt;
Datei:17c.jpg|&amp;lt;span style=&amp;quot;background-color:palegreen&amp;quot;&amp;gt;HDD Cage&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
*Case: Codegen 4U-500 Server Case, DOP around 2005&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span style=&amp;quot;background-color:palegreen&amp;quot;&amp;gt;HDD Cage: Icy Dock Black Vortex MB074SP-1B, DOP 2017-10-09, Price 73.56 €&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Power Supply: Seasonic S12II-330 (SS-330GB), 330 Watt, 80plus, 120 mm Single-Fan, DOP around 2008&lt;br /&gt;
&lt;br /&gt;
===External Hardware===&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Datei:5637.jpg|USRobotics 5637&lt;br /&gt;
Datei:016303.jpg|Gold TEMPer&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
*USB Modem 56K USRobotics (Model USR5637), DOP 2017-05-23, Price 14.49 €&lt;br /&gt;
&lt;br /&gt;
*USB PC Thermometer (Model Gold TEMPer), DOP 2017-04-19, Price 6.49 €&lt;br /&gt;
&lt;br /&gt;
===Notes===&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;Mainboard&amp;quot;&amp;gt;Mainboard was taken from a desktop computer because it has eight SATA ports and six fan connectors whereas the Asus H81M-PLUS has only four SATA ports and two fan connectors. The replacement for the desktop computer is an Asus H87-PLUS purchased on eBay.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;Fan&amp;quot;&amp;gt;Replacement for the standard fan of the HDD Cage.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;/div&gt;</summary>
		<author><name>Wulf</name></author>
	</entry>
	<entry>
		<id>http://wiki.frank-wulf.de/index.php?title=Since_October_2017&amp;diff=609</id>
		<title>Since October 2017</title>
		<link rel="alternate" type="text/html" href="http://wiki.frank-wulf.de/index.php?title=Since_October_2017&amp;diff=609"/>
		<updated>2023-08-03T07:24:25Z</updated>

		<summary type="html">&lt;p&gt;Wulf: /* Hard Disks */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Caption: &amp;lt;span style=&amp;quot;background:cornsilk&amp;quot;&amp;gt;&#039;&#039;Changed&#039;&#039;&amp;lt;/span&amp;gt; / &amp;lt;span style=&amp;quot;background:palegreen&amp;quot;&amp;gt;&#039;&#039;Added&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Processor, Mainboard, Memory===&lt;br /&gt;
[[Datei:ASUS-Z87-Pro-Top.jpg|miniatur|253x253px|&amp;lt;span style=&amp;quot;background-color:cornsilk&amp;quot;&amp;gt;Asus Z87-PRO&amp;lt;/span&amp;gt;]]&lt;br /&gt;
*Processor: Intel i5-4690T (Quadcore, Base Frequency 2.50 GHz, Turbo Frequency 3.50 GHz, TDP 45W, LGA 1150), DOP 2015-07-15, Price 229.90 €&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span style=&amp;quot;background:cornsilk&amp;quot;&amp;gt;Mainboard: Asus Z87-PRO (C2), DOP 2013-08-27, Price 159.54 €&amp;lt;ref name=&amp;quot;Mainboard&amp;quot; /&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Memory: 16 GB (2 x 8GB Corsair Vengeance DDR3 1600 MHz, CML16GX3M2A1600C9), DOP 2015-07-20, Price 103.93 €&lt;br /&gt;
&lt;br /&gt;
===Hard Disks===&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Datei:20170824-123007-1974.jpg|WD Red 4 TB No. 1&lt;br /&gt;
Datei:20170824-122856-1972.jpg|WD Red 4 TB No. 2&lt;br /&gt;
Datei:20170824-123048-1976.jpg|HGST Ultrastar 10 TB No. 1&lt;br /&gt;
Datei:18-05-10 10-28-21 2259.jpg|&amp;lt;span style=&amp;quot;background-color:palegreen&amp;quot;&amp;gt;HGST Ultrastar 10 TB No. 2&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Type !! Model !! Size !! Interface !! RPM !! Transfer Rate !! MTBF hrs !! Watt Act/Idle/Sleep !! Specs || DOP&lt;br /&gt;
!Price&lt;br /&gt;
|-&lt;br /&gt;
| Intel SSD X25-M&lt;br /&gt;
| SSDSA2M120 &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 120 GB &lt;br /&gt;
| SATA 3 GB/s &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | - &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | (r/w) 250/100 MB/s&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 1.2 Mio.&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 3.0 / 0.06 / na&lt;br /&gt;
| [[Media:Ssd-intel-mlc.pdf|ssd-intel-mic.pdf]]&lt;br /&gt;
| 2011-02-18&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 205.89 €&lt;br /&gt;
|- style=&amp;quot;background-color:palegreen&amp;quot;&lt;br /&gt;
| SanDisk SSD PLUS&lt;br /&gt;
| SDSSDA-1T00-G26&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 1 TB &lt;br /&gt;
| SATA 6 GB/s &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | - &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | (r/w) 535/450 MB/s&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 1.75 Mio.&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |&lt;br /&gt;
| [[Media:Sandisk-ssd-plus.pdf|Sandisk-ssd-plus.pdf]]&lt;br /&gt;
| 2020-06-14&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 89,99 €&lt;br /&gt;
|-&lt;br /&gt;
| Western Digital Red&lt;br /&gt;
| WD40EFRX-68W&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 4 TB &lt;br /&gt;
| SATA 6 GB/s &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 5,400 &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 150 MB/s&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 1.0 Mio.&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 4.5 / 3.3 / 0.4&lt;br /&gt;
| [[Media:2879-800002.pdf|2879-800002.pdf]]&lt;br /&gt;
| 2013-10-16&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 159.78 €&lt;br /&gt;
|-&lt;br /&gt;
|Western Digital Red&lt;br /&gt;
|WD40EFRX-68W&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; |4 TB&lt;br /&gt;
|SATA 6 GB/s&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |5,400&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; |150 MB/s&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |1.0 Mio.&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |4.5 / 3.3 / 0.4&lt;br /&gt;
| [[Media:2879-800002.pdf|2879-800002.pdf]]&lt;br /&gt;
| 2015-07-20&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 168.66 €&lt;br /&gt;
|-&lt;br /&gt;
| HGST Ultrastar He10&lt;br /&gt;
| HUH721010AL &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 10 TB &lt;br /&gt;
| SATA 6 GB/s &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 7,200 &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 249 MB/s&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 2.5 Mio.&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 6.8 / 5.0 / 0.5&lt;br /&gt;
| [[Media:Ultrastar-He10-DS.pdf|Ultrastar-He10-DS.pdf]]&lt;br /&gt;
| 2017-08-22&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 325.14 €&lt;br /&gt;
|- style=&amp;quot;background-color:palegreen&amp;quot;&lt;br /&gt;
| HGST Ultrastar He10&lt;br /&gt;
| HUH721010AL &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 10 TB &lt;br /&gt;
| SATA 6 GB/s &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 7,200 &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 249 MB/s&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 2.5 Mio.&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 6.8 / 5.0 / 0.5&lt;br /&gt;
| [[Media:Ultrastar-He10-DS.pdf|Ultrastar-He10-DS.pdf]]&lt;br /&gt;
| 2018-03-19&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 313.87 €&lt;br /&gt;
|- style=&amp;quot;background-color:palegreen&amp;quot;&lt;br /&gt;
| Seagate Exos X20&lt;br /&gt;
| ST20000NM007D&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 20 TB &lt;br /&gt;
| SATA 6 GB/s &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 7,200 &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 285 MB/s&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 2.5 Mio.&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 9.4 / 5.4 / 0.9&lt;br /&gt;
| [[Media:Exos-x20-DS2080.pdf|Exos-x20-DS2080.pdf]]&lt;br /&gt;
| 2023-07-31&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 315.80 €&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Cooling===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Type !! Model !! Size !! RPM !! m³/h !! Watt || DOP&lt;br /&gt;
!Price&lt;br /&gt;
|-&lt;br /&gt;
| CPU Cooler &lt;br /&gt;
| Arctic Freezer 13 CO &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 92 mm &lt;br /&gt;
| 600 - 2,000 &lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 2.28&lt;br /&gt;
| 2015-07-31&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 29.99 €&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|-&lt;br /&gt;
| Chassis Fan (Front left)&lt;br /&gt;
| Arctic F12 PWM PST CO &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 120 mm &lt;br /&gt;
| 600 - 1,350 &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 125.7 &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 2.64&lt;br /&gt;
| 2015-07-31&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 10.09 €&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|- style=&amp;quot;background-color:palegreen&amp;quot;&lt;br /&gt;
| Chassis Fan (Front right)&lt;br /&gt;
| Arctic F12 PWM PST CO &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 120 mm &lt;br /&gt;
| 600 - 1,350&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 125.7 &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 2.64&lt;br /&gt;
| 2017-10-09&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 3.69 € &amp;lt;ref name=&amp;quot;Fan&amp;quot; /&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Chassis Fan (Rear left)&lt;br /&gt;
| Arctic F8 PWM PST CO &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 80 mm &lt;br /&gt;
| 850 - 2,000 &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 52.7 &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 1.68&lt;br /&gt;
| 2015-07-30&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 5.90 €&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|- style=&amp;quot;background-color:cornsilk&amp;quot;&lt;br /&gt;
| Chassis Fan (Rear right)&lt;br /&gt;
| Arctic F8 PWM PST CO &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 80 mm &lt;br /&gt;
| 850 - 2,000 &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 52.7 &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 1.68&lt;br /&gt;
| 2017-11-16&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 5.14 €&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Case and Power Supply===&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Datei:11-182-566-30.jpg|Front&lt;br /&gt;
Datei:544427 0 8194306.jpg|Front open&lt;br /&gt;
Datei:4u5-3.jpg|Interieur&lt;br /&gt;
Datei:17c.jpg|&amp;lt;span style=&amp;quot;background-color:palegreen&amp;quot;&amp;gt;HDD Cage&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
*Case: Codegen 4U-500 Server Case, DOP around 2005&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span style=&amp;quot;background-color:palegreen&amp;quot;&amp;gt;HDD Cage: Icy Dock Black Vortex MB074SP-1B, DOP 2017-10-09, Price 73.56 €&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Power Supply: Seasonic S12II-330 (SS-330GB), 330 Watt, 80plus, 120 mm Single-Fan, DOP around 2008&lt;br /&gt;
&lt;br /&gt;
===External Hardware===&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Datei:5637.jpg|USRobotics 5637&lt;br /&gt;
Datei:016303.jpg|Gold TEMPer&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
*USB Modem 56K USRobotics (Model USR5637), DOP 2017-05-23, Price 14.49 €&lt;br /&gt;
&lt;br /&gt;
*USB PC Thermometer (Model Gold TEMPer), DOP 2017-04-19, Price 6.49 €&lt;br /&gt;
&lt;br /&gt;
===Notes===&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;Mainboard&amp;quot;&amp;gt;Mainboard was taken from a desktop computer because it has eight SATA ports and six fan connectors whereas the Asus H81M-PLUS has only four SATA ports and two fan connectors. The replacement for the desktop computer is an Asus H87-PLUS purchased on eBay.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;Fan&amp;quot;&amp;gt;Replacement for the standard fan of the HDD Cage.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;/div&gt;</summary>
		<author><name>Wulf</name></author>
	</entry>
	<entry>
		<id>http://wiki.frank-wulf.de/index.php?title=Since_October_2017&amp;diff=608</id>
		<title>Since October 2017</title>
		<link rel="alternate" type="text/html" href="http://wiki.frank-wulf.de/index.php?title=Since_October_2017&amp;diff=608"/>
		<updated>2023-08-03T07:23:32Z</updated>

		<summary type="html">&lt;p&gt;Wulf: /* Hard Disks */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Caption: &amp;lt;span style=&amp;quot;background:cornsilk&amp;quot;&amp;gt;&#039;&#039;Changed&#039;&#039;&amp;lt;/span&amp;gt; / &amp;lt;span style=&amp;quot;background:palegreen&amp;quot;&amp;gt;&#039;&#039;Added&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Processor, Mainboard, Memory===&lt;br /&gt;
[[Datei:ASUS-Z87-Pro-Top.jpg|miniatur|253x253px|&amp;lt;span style=&amp;quot;background-color:cornsilk&amp;quot;&amp;gt;Asus Z87-PRO&amp;lt;/span&amp;gt;]]&lt;br /&gt;
*Processor: Intel i5-4690T (Quadcore, Base Frequency 2.50 GHz, Turbo Frequency 3.50 GHz, TDP 45W, LGA 1150), DOP 2015-07-15, Price 229.90 €&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span style=&amp;quot;background:cornsilk&amp;quot;&amp;gt;Mainboard: Asus Z87-PRO (C2), DOP 2013-08-27, Price 159.54 €&amp;lt;ref name=&amp;quot;Mainboard&amp;quot; /&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Memory: 16 GB (2 x 8GB Corsair Vengeance DDR3 1600 MHz, CML16GX3M2A1600C9), DOP 2015-07-20, Price 103.93 €&lt;br /&gt;
&lt;br /&gt;
===Hard Disks===&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Datei:20170824-123007-1974.jpg|WD Red 4 TB No. 1&lt;br /&gt;
Datei:20170824-122856-1972.jpg|WD Red 4 TB No. 2&lt;br /&gt;
Datei:20170824-123048-1976.jpg|HGST Ultrastar 10 TB No. 1&lt;br /&gt;
Datei:18-05-10 10-28-21 2259.jpg|&amp;lt;span style=&amp;quot;background-color:palegreen&amp;quot;&amp;gt;HGST Ultrastar 10 TB No. 2&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Type !! Model !! Size !! Interface !! RPM !! Transfer Rate !! MTBF hrs !! Watt Act/Idle/Sleep !! Specs || DOP&lt;br /&gt;
!Price&lt;br /&gt;
|-&lt;br /&gt;
| Intel SSD X25-M&lt;br /&gt;
| SSDSA2M120 &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 120 GB &lt;br /&gt;
| SATA 3 GB/s &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | - &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | (r/w) 250/100 MB/s&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 1.2 Mio.&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 3.0 / 0.06 / na&lt;br /&gt;
| [[Media:Ssd-intel-mlc.pdf|ssd-intel-mic.pdf]]&lt;br /&gt;
| 2011-02-18&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 205.89 €&lt;br /&gt;
|- style=&amp;quot;background-color:palegreen&amp;quot;&lt;br /&gt;
| SanDisk SSD PLUS&lt;br /&gt;
| SDSSDA-1T00-G26&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 1 TB &lt;br /&gt;
| SATA 6 GB/s &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | - &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | (r/w) 535/450 MB/s&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 1.75 Mio.&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |&lt;br /&gt;
| [[Media:Sandisk-ssd-plus.pdf|Sandisk-ssd-plus.pdf]]&lt;br /&gt;
| 2020-06-14&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 89,99 €&lt;br /&gt;
|-&lt;br /&gt;
| Western Digital Red&lt;br /&gt;
| WD40EFRX-68W&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 4 TB &lt;br /&gt;
| SATA 6 GB/s &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 5,400 &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 150 MB/s&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 1.0 Mio.&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 4.5 / 3.3 / 0.4&lt;br /&gt;
| [[Media:2879-800002.pdf|2879-800002.pdf]]&lt;br /&gt;
| 2013-10-16&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 159.78 €&lt;br /&gt;
|-&lt;br /&gt;
|Western Digital Red&lt;br /&gt;
|WD40EFRX-68W&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; |4 TB&lt;br /&gt;
|SATA 6 GB/s&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |5,400&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; |150 MB/s&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |1.0 Mio.&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |4.5 / 3.3 / 0.4&lt;br /&gt;
| [[Media:2879-800002.pdf|2879-800002.pdf]]&lt;br /&gt;
| 2015-07-20&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 168.66 €&lt;br /&gt;
|-&lt;br /&gt;
| HGST Ultrastar He10&lt;br /&gt;
| HUH721010AL &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 10 TB &lt;br /&gt;
| SATA 6 GB/s &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 7,200 &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 249 MB/s&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 2.5 Mio.&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 6.8 / 5.0 / 0.5&lt;br /&gt;
| [[Media:Ultrastar-He10-DS.pdf|Ultrastar-He10-DS.pdf]]&lt;br /&gt;
| 2017-08-22&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 325.14 €&lt;br /&gt;
|- style=&amp;quot;background-color:palegreen&amp;quot;&lt;br /&gt;
| HGST Ultrastar He10&lt;br /&gt;
| HUH721010AL &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 10 TB &lt;br /&gt;
| SATA 6 GB/s &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 7,200 &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 249 MB/s&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 2.5 Mio.&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 6.8 / 5.0 / 0.5&lt;br /&gt;
| [[Media:Ultrastar-He10-DS.pdf|Ultrastar-He10-DS.pdf]]&lt;br /&gt;
| 2018-03-19&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 313.87 €&lt;br /&gt;
|- style=&amp;quot;background-color:palegreen&amp;quot;&lt;br /&gt;
| Seagate Exos X20&lt;br /&gt;
| ST20000NM007D&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 20 TB &lt;br /&gt;
| SATA 6 GB/s &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 7,200 &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 285 MB/s&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 2.5 Mio.&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 9.4 / 5.4 / 0.9&lt;br /&gt;
| [[Exos-x20-DS2080.pdf|Exos-x20-DS2080.pdf]]&lt;br /&gt;
| 2023-07-31&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 315.80 €&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Cooling===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Type !! Model !! Size !! RPM !! m³/h !! Watt || DOP&lt;br /&gt;
!Price&lt;br /&gt;
|-&lt;br /&gt;
| CPU Cooler &lt;br /&gt;
| Arctic Freezer 13 CO &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 92 mm &lt;br /&gt;
| 600 - 2,000 &lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 2.28&lt;br /&gt;
| 2015-07-31&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 29.99 €&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|-&lt;br /&gt;
| Chassis Fan (Front left)&lt;br /&gt;
| Arctic F12 PWM PST CO &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 120 mm &lt;br /&gt;
| 600 - 1,350 &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 125.7 &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 2.64&lt;br /&gt;
| 2015-07-31&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 10.09 €&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|- style=&amp;quot;background-color:palegreen&amp;quot;&lt;br /&gt;
| Chassis Fan (Front right)&lt;br /&gt;
| Arctic F12 PWM PST CO &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 120 mm &lt;br /&gt;
| 600 - 1,350&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 125.7 &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 2.64&lt;br /&gt;
| 2017-10-09&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 3.69 € &amp;lt;ref name=&amp;quot;Fan&amp;quot; /&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Chassis Fan (Rear left)&lt;br /&gt;
| Arctic F8 PWM PST CO &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 80 mm &lt;br /&gt;
| 850 - 2,000 &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 52.7 &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 1.68&lt;br /&gt;
| 2015-07-30&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 5.90 €&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|- style=&amp;quot;background-color:cornsilk&amp;quot;&lt;br /&gt;
| Chassis Fan (Rear right)&lt;br /&gt;
| Arctic F8 PWM PST CO &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 80 mm &lt;br /&gt;
| 850 - 2,000 &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 52.7 &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 1.68&lt;br /&gt;
| 2017-11-16&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 5.14 €&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Case and Power Supply===&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Datei:11-182-566-30.jpg|Front&lt;br /&gt;
Datei:544427 0 8194306.jpg|Front open&lt;br /&gt;
Datei:4u5-3.jpg|Interieur&lt;br /&gt;
Datei:17c.jpg|&amp;lt;span style=&amp;quot;background-color:palegreen&amp;quot;&amp;gt;HDD Cage&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
*Case: Codegen 4U-500 Server Case, DOP around 2005&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span style=&amp;quot;background-color:palegreen&amp;quot;&amp;gt;HDD Cage: Icy Dock Black Vortex MB074SP-1B, DOP 2017-10-09, Price 73.56 €&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Power Supply: Seasonic S12II-330 (SS-330GB), 330 Watt, 80plus, 120 mm Single-Fan, DOP around 2008&lt;br /&gt;
&lt;br /&gt;
===External Hardware===&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Datei:5637.jpg|USRobotics 5637&lt;br /&gt;
Datei:016303.jpg|Gold TEMPer&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
*USB Modem 56K USRobotics (Model USR5637), DOP 2017-05-23, Price 14.49 €&lt;br /&gt;
&lt;br /&gt;
*USB PC Thermometer (Model Gold TEMPer), DOP 2017-04-19, Price 6.49 €&lt;br /&gt;
&lt;br /&gt;
===Notes===&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;Mainboard&amp;quot;&amp;gt;Mainboard was taken from a desktop computer because it has eight SATA ports and six fan connectors whereas the Asus H81M-PLUS has only four SATA ports and two fan connectors. The replacement for the desktop computer is an Asus H87-PLUS purchased on eBay.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;Fan&amp;quot;&amp;gt;Replacement for the standard fan of the HDD Cage.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;/div&gt;</summary>
		<author><name>Wulf</name></author>
	</entry>
	<entry>
		<id>http://wiki.frank-wulf.de/index.php?title=Datei:Exos-x20-DS2080.pdf&amp;diff=607</id>
		<title>Datei:Exos-x20-DS2080.pdf</title>
		<link rel="alternate" type="text/html" href="http://wiki.frank-wulf.de/index.php?title=Datei:Exos-x20-DS2080.pdf&amp;diff=607"/>
		<updated>2023-08-03T07:22:08Z</updated>

		<summary type="html">&lt;p&gt;Wulf: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Wulf</name></author>
	</entry>
	<entry>
		<id>http://wiki.frank-wulf.de/index.php?title=Since_October_2017&amp;diff=606</id>
		<title>Since October 2017</title>
		<link rel="alternate" type="text/html" href="http://wiki.frank-wulf.de/index.php?title=Since_October_2017&amp;diff=606"/>
		<updated>2023-08-03T07:19:55Z</updated>

		<summary type="html">&lt;p&gt;Wulf: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Caption: &amp;lt;span style=&amp;quot;background:cornsilk&amp;quot;&amp;gt;&#039;&#039;Changed&#039;&#039;&amp;lt;/span&amp;gt; / &amp;lt;span style=&amp;quot;background:palegreen&amp;quot;&amp;gt;&#039;&#039;Added&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Processor, Mainboard, Memory===&lt;br /&gt;
[[Datei:ASUS-Z87-Pro-Top.jpg|miniatur|253x253px|&amp;lt;span style=&amp;quot;background-color:cornsilk&amp;quot;&amp;gt;Asus Z87-PRO&amp;lt;/span&amp;gt;]]&lt;br /&gt;
*Processor: Intel i5-4690T (Quadcore, Base Frequency 2.50 GHz, Turbo Frequency 3.50 GHz, TDP 45W, LGA 1150), DOP 2015-07-15, Price 229.90 €&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span style=&amp;quot;background:cornsilk&amp;quot;&amp;gt;Mainboard: Asus Z87-PRO (C2), DOP 2013-08-27, Price 159.54 €&amp;lt;ref name=&amp;quot;Mainboard&amp;quot; /&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Memory: 16 GB (2 x 8GB Corsair Vengeance DDR3 1600 MHz, CML16GX3M2A1600C9), DOP 2015-07-20, Price 103.93 €&lt;br /&gt;
&lt;br /&gt;
===Hard Disks===&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Datei:20170824-123007-1974.jpg|WD Red 4 TB No. 1&lt;br /&gt;
Datei:20170824-122856-1972.jpg|WD Red 4 TB No. 2&lt;br /&gt;
Datei:20170824-123048-1976.jpg|HGST Ultrastar 10 TB No. 1&lt;br /&gt;
Datei:18-05-10 10-28-21 2259.jpg|&amp;lt;span style=&amp;quot;background-color:palegreen&amp;quot;&amp;gt;HGST Ultrastar 10 TB No. 2&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Type !! Model !! Size !! Interface !! RPM !! Transfer Rate !! MTBF hrs !! Watt Act/Idle/Sleep !! Specs || DOP&lt;br /&gt;
!Price&lt;br /&gt;
|-&lt;br /&gt;
| Intel SSD X25-M&lt;br /&gt;
| SSDSA2M120 &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 120 GB &lt;br /&gt;
| SATA 3 GB/s &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | - &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | (r/w) 250/100 MB/s&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 1.2 Mio.&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 3.0 / 0.06 / na&lt;br /&gt;
| [[Media:Ssd-intel-mlc.pdf|ssd-intel-mic.pdf]]&lt;br /&gt;
| 2011-02-18&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 205.89 €&lt;br /&gt;
|- style=&amp;quot;background-color:palegreen&amp;quot;&lt;br /&gt;
| SanDisk SSD PLUS&lt;br /&gt;
| SDSSDA-1T00-G26&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 1 TB &lt;br /&gt;
| SATA 6 GB/s &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | - &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | (r/w) 535/450 MB/s&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 1.75 Mio.&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |&lt;br /&gt;
| [[Media:Sandisk-ssd-plus.pdf|Sandisk-ssd-plus.pdf]]&lt;br /&gt;
| 2020-06-14&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 89,99 €&lt;br /&gt;
|-&lt;br /&gt;
| Western Digital Red&lt;br /&gt;
| WD40EFRX-68W&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 4 TB &lt;br /&gt;
| SATA 6 GB/s &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 5,400 &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 150 MB/s&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 1.0 Mio.&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 4.5 / 3.3 / 0.4&lt;br /&gt;
| [[Media:2879-800002.pdf|2879-800002.pdf]]&lt;br /&gt;
| 2013-10-16&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 159.78 €&lt;br /&gt;
|-&lt;br /&gt;
|Western Digital Red&lt;br /&gt;
|WD40EFRX-68W&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; |4 TB&lt;br /&gt;
|SATA 6 GB/s&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |5,400&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; |150 MB/s&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |1.0 Mio.&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |4.5 / 3.3 / 0.4&lt;br /&gt;
| [[Media:2879-800002.pdf|2879-800002.pdf]]&lt;br /&gt;
| 2015-07-20&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 168.66 €&lt;br /&gt;
|-&lt;br /&gt;
| HGST Ultrastar He10&lt;br /&gt;
| HUH721010AL &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 10 TB &lt;br /&gt;
| SATA 6 GB/s &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 7,200 &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 249 MB/s&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 2.5 Mio.&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 6.8 / 5.0 / 0.5&lt;br /&gt;
| [[Media:Ultrastar-He10-DS.pdf|Ultrastar-He10-DS.pdf]]&lt;br /&gt;
| 2017-08-22&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 325.14 €&lt;br /&gt;
|- style=&amp;quot;background-color:palegreen&amp;quot;&lt;br /&gt;
| HGST Ultrastar He10&lt;br /&gt;
| HUH721010AL &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 10 TB &lt;br /&gt;
| SATA 6 GB/s &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 7,200 &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 249 MB/s&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 2.5 Mio.&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 6.8 / 5.0 / 0.5&lt;br /&gt;
| [[Media:Ultrastar-He10-DS.pdf|Ultrastar-He10-DS.pdf]]&lt;br /&gt;
| 2018-03-19&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 313.87 €&lt;br /&gt;
|- style=&amp;quot;background-color:palegreen&amp;quot;&lt;br /&gt;
| Seagate Exos X20&lt;br /&gt;
| ST20000NM007D&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 20 TB &lt;br /&gt;
| SATA 6 GB/s &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 7,200 &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 285 MB/s&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 2.5 Mio.&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 9.4 / 5.4 / 0.9&lt;br /&gt;
| [[Exos-x20-channel-DS2080.pdf|Exos-x20-channel-DS2080.pdf]]&lt;br /&gt;
| 2023-07-31&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 315.80 €&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Cooling===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Type !! Model !! Size !! RPM !! m³/h !! Watt || DOP&lt;br /&gt;
!Price&lt;br /&gt;
|-&lt;br /&gt;
| CPU Cooler &lt;br /&gt;
| Arctic Freezer 13 CO &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 92 mm &lt;br /&gt;
| 600 - 2,000 &lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 2.28&lt;br /&gt;
| 2015-07-31&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 29.99 €&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|-&lt;br /&gt;
| Chassis Fan (Front left)&lt;br /&gt;
| Arctic F12 PWM PST CO &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 120 mm &lt;br /&gt;
| 600 - 1,350 &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 125.7 &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 2.64&lt;br /&gt;
| 2015-07-31&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 10.09 €&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|- style=&amp;quot;background-color:palegreen&amp;quot;&lt;br /&gt;
| Chassis Fan (Front right)&lt;br /&gt;
| Arctic F12 PWM PST CO &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 120 mm &lt;br /&gt;
| 600 - 1,350&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 125.7 &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 2.64&lt;br /&gt;
| 2017-10-09&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 3.69 € &amp;lt;ref name=&amp;quot;Fan&amp;quot; /&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Chassis Fan (Rear left)&lt;br /&gt;
| Arctic F8 PWM PST CO &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 80 mm &lt;br /&gt;
| 850 - 2,000 &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 52.7 &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 1.68&lt;br /&gt;
| 2015-07-30&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 5.90 €&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|- style=&amp;quot;background-color:cornsilk&amp;quot;&lt;br /&gt;
| Chassis Fan (Rear right)&lt;br /&gt;
| Arctic F8 PWM PST CO &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 80 mm &lt;br /&gt;
| 850 - 2,000 &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 52.7 &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 1.68&lt;br /&gt;
| 2017-11-16&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 5.14 €&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Case and Power Supply===&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Datei:11-182-566-30.jpg|Front&lt;br /&gt;
Datei:544427 0 8194306.jpg|Front open&lt;br /&gt;
Datei:4u5-3.jpg|Interieur&lt;br /&gt;
Datei:17c.jpg|&amp;lt;span style=&amp;quot;background-color:palegreen&amp;quot;&amp;gt;HDD Cage&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
*Case: Codegen 4U-500 Server Case, DOP around 2005&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span style=&amp;quot;background-color:palegreen&amp;quot;&amp;gt;HDD Cage: Icy Dock Black Vortex MB074SP-1B, DOP 2017-10-09, Price 73.56 €&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Power Supply: Seasonic S12II-330 (SS-330GB), 330 Watt, 80plus, 120 mm Single-Fan, DOP around 2008&lt;br /&gt;
&lt;br /&gt;
===External Hardware===&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Datei:5637.jpg|USRobotics 5637&lt;br /&gt;
Datei:016303.jpg|Gold TEMPer&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
*USB Modem 56K USRobotics (Model USR5637), DOP 2017-05-23, Price 14.49 €&lt;br /&gt;
&lt;br /&gt;
*USB PC Thermometer (Model Gold TEMPer), DOP 2017-04-19, Price 6.49 €&lt;br /&gt;
&lt;br /&gt;
===Notes===&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;Mainboard&amp;quot;&amp;gt;Mainboard was taken from a desktop computer because it has eight SATA ports and six fan connectors whereas the Asus H81M-PLUS has only four SATA ports and two fan connectors. The replacement for the desktop computer is an Asus H87-PLUS purchased on eBay.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;Fan&amp;quot;&amp;gt;Replacement for the standard fan of the HDD Cage.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;/div&gt;</summary>
		<author><name>Wulf</name></author>
	</entry>
	<entry>
		<id>http://wiki.frank-wulf.de/index.php?title=Since_October_2017&amp;diff=603</id>
		<title>Since October 2017</title>
		<link rel="alternate" type="text/html" href="http://wiki.frank-wulf.de/index.php?title=Since_October_2017&amp;diff=603"/>
		<updated>2023-08-03T07:15:12Z</updated>

		<summary type="html">&lt;p&gt;Wulf: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Caption: &amp;lt;span style=&amp;quot;background:cornsilk&amp;quot;&amp;gt;&#039;&#039;Changed&#039;&#039;&amp;lt;/span&amp;gt; / &amp;lt;span style=&amp;quot;background:palegreen&amp;quot;&amp;gt;&#039;&#039;Added&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Processor, Mainboard, Memory===&lt;br /&gt;
[[Datei:ASUS-Z87-Pro-Top.jpg|miniatur|253x253px|&amp;lt;span style=&amp;quot;background-color:cornsilk&amp;quot;&amp;gt;Asus Z87-PRO&amp;lt;/span&amp;gt;]]&lt;br /&gt;
*Processor: Intel i5-4690T (Quadcore, Base Frequency 2.50 GHz, Turbo Frequency 3.50 GHz, TDP 45W, LGA 1150), DOP 2015-07-15, Price 229.90 €&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span style=&amp;quot;background:cornsilk&amp;quot;&amp;gt;Mainboard: Asus Z87-PRO (C2), DOP 2013-08-27, Price 159.54 €&amp;lt;ref name=&amp;quot;Mainboard&amp;quot; /&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Memory: 16 GB (2 x 8GB Corsair Vengeance DDR3 1600 MHz, CML16GX3M2A1600C9), DOP 2015-07-20, Price 103.93 €&lt;br /&gt;
&lt;br /&gt;
===Hard Disks===&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Datei:20170824-123007-1974.jpg|WD Red 4 TB No. 1&lt;br /&gt;
Datei:20170824-122856-1972.jpg|WD Red 4 TB No. 2&lt;br /&gt;
Datei:20170824-123048-1976.jpg|HGST Ultrastar 10 TB No. 1&lt;br /&gt;
Datei:18-05-10 10-28-21 2259.jpg|&amp;lt;span style=&amp;quot;background-color:palegreen&amp;quot;&amp;gt;HGST Ultrastar 10 TB No. 2&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Type !! Model !! Size !! Interface !! RPM !! Transfer Rate !! MTBF hrs !! Watt Act/Idle/Sleep !! Specs || DOP&lt;br /&gt;
!Price&lt;br /&gt;
|-&lt;br /&gt;
| Intel SSD X25-M&lt;br /&gt;
| SSDSA2M120 &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 120 GB &lt;br /&gt;
| SATA 3 GB/s &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | - &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | (r/w) 250/100 MB/s&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 1.2 Mio.&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 3.0 / 0.06 / na&lt;br /&gt;
| [[Media:Ssd-intel-mlc.pdf|ssd-intel-mic.pdf]]&lt;br /&gt;
| 2011-02-18&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 205.89 €&lt;br /&gt;
|- style=&amp;quot;background-color:palegreen&amp;quot;&lt;br /&gt;
| SanDisk SSD PLUS&lt;br /&gt;
| SDSSDA-1T00-G26&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 1 TB &lt;br /&gt;
| SATA 6 GB/s &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | - &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | (r/w) 535/450 MB/s&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 1.75 Mio.&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |&lt;br /&gt;
| [[Media:Sandisk-ssd-plus.pdf|Sandisk-ssd-plus.pdf]]&lt;br /&gt;
| 2020-06-14&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 89,99 €&lt;br /&gt;
|-&lt;br /&gt;
| Western Digital Red&lt;br /&gt;
| WD40EFRX-68W&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 4 TB &lt;br /&gt;
| SATA 6 GB/s &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 5,400 &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 150 MB/s&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 1.0 Mio.&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 4.5 / 3.3 / 0.4&lt;br /&gt;
| [[Media:2879-800002.pdf|2879-800002.pdf]]&lt;br /&gt;
| 2013-10-16&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 159.78 €&lt;br /&gt;
|-&lt;br /&gt;
|Western Digital Red&lt;br /&gt;
|WD40EFRX-68W&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; |4 TB&lt;br /&gt;
|SATA 6 GB/s&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |5,400&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; |150 MB/s&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |1.0 Mio.&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |4.5 / 3.3 / 0.4&lt;br /&gt;
| [[Media:2879-800002.pdf|2879-800002.pdf]]&lt;br /&gt;
| 2015-07-20&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 168.66 €&lt;br /&gt;
|-&lt;br /&gt;
| HGST Ultrastar He10&lt;br /&gt;
| HUH721010AL &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 10 TB &lt;br /&gt;
| SATA 6 GB/s &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 7,200 &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 249 MB/s&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 2.5 Mio.&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 6.8 / 5.0 / 0.5&lt;br /&gt;
| [[Media:Ultrastar-He10-DS.pdf|Ultrastar-He10-DS.pdf]]&lt;br /&gt;
| 2017-08-22&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 325.14 €&lt;br /&gt;
|- style=&amp;quot;background-color:palegreen&amp;quot;&lt;br /&gt;
| HGST Ultrastar He10&lt;br /&gt;
| HUH721010AL &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 10 TB &lt;br /&gt;
| SATA 6 GB/s &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 7,200 &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 249 MB/s&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 2.5 Mio.&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 6.8 / 5.0 / 0.5&lt;br /&gt;
| [[Media:Ultrastar-He10-DS.pdf|Ultrastar-He10-DS.pdf]]&lt;br /&gt;
| 2018-03-19&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 313.87 €&lt;br /&gt;
|- style=&amp;quot;background-color:palegreen&amp;quot;&lt;br /&gt;
| Seagate Exos X20&lt;br /&gt;
| ST20000NM007D&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 20 TB &lt;br /&gt;
| SATA 6 GB/s &lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 7,200 &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 285 MB/s&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 2.5 Mio.&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 9.4 / 5.4 / 0.9&lt;br /&gt;
| [[Media:Ultrastar-He10-DS.pdf|Ultrastar-He10-DS.pdf]]&lt;br /&gt;
| 2023-07-31&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 315.80 €&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Cooling===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Type !! Model !! Size !! RPM !! m³/h !! Watt || DOP&lt;br /&gt;
!Price&lt;br /&gt;
|-&lt;br /&gt;
| CPU Cooler &lt;br /&gt;
| Arctic Freezer 13 CO &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 92 mm &lt;br /&gt;
| 600 - 2,000 &lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 2.28&lt;br /&gt;
| 2015-07-31&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 29.99 €&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|-&lt;br /&gt;
| Chassis Fan (Front left)&lt;br /&gt;
| Arctic F12 PWM PST CO &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 120 mm &lt;br /&gt;
| 600 - 1,350 &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 125.7 &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 2.64&lt;br /&gt;
| 2015-07-31&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 10.09 €&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|- style=&amp;quot;background-color:palegreen&amp;quot;&lt;br /&gt;
| Chassis Fan (Front right)&lt;br /&gt;
| Arctic F12 PWM PST CO &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 120 mm &lt;br /&gt;
| 600 - 1,350&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 125.7 &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 2.64&lt;br /&gt;
| 2017-10-09&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 3.69 € &amp;lt;ref name=&amp;quot;Fan&amp;quot; /&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Chassis Fan (Rear left)&lt;br /&gt;
| Arctic F8 PWM PST CO &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 80 mm &lt;br /&gt;
| 850 - 2,000 &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 52.7 &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 1.68&lt;br /&gt;
| 2015-07-30&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 5.90 €&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|- style=&amp;quot;background-color:cornsilk&amp;quot;&lt;br /&gt;
| Chassis Fan (Rear right)&lt;br /&gt;
| Arctic F8 PWM PST CO &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 80 mm &lt;br /&gt;
| 850 - 2,000 &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 52.7 &lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 1.68&lt;br /&gt;
| 2017-11-16&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; | 5.14 €&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Case and Power Supply===&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Datei:11-182-566-30.jpg|Front&lt;br /&gt;
Datei:544427 0 8194306.jpg|Front open&lt;br /&gt;
Datei:4u5-3.jpg|Interieur&lt;br /&gt;
Datei:17c.jpg|&amp;lt;span style=&amp;quot;background-color:palegreen&amp;quot;&amp;gt;HDD Cage&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
*Case: Codegen 4U-500 Server Case, DOP around 2005&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span style=&amp;quot;background-color:palegreen&amp;quot;&amp;gt;HDD Cage: Icy Dock Black Vortex MB074SP-1B, DOP 2017-10-09, Price 73.56 €&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Power Supply: Seasonic S12II-330 (SS-330GB), 330 Watt, 80plus, 120 mm Single-Fan, DOP around 2008&lt;br /&gt;
&lt;br /&gt;
===External Hardware===&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Datei:5637.jpg|USRobotics 5637&lt;br /&gt;
Datei:016303.jpg|Gold TEMPer&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
*USB Modem 56K USRobotics (Model USR5637), DOP 2017-05-23, Price 14.49 €&lt;br /&gt;
&lt;br /&gt;
*USB PC Thermometer (Model Gold TEMPer), DOP 2017-04-19, Price 6.49 €&lt;br /&gt;
&lt;br /&gt;
===Notes===&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;Mainboard&amp;quot;&amp;gt;Mainboard was taken from a desktop computer because it has eight SATA ports and six fan connectors whereas the Asus H81M-PLUS has only four SATA ports and two fan connectors. The replacement for the desktop computer is an Asus H87-PLUS purchased on eBay.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;Fan&amp;quot;&amp;gt;Replacement for the standard fan of the HDD Cage.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;/div&gt;</summary>
		<author><name>Wulf</name></author>
	</entry>
	<entry>
		<id>http://wiki.frank-wulf.de/index.php?title=Bacula_Backup_Solution&amp;diff=602</id>
		<title>Bacula Backup Solution</title>
		<link rel="alternate" type="text/html" href="http://wiki.frank-wulf.de/index.php?title=Bacula_Backup_Solution&amp;diff=602"/>
		<updated>2023-08-02T09:40:37Z</updated>

		<summary type="html">&lt;p&gt;Wulf: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__FORCETOC__&lt;br /&gt;
=Install Bacula on Linux=&lt;br /&gt;
&lt;br /&gt;
This article describes how to install the latest Bacula version on Linux.&lt;br /&gt;
 &lt;br /&gt;
Download current version:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;wget -qO- https://sourceforge.net/projects/bacula/files/latest/download | tar -xzvf - -C /usr/src&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Goto the source directory:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;cd /usr/src/bacula*&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Configure the code, changing the last options below accordingly (normally the last three):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;./configure --with-readline=/usr/include/readline --disable-conio --bindir=/usr/bin --sbindir=/usr/sbin --with-scriptdir=/etc/bacula/scripts --with-working-dir=/var/lib/bacula --with-logdir=/var/log --enable-smartalloc --with-mysql --with-archivedir=&amp;lt;pathname of backup disk&amp;gt; --with-job-email=&amp;lt;mail address&amp;gt; --with-hostname=192.168.x.x&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Build, install and enable the Bacula daemons start at boot time:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;make -j8 &amp;amp;&amp;amp; make install &amp;amp;&amp;amp; make install-autostart&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Goto the scripts directory:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;cd /etc/bacula/scripts&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create the database:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;./create_bacula_database -u root -p&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create the database tables:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;./make_bacula_tables -u root -p&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create the database user:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;./grant_bacula_privileges -u root -p&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Start the Bacula daemons:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;service bacula-dir start&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;service bacula-fd start&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;service bacula-sd start&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Remark: The steps are orginally taken from http://bacula.us/compilation/ and slightly adjusted for personal use.&lt;br /&gt;
&lt;br /&gt;
Content of this site from 25th of Sep 2017: [[Media:Bacula.us-Bacula 903 Compilation and Installation Commands.pdf|Bacula.us-Bacula 903 Compilation and Installation Commands.pdf]]&lt;br /&gt;
&lt;br /&gt;
=Reset Bacula after testing phase=&lt;br /&gt;
&lt;br /&gt;
Benefits:&lt;br /&gt;
&lt;br /&gt;
* Database Catalog will be initialized. &lt;br /&gt;
* Executed Jobs will disappear. &lt;br /&gt;
* JobIDs and Volume numbering will be resetted. &lt;br /&gt;
* We keep the configuration of the Bacula Director, the Client and the Storage Daemon as well as File Sets, Backup Schedules, Backup Job definitions, Volume Pools and Storage Devices.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
How-To:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Stop Bacula daemons&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;sudo bacula stop&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
2. Drop database tables (system will ask for password of database user „root@localhost“)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;sudo sh -c &amp;quot;cd /etc/bacula/scripts; ./drop_bacula_tables -u root -p&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
3. Create new database tables (system will ask for password of database user „root@localhost“)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;sudo sh -c &amp;quot;cd /etc/bacula/scripts; ./make_bacula_tables -u root -p&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
4. Delete all files in /var/lib/bacula (File &amp;quot;.my.cnf&amp;quot; is important and will not be deleted)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;sudo sh -c &amp;quot;cd /var/lib/bacula; rm *&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
5. Start Bacula daemons&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;sudo bacula start&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note: Existing backup files must be removed from backup directory.&lt;br /&gt;
&lt;br /&gt;
=Install Baculum API and Web GUI Tools=&lt;br /&gt;
Add key for Baculum&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;wget -qO - http://bacula.org/downloads/baculum/baculum.pub | apt-key add -&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Add source for Baculum&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;echo -e &amp;quot;deb [ arch=amd64 ] http://bacula.org/downloads/baculum/stable/ubuntu bionic main\ndeb-src http://bacula.org/downloads/baculum/stable/ubuntu bionic main&amp;quot; &amp;gt;/etc/apt/sources.list.d/baculum.list&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Install Baculum&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;apt-get update &amp;amp;&amp;amp; apt-get install baculum-api baculum-api-apache2 baculum-common baculum-web baculum-web-apache2&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Add sudo access for Baculum&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;echo -e &amp;quot;Defaults:apache &amp;quot;&#039;!&#039;&amp;quot;requiretty\nwww-data ALL=NOPASSWD: /usr/sbin/bconsole\nwww-data ALL=NOPASSWD: /usr/sbin/bdirjson\nwww-data ALL=NOPASSWD: /usr/sbin/bsdjson\nwww-data ALL=NOPASSWD: /usr/sbin/bfdjson\nwww-data ALL=NOPASSWD: /usr/sbin/bbconsjson&amp;quot; &amp;gt; /etc/sudoers.d/baculum&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enable rewrite module&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;a2enmod rewrite&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enable Baculum API and web site&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;a2ensite baculum-web baculum-api&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Restart Apache&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;systemctl reload apache2&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Backup of Windows-Clients=&lt;br /&gt;
Under construction&lt;br /&gt;
&lt;br /&gt;
=Backup process implementation=&lt;br /&gt;
===Requirement===&lt;br /&gt;
* Regular backups of the server and other computers (eg PC, Notebook) should be carried out.&lt;br /&gt;
* No manual steps should be necessary.&lt;br /&gt;
* The backups should be stored on the server.&lt;br /&gt;
&lt;br /&gt;
===Implementation=== &lt;br /&gt;
* The Bacula Director on the server manages the progress of all backups.&lt;br /&gt;
* All computers to be backed up have a Bacula Filedaemon installed.&lt;br /&gt;
* A computer can be backed up if one of the following conditions is true:&lt;br /&gt;
** The computer is running and accessible via the network.&lt;br /&gt;
** The computer is turned off and can be automatically turned on via a server-initiated &amp;quot;wake on LAN&amp;quot; signal.&lt;/div&gt;</summary>
		<author><name>Wulf</name></author>
	</entry>
	<entry>
		<id>http://wiki.frank-wulf.de/index.php?title=MediaWiki&amp;diff=601</id>
		<title>MediaWiki</title>
		<link rel="alternate" type="text/html" href="http://wiki.frank-wulf.de/index.php?title=MediaWiki&amp;diff=601"/>
		<updated>2023-07-29T17:16:19Z</updated>

		<summary type="html">&lt;p&gt;Wulf: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__FORCETOC__&lt;br /&gt;
=Upgrading MediaWiki=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Download and install new version in new directory&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;export VERSION_SHORT=1.32&lt;br /&gt;
export VERSION_LONG=1.32.0&lt;br /&gt;
export VERSION_OLD=1.31.0&lt;br /&gt;
cd /var/lib&lt;br /&gt;
wget https://releases.wikimedia.org/mediawiki/&amp;quot;${VERSION_SHORT}&amp;quot;/mediawiki-&amp;quot;${VERSION_LONG}&amp;quot;.tar.gz&lt;br /&gt;
tar -xvzf mediawiki-&amp;quot;${VERSION_LONG}&amp;quot;.tar.gz&lt;br /&gt;
rm mediawiki-&amp;quot;${VERSION_LONG}&amp;quot;.tar.gz&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Copy configuration file and images to new directory&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;cp -r --preserve=all ./mediawiki/LocalSettings.php ./mediawiki-&amp;quot;${VERSION_LONG}&amp;quot;&lt;br /&gt;
rsync -axHAWXS --numeric-ids --info=progress2 ./mediawiki/images/ ./mediawiki-&amp;quot;${VERSION_LONG}&amp;quot;/images&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Rename the old installation directory and then rename the new one to match the old name&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;mv mediawiki mediawiki-&amp;quot;${VERSION_OLD}&amp;quot;&lt;br /&gt;
mv mediawiki-&amp;quot;${VERSION_LONG}&amp;quot; mediawiki&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Run update script for database scheme&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;cd mediawiki/maintenance&lt;br /&gt;
php update.php&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. Restart Apache Webserver&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;systemctl restart apache2&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Wulf</name></author>
	</entry>
	<entry>
		<id>http://wiki.frank-wulf.de/index.php?title=PHP&amp;diff=600</id>
		<title>PHP</title>
		<link rel="alternate" type="text/html" href="http://wiki.frank-wulf.de/index.php?title=PHP&amp;diff=600"/>
		<updated>2023-07-29T10:53:15Z</updated>

		<summary type="html">&lt;p&gt;Wulf: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Actual version running is PHP 8.1&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
There is also PHP 8.2 installed but not activated because Zoneminder seems to have issues with PHP 8.2.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==== PHP Extensions to be installed ====&lt;br /&gt;
*mysql&lt;br /&gt;
*mbstring&lt;br /&gt;
*xml&lt;br /&gt;
*curl&lt;br /&gt;
*gd&lt;br /&gt;
*apcu&lt;br /&gt;
*zip&lt;br /&gt;
*intl&lt;br /&gt;
*imagick&lt;br /&gt;
*bcmath&lt;br /&gt;
*gmp&lt;br /&gt;
*redis&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
apt install php8.2-mysql php8.2-mbstring php8.2-xml php8.2-curl php8.2-gd php8.2-apcu php8.2-zip php8.2-intl php8.2-imagick php8.2-bcmath php8.2-gmp php8.2-redis&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Switch PHP version on command line =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
update-alternatives --config php&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Wulf</name></author>
	</entry>
	<entry>
		<id>http://wiki.frank-wulf.de/index.php?title=PHP&amp;diff=599</id>
		<title>PHP</title>
		<link rel="alternate" type="text/html" href="http://wiki.frank-wulf.de/index.php?title=PHP&amp;diff=599"/>
		<updated>2023-07-29T10:52:42Z</updated>

		<summary type="html">&lt;p&gt;Wulf: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Actual version running is PHP 8.1&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
There is also PHP 8.2 installed but not activated because Zoneminder seems to have issues with PHP 8.2.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==== PHP Extensions to be installed ====&lt;br /&gt;
*mysql&lt;br /&gt;
*mbstring&lt;br /&gt;
*xml&lt;br /&gt;
*curl&lt;br /&gt;
*gd&lt;br /&gt;
*apcu&lt;br /&gt;
*zip&lt;br /&gt;
*intl&lt;br /&gt;
*imagick&lt;br /&gt;
*bcmath&lt;br /&gt;
*gmp&lt;br /&gt;
*redis&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
apt install php8.2-mysql php8.2-mbstring php8.2-xml php8.2-curl php8.2-gd php8.2-apcu php8.2-zip php8.2-intl php8.2-imagick php8.2-bcmath php8.2-gmp php8.2-redis&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Switch PHP version on command line =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
update-alternatives --config php&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Wulf</name></author>
	</entry>
	<entry>
		<id>http://wiki.frank-wulf.de/index.php?title=PHP&amp;diff=598</id>
		<title>PHP</title>
		<link rel="alternate" type="text/html" href="http://wiki.frank-wulf.de/index.php?title=PHP&amp;diff=598"/>
		<updated>2023-07-29T10:45:12Z</updated>

		<summary type="html">&lt;p&gt;Wulf: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-Extensions&lt;br /&gt;
&lt;br /&gt;
*mysql&lt;br /&gt;
*mbstring&lt;br /&gt;
*xml&lt;br /&gt;
*curl&lt;br /&gt;
*gd&lt;br /&gt;
*apcu&lt;br /&gt;
*zip&lt;br /&gt;
*intl&lt;br /&gt;
*imagick&lt;br /&gt;
*bcmath&lt;br /&gt;
*gmp&lt;br /&gt;
*redis&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
apt install php8.2-mysql php8.2-mbstring php8.2-xml php8.2-curl php8.2-gd php8.2-apcu php8.2-zip php8.2-intl php8.2-imagick php8.2-bcmath php8.2-gmp php8.2-redis&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Switch PHP version on command line&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
update-alternatives --config php&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Wulf</name></author>
	</entry>
	<entry>
		<id>http://wiki.frank-wulf.de/index.php?title=PHP&amp;diff=597</id>
		<title>PHP</title>
		<link rel="alternate" type="text/html" href="http://wiki.frank-wulf.de/index.php?title=PHP&amp;diff=597"/>
		<updated>2023-07-29T10:23:53Z</updated>

		<summary type="html">&lt;p&gt;Wulf: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-Extensions&lt;br /&gt;
&lt;br /&gt;
*mysql&lt;br /&gt;
*mbstring&lt;br /&gt;
*xml&lt;br /&gt;
*curl&lt;br /&gt;
*gd&lt;br /&gt;
*apcu&lt;br /&gt;
*zip&lt;br /&gt;
*intl&lt;br /&gt;
*imagick&lt;br /&gt;
*bcmath&lt;br /&gt;
*gmp&lt;br /&gt;
*redis&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
apt install php8.2-mysql php8.2-mbstring php8.2-xml php8.2-curl php8.2-gd php8.2-apcu php8.2-zip php8.2-intl php8.2-imagick php8.2-bcmath php8.2-gmp php8.2-redis&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Wulf</name></author>
	</entry>
	<entry>
		<id>http://wiki.frank-wulf.de/index.php?title=PHP&amp;diff=596</id>
		<title>PHP</title>
		<link rel="alternate" type="text/html" href="http://wiki.frank-wulf.de/index.php?title=PHP&amp;diff=596"/>
		<updated>2023-07-29T10:14:46Z</updated>

		<summary type="html">&lt;p&gt;Wulf: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-Extensions&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
php8.1-mysql&lt;br /&gt;
php8.1-mbstring&lt;br /&gt;
php8.1-xml&lt;br /&gt;
php8.1-curl&lt;br /&gt;
php8.1-gd&lt;br /&gt;
php8.1-apcu&lt;br /&gt;
php8.1-zip&lt;br /&gt;
php8.1-intl&lt;br /&gt;
php8.1-imagick&lt;br /&gt;
php8.1-bcmath&lt;br /&gt;
php8.1-gmp&lt;br /&gt;
php8.1-redis&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Wulf</name></author>
	</entry>
	<entry>
		<id>http://wiki.frank-wulf.de/index.php?title=PHP&amp;diff=595</id>
		<title>PHP</title>
		<link rel="alternate" type="text/html" href="http://wiki.frank-wulf.de/index.php?title=PHP&amp;diff=595"/>
		<updated>2023-07-29T10:13:03Z</updated>

		<summary type="html">&lt;p&gt;Wulf: Die Seite wurde neu angelegt: „-Extensions php8.1-mysql php8.1-mbstring php8.1-xml php8.1-curl php8.1-gd php8.1-apcu php8.1-zip php8.1-intl php8.1-imagick php8.1-bcmath php8.1-gmp php8.1-redis“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-Extensions&lt;br /&gt;
php8.1-mysql&lt;br /&gt;
php8.1-mbstring&lt;br /&gt;
php8.1-xml&lt;br /&gt;
php8.1-curl&lt;br /&gt;
php8.1-gd&lt;br /&gt;
php8.1-apcu&lt;br /&gt;
php8.1-zip&lt;br /&gt;
php8.1-intl&lt;br /&gt;
php8.1-imagick&lt;br /&gt;
php8.1-bcmath&lt;br /&gt;
php8.1-gmp&lt;br /&gt;
php8.1-redis&lt;/div&gt;</summary>
		<author><name>Wulf</name></author>
	</entry>
	<entry>
		<id>http://wiki.frank-wulf.de/index.php?title=Server&amp;diff=594</id>
		<title>Server</title>
		<link rel="alternate" type="text/html" href="http://wiki.frank-wulf.de/index.php?title=Server&amp;diff=594"/>
		<updated>2023-07-29T10:11:07Z</updated>

		<summary type="html">&lt;p&gt;Wulf: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;*[[Bacula Backup Solution]]&lt;br /&gt;
*[[Configuration]]&lt;br /&gt;
*[[Fail2ban]]&lt;br /&gt;
*[[Fancontrol]]&lt;br /&gt;
*[[Internet Speedtest]]&lt;br /&gt;
*[[ioBroker]]&lt;br /&gt;
*[[MediaWiki]]&lt;br /&gt;
*[[PHP]]&lt;br /&gt;
*[[phpMyAdmin]]&lt;br /&gt;
*[[Signal Messenger]]&lt;br /&gt;
*[[Wake on LAN and remote shutdown]]&lt;br /&gt;
*[[Hardware Monitoring]]&lt;br /&gt;
*[[Hardware]]&lt;/div&gt;</summary>
		<author><name>Wulf</name></author>
	</entry>
	<entry>
		<id>http://wiki.frank-wulf.de/index.php?title=Internet_Speedtest&amp;diff=593</id>
		<title>Internet Speedtest</title>
		<link rel="alternate" type="text/html" href="http://wiki.frank-wulf.de/index.php?title=Internet_Speedtest&amp;diff=593"/>
		<updated>2022-07-31T05:18:43Z</updated>

		<summary type="html">&lt;p&gt;Wulf: /* Shell script /usr/bin/fwspeedtest */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__FORCETOC__&lt;br /&gt;
===Shell script &#039;&#039;&#039;&#039;&#039;/usr/bin/fwspeedtest&#039;&#039;&#039;&#039;&#039;===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
#&lt;br /&gt;
# Author:  Frank Wulf&lt;br /&gt;
# Version: 1.5 (2020-12-23)&lt;br /&gt;
#&lt;br /&gt;
# This script measures the internet speed by using Ookla speedtest tool.&lt;br /&gt;
#&lt;br /&gt;
# In regards to the conversion rules described in&lt;br /&gt;
# https://help.speedtest.net/hc/en-us/articles/360039162713-What-do-mbps-and-kbps-mean-&lt;br /&gt;
# the following calculations are used:&lt;br /&gt;
# 1 kilobit = 1000 bits&lt;br /&gt;
# 1 megabit = 1000 kilobits&lt;br /&gt;
# 1 Mbyte   = 8 megabits&lt;br /&gt;
&lt;br /&gt;
runs=2&lt;br /&gt;
tarif=&amp;quot;Telekom Zuhause L&amp;quot;&lt;br /&gt;
exclude=0&lt;br /&gt;
comment=&amp;quot;&amp;quot;&lt;br /&gt;
out=/tmp/fwspeedtest.out&lt;br /&gt;
&lt;br /&gt;
if [ -f &amp;quot;$out&amp;quot; ]; then&lt;br /&gt;
  rm $out 1&amp;gt;/dev/null 2&amp;gt;&amp;amp;1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Run the speedtest &amp;lt;runs&amp;gt; times without VPN connection&lt;br /&gt;
for i in `eval echo {1..$runs}`&lt;br /&gt;
do&lt;br /&gt;
  # Check if VPN connection is active&lt;br /&gt;
  systemctl status openvpn 1&amp;gt;/dev/null 2&amp;gt;&amp;amp;1&lt;br /&gt;
  if [ $? -eq 0 ]; then&lt;br /&gt;
    vpn_active=1&lt;br /&gt;
    # Stop VPN connection&lt;br /&gt;
    systemctl stop openvpn&lt;br /&gt;
    sleep 5&lt;br /&gt;
  else&lt;br /&gt;
    vpn_active=0&lt;br /&gt;
  fi&lt;br /&gt;
&lt;br /&gt;
  # Fill timestamp field&lt;br /&gt;
  timestamp[$i]=`date +&#039;%Y-%m-%d %H:%M:%S&#039;`&lt;br /&gt;
&lt;br /&gt;
  # Run speedtest&lt;br /&gt;
  /usr/bin/speedtest speedtest --accept-gdpr --format=csv &amp;gt;&amp;gt;$out&lt;br /&gt;
  retcode=$?&lt;br /&gt;
&lt;br /&gt;
  if [ $vpn_active -eq 1 ]; then&lt;br /&gt;
    # Start VPN connection&lt;br /&gt;
    systemctl start openvpn&lt;br /&gt;
  fi&lt;br /&gt;
&lt;br /&gt;
  if [ &amp;quot;$retcode&amp;quot; -ne 0 ]; then&lt;br /&gt;
    exit 1&lt;br /&gt;
  fi&lt;br /&gt;
&lt;br /&gt;
  if [ $i -lt $runs ]; then&lt;br /&gt;
    # Wait 15 seconds between two speedtests&lt;br /&gt;
    sleep 15&lt;br /&gt;
  fi&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
download_max=0&lt;br /&gt;
i=0&lt;br /&gt;
&lt;br /&gt;
while read line; do&lt;br /&gt;
  i=$((i+1))&lt;br /&gt;
  download_new=`echo &amp;quot;$line&amp;quot;|awk -F &#039;^ *&amp;quot;|&amp;quot; *, *&amp;quot;|&amp;quot; *$&#039; &#039;{ print $7 }&#039;`&lt;br /&gt;
  if [ $download_new -gt $download_max ]; then&lt;br /&gt;
    # Download rate is faster than previous ones&lt;br /&gt;
    download=$download_new&lt;br /&gt;
    server_id=`echo &amp;quot;$line&amp;quot;|awk -F &#039;^ *&amp;quot;|&amp;quot; *, *&amp;quot;|&amp;quot; *$&#039; &#039;{ print $3 }&#039;`&lt;br /&gt;
    server_name=`echo &amp;quot;$line&amp;quot;|awk -F &#039;^ *&amp;quot;|&amp;quot; *, *&amp;quot;|&amp;quot; *$&#039; &#039;{ print $2 }&#039;`&lt;br /&gt;
    latency=`echo &amp;quot;$line&amp;quot;|awk -F &#039;^ *&amp;quot;|&amp;quot; *, *&amp;quot;|&amp;quot; *$&#039; &#039;{ print $4 }&#039;`&lt;br /&gt;
    jitter=`echo &amp;quot;$line&amp;quot;|awk -F &#039;^ *&amp;quot;|&amp;quot; *, *&amp;quot;|&amp;quot; *$&#039; &#039;{ print $5 }&#039;`&lt;br /&gt;
    packet_loss=`echo &amp;quot;$line&amp;quot;|awk -F &#039;^ *&amp;quot;|&amp;quot; *, *&amp;quot;|&amp;quot; *$&#039; &#039;{ print $6 }&#039;`&lt;br /&gt;
    download=`echo &amp;quot;$line&amp;quot;|awk -F &#039;^ *&amp;quot;|&amp;quot; *, *&amp;quot;|&amp;quot; *$&#039; &#039;{ print $7 }&#039;`&lt;br /&gt;
    upload=`echo &amp;quot;$line&amp;quot;|awk -F &#039;^ *&amp;quot;|&amp;quot; *, *&amp;quot;|&amp;quot; *$&#039; &#039;{ print $8 }&#039;`&lt;br /&gt;
    download_used=`echo &amp;quot;$line&amp;quot;|awk -F &#039;^ *&amp;quot;|&amp;quot; *, *&amp;quot;|&amp;quot; *$&#039; &#039;{ print $9 }&#039;`&lt;br /&gt;
    upload_used=`echo &amp;quot;$line&amp;quot;|awk -F &#039;^ *&amp;quot;|&amp;quot; *, *&amp;quot;|&amp;quot; *$&#039; &#039;{ print $10 }&#039;`&lt;br /&gt;
    url=`echo &amp;quot;$line&amp;quot;|awk -F &#039;^ *&amp;quot;|&amp;quot; *, *&amp;quot;|&amp;quot; *$&#039; &#039;{ print $11 }&#039;`&lt;br /&gt;
    download_max=$download&lt;br /&gt;
    row=$i&lt;br /&gt;
  fi&lt;br /&gt;
&lt;br /&gt;
  if [ $i -eq $runs ]; then&lt;br /&gt;
    # Round values for latency. jitter and packet_loss&lt;br /&gt;
    latency=`echo &amp;quot;scale=2; ($latency + 0.005) / 1&amp;quot; | bc`&lt;br /&gt;
    jitter=`echo &amp;quot;scale=2; ($jitter + 0.005) / 1&amp;quot; | bc`&lt;br /&gt;
    if [ $packet_loss == &amp;quot;N/A&amp;quot; ]; then&lt;br /&gt;
      packet_loss=0&lt;br /&gt;
    else&lt;br /&gt;
      packet_loss=`echo &amp;quot;scale=1; ($packet_loss + 0.05) / 1&amp;quot; | bc`&lt;br /&gt;
    fi&lt;br /&gt;
&lt;br /&gt;
    # Convert download/upload speed from bytes per second to Mbps and round values&lt;br /&gt;
    download=`echo &amp;quot;scale=8; $download * 8 / 1000000&amp;quot; | bc`&lt;br /&gt;
    download=`echo &amp;quot;scale=2; ($download + 0.005) / 1&amp;quot; | bc`&lt;br /&gt;
    upload=`echo &amp;quot;scale=8; $upload * 8 / 1000000&amp;quot; | bc`&lt;br /&gt;
    upload=`echo &amp;quot;scale=2; ($upload + 0.005) / 1&amp;quot; | bc`&lt;br /&gt;
&lt;br /&gt;
    # Convert used bytes to MBytes and round values&lt;br /&gt;
    download_used=`echo &amp;quot;scale=8; $download_used / 1000000&amp;quot; | bc`&lt;br /&gt;
    download_used=`echo &amp;quot;scale=1; ($download_used + 0.05) / 1&amp;quot; | bc`&lt;br /&gt;
    upload_used=`echo &amp;quot;scale=8; $upload_used / 1000000&amp;quot; | bc`&lt;br /&gt;
    upload_used=`echo &amp;quot;scale=1; ($upload_used + 0.05) / 1&amp;quot; | bc`&lt;br /&gt;
&lt;br /&gt;
    vpn_active=0&lt;br /&gt;
&lt;br /&gt;
    # Fill timestamp field&lt;br /&gt;
    timestamp=${timestamp[$row]}&lt;br /&gt;
&lt;br /&gt;
    # Insert data into database&lt;br /&gt;
    sql=&amp;quot;INSERT INTO fw_speedtest (timestamp,server_id,server_name,latency,&amp;quot;&lt;br /&gt;
    sql+=&amp;quot;jitter,packet_loss,download,upload,download_used,upload_used,&amp;quot;&lt;br /&gt;
    sql+=&amp;quot;vpn_active,tarif,exclude,comment,url) VALUES (&amp;quot;&lt;br /&gt;
    sql+=&amp;quot;\&amp;quot;$timestamp\&amp;quot;, \&amp;quot;$server_id\&amp;quot;, \&amp;quot;$server_name\&amp;quot;, \&amp;quot;$latency\&amp;quot;, &amp;quot;&lt;br /&gt;
    sql+=&amp;quot;\&amp;quot;$jitter\&amp;quot;, \&amp;quot;$packet_loss\&amp;quot;, \&amp;quot;$download\&amp;quot;, \&amp;quot;$upload\&amp;quot;, &amp;quot;&lt;br /&gt;
    sql+=&amp;quot;\&amp;quot;$download_used\&amp;quot;, \&amp;quot;$upload_used\&amp;quot;, \&amp;quot;$vpn_active\&amp;quot;, &amp;quot;&lt;br /&gt;
    sql+=&amp;quot;\&amp;quot;$tarif\&amp;quot;, \&amp;quot;$exclude\&amp;quot;, \&amp;quot;$comment\&amp;quot;,\&amp;quot;$url\&amp;quot;)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    mysql --login-path=fwsysmon -D fwsysmon -e &amp;quot;$sql&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  fi&lt;br /&gt;
&lt;br /&gt;
done &amp;lt;&amp;lt;&amp;lt;`cat $out`&lt;br /&gt;
&lt;br /&gt;
exit 0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Scheduling Speedtest with systemd ===&lt;br /&gt;
* &#039;&#039;&#039;Service Unit file &#039;&#039;/lib/systemd/system/fwspeedtest.service&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Internet speedtest&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=oneshot&lt;br /&gt;
ExecStart=/usr/bin/fwspeedtest&lt;br /&gt;
User=root&lt;br /&gt;
Group=root&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Timer Unit file &#039;&#039;/lib/systemd/system/fwspeedtest.timer&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Run Internet speedtest&lt;br /&gt;
&lt;br /&gt;
[Timer]&lt;br /&gt;
OnCalendar=*-*-* 18:00&lt;br /&gt;
RandomizedDelaySec=12h&lt;br /&gt;
Persistent=true&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=timers.target&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Wulf</name></author>
	</entry>
	<entry>
		<id>http://wiki.frank-wulf.de/index.php?title=Internet_Speedtest&amp;diff=592</id>
		<title>Internet Speedtest</title>
		<link rel="alternate" type="text/html" href="http://wiki.frank-wulf.de/index.php?title=Internet_Speedtest&amp;diff=592"/>
		<updated>2022-07-31T05:06:37Z</updated>

		<summary type="html">&lt;p&gt;Wulf: /* Scheduling Speedtest with systemd */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__FORCETOC__&lt;br /&gt;
===Shell script &#039;&#039;&#039;&#039;&#039;/usr/bin/fwspeedtest&#039;&#039;&#039;&#039;&#039;===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
#&lt;br /&gt;
# Author:  Frank Wulf&lt;br /&gt;
# Version: 1.5 (2020-12-23)&lt;br /&gt;
#&lt;br /&gt;
# This script measures the internet speed by using Ookla speedtest tool.&lt;br /&gt;
#&lt;br /&gt;
# In regards to the conversion rules described in&lt;br /&gt;
# https://help.speedtest.net/hc/en-us/articles/360039162713-What-do-mbps-and-kbp&lt;br /&gt;
# the following calculations are used:&lt;br /&gt;
# 1 kilobit = 1000 bits&lt;br /&gt;
# 1 megabit = 1000 kilobits&lt;br /&gt;
# 1 Mbyte   = 8 megabits&lt;br /&gt;
&lt;br /&gt;
runs=2&lt;br /&gt;
tarif=&amp;quot;Telekom Zuhause L&amp;quot;&lt;br /&gt;
exclude=0&lt;br /&gt;
comment=&amp;quot;&amp;quot;&lt;br /&gt;
out=/tmp/fwspeedtest.out&lt;br /&gt;
&lt;br /&gt;
if [ -f &amp;quot;$out&amp;quot; ]; then&lt;br /&gt;
  rm $out 1&amp;gt;/dev/null 2&amp;gt;&amp;amp;1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Run the speedtest &amp;lt;runs&amp;gt; times without VPN connection&lt;br /&gt;
for i in `eval echo {1..$runs}`&lt;br /&gt;
do&lt;br /&gt;
  # Check if VPN connection is active&lt;br /&gt;
  systemctl status openvpn 1&amp;gt;/dev/null 2&amp;gt;&amp;amp;1&lt;br /&gt;
  if [ $? -eq 0 ]; then&lt;br /&gt;
    vpn_active=1&lt;br /&gt;
    # Stop VPN connection&lt;br /&gt;
    systemctl stop openvpn&lt;br /&gt;
    sleep 5&lt;br /&gt;
  else&lt;br /&gt;
    vpn_active=0&lt;br /&gt;
  fi&lt;br /&gt;
&lt;br /&gt;
  # Fill timestamp field&lt;br /&gt;
  timestamp[$i]=`date +&#039;%Y-%m-%d %H:%M:%S&#039;`&lt;br /&gt;
&lt;br /&gt;
  # Run speedtest&lt;br /&gt;
  /usr/bin/speedtest speedtest --accept-gdpr --format=csv &amp;gt;&amp;gt;$out&lt;br /&gt;
  retcode=$?&lt;br /&gt;
&lt;br /&gt;
  if [ $vpn_active -eq 1 ]; then&lt;br /&gt;
    # Start VPN connection&lt;br /&gt;
    systemctl start openvpn&lt;br /&gt;
  fi&lt;br /&gt;
&lt;br /&gt;
  if [ &amp;quot;$retcode&amp;quot; -ne 0 ]; then&lt;br /&gt;
    exit 1&lt;br /&gt;
  fi&lt;br /&gt;
&lt;br /&gt;
  if [ $i -lt $runs ]; then&lt;br /&gt;
    # Wait 15 seconds between two speedtests&lt;br /&gt;
    sleep 15&lt;br /&gt;
  fi&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
download_max=0&lt;br /&gt;
i=0&lt;br /&gt;
&lt;br /&gt;
while read line; do&lt;br /&gt;
  i=$((i+1))&lt;br /&gt;
  download_new=`echo &amp;quot;$line&amp;quot;|awk -F &#039;^ *&amp;quot;|&amp;quot; *, *&amp;quot;|&amp;quot; *$&#039; &#039;{ print $7 }&#039;`&lt;br /&gt;
  if [ $download_new -gt $download_max ]; then&lt;br /&gt;
    # Download rate is faster than previous ones&lt;br /&gt;
    download=$download_new&lt;br /&gt;
    server_id=`echo &amp;quot;$line&amp;quot;|awk -F &#039;^ *&amp;quot;|&amp;quot; *, *&amp;quot;|&amp;quot; *$&#039; &#039;{ print $3 }&#039;`&lt;br /&gt;
    server_name=`echo &amp;quot;$line&amp;quot;|awk -F &#039;^ *&amp;quot;|&amp;quot; *, *&amp;quot;|&amp;quot; *$&#039; &#039;{ print $2 }&#039;`&lt;br /&gt;
    latency=`echo &amp;quot;$line&amp;quot;|awk -F &#039;^ *&amp;quot;|&amp;quot; *, *&amp;quot;|&amp;quot; *$&#039; &#039;{ print $4 }&#039;`&lt;br /&gt;
    jitter=`echo &amp;quot;$line&amp;quot;|awk -F &#039;^ *&amp;quot;|&amp;quot; *, *&amp;quot;|&amp;quot; *$&#039; &#039;{ print $5 }&#039;`&lt;br /&gt;
    packet_loss=`echo &amp;quot;$line&amp;quot;|awk -F &#039;^ *&amp;quot;|&amp;quot; *, *&amp;quot;|&amp;quot; *$&#039; &#039;{ print $6 }&#039;`&lt;br /&gt;
    download=`echo &amp;quot;$line&amp;quot;|awk -F &#039;^ *&amp;quot;|&amp;quot; *, *&amp;quot;|&amp;quot; *$&#039; &#039;{ print $7 }&#039;`&lt;br /&gt;
    upload=`echo &amp;quot;$line&amp;quot;|awk -F &#039;^ *&amp;quot;|&amp;quot; *, *&amp;quot;|&amp;quot; *$&#039; &#039;{ print $8 }&#039;`&lt;br /&gt;
    download_used=`echo &amp;quot;$line&amp;quot;|awk -F &#039;^ *&amp;quot;|&amp;quot; *, *&amp;quot;|&amp;quot; *$&#039; &#039;{ print $9 }&#039;`&lt;br /&gt;
    upload_used=`echo &amp;quot;$line&amp;quot;|awk -F &#039;^ *&amp;quot;|&amp;quot; *, *&amp;quot;|&amp;quot; *$&#039; &#039;{ print $10 }&#039;`&lt;br /&gt;
    url=`echo &amp;quot;$line&amp;quot;|awk -F &#039;^ *&amp;quot;|&amp;quot; *, *&amp;quot;|&amp;quot; *$&#039; &#039;{ print $11 }&#039;`&lt;br /&gt;
    download_max=$download&lt;br /&gt;
    row=$i&lt;br /&gt;
  fi&lt;br /&gt;
&lt;br /&gt;
  if [ $i -eq $runs ]; then&lt;br /&gt;
    # Round values for latency. jitter and packet_loss&lt;br /&gt;
    latency=`echo &amp;quot;scale=2; ($latency + 0.005) / 1&amp;quot; | bc`&lt;br /&gt;
    jitter=`echo &amp;quot;scale=2; ($jitter + 0.005) / 1&amp;quot; | bc`&lt;br /&gt;
    if [ $packet_loss == &amp;quot;N/A&amp;quot; ]; then&lt;br /&gt;
      packet_loss=0&lt;br /&gt;
    else&lt;br /&gt;
      packet_loss=`echo &amp;quot;scale=1; ($packet_loss + 0.05) / 1&amp;quot; | bc`&lt;br /&gt;
    fi&lt;br /&gt;
&lt;br /&gt;
    # Convert download/upload speed from bytes per second to Mbps and round valu&lt;br /&gt;
    download=`echo &amp;quot;scale=8; $download * 8 / 1000000&amp;quot; | bc`&lt;br /&gt;
    download=`echo &amp;quot;scale=2; ($download + 0.005) / 1&amp;quot; | bc`&lt;br /&gt;
    upload=`echo &amp;quot;scale=8; $upload * 8 / 1000000&amp;quot; | bc`&lt;br /&gt;
    upload=`echo &amp;quot;scale=2; ($upload + 0.005) / 1&amp;quot; | bc`&lt;br /&gt;
&lt;br /&gt;
    # Convert used bytes to MBytes and round values&lt;br /&gt;
    download_used=`echo &amp;quot;scale=8; $download_used / 1000000&amp;quot; | bc`&lt;br /&gt;
    download_used=`echo &amp;quot;scale=1; ($download_used + 0.05) / 1&amp;quot; | bc`&lt;br /&gt;
    upload_used=`echo &amp;quot;scale=8; $upload_used / 1000000&amp;quot; | bc`&lt;br /&gt;
    upload_used=`echo &amp;quot;scale=1; ($upload_used + 0.05) / 1&amp;quot; | bc`&lt;br /&gt;
&lt;br /&gt;
    vpn_active=0&lt;br /&gt;
&lt;br /&gt;
    # Fill timestamp field&lt;br /&gt;
    timestamp=${timestamp[$row]}&lt;br /&gt;
&lt;br /&gt;
    # Insert data into database&lt;br /&gt;
    sql=&amp;quot;INSERT INTO fw_speedtest (timestamp,server_id,server_name,latency,&amp;quot;&lt;br /&gt;
    sql+=&amp;quot;jitter,packet_loss,download,upload,download_used,upload_used,&amp;quot;&lt;br /&gt;
    sql+=&amp;quot;vpn_active,tarif,exclude,comment,url) VALUES (&amp;quot;&lt;br /&gt;
    sql+=&amp;quot;\&amp;quot;$timestamp\&amp;quot;, \&amp;quot;$server_id\&amp;quot;, \&amp;quot;$server_name\&amp;quot;, \&amp;quot;$latency\&amp;quot;, &amp;quot;&lt;br /&gt;
    sql+=&amp;quot;\&amp;quot;$jitter\&amp;quot;, \&amp;quot;$packet_loss\&amp;quot;, \&amp;quot;$download\&amp;quot;, \&amp;quot;$upload\&amp;quot;, &amp;quot;&lt;br /&gt;
    sql+=&amp;quot;\&amp;quot;$download_used\&amp;quot;, \&amp;quot;$upload_used\&amp;quot;, \&amp;quot;$vpn_active\&amp;quot;, &amp;quot;&lt;br /&gt;
    sql+=&amp;quot;\&amp;quot;$tarif\&amp;quot;, \&amp;quot;$exclude\&amp;quot;, \&amp;quot;$comment\&amp;quot;,\&amp;quot;$url\&amp;quot;)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    mysql --login-path=fwsysmon -D fwsysmon -e &amp;quot;$sql&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  fi&lt;br /&gt;
&lt;br /&gt;
done &amp;lt;&amp;lt;&amp;lt;`cat $out`&lt;br /&gt;
&lt;br /&gt;
exit 0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Scheduling Speedtest with systemd ===&lt;br /&gt;
* &#039;&#039;&#039;Service Unit file &#039;&#039;/lib/systemd/system/fwspeedtest.service&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Internet speedtest&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=oneshot&lt;br /&gt;
ExecStart=/usr/bin/fwspeedtest&lt;br /&gt;
User=root&lt;br /&gt;
Group=root&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Timer Unit file &#039;&#039;/lib/systemd/system/fwspeedtest.timer&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Run Internet speedtest&lt;br /&gt;
&lt;br /&gt;
[Timer]&lt;br /&gt;
OnCalendar=*-*-* 18:00&lt;br /&gt;
RandomizedDelaySec=12h&lt;br /&gt;
Persistent=true&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=timers.target&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Wulf</name></author>
	</entry>
	<entry>
		<id>http://wiki.frank-wulf.de/index.php?title=Internet_Speedtest&amp;diff=591</id>
		<title>Internet Speedtest</title>
		<link rel="alternate" type="text/html" href="http://wiki.frank-wulf.de/index.php?title=Internet_Speedtest&amp;diff=591"/>
		<updated>2022-07-31T04:59:42Z</updated>

		<summary type="html">&lt;p&gt;Wulf: /* Shell script /usr/bin/fwspeedtest */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__FORCETOC__&lt;br /&gt;
===Shell script &#039;&#039;&#039;&#039;&#039;/usr/bin/fwspeedtest&#039;&#039;&#039;&#039;&#039;===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
#&lt;br /&gt;
# Author:  Frank Wulf&lt;br /&gt;
# Version: 1.5 (2020-12-23)&lt;br /&gt;
#&lt;br /&gt;
# This script measures the internet speed by using Ookla speedtest tool.&lt;br /&gt;
#&lt;br /&gt;
# In regards to the conversion rules described in&lt;br /&gt;
# https://help.speedtest.net/hc/en-us/articles/360039162713-What-do-mbps-and-kbp&lt;br /&gt;
# the following calculations are used:&lt;br /&gt;
# 1 kilobit = 1000 bits&lt;br /&gt;
# 1 megabit = 1000 kilobits&lt;br /&gt;
# 1 Mbyte   = 8 megabits&lt;br /&gt;
&lt;br /&gt;
runs=2&lt;br /&gt;
tarif=&amp;quot;Telekom Zuhause L&amp;quot;&lt;br /&gt;
exclude=0&lt;br /&gt;
comment=&amp;quot;&amp;quot;&lt;br /&gt;
out=/tmp/fwspeedtest.out&lt;br /&gt;
&lt;br /&gt;
if [ -f &amp;quot;$out&amp;quot; ]; then&lt;br /&gt;
  rm $out 1&amp;gt;/dev/null 2&amp;gt;&amp;amp;1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Run the speedtest &amp;lt;runs&amp;gt; times without VPN connection&lt;br /&gt;
for i in `eval echo {1..$runs}`&lt;br /&gt;
do&lt;br /&gt;
  # Check if VPN connection is active&lt;br /&gt;
  systemctl status openvpn 1&amp;gt;/dev/null 2&amp;gt;&amp;amp;1&lt;br /&gt;
  if [ $? -eq 0 ]; then&lt;br /&gt;
    vpn_active=1&lt;br /&gt;
    # Stop VPN connection&lt;br /&gt;
    systemctl stop openvpn&lt;br /&gt;
    sleep 5&lt;br /&gt;
  else&lt;br /&gt;
    vpn_active=0&lt;br /&gt;
  fi&lt;br /&gt;
&lt;br /&gt;
  # Fill timestamp field&lt;br /&gt;
  timestamp[$i]=`date +&#039;%Y-%m-%d %H:%M:%S&#039;`&lt;br /&gt;
&lt;br /&gt;
  # Run speedtest&lt;br /&gt;
  /usr/bin/speedtest speedtest --accept-gdpr --format=csv &amp;gt;&amp;gt;$out&lt;br /&gt;
  retcode=$?&lt;br /&gt;
&lt;br /&gt;
  if [ $vpn_active -eq 1 ]; then&lt;br /&gt;
    # Start VPN connection&lt;br /&gt;
    systemctl start openvpn&lt;br /&gt;
  fi&lt;br /&gt;
&lt;br /&gt;
  if [ &amp;quot;$retcode&amp;quot; -ne 0 ]; then&lt;br /&gt;
    exit 1&lt;br /&gt;
  fi&lt;br /&gt;
&lt;br /&gt;
  if [ $i -lt $runs ]; then&lt;br /&gt;
    # Wait 15 seconds between two speedtests&lt;br /&gt;
    sleep 15&lt;br /&gt;
  fi&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
download_max=0&lt;br /&gt;
i=0&lt;br /&gt;
&lt;br /&gt;
while read line; do&lt;br /&gt;
  i=$((i+1))&lt;br /&gt;
  download_new=`echo &amp;quot;$line&amp;quot;|awk -F &#039;^ *&amp;quot;|&amp;quot; *, *&amp;quot;|&amp;quot; *$&#039; &#039;{ print $7 }&#039;`&lt;br /&gt;
  if [ $download_new -gt $download_max ]; then&lt;br /&gt;
    # Download rate is faster than previous ones&lt;br /&gt;
    download=$download_new&lt;br /&gt;
    server_id=`echo &amp;quot;$line&amp;quot;|awk -F &#039;^ *&amp;quot;|&amp;quot; *, *&amp;quot;|&amp;quot; *$&#039; &#039;{ print $3 }&#039;`&lt;br /&gt;
    server_name=`echo &amp;quot;$line&amp;quot;|awk -F &#039;^ *&amp;quot;|&amp;quot; *, *&amp;quot;|&amp;quot; *$&#039; &#039;{ print $2 }&#039;`&lt;br /&gt;
    latency=`echo &amp;quot;$line&amp;quot;|awk -F &#039;^ *&amp;quot;|&amp;quot; *, *&amp;quot;|&amp;quot; *$&#039; &#039;{ print $4 }&#039;`&lt;br /&gt;
    jitter=`echo &amp;quot;$line&amp;quot;|awk -F &#039;^ *&amp;quot;|&amp;quot; *, *&amp;quot;|&amp;quot; *$&#039; &#039;{ print $5 }&#039;`&lt;br /&gt;
    packet_loss=`echo &amp;quot;$line&amp;quot;|awk -F &#039;^ *&amp;quot;|&amp;quot; *, *&amp;quot;|&amp;quot; *$&#039; &#039;{ print $6 }&#039;`&lt;br /&gt;
    download=`echo &amp;quot;$line&amp;quot;|awk -F &#039;^ *&amp;quot;|&amp;quot; *, *&amp;quot;|&amp;quot; *$&#039; &#039;{ print $7 }&#039;`&lt;br /&gt;
    upload=`echo &amp;quot;$line&amp;quot;|awk -F &#039;^ *&amp;quot;|&amp;quot; *, *&amp;quot;|&amp;quot; *$&#039; &#039;{ print $8 }&#039;`&lt;br /&gt;
    download_used=`echo &amp;quot;$line&amp;quot;|awk -F &#039;^ *&amp;quot;|&amp;quot; *, *&amp;quot;|&amp;quot; *$&#039; &#039;{ print $9 }&#039;`&lt;br /&gt;
    upload_used=`echo &amp;quot;$line&amp;quot;|awk -F &#039;^ *&amp;quot;|&amp;quot; *, *&amp;quot;|&amp;quot; *$&#039; &#039;{ print $10 }&#039;`&lt;br /&gt;
    url=`echo &amp;quot;$line&amp;quot;|awk -F &#039;^ *&amp;quot;|&amp;quot; *, *&amp;quot;|&amp;quot; *$&#039; &#039;{ print $11 }&#039;`&lt;br /&gt;
    download_max=$download&lt;br /&gt;
    row=$i&lt;br /&gt;
  fi&lt;br /&gt;
&lt;br /&gt;
  if [ $i -eq $runs ]; then&lt;br /&gt;
    # Round values for latency. jitter and packet_loss&lt;br /&gt;
    latency=`echo &amp;quot;scale=2; ($latency + 0.005) / 1&amp;quot; | bc`&lt;br /&gt;
    jitter=`echo &amp;quot;scale=2; ($jitter + 0.005) / 1&amp;quot; | bc`&lt;br /&gt;
    if [ $packet_loss == &amp;quot;N/A&amp;quot; ]; then&lt;br /&gt;
      packet_loss=0&lt;br /&gt;
    else&lt;br /&gt;
      packet_loss=`echo &amp;quot;scale=1; ($packet_loss + 0.05) / 1&amp;quot; | bc`&lt;br /&gt;
    fi&lt;br /&gt;
&lt;br /&gt;
    # Convert download/upload speed from bytes per second to Mbps and round valu&lt;br /&gt;
    download=`echo &amp;quot;scale=8; $download * 8 / 1000000&amp;quot; | bc`&lt;br /&gt;
    download=`echo &amp;quot;scale=2; ($download + 0.005) / 1&amp;quot; | bc`&lt;br /&gt;
    upload=`echo &amp;quot;scale=8; $upload * 8 / 1000000&amp;quot; | bc`&lt;br /&gt;
    upload=`echo &amp;quot;scale=2; ($upload + 0.005) / 1&amp;quot; | bc`&lt;br /&gt;
&lt;br /&gt;
    # Convert used bytes to MBytes and round values&lt;br /&gt;
    download_used=`echo &amp;quot;scale=8; $download_used / 1000000&amp;quot; | bc`&lt;br /&gt;
    download_used=`echo &amp;quot;scale=1; ($download_used + 0.05) / 1&amp;quot; | bc`&lt;br /&gt;
    upload_used=`echo &amp;quot;scale=8; $upload_used / 1000000&amp;quot; | bc`&lt;br /&gt;
    upload_used=`echo &amp;quot;scale=1; ($upload_used + 0.05) / 1&amp;quot; | bc`&lt;br /&gt;
&lt;br /&gt;
    vpn_active=0&lt;br /&gt;
&lt;br /&gt;
    # Fill timestamp field&lt;br /&gt;
    timestamp=${timestamp[$row]}&lt;br /&gt;
&lt;br /&gt;
    # Insert data into database&lt;br /&gt;
    sql=&amp;quot;INSERT INTO fw_speedtest (timestamp,server_id,server_name,latency,&amp;quot;&lt;br /&gt;
    sql+=&amp;quot;jitter,packet_loss,download,upload,download_used,upload_used,&amp;quot;&lt;br /&gt;
    sql+=&amp;quot;vpn_active,tarif,exclude,comment,url) VALUES (&amp;quot;&lt;br /&gt;
    sql+=&amp;quot;\&amp;quot;$timestamp\&amp;quot;, \&amp;quot;$server_id\&amp;quot;, \&amp;quot;$server_name\&amp;quot;, \&amp;quot;$latency\&amp;quot;, &amp;quot;&lt;br /&gt;
    sql+=&amp;quot;\&amp;quot;$jitter\&amp;quot;, \&amp;quot;$packet_loss\&amp;quot;, \&amp;quot;$download\&amp;quot;, \&amp;quot;$upload\&amp;quot;, &amp;quot;&lt;br /&gt;
    sql+=&amp;quot;\&amp;quot;$download_used\&amp;quot;, \&amp;quot;$upload_used\&amp;quot;, \&amp;quot;$vpn_active\&amp;quot;, &amp;quot;&lt;br /&gt;
    sql+=&amp;quot;\&amp;quot;$tarif\&amp;quot;, \&amp;quot;$exclude\&amp;quot;, \&amp;quot;$comment\&amp;quot;,\&amp;quot;$url\&amp;quot;)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    mysql --login-path=fwsysmon -D fwsysmon -e &amp;quot;$sql&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  fi&lt;br /&gt;
&lt;br /&gt;
done &amp;lt;&amp;lt;&amp;lt;`cat $out`&lt;br /&gt;
&lt;br /&gt;
exit 0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Scheduling Speedtest with systemd ===&lt;br /&gt;
* &#039;&#039;&#039;Service Unit file &#039;&#039;/lib/systemd/system/fwspeedtest.service&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=LTE speedtest&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=oneshot&lt;br /&gt;
ExecStart=/usr/bin/fwspeedtest&lt;br /&gt;
User=root&lt;br /&gt;
Group=root&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Timer Unit file &#039;&#039;/lib/systemd/system/fwspeedtest.timer&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Run LTE speedtest&lt;br /&gt;
&lt;br /&gt;
[Timer]&lt;br /&gt;
OnCalendar=*-*-* 18:00&lt;br /&gt;
RandomizedDelaySec=12h&lt;br /&gt;
Persistent=true&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=timers.target&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Wulf</name></author>
	</entry>
	<entry>
		<id>http://wiki.frank-wulf.de/index.php?title=Internet_Speedtest&amp;diff=590</id>
		<title>Internet Speedtest</title>
		<link rel="alternate" type="text/html" href="http://wiki.frank-wulf.de/index.php?title=Internet_Speedtest&amp;diff=590"/>
		<updated>2022-07-31T04:58:58Z</updated>

		<summary type="html">&lt;p&gt;Wulf: Änderung 589 von Wulf (Diskussion) rückgängig gemacht.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__FORCETOC__&lt;br /&gt;
===Shell script &#039;&#039;&#039;&#039;&#039;/usr/bin/fwspeedtest&#039;&#039;&#039;&#039;&#039;===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
#&lt;br /&gt;
# Author:  Frank Wulf&lt;br /&gt;
# Version: 1.5 (2020-12-23)&lt;br /&gt;
#&lt;br /&gt;
# This script measures the internet speed by using Ookla speedtest tool.&lt;br /&gt;
#&lt;br /&gt;
# In regards to the conversion rules described in&lt;br /&gt;
# https://help.speedtest.net/hc/en-us/articles/360039162713-What-do-mbps-and-kbps-mean-&lt;br /&gt;
# the following calculations are used:&lt;br /&gt;
# 1 kilobit = 1000 bits&lt;br /&gt;
# 1 megabit = 1000 kilobits&lt;br /&gt;
# 1 Mbyte   = 8 megabits&lt;br /&gt;
&lt;br /&gt;
runs=2&lt;br /&gt;
tarif=&amp;quot;Freenet FUNK&amp;quot;&lt;br /&gt;
exclude=0&lt;br /&gt;
comment=&amp;quot;&amp;quot;&lt;br /&gt;
out=/tmp/fwspeedtest.out&lt;br /&gt;
&lt;br /&gt;
if [ -f &amp;quot;$out&amp;quot; ]; then&lt;br /&gt;
  rm $out 1&amp;gt;/dev/null 2&amp;gt;&amp;amp;1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Run the speedtest &amp;lt;runs&amp;gt; times without VPN connection&lt;br /&gt;
for i in `eval echo {1..$runs}`&lt;br /&gt;
do&lt;br /&gt;
  # Check if VPN connection is active&lt;br /&gt;
  systemctl status openvpn 1&amp;gt;/dev/null 2&amp;gt;&amp;amp;1&lt;br /&gt;
  if [ $? -eq 0 ]; then&lt;br /&gt;
    vpn_active=1&lt;br /&gt;
    # Stop VPN connection&lt;br /&gt;
    systemctl stop openvpn&lt;br /&gt;
    sleep 5&lt;br /&gt;
  else&lt;br /&gt;
    vpn_active=0&lt;br /&gt;
  fi&lt;br /&gt;
&lt;br /&gt;
  # Fill timestamp field&lt;br /&gt;
  timestamp[$i]=`date +&#039;%Y-%m-%d %H:%M:%S&#039;`&lt;br /&gt;
&lt;br /&gt;
  # Run speedtest&lt;br /&gt;
  /usr/bin/speedtest speedtest --accept-gdpr --format=csv &amp;gt;&amp;gt;$out&lt;br /&gt;
  retcode=$?&lt;br /&gt;
&lt;br /&gt;
  if [ $vpn_active -eq 1 ]; then&lt;br /&gt;
    # Start VPN connection&lt;br /&gt;
    systemctl start openvpn&lt;br /&gt;
  fi&lt;br /&gt;
&lt;br /&gt;
  if [ &amp;quot;$retcode&amp;quot; -ne 0 ]; then&lt;br /&gt;
    exit 1&lt;br /&gt;
  fi&lt;br /&gt;
&lt;br /&gt;
  if [ $i -lt $runs ]; then&lt;br /&gt;
    # Wait 15 seconds between two speedtests&lt;br /&gt;
    sleep 15&lt;br /&gt;
  fi&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
download_max=0&lt;br /&gt;
i=0&lt;br /&gt;
&lt;br /&gt;
while read line; do&lt;br /&gt;
  i=$((i+1))&lt;br /&gt;
  download_new=`echo &amp;quot;$line&amp;quot;|awk -F &#039;^ *&amp;quot;|&amp;quot; *, *&amp;quot;|&amp;quot; *$&#039; &#039;{ print $7 }&#039;`&lt;br /&gt;
  if [ $download_new -gt $download_max ]; then&lt;br /&gt;
    # Download rate is faster than previous ones&lt;br /&gt;
    download=$download_new&lt;br /&gt;
    server_id=`echo &amp;quot;$line&amp;quot;|awk -F &#039;^ *&amp;quot;|&amp;quot; *, *&amp;quot;|&amp;quot; *$&#039; &#039;{ print $3 }&#039;`&lt;br /&gt;
    server_name=`echo &amp;quot;$line&amp;quot;|awk -F &#039;^ *&amp;quot;|&amp;quot; *, *&amp;quot;|&amp;quot; *$&#039; &#039;{ print $2 }&#039;`&lt;br /&gt;
    latency=`echo &amp;quot;$line&amp;quot;|awk -F &#039;^ *&amp;quot;|&amp;quot; *, *&amp;quot;|&amp;quot; *$&#039; &#039;{ print $4 }&#039;`&lt;br /&gt;
    jitter=`echo &amp;quot;$line&amp;quot;|awk -F &#039;^ *&amp;quot;|&amp;quot; *, *&amp;quot;|&amp;quot; *$&#039; &#039;{ print $5 }&#039;`&lt;br /&gt;
    packet_loss=`echo &amp;quot;$line&amp;quot;|awk -F &#039;^ *&amp;quot;|&amp;quot; *, *&amp;quot;|&amp;quot; *$&#039; &#039;{ print $6 }&#039;`&lt;br /&gt;
    download=`echo &amp;quot;$line&amp;quot;|awk -F &#039;^ *&amp;quot;|&amp;quot; *, *&amp;quot;|&amp;quot; *$&#039; &#039;{ print $7 }&#039;`&lt;br /&gt;
    upload=`echo &amp;quot;$line&amp;quot;|awk -F &#039;^ *&amp;quot;|&amp;quot; *, *&amp;quot;|&amp;quot; *$&#039; &#039;{ print $8 }&#039;`&lt;br /&gt;
    download_used=`echo &amp;quot;$line&amp;quot;|awk -F &#039;^ *&amp;quot;|&amp;quot; *, *&amp;quot;|&amp;quot; *$&#039; &#039;{ print $9 }&#039;`&lt;br /&gt;
    upload_used=`echo &amp;quot;$line&amp;quot;|awk -F &#039;^ *&amp;quot;|&amp;quot; *, *&amp;quot;|&amp;quot; *$&#039; &#039;{ print $10 }&#039;`&lt;br /&gt;
    url=`echo &amp;quot;$line&amp;quot;|awk -F &#039;^ *&amp;quot;|&amp;quot; *, *&amp;quot;|&amp;quot; *$&#039; &#039;{ print $11 }&#039;`&lt;br /&gt;
    download_max=$download&lt;br /&gt;
    row=$i&lt;br /&gt;
  fi&lt;br /&gt;
&lt;br /&gt;
  if [ $i -eq $runs ]; then&lt;br /&gt;
    # Round values for latency. jitter and packet_loss&lt;br /&gt;
    latency=`echo &amp;quot;scale=2; ($latency + 0.005) / 1&amp;quot; | bc`&lt;br /&gt;
    jitter=`echo &amp;quot;scale=2; ($jitter + 0.005) / 1&amp;quot; | bc`&lt;br /&gt;
    if [ $packet_loss == &amp;quot;N/A&amp;quot; ]; then&lt;br /&gt;
      packet_loss=0&lt;br /&gt;
    else&lt;br /&gt;
      packet_loss=`echo &amp;quot;scale=1; ($packet_loss + 0.05) / 1&amp;quot; | bc`&lt;br /&gt;
    fi&lt;br /&gt;
&lt;br /&gt;
    # Convert download/upload speed from bytes per second to Mbps and round values&lt;br /&gt;
    download=`echo &amp;quot;scale=8; $download * 8 / 1000000&amp;quot; | bc`&lt;br /&gt;
    download=`echo &amp;quot;scale=2; ($download + 0.005) / 1&amp;quot; | bc`&lt;br /&gt;
    upload=`echo &amp;quot;scale=8; $upload * 8 / 1000000&amp;quot; | bc`&lt;br /&gt;
    upload=`echo &amp;quot;scale=2; ($upload + 0.005) / 1&amp;quot; | bc`&lt;br /&gt;
&lt;br /&gt;
    # Convert used bytes to MBytes and round values&lt;br /&gt;
    download_used=`echo &amp;quot;scale=8; $download_used / 1000000&amp;quot; | bc`&lt;br /&gt;
    download_used=`echo &amp;quot;scale=1; ($download_used + 0.05) / 1&amp;quot; | bc`&lt;br /&gt;
    upload_used=`echo &amp;quot;scale=8; $upload_used / 1000000&amp;quot; | bc`&lt;br /&gt;
    upload_used=`echo &amp;quot;scale=1; ($upload_used + 0.05) / 1&amp;quot; | bc`&lt;br /&gt;
&lt;br /&gt;
    vpn_active=0&lt;br /&gt;
&lt;br /&gt;
    # Fill timestamp field&lt;br /&gt;
    timestamp=${timestamp[$row]}&lt;br /&gt;
&lt;br /&gt;
    # Insert data into database&lt;br /&gt;
    sql=&amp;quot;INSERT INTO fw_speedtest (timestamp,server_id,server_name,latency,&amp;quot;&lt;br /&gt;
    sql+=&amp;quot;jitter,packet_loss,download,upload,download_used,upload_used,&amp;quot;&lt;br /&gt;
    sql+=&amp;quot;vpn_active,tarif,exclude,comment,url) VALUES (&amp;quot;&lt;br /&gt;
    sql+=&amp;quot;\&amp;quot;$timestamp\&amp;quot;, \&amp;quot;$server_id\&amp;quot;, \&amp;quot;$server_name\&amp;quot;, \&amp;quot;$latency\&amp;quot;, &amp;quot;&lt;br /&gt;
    sql+=&amp;quot;\&amp;quot;$jitter\&amp;quot;, \&amp;quot;$packet_loss\&amp;quot;, \&amp;quot;$download\&amp;quot;, \&amp;quot;$upload\&amp;quot;, &amp;quot;&lt;br /&gt;
    sql+=&amp;quot;\&amp;quot;$download_used\&amp;quot;, \&amp;quot;$upload_used\&amp;quot;, \&amp;quot;$vpn_active\&amp;quot;, &amp;quot;&lt;br /&gt;
    sql+=&amp;quot;\&amp;quot;$tarif\&amp;quot;, \&amp;quot;$exclude\&amp;quot;, \&amp;quot;$comment\&amp;quot;,\&amp;quot;$url\&amp;quot;)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    mysql --login-path=fwsysmon -D fwsysmon -e &amp;quot;$sql&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  fi&lt;br /&gt;
&lt;br /&gt;
done &amp;lt;&amp;lt;&amp;lt;`cat $out`&lt;br /&gt;
&lt;br /&gt;
exit 0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Scheduling Speedtest with systemd ===&lt;br /&gt;
* &#039;&#039;&#039;Service Unit file &#039;&#039;/lib/systemd/system/fwspeedtest.service&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=LTE speedtest&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=oneshot&lt;br /&gt;
ExecStart=/usr/bin/fwspeedtest&lt;br /&gt;
User=root&lt;br /&gt;
Group=root&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Timer Unit file &#039;&#039;/lib/systemd/system/fwspeedtest.timer&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Run LTE speedtest&lt;br /&gt;
&lt;br /&gt;
[Timer]&lt;br /&gt;
OnCalendar=*-*-* 18:00&lt;br /&gt;
RandomizedDelaySec=12h&lt;br /&gt;
Persistent=true&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=timers.target&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Wulf</name></author>
	</entry>
	<entry>
		<id>http://wiki.frank-wulf.de/index.php?title=Internet_Speedtest&amp;diff=589</id>
		<title>Internet Speedtest</title>
		<link rel="alternate" type="text/html" href="http://wiki.frank-wulf.de/index.php?title=Internet_Speedtest&amp;diff=589"/>
		<updated>2022-07-31T04:58:01Z</updated>

		<summary type="html">&lt;p&gt;Wulf: /* Shell script /usr/bin/fwspeedtest */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__FORCETOC__&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
#&lt;br /&gt;
# Author:  Frank Wulf&lt;br /&gt;
# Version: 1.5 (2020-12-23)&lt;br /&gt;
#&lt;br /&gt;
# This script measures the internet speed by using Ookla speedtest tool.&lt;br /&gt;
#&lt;br /&gt;
# In regards to the conversion rules described in&lt;br /&gt;
# https://help.speedtest.net/hc/en-us/articles/360039162713-What-do-mbps-and-kbp&lt;br /&gt;
# the following calculations are used:&lt;br /&gt;
# 1 kilobit = 1000 bits&lt;br /&gt;
# 1 megabit = 1000 kilobits&lt;br /&gt;
# 1 Mbyte   = 8 megabits&lt;br /&gt;
&lt;br /&gt;
runs=2&lt;br /&gt;
tarif=&amp;quot;Telekom Zuhause L&amp;quot;&lt;br /&gt;
exclude=0&lt;br /&gt;
comment=&amp;quot;&amp;quot;&lt;br /&gt;
out=/tmp/fwspeedtest.out&lt;br /&gt;
&lt;br /&gt;
if [ -f &amp;quot;$out&amp;quot; ]; then&lt;br /&gt;
  rm $out 1&amp;gt;/dev/null 2&amp;gt;&amp;amp;1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Run the speedtest &amp;lt;runs&amp;gt; times without VPN connection&lt;br /&gt;
for i in `eval echo {1..$runs}`&lt;br /&gt;
do&lt;br /&gt;
  # Check if VPN connection is active&lt;br /&gt;
  systemctl status openvpn 1&amp;gt;/dev/null 2&amp;gt;&amp;amp;1&lt;br /&gt;
  if [ $? -eq 0 ]; then&lt;br /&gt;
    vpn_active=1&lt;br /&gt;
    # Stop VPN connection&lt;br /&gt;
    systemctl stop openvpn&lt;br /&gt;
    sleep 5&lt;br /&gt;
  else&lt;br /&gt;
    vpn_active=0&lt;br /&gt;
  fi&lt;br /&gt;
&lt;br /&gt;
  # Fill timestamp field&lt;br /&gt;
  timestamp[$i]=`date +&#039;%Y-%m-%d %H:%M:%S&#039;`&lt;br /&gt;
&lt;br /&gt;
  # Run speedtest&lt;br /&gt;
  /usr/bin/speedtest speedtest --accept-gdpr --format=csv &amp;gt;&amp;gt;$out&lt;br /&gt;
  retcode=$?&lt;br /&gt;
&lt;br /&gt;
  if [ $vpn_active -eq 1 ]; then&lt;br /&gt;
    # Start VPN connection&lt;br /&gt;
    systemctl start openvpn&lt;br /&gt;
  fi&lt;br /&gt;
&lt;br /&gt;
  if [ &amp;quot;$retcode&amp;quot; -ne 0 ]; then&lt;br /&gt;
    exit 1&lt;br /&gt;
  fi&lt;br /&gt;
&lt;br /&gt;
  if [ $i -lt $runs ]; then&lt;br /&gt;
    # Wait 15 seconds between two speedtests&lt;br /&gt;
    sleep 15&lt;br /&gt;
  fi&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
download_max=0&lt;br /&gt;
i=0&lt;br /&gt;
&lt;br /&gt;
while read line; do&lt;br /&gt;
  i=$((i+1))&lt;br /&gt;
  download_new=`echo &amp;quot;$line&amp;quot;|awk -F &#039;^ *&amp;quot;|&amp;quot; *, *&amp;quot;|&amp;quot; *$&#039; &#039;{ print $7 }&#039;`&lt;br /&gt;
  if [ $download_new -gt $download_max ]; then&lt;br /&gt;
    # Download rate is faster than previous ones&lt;br /&gt;
    download=$download_new&lt;br /&gt;
    server_id=`echo &amp;quot;$line&amp;quot;|awk -F &#039;^ *&amp;quot;|&amp;quot; *, *&amp;quot;|&amp;quot; *$&#039; &#039;{ print $3 }&#039;`&lt;br /&gt;
    server_name=`echo &amp;quot;$line&amp;quot;|awk -F &#039;^ *&amp;quot;|&amp;quot; *, *&amp;quot;|&amp;quot; *$&#039; &#039;{ print $2 }&#039;`&lt;br /&gt;
    latency=`echo &amp;quot;$line&amp;quot;|awk -F &#039;^ *&amp;quot;|&amp;quot; *, *&amp;quot;|&amp;quot; *$&#039; &#039;{ print $4 }&#039;`&lt;br /&gt;
    jitter=`echo &amp;quot;$line&amp;quot;|awk -F &#039;^ *&amp;quot;|&amp;quot; *, *&amp;quot;|&amp;quot; *$&#039; &#039;{ print $5 }&#039;`&lt;br /&gt;
    packet_loss=`echo &amp;quot;$line&amp;quot;|awk -F &#039;^ *&amp;quot;|&amp;quot; *, *&amp;quot;|&amp;quot; *$&#039; &#039;{ print $6 }&#039;`&lt;br /&gt;
    download=`echo &amp;quot;$line&amp;quot;|awk -F &#039;^ *&amp;quot;|&amp;quot; *, *&amp;quot;|&amp;quot; *$&#039; &#039;{ print $7 }&#039;`&lt;br /&gt;
    upload=`echo &amp;quot;$line&amp;quot;|awk -F &#039;^ *&amp;quot;|&amp;quot; *, *&amp;quot;|&amp;quot; *$&#039; &#039;{ print $8 }&#039;`&lt;br /&gt;
    download_used=`echo &amp;quot;$line&amp;quot;|awk -F &#039;^ *&amp;quot;|&amp;quot; *, *&amp;quot;|&amp;quot; *$&#039; &#039;{ print $9 }&#039;`&lt;br /&gt;
    upload_used=`echo &amp;quot;$line&amp;quot;|awk -F &#039;^ *&amp;quot;|&amp;quot; *, *&amp;quot;|&amp;quot; *$&#039; &#039;{ print $10 }&#039;`&lt;br /&gt;
    url=`echo &amp;quot;$line&amp;quot;|awk -F &#039;^ *&amp;quot;|&amp;quot; *, *&amp;quot;|&amp;quot; *$&#039; &#039;{ print $11 }&#039;`&lt;br /&gt;
    download_max=$download&lt;br /&gt;
    row=$i&lt;br /&gt;
  fi&lt;br /&gt;
&lt;br /&gt;
  if [ $i -eq $runs ]; then&lt;br /&gt;
    # Round values for latency. jitter and packet_loss&lt;br /&gt;
    latency=`echo &amp;quot;scale=2; ($latency + 0.005) / 1&amp;quot; | bc`&lt;br /&gt;
    jitter=`echo &amp;quot;scale=2; ($jitter + 0.005) / 1&amp;quot; | bc`&lt;br /&gt;
    if [ $packet_loss == &amp;quot;N/A&amp;quot; ]; then&lt;br /&gt;
      packet_loss=0&lt;br /&gt;
    else&lt;br /&gt;
      packet_loss=`echo &amp;quot;scale=1; ($packet_loss + 0.05) / 1&amp;quot; | bc`&lt;br /&gt;
    fi&lt;br /&gt;
&lt;br /&gt;
    # Convert download/upload speed from bytes per second to Mbps and round valu&lt;br /&gt;
    download=`echo &amp;quot;scale=8; $download * 8 / 1000000&amp;quot; | bc`&lt;br /&gt;
    download=`echo &amp;quot;scale=2; ($download + 0.005) / 1&amp;quot; | bc`&lt;br /&gt;
    upload=`echo &amp;quot;scale=8; $upload * 8 / 1000000&amp;quot; | bc`&lt;br /&gt;
    upload=`echo &amp;quot;scale=2; ($upload + 0.005) / 1&amp;quot; | bc`&lt;br /&gt;
&lt;br /&gt;
    # Convert used bytes to MBytes and round values&lt;br /&gt;
    download_used=`echo &amp;quot;scale=8; $download_used / 1000000&amp;quot; | bc`&lt;br /&gt;
    download_used=`echo &amp;quot;scale=1; ($download_used + 0.05) / 1&amp;quot; | bc`&lt;br /&gt;
    upload_used=`echo &amp;quot;scale=8; $upload_used / 1000000&amp;quot; | bc`&lt;br /&gt;
    upload_used=`echo &amp;quot;scale=1; ($upload_used + 0.05) / 1&amp;quot; | bc`&lt;br /&gt;
&lt;br /&gt;
    vpn_active=0&lt;br /&gt;
&lt;br /&gt;
    # Fill timestamp field&lt;br /&gt;
    timestamp=${timestamp[$row]}&lt;br /&gt;
&lt;br /&gt;
    # Insert data into database&lt;br /&gt;
    sql=&amp;quot;INSERT INTO fw_speedtest (timestamp,server_id,server_name,latency,&amp;quot;&lt;br /&gt;
    sql+=&amp;quot;jitter,packet_loss,download,upload,download_used,upload_used,&amp;quot;&lt;br /&gt;
    sql+=&amp;quot;vpn_active,tarif,exclude,comment,url) VALUES (&amp;quot;&lt;br /&gt;
    sql+=&amp;quot;\&amp;quot;$timestamp\&amp;quot;, \&amp;quot;$server_id\&amp;quot;, \&amp;quot;$server_name\&amp;quot;, \&amp;quot;$latency\&amp;quot;, &amp;quot;&lt;br /&gt;
    sql+=&amp;quot;\&amp;quot;$jitter\&amp;quot;, \&amp;quot;$packet_loss\&amp;quot;, \&amp;quot;$download\&amp;quot;, \&amp;quot;$upload\&amp;quot;, &amp;quot;&lt;br /&gt;
    sql+=&amp;quot;\&amp;quot;$download_used\&amp;quot;, \&amp;quot;$upload_used\&amp;quot;, \&amp;quot;$vpn_active\&amp;quot;, &amp;quot;&lt;br /&gt;
    sql+=&amp;quot;\&amp;quot;$tarif\&amp;quot;, \&amp;quot;$exclude\&amp;quot;, \&amp;quot;$comment\&amp;quot;,\&amp;quot;$url\&amp;quot;)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    mysql --login-path=fwsysmon -D fwsysmon -e &amp;quot;$sql&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  fi&lt;br /&gt;
&lt;br /&gt;
done &amp;lt;&amp;lt;&amp;lt;`cat $out`&lt;br /&gt;
&lt;br /&gt;
exit 0&lt;br /&gt;
&lt;br /&gt;
=== Scheduling Speedtest with systemd ===&lt;br /&gt;
* &#039;&#039;&#039;Service Unit file &#039;&#039;/lib/systemd/system/fwspeedtest.service&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=LTE speedtest&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=oneshot&lt;br /&gt;
ExecStart=/usr/bin/fwspeedtest&lt;br /&gt;
User=root&lt;br /&gt;
Group=root&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Timer Unit file &#039;&#039;/lib/systemd/system/fwspeedtest.timer&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Run LTE speedtest&lt;br /&gt;
&lt;br /&gt;
[Timer]&lt;br /&gt;
OnCalendar=*-*-* 18:00&lt;br /&gt;
RandomizedDelaySec=12h&lt;br /&gt;
Persistent=true&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=timers.target&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Wulf</name></author>
	</entry>
	<entry>
		<id>http://wiki.frank-wulf.de/index.php?title=IoBroker&amp;diff=588</id>
		<title>IoBroker</title>
		<link rel="alternate" type="text/html" href="http://wiki.frank-wulf.de/index.php?title=IoBroker&amp;diff=588"/>
		<updated>2022-06-25T18:20:16Z</updated>

		<summary type="html">&lt;p&gt;Wulf: /* Upgrading Node.js */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__FORCETOC__&lt;br /&gt;
=Upgrading Node.js=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
iobroker stop&lt;br /&gt;
npm cache verify&lt;br /&gt;
chown -R iobroker /opt/iobroker&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Remove old node.js and install new one (replace &amp;quot;16&amp;quot; below with new version)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
apt update -y &amp;amp;&amp;amp; sudo apt upgrade -y&lt;br /&gt;
apt-get purge nodejs -y &amp;amp;&amp;amp; sudo apt-get autoremove -y &amp;amp;&amp;amp; sudo apt-get autoclean -y&lt;br /&gt;
curl -sL https://deb.nodesource.com/setup_16.x | sudo bash -&lt;br /&gt;
apt-get install -y nodejs&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Install new JS Controller&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
chown -R iobroker /opt/iobroker&lt;br /&gt;
iobroker stop&lt;br /&gt;
cd /opt/iobroker&lt;br /&gt;
curl -sL https://iobroker.net/fix.sh | bash -&lt;br /&gt;
sudo npm install -y iobroker.js-controller --unsafe-perm --production --save --prefix&lt;br /&gt;
sudo npm rebuild&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Update and run ioBroker&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
iobroker update&lt;br /&gt;
iobroker upgrade self&lt;br /&gt;
iobroker upgrade&lt;br /&gt;
iobroker start&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Wulf</name></author>
	</entry>
</feed>