<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title>smemory_TechSomething</title>
	<subtitle>smemory_TechSomething</subtitle>
	
	<link href="https://blog.smemory.org/feed/feed.xml" rel="self"/>
	<link href="https://blog.smemory.org/"/>
	<updated>2026-03-13T00:00:00+00:00</updated>
	<id>https://blog.smemory.org</id>
	<author>
		<name>smemory</name>
		<email>UuGNzwLSsEkMd8kQ at protonmail dot com</email>
	</author>
	
	<entry>
		<title>pfSense wireguard VPN with Mullvad</title>
		<link href="https://blog.smemory.org/posts/20260313_01_pfsenseWireguardVPN/"/>
		<updated>2026-03-13T00:00:00+00:00</updated>
		<id>https://blog.smemory.org/posts/20260313_01_pfsenseWireguardVPN/</id>
		<content type="html">&lt;h1 id=&quot;aim&quot;&gt;Aim &lt;a class=&quot;direct-link&quot; href=&quot;#aim&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;We have a pfSense box and we want some subnets going out only via VPN so the traffic won&#39;t exit our ISP ip address.&lt;/p&gt;
&lt;p&gt;We&#39;ll configure a wireguard VPN using Mullvad.&lt;/p&gt;
&lt;p&gt;We&#39;ll also add a killswitch to ensure no unwanted traffic from the subnets goes out via WAN interface.&lt;/p&gt;
&lt;h1 id=&quot;configure-the-vpn&quot;&gt;Configure the VPN &lt;a class=&quot;direct-link&quot; href=&quot;#configure-the-vpn&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;these guides are perfect:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://mullvad.net/en/help/pfsense-with-wireguard&quot;&gt;https://mullvad.net/en/help/pfsense-with-wireguard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.alexmoch.com/blog/mullvad-wireguard-vpn-in-pfsense-dual-stack/&quot;&gt;https://www.alexmoch.com/blog/mullvad-wireguard-vpn-in-pfsense-dual-stack/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;please ignore the section &amp;quot;Adding a kill switch&amp;quot; from alexmoch&#39;s blog because for me it was not working.&lt;/p&gt;
&lt;h1 id=&quot;configure-the-killswitch&quot;&gt;Configure the killswitch &lt;a class=&quot;direct-link&quot; href=&quot;#configure-the-killswitch&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;LAN: our interface we want to route out of the vpn&lt;br&gt;
se1_gw: the vpn gateway&lt;/p&gt;
&lt;p&gt;in Firewall --&amp;gt; Rules --&amp;gt; YourSubnet you&#39;ll have a rule like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Action: pass
Interface: INT
Address Family: ipv4
Protocol: any

Source: LAN subnets

Destination: Any

Log: yes


ADVANCED:

Tag: ExitViaVpn

Gateway: se1_gw (your mullvad gateway name, I&#39;ll use mullvad&#39;s guide names)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Note the Tag and Gateway options:&lt;/p&gt;
&lt;p&gt;Tag: tags our packets so we can filter them using that&lt;/p&gt;
&lt;p&gt;Gateway: instructs the rule to use a different gateway than the default one.&lt;/p&gt;
&lt;p&gt;Now for the killswitch, we&#39;ll head to Firewall --&amp;gt; Rules --&amp;gt; Floating&lt;br&gt;
and add a new rule:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Action: block
Quick: yes
Interface: WAN
Direction: any
Address Family: IPV4
Protocol: any

Source: any
Destination: any

Log: yes

ADVANCED:

Tagged: ExitViaVpn
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This rule allows us to block all the traffic from the &amp;quot;VPN subnet&amp;quot; that tries to use the WAN interface, thus exiting not via the VPN.&lt;/p&gt;
&lt;p&gt;This is needed because when the VPN fails, and this also happened with openVPN, the &amp;quot;Gateway&amp;quot; option in the firewall rule gets ignored and the traffic goes out via the default gateway.&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>HP Z440 Workstation Upgrade and Improvements</title>
		<link href="https://blog.smemory.org/posts/20260311_01_HpZ440Workstation/"/>
		<updated>2026-03-11T00:00:00+00:00</updated>
		<id>https://blog.smemory.org/posts/20260311_01_HpZ440Workstation/</id>
		<content type="html">&lt;h1 id=&quot;why&quot;&gt;Why &lt;a class=&quot;direct-link&quot; href=&quot;#why&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I had some 32GB DDR4 registered dimms from old hardware and I wanted to do something with those.&lt;/p&gt;
&lt;p&gt;I&#39;ve found that the best bet would be an X99 platform &lt;a href=&quot;https://en.wikipedia.org/wiki/Intel_X99&quot;&gt;0&lt;/a&gt;, but the Aliexpress boards would only have 4 dimm slots and other used mainboards would need a complete system around: PUS, case, etc..&lt;/p&gt;
&lt;p&gt;The HP Z440 &lt;a href=&quot;https://en.wikipedia.org/wiki/HP_Z&quot;&gt;1&lt;/a&gt; is a workstation from 2014 that:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;supports 8 dimm slots up to officially 256GB of ram (512GB unofficially)&lt;/li&gt;
&lt;li&gt;supports Intel Xeon v3 and v4 cpus, a lot of them &lt;a href=&quot;https://www.bargainhardware.co.uk/knowledge-base/hp-z440-workstation-cpu-support-list&quot;&gt;2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;may be made compatible with standard ATX PUSs using an adapter &lt;a href=&quot;https://www.ebay.it/itm/286590899089&quot;&gt;3&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;the front panel connector pinout has been documented &lt;a href=&quot;https://www.reddit.com/r/HSpecWorkstations/comments/16mffe4/hp_z440_front_io_pinout/&quot;&gt;4&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;supports pci-e bifurcation with the latest bios update &lt;a href=&quot;https://support.hp.com/it-it/drivers/swdetails/hp-z440-workstation/6978828/swItemId/vc-293846-1&quot;&gt;5&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;where-to-find-one&quot;&gt;Where to find one &lt;a class=&quot;direct-link&quot; href=&quot;#where-to-find-one&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I&#39;ve searched mine on &lt;a href=&quot;http://subito.it/&quot;&gt;subito.it&lt;/a&gt;, vinted and ebay, in the end I&#39;ve found one for ~170 euros shipped from germany,&lt;br&gt;
the listing did not specify if the PSU was the 525w or the 700w one and I wanted the latter because of the 12v GPUs rails.&lt;br&gt;
Included there was a Quadro P2000 so it was a fairly good deal.&lt;/p&gt;
&lt;h1 id=&quot;memory&quot;&gt;Memory &lt;a class=&quot;direct-link&quot; href=&quot;#memory&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id=&quot;density-and-configurations&quot;&gt;Density and configurations &lt;a class=&quot;direct-link&quot; href=&quot;#density-and-configurations&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The z440 officially supports up to 256GB in 8x 32GB rdimms &lt;a href=&quot;https://h30434.www3.hp.com/psg/attachments/psg/Business-PC-Workstation-POS/48281/2/Z440%20QuickSpecs%20v36.pdf&quot;&gt;6&lt;/a&gt;,&lt;br&gt;
unofficially it can go up to 512GB with 64GB rdimms but you&#39;ll get an error about unsupported LRDIMMs in the system.&lt;/p&gt;
&lt;p&gt;If you populate all the 8 dimm slots, and don&#39;t have the fancy ram cooler shroud from HP:&lt;br&gt;
&lt;a href=&quot;https://blog.smemory.org/img/20260311_01_z440_10.jpg&quot;&gt;&lt;img src=&quot;https://blog.smemory.org/img/20260311_01_z440_10.jpg&quot; alt=&quot;description&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;you&#39;ll get this error:&lt;br&gt;
&lt;a href=&quot;https://blog.smemory.org/img/20260311_01_z440_02.jpeg&quot;&gt;&lt;img src=&quot;https://blog.smemory.org/img/20260311_01_z440_02.jpeg&quot; alt=&quot;description&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Since I had no intention to spend 70+ euros for a shroud I built myself one, see the fans section.&lt;/p&gt;
&lt;h1 id=&quot;fans&quot;&gt;Fans &lt;a class=&quot;direct-link&quot; href=&quot;#fans&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id=&quot;bottom-fan&quot;&gt;Bottom Fan &lt;a class=&quot;direct-link&quot; href=&quot;#bottom-fan&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The bottom fan has a mostly normal 4pin fan connector, except it has a different key on it, you&#39;ll just need to shave the 2 slim guides on the fan connector to adapt it.&lt;/p&gt;
&lt;h2 id=&quot;bottom-fan-mounting&quot;&gt;Bottom fan mounting &lt;a class=&quot;direct-link&quot; href=&quot;#bottom-fan-mounting&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I&#39;ve printed the &amp;quot;HP Z440 Fron fan bracket (92mm fan)&amp;quot; from kiril_nedev (&lt;a href=&quot;https://www.thingiverse.com/thing:4653689&quot;&gt;https://www.thingiverse.com/thing:4653689&lt;/a&gt;)&lt;br&gt;
and the &amp;quot;Fan reduction 120mm to 92mm&amp;quot; from Fixercode (&lt;a href=&quot;https://www.thingiverse.com/thing:6251457&quot;&gt;https://www.thingiverse.com/thing:6251457&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Note that the reduction is asymmetric and perfect for our case.&lt;/p&gt;
&lt;p&gt;This way I am able to mount a 120mm PWM fan I had lying around in my case, the airflow is excellent and directed to the pci-e slots.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.smemory.org/img/20260311_01_z440_01.jpeg&quot;&gt;&lt;img src=&quot;https://blog.smemory.org/img/20260311_01_z440_01.jpeg&quot; alt=&quot;description&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;diy-ram-cooler&quot;&gt;DIY ram cooler &lt;a class=&quot;direct-link&quot; href=&quot;#diy-ram-cooler&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The RAM cooler uses a spcific connector but the pinout has been found &lt;a href=&quot;https://h30434.www3.hp.com/t5/Business-PCs-Workstations-and-Point-of-Sale-Systems/PIN-out-of-Z440-memory-fan-connector/td-p/9013593&quot;&gt;7&lt;/a&gt;:&lt;br&gt;
&lt;a href=&quot;https://blog.smemory.org/img/20260311_01_z440_11.jpg&quot;&gt;&lt;img src=&quot;https://blog.smemory.org/img/20260311_01_z440_11.jpg&quot; alt=&quot;description&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;so I&#39;ve bought the needed parts on aliexpress:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;2x 4pin pwm fan extension (color: &amp;quot;1 in 1&amp;quot;): &lt;a href=&quot;https://it.aliexpress.com/item/1005006140447407.html&quot;&gt;https://it.aliexpress.com/item/1005006140447407.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Molex 3.0mm connectors (pack of 10, color: Male H Female T 10Se, 2x3P): &lt;a href=&quot;https://it.aliexpress.com/item/1005007253431348.html&quot;&gt;https://it.aliexpress.com/item/1005007253431348.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I&#39;ve removed the connector from the extension, crimped and soldered the Molex pins:&lt;br&gt;
Ground: black&lt;br&gt;
12V: red&lt;br&gt;
Tach: yellow&lt;br&gt;
PWM: blue&lt;/p&gt;
&lt;p&gt;the Tach and PWM pins of the two cables will go to a pin each,&lt;br&gt;
while we&#39;ll soler together the Ground and 12V ones since those are common:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.smemory.org/img/20260311_01_z440_03.jpeg&quot;&gt;&lt;img src=&quot;https://blog.smemory.org/img/20260311_01_z440_03.jpeg&quot; alt=&quot;description&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.smemory.org/img/20260311_01_z440_05.jpeg&quot;&gt;&lt;img src=&quot;https://blog.smemory.org/img/20260311_01_z440_05.jpeg&quot; alt=&quot;description&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.smemory.org/img/20260311_01_z440_06.jpeg&quot;&gt;&lt;img src=&quot;https://blog.smemory.org/img/20260311_01_z440_06.jpeg&quot; alt=&quot;description&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.smemory.org/img/20260311_01_z440_07.jpeg&quot;&gt;&lt;img src=&quot;https://blog.smemory.org/img/20260311_01_z440_07.jpeg&quot; alt=&quot;description&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;To allow the molex connector to fit in the custom HP&#39;s plastic receptacle you&#39;ll need to remove the locking lever, just shave it off with an xacto kinfe.&lt;/p&gt;
&lt;h2 id=&quot;mounting-the-fans&quot;&gt;Mounting the fans &lt;a class=&quot;direct-link&quot; href=&quot;#mounting-the-fans&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I&#39;ve asked &amp;quot;Snoopmasta&amp;quot; &lt;a href=&quot;https://www.thingiverse.com/Snoopmasta/designs&quot;&gt;8&lt;/a&gt; to share with me the awesome fan mount design he did for his z440 and he very kindly sent me the files.&lt;/p&gt;
&lt;p&gt;I&#39;ve printed the parts in esun PLA+ and glued it together with Attack (Cyanoacrliate),&lt;br&gt;
the result is very nice:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.smemory.org/img/20260311_01_z440_09.jpeg&quot;&gt;&lt;img src=&quot;https://blog.smemory.org/img/20260311_01_z440_09.jpeg&quot; alt=&quot;description&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id=&quot;sources%3A&quot;&gt;sources: &lt;a class=&quot;direct-link&quot; href=&quot;#sources%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://michael.stapelberg.ch/posts/2021-08-28-silent-hp-z440-workstation/&quot;&gt;https://michael.stapelberg.ch/posts/2021-08-28-silent-hp-z440-workstation/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.reddit.com/r/HSpecWorkstations/comments/18ouovt/z440_without_memory_shroud_and_new_case/&quot;&gt;https://www.reddit.com/r/HSpecWorkstations/comments/18ouovt/z440_without_memory_shroud_and_new_case/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.reddit.com/r/HSpecWorkstations/comments/16mffe4/hp_z440_front_io_pinout/&quot;&gt;https://www.reddit.com/r/HSpecWorkstations/comments/16mffe4/hp_z440_front_io_pinout/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.reddit.com/r/servers/comments/1mhaiam/does_hp_z440_mobo_supports_ddr4_64gb_ecc_ram/&quot;&gt;https://www.reddit.com/r/servers/comments/1mhaiam/does_hp_z440_mobo_supports_ddr4_64gb_ecc_ram/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://h30434.www3.hp.com/t5/Business-PCs-Workstations-and-Point-of-Sale-Systems/PIN-out-of-Z440-memory-fan-connector/td-p/9013593&quot;&gt;https://h30434.www3.hp.com/t5/Business-PCs-Workstations-and-Point-of-Sale-Systems/PIN-out-of-Z440-memory-fan-connector/td-p/9013593&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
	</entry>
	
	<entry>
		<title>Proxmox Nvidia Gpu on LXC (pve8-deb12)</title>
		<link href="https://blog.smemory.org/posts/20241216_01_proxmoxLxcNvidiaGpu/"/>
		<updated>2024-12-16T00:00:00+00:00</updated>
		<id>https://blog.smemory.org/posts/20241216_01_proxmoxLxcNvidiaGpu/</id>
		<content type="html">&lt;h1 id=&quot;install-nvidia-drivers-on-proxmox-8-(debian-12)&quot;&gt;install nvidia drivers on proxmox 8 (debian 12) &lt;a class=&quot;direct-link&quot; href=&quot;#install-nvidia-drivers-on-proxmox-8-(debian-12)&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;proxmox 7 is based on debian 12 so we can follow the official steps:&lt;br&gt;
&lt;a href=&quot;https://wiki.debian.org/NvidiaGraphicsDrivers#Debian_12_.22Bookworm.22$0&quot;&gt;https://wiki.debian.org/NvidiaGraphicsDrivers#Debian_12_.22Bookworm.22$0&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;the one thing we must remember is to install PVE kernel headers: pve-headers&lt;/p&gt;
&lt;h2 id=&quot;update-pve&quot;&gt;update pve &lt;a class=&quot;direct-link&quot; href=&quot;#update-pve&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;check you already have the correct pve repos,&lt;br&gt;
if needed you cna add it with this (useful also for the lxc container):&lt;/p&gt;
&lt;p&gt;add repo key:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;wget https://enterprise.proxmox.com/debian/proxmox-release-bookworm.gpg -O /etc/apt/trusted.gpg.d/proxmox-release-bookworm.gpg 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;add repo:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;nano /etc/apt/sources.list.d/pve-install-repo.list
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;deb http://download.proxmox.com/debian/pve bookworm pve-no-subscription
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;now we can update everything to the latest kernel:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;apt update

apt upgrade

reboot
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;add-repos-for-non-free-nvidia-driver&quot;&gt;add repos for non-free nvidia driver &lt;a class=&quot;direct-link&quot; href=&quot;#add-repos-for-non-free-nvidia-driver&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;since nvidia drivers are in the non-free repos let&#39;s add them to our repo list:&lt;/p&gt;
&lt;p&gt;edit&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;nano /etc/apt/sources.list
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;and add &amp;quot;non-free non-free-firmware&amp;quot; where needed:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;deb http://deb.debian.org/debian/ bookworm main contrib non-free non-free-firmware
deb-src http://deb.debian.org/debian/ bookworm main contrib non-free non-free-firmware

deb http://security.debian.org/debian-security bookworm-security main
deb-src http://security.debian.org/debian-security bookworm-security main

deb http://deb.debian.org/debian/ bookworm-updates main
deb-src http://deb.debian.org/debian/ bookworm-updates main
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;then update:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;apt update
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;install-headers-and-nvidia-driver&quot;&gt;install headers and nvidia-driver &lt;a class=&quot;direct-link&quot; href=&quot;#install-headers-and-nvidia-driver&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;now we can install the pve-headers&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;apt install pve-headers
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;and install the nvidia driver:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;apt install nvidia-driver
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;at this point we must reboot:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;reboot
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;debug&quot;&gt;debug &lt;a class=&quot;direct-link&quot; href=&quot;#debug&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;if nvidia-smi won&#39;t start might be to errors in the driver installation,&lt;br&gt;
if you have any doubt remove everything from nvidia, fix the headers and reinstall&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;apt remove nvidia*
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;check-driver-installation&quot;&gt;check driver installation &lt;a class=&quot;direct-link&quot; href=&quot;#check-driver-installation&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;run nvidia-smi to check if everything is correctly installed:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;nvidia-smi
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;output:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;13:12:42_root@machine:[~]:#nvidia-smi
+---------------------------------------------------------------------------------------+
| NVIDIA-SMI 535.183.01             Driver Version: 535.183.01   CUDA Version: 12.2     |
|-----------------------------------------+----------------------+----------------------+
| GPU  Name                 Persistence-M | Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp   Perf          Pwr:Usage/Cap |         Memory-Usage | GPU-Util  Compute M. |
|                                         |                      |               MIG M. |
|=========================================+======================+======================|
|   0  Quadro P400                    On  | 00000000:26:00.0 Off |                  N/A |
| 34%   25C    P8              N/A /  N/A |      1MiB /  2048MiB |      0%      Default |
|                                         |                      |                  N/A |
+-----------------------------------------+----------------------+----------------------+
                                                                                         
+---------------------------------------------------------------------------------------+
| Processes:                                                                            |
|  GPU   GI   CI        PID   Type   Process name                            GPU Memory |
|        ID   ID                                                             Usage      |
|=======================================================================================|
|  No running processes found                                                           |
+---------------------------------------------------------------------------------------+
&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id=&quot;container-creation&quot;&gt;container creation &lt;a class=&quot;direct-link&quot; href=&quot;#container-creation&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;in proxmox&lt;br&gt;
select your storage for LXC templates and download the debian 12 template&lt;/p&gt;
&lt;p&gt;create a container:&lt;/p&gt;
&lt;p&gt;for plex you might want to add the folder on a separate mount:&lt;br&gt;
add disk on path: /var/lib/plexmediaserver&lt;br&gt;
30gb&lt;/p&gt;
&lt;h2 id=&quot;add-gpu-to-container&quot;&gt;add gpu to container &lt;a class=&quot;direct-link&quot; href=&quot;#add-gpu-to-container&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;on your pve host check that you see someting like: &lt;code&gt;/dev/dri/renderD128&lt;/code&gt;&lt;br&gt;
and&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;grep render /etc/group
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;render:x:107:
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;in proxmox gui edit the container, in &amp;quot;Resources&amp;quot; add: &amp;quot;Device Passtrough&amp;quot;&lt;br&gt;
in &amp;quot;Device Path&amp;quot;: &lt;code&gt;/dev/dri/renderD128&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;select advanced&lt;/p&gt;
&lt;p&gt;in &amp;quot;GID in CT&amp;quot;: &amp;quot;107&amp;quot; (see the grep render before)&lt;/p&gt;
&lt;h2 id=&quot;fix-container-permissions-for-the-gpu%3A&quot;&gt;fix container permissions for the gpu: &lt;a class=&quot;direct-link&quot; href=&quot;#fix-container-permissions-for-the-gpu%3A&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;in /etc/pve/lxc/&lt;id&gt;.conf&lt;/id&gt;&lt;/p&gt;
&lt;p&gt;add:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# Allow cgroup access
lxc.cgroup2.devices.allow: c 195:* rwm
lxc.cgroup2.devices.allow: c 243:* rwm

# Pass through device files
lxc.mount.entry: /dev/nvidia0 dev/nvidia0 none bind,optional,create=file
lxc.mount.entry: /dev/nvidiactl dev/nvidiactl none bind,optional,create=file
lxc.mount.entry: /dev/nvidia-uvm dev/nvidia-uvm none bind,optional,create=file
lxc.mount.entry: /dev/nvidia-modeset dev/nvidia-modeset none bind,optional,create=file
lxc.mount.entry: /dev/nvidia-uvm-tools dev/nvidia-uvm-tools none bind,optional,create=file
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;and start your container&lt;/p&gt;
&lt;p&gt;now from your container you should see:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ ls -l /dev/nvidia*
crw-rw-rw- 1 root root 195, 254 Dec 22 20:51 /dev/nvidia-modeset
crw-rw-rw- 1 root root 243,   0 Dec 22 20:51 /dev/nvidia-uvm
crw-rw-rw- 1 root root 243,   1 Dec 22 20:51 /dev/nvidia-uvm-tools
crw-rw-rw- 1 root root 195,   0 Dec 22 20:51 /dev/nvidia0
crw-rw-rw- 1 root root 195, 255 Dec 22 20:51 /dev/nvidiactl
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;source: &lt;a href=&quot;https://theorangeone.net/posts/lxc-nvidia-gpu-passthrough/#ref-2-configure-container$0&quot;&gt;https://theorangeone.net/posts/lxc-nvidia-gpu-passthrough/#ref-2-configure-container$0&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;install-nvidia-drivers-on-the-container&quot;&gt;install nvidia drivers on the container &lt;a class=&quot;direct-link&quot; href=&quot;#install-nvidia-drivers-on-the-container&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;nano /etc/apt/sources.list
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;deb http://deb.debian.org/debian/ bookworm main contrib non-free non-free-firmware
deb-src http://deb.debian.org/debian/ bookworm main contrib non-free non-free-firmware

deb http://security.debian.org/debian-security bookworm-security main
deb-src http://security.debian.org/debian-security bookworm-security main

deb http://deb.debian.org/debian/ bookworm-updates main
deb-src http://deb.debian.org/debian/ bookworm-updates main
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;wget https://enterprise.proxmox.com/debian/proxmox-release-bookworm.gpg -O /etc/apt/trusted.gpg.d/proxmox-release-bookworm.gpg 
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;nano /etc/apt/sources.list.d/pve-install-repo.list
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;deb http://download.proxmox.com/debian/pve bookworm pve-no-subscription
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;apt update

apt upgrade -y

reboot
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;apt install pve-headers

apt install nvidia-driver

reboot
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;nvidia-smi
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;apt install lshw

lshw -c video

root@plex-gpu:~# lshw -c video
  *-display                 
       description: VGA compatible controller
       product: GP107GL [Quadro P400]
       vendor: NVIDIA Corporation
       physical id: 0
       bus info: pci@0000:26:00.0
       logical name: fb0
       version: a1
       width: 64 bits
       clock: 33MHz
       capabilities: pm msi pciexpress vga_controller bus_master cap_list rom fb
       configuration: depth=32 driver=nvidia latency=0 resolution=800,600
       resources: irq:73 memory:fb000000-fbffffff memory:d0000000-dfffffff memory:e0000000-e1ffffff ioport:f000(size=128) memory:c0000-dffff
&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id=&quot;tips-and-tricks%3A&quot;&gt;tips and tricks: &lt;a class=&quot;direct-link&quot; href=&quot;#tips-and-tricks%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id=&quot;mount-bind-on-containers%3A&quot;&gt;mount bind on containers: &lt;a class=&quot;direct-link&quot; href=&quot;#mount-bind-on-containers%3A&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;in /etc/pve/lxc/&lt;id&gt;.conf&lt;/id&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mp99 /host/folder/source,mp=/container/target

mp99 /host/folder/source,mp=/container/target_readonly,ro=1
&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id=&quot;sources%3A&quot;&gt;sources: &lt;a class=&quot;direct-link&quot; href=&quot;#sources%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.geekbitzone.com/posts/2022/proxmox/plex-lxc/install-plex-in-proxmox-lxc/$0&quot;&gt;https://www.geekbitzone.com/posts/2022/proxmox/plex-lxc/install-plex-in-proxmox-lxc/$0&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
	</entry>
	
	<entry>
		<title>Restoring data from a broken disk</title>
		<link href="https://blog.smemory.org/posts/20241209_01_restoreDataFromBrokenDisk/"/>
		<updated>2024-12-09T00:00:00+00:00</updated>
		<id>https://blog.smemory.org/posts/20241209_01_restoreDataFromBrokenDisk/</id>
		<content type="html">&lt;h1 id=&quot;example%3A&quot;&gt;example: &lt;a class=&quot;direct-link&quot; href=&quot;#example%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;broken disk: /dev/sdb
&lt;ul&gt;
&lt;li&gt;was mounted on /mnt/faulty&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;external usb disk: /dev/sde
&lt;ul&gt;
&lt;li&gt;formatted in ext4 and mounted on /mnt/recovery_8TB&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;what-happened%3A&quot;&gt;what happened: &lt;a class=&quot;direct-link&quot; href=&quot;#what-happened%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;the system started giving errors on a non redundant disk:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Device: /dev/sdb [SAT], 1025 Currently unreadable (pending) sectors
Device: /dev/sdb [SAT], 255 Offline uncorrectable sectors
Device: /dev/sdb [SAT], ATA error count increased from 306 to 903
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;trying to rsync the files to another disk led to errors and fails&lt;/p&gt;
&lt;h1 id=&quot;data-recovery-with-ddrescue%3A&quot;&gt;data recovery with ddrescue: &lt;a class=&quot;direct-link&quot; href=&quot;#data-recovery-with-ddrescue%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;ddrescue can read the faulty disk to an image (or to another disk) while selecting different settings for aggressivity&lt;/p&gt;
&lt;p&gt;we want to create a full disk image on the first pass, avoiding add too much stress on an already faulty drive,&lt;br&gt;
so we&#39;ll tune our ddrescue settings to reflect that, for example:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ddrescue --idirect --no-scrape /dev/sdx sdx.img sdx.log
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;you see some options and settings:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;--idirect: skip os caches and work directly on the device&lt;/li&gt;
&lt;li&gt;--no-scrape: avoids stressing the disk&lt;/li&gt;
&lt;li&gt;/dev/sdb: the faulty device&lt;/li&gt;
&lt;li&gt;sdb.img: target disk image&lt;/li&gt;
&lt;li&gt;sdb.log: targe disk&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;the sdx.log file is very important beacause it maps the bad parts of the disk, so in a second pass we can void rescanning the whole drive but we can just insist on the faulty parts&lt;/p&gt;
&lt;p&gt;in the subsequent passes we can omit &amp;quot;--idirect&amp;quot; since we already have a full disk image and we want to recover as much as we can, even breaking the drive:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ddrescue --idirect -r3 /dev/sdx sdx.img sdx.log
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;the only difference with the first pass has been removing &amp;quot;--no-scrape&amp;quot; and adding &amp;quot;-r3&amp;quot;, which is the number of retries we want to do on a bad sector&lt;/p&gt;
&lt;h1 id=&quot;actual-data-recovery%3A&quot;&gt;actual data recovery: &lt;a class=&quot;direct-link&quot; href=&quot;#actual-data-recovery%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;pre&gt;&lt;code&gt;umount /dev/sdb
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;we are working on the external sub drive, at /mnt/recovery_8TB:&lt;/p&gt;
&lt;p&gt;first pass:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ddrescue --idirect --no-scrape /dev/sdb sdb.img sdb.log
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;output:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Current status
     ipos:   60025 MB, non-trimmed:   131072 B,  current rate:    166 MB/s
     opos:   60025 MB, non-scraped:        0 B,  average rate:  48489 kB/s
     ipos:    1781 GB, non-trimmed:        0 B,  current rate:   13312 B/s
     opos:    1781 GB, non-scraped:    1213 kB,  average rate:  72448 kB/s
non-tried:        0 B,  bad-sector:    93184 B,    error rate:     170 B/s
  rescued:    2000 GB,   bad areas:      145,        run time:  7h 39m 25s
pct rescued:   99.99%, read errors:      306,  remaining time:      1m 35s
                              time since last successful read:          0s
Finished
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;second pass:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ddrescue --idirect -r3 /dev/sdb sdb.img sdb.log
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;output:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Current status
     ipos:    1781 GB, non-trimmed:        0 B,  current rate:       0 B/s
     opos:    1781 GB, non-scraped:        0 B,  average rate:      79 B/s
non-tried:        0 B,  bad-sector:   524800 B,    error rate:     170 B/s
  rescued:    2000 GB,   bad areas:      182,        run time:  2h 44m 23s
pct rescued:   99.99%, read errors:     3924,  remaining time:         n/a
                              time since last successful read:     30m 35s
Finished
&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id=&quot;transferring-recovered-data%3A&quot;&gt;transferring recovered data: &lt;a class=&quot;direct-link&quot; href=&quot;#transferring-recovered-data%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;now we can move the data from the image file we created to another mountpoint,&lt;br&gt;
to do that we need to mount the image file&lt;/p&gt;
&lt;p&gt;detect partitions on the image file:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;kpartx -av sdb.img
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;look what your loop device looks like:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;root@machine:/mnt/recovery_8TB# lsblk
NAME      MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT
loop0       7:0    0   1,8T  0 loop  
`-loop0p1 253:0    0   1,8T  0 part  
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;mount the image in ReadOnly mode:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mount -o loop,ro /dev/mapper/loop0p1 /mnt/recovery_8TB/restored_volume
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;rsync the data somewhere else&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;rsync -avh --progress /mnt/recovery_8TB/restored_volume/ /mnt/recovery_8TB/recovered_data/
&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id=&quot;compare-data%3A&quot;&gt;compare data: &lt;a class=&quot;direct-link&quot; href=&quot;#compare-data%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;pre&gt;&lt;code&gt;tree -pugsDx -o tree_faulty.txt -a /mnt/faulty/
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;tree -pugsDx -o tree_restored.txt -a /mnt/recovery_8TB/recovered_data/
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;diff tree_*
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;tree:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;p: Print the protections for each file.&lt;/li&gt;
&lt;li&gt;u: Displays file owner or UID number.&lt;/li&gt;
&lt;li&gt;g: Displays file group owner or GID number.&lt;/li&gt;
&lt;li&gt;s: Print the size in bytes of each file.&lt;/li&gt;
&lt;li&gt;D: Print the date of last modification&lt;/li&gt;
&lt;li&gt;x: do not traverse filesystems&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;sources:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://superuser.com/questions/905811/faster-recovery-from-a-disk-with-bad-sectors$0&quot;&gt;https://superuser.com/questions/905811/faster-recovery-from-a-disk-with-bad-sectors$0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.technibble.com/guide-using-ddrescue-recover-data/$0&quot;&gt;https://www.technibble.com/guide-using-ddrescue-recover-data/$0&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
	</entry>
	
	<entry>
		<title>Proxmox LXC Containers</title>
		<link href="https://blog.smemory.org/posts/20240211_01_ProxmoxLxcContainers/"/>
		<updated>2024-02-11T00:00:00+00:00</updated>
		<id>https://blog.smemory.org/posts/20240211_01_ProxmoxLxcContainers/</id>
		<content type="html">&lt;h1 id=&quot;lxc-containers&quot;&gt;lxc containers &lt;a class=&quot;direct-link&quot; href=&quot;#lxc-containers&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;pros:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;lightweight&lt;/li&gt;
&lt;li&gt;very flexibile config from proxmox interface&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;cons:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;compromise of the container might affect the running host (vms are better isolated)&lt;/li&gt;
&lt;li&gt;backup quirks and downtime (see dedicated section)&lt;/li&gt;
&lt;li&gt;can see underlying hardware (see dedicated section)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;other things that works:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;iptables&lt;/li&gt;
&lt;li&gt;vpns (see dedicater section)&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;backup&quot;&gt;backup &lt;a class=&quot;direct-link&quot; href=&quot;#backup&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;while KVM vms use dirty bitmaps to achieve an online backup, the LXC container needs to be suspended:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;snapshot: This mode uses the snapshotting facilities of the underlying storage. First, the container will be suspended to ensure data consistency. A temporary snapshot of the container’s volumes will be made and the snapshot content will be archived in a tar file. Finally, the temporary snapshot is deleted again.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;sources:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://pve.proxmox.com/wiki/Backup_and_Restore&quot;&gt;https://pve.proxmox.com/wiki/Backup_and_Restore&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://symcbean.blogspot.com/2022/01/proxmox-backup-server-evaluation.html&quot;&gt;https://symcbean.blogspot.com/2022/01/proxmox-backup-server-evaluation.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;underlying-hardware&quot;&gt;underlying hardware &lt;a class=&quot;direct-link&quot; href=&quot;#underlying-hardware&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;the container will be able to see part of the hardware, for example disks.&lt;/p&gt;
&lt;p&gt;An &amp;quot;lbslk&amp;quot; will show the host&#39;s disks and you can see infos about the disks,&lt;br&gt;
for example we can retrieve the disk serial:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;:#cat /sys/block/sda/device/model
SeagateUltrastarIII

:#cat /sys/class/block/sda/device/wwid   
t10.ATA     SeagateUltrastarIII                          AABBCCDDEEFF
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;this is an unnecessary potential leak of information that needs to be taken into account,&lt;br&gt;
a VM would only see it&#39;s disk image.&lt;/p&gt;
&lt;h1 id=&quot;detecting-the-container-(useful-in-ansible)&quot;&gt;detecting the container (useful in Ansible) &lt;a class=&quot;direct-link&quot; href=&quot;#detecting-the-container-(useful-in-ansible)&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;we can leverage&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;systemd-detect-virt
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;to understand where our os is running,&lt;br&gt;
the command will output the different technologies if ran without any option, for example:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&amp;quot;none&amp;quot; : running on baremetal&lt;/li&gt;
&lt;li&gt;&amp;quot;kvm&amp;quot; : runnning in a vm (on Proxmox)&lt;/li&gt;
&lt;li&gt;&amp;quot;lxc&amp;quot; : running in a container (on Proxmox)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;See here for the full list:&lt;/p&gt;
&lt;p&gt;But if we run the command with the --container option:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;systemd-detect-virt --container
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;the output will be:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&amp;quot;none&amp;quot; : if we are running on ANYTHING else than a container&lt;/li&gt;
&lt;li&gt;$container : if we are running insiede a container (so in my case would be &amp;quot;lxc&amp;quot;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is very useful in Ansible where I want to skip the sysctl tasks since those are not valid for a container:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# playbook.yml:
---
- name: &amp;quot;container detection&amp;quot;
  hosts: localhost
  connection: local
  
  tasks:
    - name: &amp;quot;Register if we are running on anything else than a container (none) or in a container&amp;quot;
      command: systemd-detect-virt --container
      register: systemd_detect_virt

    - name: &amp;quot;Set swappiness to zero in sysctl.conf&amp;quot;
      sysctl:
        name: vm.swappiness
        value: &#39;1&#39;
        state: present
        reload: yes
        sysctl_file: /etc/sysctl.conf
      when: systemd_detect_virt.stdout == &amp;quot;none&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;the task will be executed only if the command output is &amp;quot;none&amp;quot;, thus we are not inside a container.&lt;/p&gt;
&lt;h1 id=&quot;tun-devices&quot;&gt;tun devices &lt;a class=&quot;direct-link&quot; href=&quot;#tun-devices&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;to configure a VPN that uses /dev/tun devices an additional configuration is needed:&lt;/p&gt;
&lt;p&gt;edit your LXC configfile, for example for container 1001: /etc/pve/lxc/1001.conf&lt;/p&gt;
&lt;p&gt;and add:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;lxc.cgroup2.devices.allow: c 10:200 rwm
lxc.mount.entry: /dev/net/tun dev/net/tun none bind,create=file
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;sources:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://pve.proxmox.com/wiki/OpenVPN_in_LXC&quot;&gt;https://pve.proxmox.com/wiki/OpenVPN_in_LXC&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://forum.proxmox.com/threads/how-to-enable-tun-tap-in-a-lxc-container.25339/&quot;&gt;https://forum.proxmox.com/threads/how-to-enable-tun-tap-in-a-lxc-container.25339/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://tailscale.com/kb/1130/lxc-unprivileged&quot;&gt;https://tailscale.com/kb/1130/lxc-unprivileged&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
	</entry>
	
	<entry>
		<title>Nginx edit content with ngx_http_sub_module</title>
		<link href="https://blog.smemory.org/posts/20240116_01_NginxEditContent/"/>
		<updated>2024-01-16T00:00:00+00:00</updated>
		<id>https://blog.smemory.org/posts/20240116_01_NginxEditContent/</id>
		<content type="html">&lt;h1 id=&quot;why&quot;&gt;why &lt;a class=&quot;direct-link&quot; href=&quot;#why&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I want to arbitrarly edit the content of a virtual host I am reverse-proxying&lt;/p&gt;
&lt;h1 id=&quot;prereq&quot;&gt;prereq &lt;a class=&quot;direct-link&quot; href=&quot;#prereq&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;nginx must be built with &amp;quot;--with-http_sub_module&amp;quot;,&lt;br&gt;
to check  it already is execute:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;nginx -V
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;example response:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;nginx version: nginx/6.42.0
built with OpenSSL 6.4.2g  49 Dec 2048
TLS SNI support enabled
configure arguments: [...CUT...] --with-http_sub_module
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;what we want is &amp;quot;--with-http_sub_module&amp;quot;&lt;/p&gt;
&lt;h1 id=&quot;how&quot;&gt;how &lt;a class=&quot;direct-link&quot; href=&quot;#how&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;these sub_filter rules will rewrite all the text &amp;quot;banana&amp;quot; to &amp;quot;mango&amp;quot; in your pages&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;    server {
        listen 443;
        server_name www.site.org;
         ssl on;
         ssl_certificate fullchain.pem;
         ssl_certificate_key privkey.pem;
         ssl_session_cache shared:SSL:10m;
         access_log    /var/log/nginx/www.site.org_access.log;
         error_log     /var/log/nginx/www.site.org_error.log;
         location / {
            proxy_pass http://192.168.1.10/;
            proxy_set_header    Host        $host;
            proxy_set_header    X-Real-IP   $remote_addr;
            #
            sub_filter_once off;
            sub_filter_types *;
            sub_filter &#39;banana&#39; &#39;mango&#39;;
        }
    }
&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id=&quot;sources&quot;&gt;sources &lt;a class=&quot;direct-link&quot; href=&quot;#sources&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://samanbaboli.medium.com/modify-html-pages-on-the-fly-using-nginx-2e7a2d069086&quot;&gt;https://samanbaboli.medium.com/modify-html-pages-on-the-fly-using-nginx-2e7a2d069086&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
	</entry>
	
	<entry>
		<title>Docs in markdown - Joplin (bonus points: to static site)</title>
		<link href="https://blog.smemory.org/posts/20240114_01_DocsInMarkdownJoplin/"/>
		<updated>2024-01-14T00:00:00+00:00</updated>
		<id>https://blog.smemory.org/posts/20240114_01_DocsInMarkdownJoplin/</id>
		<content type="html">&lt;h1 id=&quot;why&quot;&gt;why &lt;a class=&quot;direct-link&quot; href=&quot;#why&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I need to maintain some documentation about home/personal projects, while sharing just the home docs with my house mate&lt;/p&gt;
&lt;p&gt;Joplin ticks most of what I want:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;[x] a cross platform tool where I can organize my notes&lt;/li&gt;
&lt;li&gt;[ ] the notes need to be saved in markdown format for future-proofing&lt;/li&gt;
&lt;li&gt;[x] sane method of syncing (read: webdav)&lt;/li&gt;
&lt;li&gt;[x] encryption&lt;/li&gt;
&lt;li&gt;[x] solid tool not under heavy development (I want to adopt it once and keep it for some time)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Bonus points:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;[x] the notes need to be easily exportable&lt;/li&gt;
&lt;li&gt;[x] the export should be in a format that allows to share them in a static html site&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;and-the-winner-is..&quot;&gt;and the winner is.. &lt;a class=&quot;direct-link&quot; href=&quot;#and-the-winner-is..&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://joplinapp.org/&quot;&gt;Joplin&lt;/a&gt; seems to cover most of what I want, the notes are not in .md format but I can export the with an automation.&lt;/p&gt;
&lt;p&gt;What I don&#39;t like:&lt;br&gt;
the noted are in markdown format inside the app but everything is saved on a sqlite database.&lt;/p&gt;
&lt;p&gt;There&#39;s an app for every major platform, and also a cli for headless systems or unattended operations.&lt;/p&gt;
&lt;h2 id=&quot;runner-ups&quot;&gt;runner ups &lt;a class=&quot;direct-link&quot; href=&quot;#runner-ups&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://logseq.com/&quot;&gt;Logseq&lt;/a&gt; seemed to be the what I wanted but wanted to sync in ways I would not want to support (file sync on every device),&lt;br&gt;
since I also want to support iOS devices a webdav sync is the way to go.&lt;/p&gt;
&lt;h1 id=&quot;joplin&quot;&gt;Joplin &lt;a class=&quot;direct-link&quot; href=&quot;#joplin&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id=&quot;installation&quot;&gt;Installation &lt;a class=&quot;direct-link&quot; href=&quot;#installation&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;apps&quot;&gt;Apps &lt;a class=&quot;direct-link&quot; href=&quot;#apps&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;very simple:&lt;br&gt;
install the app and configure it to sync via webdav&lt;/p&gt;
&lt;h3 id=&quot;cli&quot;&gt;CLI &lt;a class=&quot;direct-link&quot; href=&quot;#cli&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;install node and the install Joplin:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;npm install -g joplin
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;run joplin&lt;/p&gt;
&lt;p&gt;your config files are in ~/.config/joplin&lt;/p&gt;
&lt;p&gt;source:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://joplinapp.org/help/apps/terminal/&quot;&gt;https://joplinapp.org/help/apps/terminal/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;webdav-sync&quot;&gt;WebDav Sync &lt;a class=&quot;direct-link&quot; href=&quot;#webdav-sync&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;apps-2&quot;&gt;Apps &lt;a class=&quot;direct-link&quot; href=&quot;#apps-2&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;set it up in the apps&lt;/p&gt;
&lt;h3 id=&quot;cli-2&quot;&gt;CLI &lt;a class=&quot;direct-link&quot; href=&quot;#cli-2&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;enter joplin and use the interactive console via &amp;quot;:&amp;quot;,&lt;br&gt;
then run these commands&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;:config sync.target 6
:config sync.6.path https://example.com/something/webdav/Joplin
:config sync.6.username YOUR_USERNAME
:config sync.6.password YOUR_PASSWORD
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;then run the sync command:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;:sync
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;e2ee&quot;&gt;E2EE &lt;a class=&quot;direct-link&quot; href=&quot;#e2ee&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;(end 2 end encryption)&lt;/p&gt;
&lt;h3 id=&quot;apps-3&quot;&gt;Apps &lt;a class=&quot;direct-link&quot; href=&quot;#apps-3&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;on the first client setup the E2EE and resync,&lt;br&gt;
on the !first clients then sync the items, you will be asked for the master pasword you set up on the first client.&lt;/p&gt;
&lt;h3 id=&quot;cli-3&quot;&gt;CLI &lt;a class=&quot;direct-link&quot; href=&quot;#cli-3&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;run&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;:e2ee decrypt
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;you will be asked the master password&lt;/p&gt;
&lt;p&gt;afeter every sync you&#39;ll need to decrypt your notes:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;joplin sync
joplin e2ee decrypt
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;otherwise when you export your notes you&#39;ll receive this error:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;This item is currently encrypted: note &amp;quot;test01&amp;quot; (aaa....fff) and was not exported. You may wait for it to be decrypted and try again.
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;other-useful-resources&quot;&gt;other useful resources &lt;a class=&quot;direct-link&quot; href=&quot;#other-useful-resources&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;plugins: &lt;a href=&quot;https://github.com/joplin/plugins/blob/master/README.md#plugins&quot;&gt;https://github.com/joplin/plugins/blob/master/README.md#plugins&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&quot;joplin-cli&quot;&gt;Joplin CLI &lt;a class=&quot;direct-link&quot; href=&quot;#joplin-cli&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id=&quot;useful-commands%3A&quot;&gt;useful commands: &lt;a class=&quot;direct-link&quot; href=&quot;#useful-commands%3A&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;list-all-the-notebooks%3A&quot;&gt;list all the notebooks: &lt;a class=&quot;direct-link&quot; href=&quot;#list-all-the-notebooks%3A&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;joplin ls -l /

aaaaa 5 14/01/2024 16:10 Welcome!   
bbbbb   14/01/2024 21:48 Home
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;headless-sync%3A&quot;&gt;headless sync: &lt;a class=&quot;direct-link&quot; href=&quot;#headless-sync%3A&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;joplin sync

Synchronisation target:  (6)
Starting synchronisation...
Fetched items: 1/1.
Downloading resources...
Fetched items: 1/1. Completed: 14/01/2024 21:31 (3s)
&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id=&quot;joplin-to-mkdocs&quot;&gt;Joplin to Mkdocs &lt;a class=&quot;direct-link&quot; href=&quot;#joplin-to-mkdocs&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I want to be able to export the notebook &amp;quot;Home&amp;quot; and transform it to a static html site,&lt;br&gt;
since we are exporting markdown files we can leverage the power and simplicity of Mkdocs to achieve what we want.&lt;/p&gt;
&lt;h2 id=&quot;mkdocs&quot;&gt;Mkdocs &lt;a class=&quot;direct-link&quot; href=&quot;#mkdocs&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;install mkdocs and create a new project:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pip install mkdocs
mkdocs new mkdocs-prj-name
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;a new folder called &amp;quot;mkdocs-prj-name&amp;quot; will be created, with this structure:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mkdocs-prj-name
|-- docs
|   `-- index.md
`-- mkdocs.yml
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;then we can place a directory structure with md files in the folder &amp;quot;docs&amp;quot; and everything will be built&lt;/p&gt;
&lt;p&gt;to serve the mkdocs site while working on it or for debugging purposes we can execute this in the project folder:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mkdocs serve -t readthedocs
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;our site will be accessible locally on &lt;a href=&quot;http://127.0.0.1:8000/&quot;&gt;http://127.0.0.1:8000/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;if you just want to build the site use:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mkdocs build -t readthedocs
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;your built files will be in the /site folder in the mkdocs workdir:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;.
|-- docs
|   `-- index.md
|-- mkdocs.yml
`-- site
    |-- 404.html
    |-- css
    |   |-- fonts
    |   |   |-- Roboto-Slab-Bold.woff
    |   |   |-- Roboto-Slab-Bold.woff2
    |   |   |-- Roboto-Slab-Regular.woff
    |   |   |-- Roboto-Slab-Regular.woff2
    |   |   |-- fontawesome-webfont.eot
    |   |   |-- fontawesome-webfont.svg
    |   |   |-- fontawesome-webfont.ttf
    |   |   |-- fontawesome-webfont.woff
    |   |   |-- fontawesome-webfont.woff2
    |   |   |-- lato-bold-italic.woff
    |   |   |-- lato-bold-italic.woff2
    |   |   |-- lato-bold.woff
    |   |   |-- lato-bold.woff2
    |   |   |-- lato-normal-italic.woff
    |   |   |-- lato-normal-italic.woff2
    |   |   |-- lato-normal.woff
    |   |   `-- lato-normal.woff2
    |   |-- theme.css
    |   `-- theme_extra.css
    |-- img
    |   `-- favicon.ico
    |-- index.html
    |-- js
    |   |-- html5shiv.min.js
    |   |-- jquery-3.6.0.min.js
    |   |-- theme.js
    |   `-- theme_extra.js
    |-- search
    |   |-- lunr.js
    |   |-- main.js
    |   |-- search_index.json
    |   `-- worker.js
    |-- search.html
    |-- sitemap.xml
    `-- sitemap.xml.gz
    
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;source: &lt;a href=&quot;https://www.mkdocs.org/getting-started/&quot;&gt;https://www.mkdocs.org/getting-started/&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;themes&quot;&gt;themes &lt;a class=&quot;direct-link&quot; href=&quot;#themes&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;I&#39;ve found I like the &amp;quot;redthedocs&amp;quot; theme more than the &amp;quot;mkdocs&amp;quot; one&lt;/p&gt;
&lt;p&gt;this is mostly due to the fact that we have a list of the Notebooks and Notes on the left instead of in chaotic and nested menus in the top bar&lt;/p&gt;
&lt;h3 id=&quot;markupsafe-errors&quot;&gt;markupsafe errors &lt;a class=&quot;direct-link&quot; href=&quot;#markupsafe-errors&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;While building, if you receive an odd error about markupsafe like:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;    from markupsafe import soft_unicode
ImportError: cannot import name &#39;soft_unicode&#39; from &#39;markupsafe&#39; (/usr/local/lib/python3.9/dist-packages/markupsafe/__init__.py)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;downgrade markupsafe to 2.0.1:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pip install markupsafe==2.0.1 --force
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;source: &lt;a href=&quot;https://stackoverflow.com/questions/72191560/importerror-cannot-import-name-soft-unicode-from-markupsafe&quot;&gt;https://stackoverflow.com/questions/72191560/importerror-cannot-import-name-soft-unicode-from-markupsafe&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;joplin-cli-operations&quot;&gt;Joplin CLI operations &lt;a class=&quot;direct-link&quot; href=&quot;#joplin-cli-operations&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;to export one notebook we&#39;ll need to sync, decrypt and the export:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;joplin sync
joplin e2ee decrypt
joplin export --notebook &amp;quot;Home&amp;quot; --format md_frontmatter ~/mkdocs-prj-name/docs/Joplin/
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;keeping-it-together&quot;&gt;keeping it together &lt;a class=&quot;direct-link&quot; href=&quot;#keeping-it-together&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I chose to export Joplin&#39;s files in a specific folder inside mkdocs&#39;s &amp;quot;docs&amp;quot; folder,&lt;br&gt;
due to the fact that if I execute multiple exports I&#39;ll have duplicate files, so I want to clean said folder before exporting.&lt;/p&gt;
&lt;p&gt;after the export the mkdocs folder structure will look like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mkdocs-prj-name
|-- docs
|   |-- Joplin
|   |   |-- Home
|   |   |   |-- Electricty
|   |   |   |   `-- wiring.md
|   |   |   `-- Water
|   |   |       `-- water_meter.md
|   `-- index.md
`-- mkdocs.yml
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;NB: the folder structure will be kept, in the mkdocs site menus you&#39;ll find the structure:&lt;/p&gt;
&lt;p&gt;|-- Joplin&lt;br&gt;
|   |-- Home&lt;br&gt;
|   |   |-- Electricty&lt;br&gt;
|   |   |   &lt;code&gt;-- wiring | |&lt;/code&gt;-- Water&lt;br&gt;
|   |       `-- water_meter&lt;/p&gt;
&lt;p&gt;source: &lt;a href=&quot;https://discourse.joplinapp.org/t/how-can-i-export-certain-ntoebooks-to-a-certain-system-folder-on-using-the-cli/25362&quot;&gt;https://discourse.joplinapp.org/t/how-can-i-export-certain-ntoebooks-to-a-certain-system-folder-on-using-the-cli/25362&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;the-script&quot;&gt;the script &lt;a class=&quot;direct-link&quot; href=&quot;#the-script&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;#!/usr/bin/env bash

ssh_key=&amp;quot;/home/user/.ssh/id_rsa&amp;quot;
folder_base=&amp;quot;/data/joplin-to-mkdocs/mkdocs_workdir&amp;quot;
joplin_dest=&amp;quot;/docs/Joplin&amp;quot;
rsync_source=&amp;quot;/site/&amp;quot;
rsync_user=&amp;quot;rsync_user&amp;quot;
rsync_host=&amp;quot;192.168.0.10&amp;quot;
rsync_dest=&amp;quot;/var/www/html/your-static-site-vhost/&amp;quot;
logfile=&amp;quot;/data/joplin-to-mkdocs/autoupdate_script.log&amp;quot;

#wake up ssh:
eval `ssh-agent`
ssh-add $ssh_key

rm -rf $folder_base$joplin_dest

joplin sync
joplin e2ee decrypt

joplin export --format md_frontmatter $folder_base$joplin_dest
# to export just one notebook use: --notebook &amp;quot;NotebookName&amp;quot;

#this substitutes one newline with to newlines in every .md file, it&#39;s used for better mkdocs compatibility
find $folder_base$joplin_dest -name &amp;quot;*.md&amp;quot; -exec gawk -i inplace &#39;BEGIN{RS=&amp;quot;\n&amp;quot; ; ORS=&amp;quot;\n\n&amp;quot;;}; { print }&#39; {} \;

cd $folder_base
mkdocs build -t readthedocs

rsync -avhz --progress $folder_base$rsync_source -e &amp;quot;ssh -i $ssh_key&amp;quot; $rsync_user@$rsync_host:$rsync_dest

rm -rf $folder_base$joplin_dest


echo &amp;quot;- - -&amp;quot; | tee -a $logfile

eval &amp;quot;$(ssh-agent -k)&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;scheduling&quot;&gt;scheduling &lt;a class=&quot;direct-link&quot; href=&quot;#scheduling&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I do it via cron:&lt;/p&gt;
&lt;p&gt;*/5  *   * * *   user    bash /data/joplin-to-mkdocs/autoupdate_script.sh &amp;gt; /dev/null&lt;/p&gt;
&lt;h2 id=&quot;workflow&quot;&gt;workflow &lt;a class=&quot;direct-link&quot; href=&quot;#workflow&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.smemory.org/img/20240114_01_DocsInMarkdownJoplin_01.png&quot;&gt;&lt;img src=&quot;https://blog.smemory.org/img/20240114_01_DocsInMarkdownJoplin_01.png&quot; alt=&quot;description&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;issues&quot;&gt;issues &lt;a class=&quot;direct-link&quot; href=&quot;#issues&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;formatting&quot;&gt;formatting &lt;a class=&quot;direct-link&quot; href=&quot;#formatting&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;what I see correctly in Joplin is displayed differently on mkdocs built site, for example the spacings between lines, take this example:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;banana
mango
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;in Joplin a single new line is enough to have the text on different lines:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;banana
mango
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;whilst in mkdocs will be displayed spaced on the same line:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;banana mango
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;this issue should have been patched with the find and aws line in the script,&lt;br&gt;
it seems to persist in lists where the indentation is not respected.&lt;/p&gt;
&lt;p&gt;for what I&#39;ve seen the rest of the formatting is ok&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>retrieve data from FindMy network and send it somewhere else</title>
		<link href="https://blog.smemory.org/posts/20231112_03_macosFindmyRetrieveData/"/>
		<updated>2023-11-12T00:00:00+00:00</updated>
		<id>https://blog.smemory.org/posts/20231112_03_macosFindmyRetrieveData/</id>
		<content type="html">&lt;p&gt;note: this is still a work in progress&lt;/p&gt;
&lt;h1 id=&quot;why&quot;&gt;why &lt;a class=&quot;direct-link&quot; href=&quot;#why&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;we want to programatically retrieve findmy items data and send it somewhere else&lt;/p&gt;
&lt;p&gt;the goal is to ingest that data in traccar&lt;/p&gt;
&lt;h1 id=&quot;notes&quot;&gt;notes &lt;a class=&quot;direct-link&quot; href=&quot;#notes&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;I am running ios 17.x on an old iphone and macos 14 Sonoma in a vm on proxmox (I wrote an article about that)&lt;br&gt;
this vm has only 2 cpu cores and 4gb of ram (of which only 2 are used right now)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The tests are run with a dedicated icloud account&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I am sharing some airtags from a second icloud account&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You cannot re-share the tags that have been shared with you&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;phantom-item%3A&quot;&gt;phantom item: &lt;a class=&quot;direct-link&quot; href=&quot;#phantom-item%3A&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;i&#39;ve shared a tag, then removed and re-shared before I could accept it, on macos I found 2 invites for the same tag and accepted both. At this point I could only remove the &amp;quot;alive&amp;quot; one since the first one, that have been unshared) cannot be managed or deleted.&lt;/p&gt;
&lt;h3 id=&quot;phantom-notifications&quot;&gt;phantom notifications &lt;a class=&quot;direct-link&quot; href=&quot;#phantom-notifications&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;on the iphone I see the notifications for the invites but don&#39;t see the invites inside the section &amp;quot;items&amp;quot; in &amp;quot;findmy&amp;quot;&lt;/p&gt;
&lt;h3 id=&quot;partial-data-before-accepting-shared-item&quot;&gt;partial data before accepting shared item &lt;a class=&quot;direct-link&quot; href=&quot;#partial-data-before-accepting-shared-item&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;I&#39;ve shared a second tag and even before I could accept the invite, I&#39;ve seen the item data in Items.data&lt;/p&gt;
&lt;p&gt;the data is without sensitive data until you accept the tag sharing (see more in &amp;quot;how to read the data in the csv&amp;quot;)&lt;/p&gt;
&lt;h3 id=&quot;airtags&quot;&gt;airtags &lt;a class=&quot;direct-link&quot; href=&quot;#airtags&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;there&#39;s a limit of 16 AirTags per Apple ID&lt;/p&gt;
&lt;h1 id=&quot;show-me-the-data&quot;&gt;show me the data &lt;a class=&quot;direct-link&quot; href=&quot;#show-me-the-data&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;the items (airtags and compatible devices) data is in:&lt;br&gt;
~/Library/Caches/com.apple.findmy.fmipcore/Items.data&lt;/p&gt;
&lt;h1 id=&quot;converting-data-to-csv&quot;&gt;converting data to csv &lt;a class=&quot;direct-link&quot; href=&quot;#converting-data-to-csv&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;for our tests we&#39;ll use airtag alex script: &lt;a href=&quot;https://github.com/icepick3000/AirtagAlex&quot;&gt;https://github.com/icepick3000/AirtagAlex&lt;/a&gt;&lt;br&gt;
it converts the items data to csv&lt;/p&gt;
&lt;h1 id=&quot;how-to-read-the-data-in-the-csv&quot;&gt;how to read the data in the csv &lt;a class=&quot;direct-link&quot; href=&quot;#how-to-read-the-data-in-the-csv&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;example of the yet to be accepted shared tag:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;2023-11-12  16:00:00,&amp;quot;Tag01&amp;quot;,&amp;quot;Not Available&amp;quot;,&amp;quot;b777&amp;quot;,77777,77,3,&amp;quot;2.0.0&amp;quot;,0,null,null,null,null,0,0,0,0,&amp;quot;null&amp;quot;,&amp;quot;null&amp;quot;,&amp;quot;null&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;example of the accepted tag (so all data is there)&lt;br&gt;
:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;2023-11-12  16:01:00,&amp;quot;Tag01&amp;quot;,&amp;quot;283KHVFAHSF832&amp;quot;,&amp;quot;b777&amp;quot;,77777,77,3,&amp;quot;2.0.0&amp;quot;,4,&amp;quot;crowdsourced&amp;quot;,44.113763000000000,12.575151000000000,1699801200000,-1,42.000000000000000,0,-1,&amp;quot;false&amp;quot;,&amp;quot;true&amp;quot;,&amp;quot;true&amp;quot;,&amp;quot;Via Fasulla 0&amp;quot;,&amp;quot;0&amp;quot;,&amp;quot;IT&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;Lombardia&amp;quot;,&amp;quot;Via Fasulla&amp;quot;,&amp;quot;Bergamo&amp;quot;,&amp;quot;Italy&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;(the data has been altered for privacy)&lt;/p&gt;
&lt;h1 id=&quot;use-case&quot;&gt;use case &lt;a class=&quot;direct-link&quot; href=&quot;#use-case&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;a headless vm with macos Sonoma (which supports items=airtag sharing),&lt;br&gt;
that receives shared airtags and sends the data somewhere else&lt;/p&gt;
&lt;p&gt;this way we can leverage the power of FindMy network but still using the tools we like,&lt;br&gt;
we can see this as a &amp;quot;compatibility layer&amp;quot;&lt;/p&gt;
&lt;h2 id=&quot;what-is-working%2Fthoughts&quot;&gt;what is working/thoughts &lt;a class=&quot;direct-link&quot; href=&quot;#what-is-working%2Fthoughts&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;having only macOS online seems to be the way to go, the device sharing arrive very slowly but arrive&lt;/li&gt;
&lt;li&gt;having also the icloud account logged on an iphone does not seem to give any added value
&lt;ul&gt;
&lt;li&gt;on iOS I see the &amp;quot;phantom notification&amp;quot; of a new item but nowhere to accept it, where on macos at least I can accept the invite&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;having the macOS user not logged in does not seem to impact the update of the devices&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;important&quot;&gt;important &lt;a class=&quot;direct-link&quot; href=&quot;#important&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;it seems that for having the items update their position you need to have macos logged in and findmy open,&lt;br&gt;
the screen can be locked.&lt;/p&gt;
&lt;h1 id=&quot;traccar-script&quot;&gt;traccar script &lt;a class=&quot;direct-link&quot; href=&quot;#traccar-script&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;this is a modified version of AirtagAlex&#39;s script,&lt;br&gt;
this writes data to the csv and also sends it to traccar&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#!/bin/bash

ITEMS_FILE=&amp;quot;./Items.data&amp;quot;
CSV_FILE=&amp;quot;./Airtags.csv&amp;quot;
CSV_HEADER=&amp;quot;datetime,name,serialnumber,producttype,productindentifier,vendoridentifier,antennapower,systemversion,batterystatus,locationpositiontype,locationlatitude,locationlongitude,locationtimestamp,locationverticalaccuracy,locationhorizontalaccuracy,locationfloorlevel,locationaltitude,locationisinaccurate,locationisold,locationfinished,addresslabel,addressstreetaddress,addresscountrycode,addressstatecode,addressadministrativearea,addressstreetname,addresslocality,addresscountry,addressareaofinteresta,addressareaofinterestb&amp;quot;

### VARS for traccar:
traccar_url=&amp;quot;http://your.traccar.url:5055&amp;quot;

copy_items_data() {
	echo &amp;quot;Creating a copy of Items.data to prevent potential file corruption&amp;quot;
	if ! cp -p ~/Library/Caches/com.apple.findmy.fmipcore/Items.data &amp;quot;$ITEMS_FILE&amp;quot;; then
	    echo &amp;quot;Failed to copy Items.data file. Please ensure Terminal has &#39;Full Disk Access&#39; in the &#39;Privacy &amp;amp; Security&#39; section in macOS Preferences&amp;quot; &amp;gt;&amp;amp;2
	    exit 1
	fi
}

create_csv_file() {
	echo &amp;quot;Checking if $CSV_FILE exists&amp;quot;
	if [ ! -f &amp;quot;$CSV_FILE&amp;quot; ]; then
	    echo &amp;quot;$CSV_FILE does not exist, creating one&amp;quot;
	    if ! echo &amp;quot;$CSV_HEADER&amp;quot; &amp;gt;&amp;gt; &amp;quot;$CSV_FILE&amp;quot;; then
	        echo &amp;quot;Failed to create $CSV_FILE. Please ensure the destination directory is writable.&amp;quot; &amp;gt;&amp;amp;2
	        exit 1
	    fi
	fi
}

while true; do
	copy_items_data
	create_csv_file

	echo &amp;quot;Checking number of Airtags to process&amp;quot;
	airtagsnumber=$(jq &amp;quot;.[].serialNumber&amp;quot; &amp;quot;$ITEMS_FILE&amp;quot; | wc -l)
	echo &amp;quot;Number of Airtags to process: $airtagsnumber&amp;quot;
	airtagsnumber=$((airtagsnumber-1))

	for j in $(seq 0 &amp;quot;$airtagsnumber&amp;quot;); do
	echo &amp;quot;Processing airtag number $j&amp;quot;

	datetime=$(date +&amp;quot;%Y-%m-%d  %T&amp;quot;)

	serialnumber=$(jq &amp;quot;.[$j].serialNumber&amp;quot; &amp;quot;$ITEMS_FILE&amp;quot;)
	name=$(jq &amp;quot;.[$j].name&amp;quot; &amp;quot;$ITEMS_FILE&amp;quot;)
	producttype=$(jq &amp;quot;.[$j].productType.type&amp;quot; &amp;quot;$ITEMS_FILE&amp;quot;)
	productindentifier=$(jq &amp;quot;.[$j].productType.productInformation.productIdentifier&amp;quot; &amp;quot;$ITEMS_FILE&amp;quot;)
	vendoridentifier=$(jq &amp;quot;.[$j].productType.productInformation.vendorIdentifier&amp;quot; &amp;quot;$ITEMS_FILE&amp;quot;)
	antennapower=$(jq &amp;quot;.[$j].productType.productInformation.antennaPower&amp;quot; &amp;quot;$ITEMS_FILE&amp;quot;)
	systemversion=$(jq &amp;quot;.[$j].systemVersion&amp;quot; &amp;quot;$ITEMS_FILE&amp;quot;)
	batterystatus=$(jq &amp;quot;.[$j].batteryStatus&amp;quot; &amp;quot;$ITEMS_FILE&amp;quot;)
	locationpositiontype=$(jq &amp;quot;.[$j].location.positionType&amp;quot; &amp;quot;$ITEMS_FILE&amp;quot;)
	locationlatitude=$(jq &amp;quot;.[$j].location.latitude&amp;quot; &amp;quot;$ITEMS_FILE&amp;quot;)
	locationlongitude=$(jq &amp;quot;.[$j].location.longitude&amp;quot; &amp;quot;$ITEMS_FILE&amp;quot;)
	locationtimestamp=$(jq &amp;quot;.[$j].location.timeStamp&amp;quot; &amp;quot;$ITEMS_FILE&amp;quot;)
	locationverticalaccuracy=$(jq &amp;quot;.[$j].location.verticalAccuracy // 0&amp;quot; &amp;quot;$ITEMS_FILE&amp;quot;)
	locationhorizontalaccuracy=$(jq &amp;quot;.[$j].location.horizontalAccuracy // 0&amp;quot; &amp;quot;$ITEMS_FILE&amp;quot;)
	locationfloorlevel=$(jq &amp;quot;.[$j].location.floorlevel // 0&amp;quot; &amp;quot;$ITEMS_FILE&amp;quot;)
	locationaltitude=$(jq &amp;quot;.[$j].location.altitude // 0&amp;quot; &amp;quot;$ITEMS_FILE&amp;quot;)
	locationisinaccurate=$(jq &amp;quot;.[$j].location.isInaccurate&amp;quot; &amp;quot;$ITEMS_FILE&amp;quot; | awk &#39;{ print &amp;quot;\&amp;quot;&amp;quot;$0&amp;quot;\&amp;quot;&amp;quot; }&#39;)
	locationisold=$(jq &amp;quot;.[$j].location.isOld&amp;quot; &amp;quot;$ITEMS_FILE&amp;quot; | awk &#39;{ print &amp;quot;\&amp;quot;&amp;quot;$0&amp;quot;\&amp;quot;&amp;quot; }&#39; )
	locationfinished=$(jq &amp;quot;.[$j].location.locationFinished&amp;quot; &amp;quot;$ITEMS_FILE&amp;quot; | awk &#39;{ print &amp;quot;\&amp;quot;&amp;quot;$0&amp;quot;\&amp;quot;&amp;quot; }&#39; )
	addresslabel=$(jq &amp;quot;.[$j].address.label // \&amp;quot;\&amp;quot;&amp;quot; &amp;quot;$ITEMS_FILE&amp;quot;)
	addressstreetaddress=$(jq &amp;quot;.[$j].address.streetAddress // \&amp;quot;\&amp;quot;&amp;quot; &amp;quot;$ITEMS_FILE&amp;quot;)
	addresscountrycode=$(jq &amp;quot;.[$j].address.countryCode // \&amp;quot;\&amp;quot;&amp;quot; &amp;quot;$ITEMS_FILE&amp;quot;)
	addressstatecode=$(jq &amp;quot;.[$j].address.stateCode // \&amp;quot;\&amp;quot;&amp;quot; &amp;quot;$ITEMS_FILE&amp;quot;)
	addressadministrativearea=$(jq &amp;quot;.[$j].address.administrativeArea // \&amp;quot;\&amp;quot;&amp;quot; &amp;quot;$ITEMS_FILE&amp;quot;)
	addressstreetname=$(jq &amp;quot;.[$j].address.streetName // \&amp;quot;\&amp;quot;&amp;quot; &amp;quot;$ITEMS_FILE&amp;quot;)
	addresslocality=$(jq &amp;quot;.[$j].address.locality // \&amp;quot;\&amp;quot;&amp;quot; &amp;quot;$ITEMS_FILE&amp;quot;)
	addresscountry=$(jq &amp;quot;.[$j].address.country // \&amp;quot;\&amp;quot;&amp;quot; &amp;quot;$ITEMS_FILE&amp;quot;)
	addressareaofinteresta=$(jq &amp;quot;.[$j].address.areaOfInterest[0] // \&amp;quot;\&amp;quot;&amp;quot; &amp;quot;$ITEMS_FILE&amp;quot;)
	addressareaofinterestb=$(jq &amp;quot;.[$j].address.areaOfInterest[1] // \&amp;quot;\&amp;quot;&amp;quot; &amp;quot;$ITEMS_FILE&amp;quot;)

	echo &amp;quot;Writing data to $CSV_FILE&amp;quot;
	echo &amp;quot;$datetime&amp;quot;,&amp;quot;$name&amp;quot;,&amp;quot;$serialnumber&amp;quot;,&amp;quot;$producttype&amp;quot;,&amp;quot;$productindentifier&amp;quot;,&amp;quot;$vendoridentifier&amp;quot;,&amp;quot;$antennapower&amp;quot;,&amp;quot;$systemversion&amp;quot;,&amp;quot;$batterystatus&amp;quot;,&amp;quot;$locationpositiontype&amp;quot;,&amp;quot;$locationlatitude&amp;quot;,&amp;quot;$locationlongitude&amp;quot;,&amp;quot;$locationtimestamp&amp;quot;,&amp;quot;$locationverticalaccuracy&amp;quot;,&amp;quot;$locationhorizontalaccuracy&amp;quot;,&amp;quot;$locationfloorlevel&amp;quot;,&amp;quot;$locationaltitude&amp;quot;,&amp;quot;$locationisinaccurate&amp;quot;,&amp;quot;$locationisold&amp;quot;,&amp;quot;$locationfinished&amp;quot;,&amp;quot;$addresslabel&amp;quot;,&amp;quot;$addressstreetaddress&amp;quot;,&amp;quot;$addresscountrycode&amp;quot;,&amp;quot;$addressstatecode&amp;quot;,&amp;quot;$addressadministrativearea&amp;quot;,&amp;quot;$addressstreetname&amp;quot;,&amp;quot;$addresslocality&amp;quot;,&amp;quot;$addresscountry&amp;quot;,&amp;quot;$addressareaofinteresta&amp;quot;,&amp;quot;$addressareaofinterestb&amp;quot; &amp;gt;&amp;gt; &amp;quot;$CSV_FILE&amp;quot;


        ### block to write data into traccar:
        #
        serialnumber=`echo $serialnumber | sed &#39;s/\&amp;quot;//g&#39;`
        ### removed due to updated code: tracname=`cat ~/Desktop/Airtags/Items.data | jq .[$j].name | sed &#39;s!&amp;quot;!!g&#39;`
        ### batterystatus=`cat ~/Desktop/Airtags/Items.data | jq .[$j].batteryStatus`
        akku=$((batterystatus * 100))
        # send data to traccar:
	wget --spider $traccar_url/?id=$serialnumber\&amp;amp;lat=$locationlatitude\&amp;amp;lon=$locationlongitude\&amp;amp;speed=0\&amp;amp;user=Airtag\&amp;amp;batteryLevel=$akku\&amp;amp;accuracy=$locationhorizontalaccuracy\&amp;amp;timestamp=$locationtimestamp\&amp;amp;serialnumber=$serialnumber\&amp;amp;lastupdate=$locationtimestamp
        #
        echo &amp;quot;Sleep for 1 second between Airtags&amp;quot;
        sleep 1
        #
        ### END block to write data into traccar

	done
	echo -e &amp;quot;Checking again in 1 minute...\n&amp;quot;
	sleep 60

done

&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id=&quot;to-check%3A&quot;&gt;to check: &lt;a class=&quot;direct-link&quot; href=&quot;#to-check%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/MartinPham/FindMySync&quot;&gt;https://github.com/MartinPham/FindMySync&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.martinpham.com/findmysync/&quot;&gt;https://www.martinpham.com/findmysync/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;sources%3A&quot;&gt;sources: &lt;a class=&quot;direct-link&quot; href=&quot;#sources%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/icepick3000/AirtagAlex&quot;&gt;https://github.com/icepick3000/AirtagAlex&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/SchorschKloni/AirtagAlex&quot;&gt;https://github.com/SchorschKloni/AirtagAlex&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
	</entry>
	
	<entry>
		<title>install and configure tailascale to start at boot on macos</title>
		<link href="https://blog.smemory.org/posts/20231112_02_macosTailscaleAlwaysOn/"/>
		<updated>2023-11-12T00:00:00+00:00</updated>
		<id>https://blog.smemory.org/posts/20231112_02_macosTailscaleAlwaysOn/</id>
		<content type="html">&lt;p&gt;we want tailscale to start at boot of our macos vm and not when a user logins (so we can remotely manage the vm).&lt;/p&gt;
&lt;p&gt;install go:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;brew update &amp;amp;&amp;amp; brew install golang
mkdir -p $HOME/go/{bin,src,pkg}

cat &amp;lt;&amp;lt;EOF &amp;gt;&amp;gt; ~/.zshrc
export GOPATH=$HOME/go
export GOROOT=&amp;quot;$(brew --prefix golang)/libexec&amp;quot;
export PATH=&amp;quot;$PATH:${GOPATH}/bin:${GOROOT}/bin&amp;quot;
EOF

source $HOME/.zshrc

cat &amp;lt;&amp;lt;EOF &amp;gt;&amp;gt; ~/.bashrc
export GOPATH=$HOME/go
export GOROOT=&amp;quot;$(brew --prefix golang)/libexec&amp;quot;
export PATH=&amp;quot;$PATH:${GOPATH}/bin:${GOROOT}/bin&amp;quot;
EOF

source $HOME/.bashrc
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;source: &lt;a href=&quot;https://jimkang.medium.com/install-go-on-mac-with-homebrew-5fa421fc55f5&quot;&gt;https://jimkang.medium.com/install-go-on-mac-with-homebrew-5fa421fc55f5&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;install tailscaled:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;go install tailscale.com/cmd/tailscale{,d}@main

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;run tailscaled at system boot:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo $HOME/go/bin/tailscaled install-system-daemon
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;login talscaled to your account (with your auth key):&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;tailscale login --authkey=tskey-auth-a08gh083g083208gf08wgef0284ghf08wgf0a288fag30
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;check it&#39;s ok:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;tailscale status
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;output&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;user@machine ~ % tailscale status
100.123.123.1  this-machine       tailscale-account@ macOS   -
100.321.321.2  another-machine    tailscale-account@ linux   -

# Health check:
#     - This is an unstable (development) version of Tailscale; frequent updates and bugs are likely
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;NB: as stated, tailscaled is an unstable (development) version of Tailscale.&lt;/p&gt;
&lt;p&gt;source: &lt;a href=&quot;https://github.com/tailscale/tailscale/wiki/Tailscaled-on-macOS&quot;&gt;https://github.com/tailscale/tailscale/wiki/Tailscaled-on-macOS&lt;/a&gt;&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>Installing MacOs Ventura on Proxmox</title>
		<link href="https://blog.smemory.org/posts/20231112_01_MacOsVenturaOnProxmox/"/>
		<updated>2023-11-12T00:00:00+00:00</updated>
		<id>https://blog.smemory.org/posts/20231112_01_MacOsVenturaOnProxmox/</id>
		<content type="html">&lt;h1 id=&quot;why%3A&quot;&gt;why: &lt;a class=&quot;direct-link&quot; href=&quot;#why%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;TL;DR:&lt;br&gt;
I want an always-on macos installation without dedicating new hardware to this test.&lt;/p&gt;
&lt;p&gt;more:&lt;br&gt;
Some data, like airtags position, is retrievable reliably only from macos,&lt;br&gt;
we&#39;ve seen that the iCloud APIs ad not reliable or don&#39;t expose the data we need.&lt;/p&gt;
&lt;p&gt;With a friend we want to test the retrieval of the airtags position from macos, convert the data and send it to traccar, an open source fleet tracking software.&lt;/p&gt;
&lt;h1 id=&quot;notes%3A&quot;&gt;notes: &lt;a class=&quot;direct-link&quot; href=&quot;#notes%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;This &amp;quot;guide&amp;quot; is a patchwork of various sources I&#39;ve followed, all of which are cited.&lt;/li&gt;
&lt;li&gt;I&#39;ve wrote this just as a series of notes about what I&#39;ve done and worked as I wanted to.&lt;/li&gt;
&lt;li&gt;This process has been tested with both the Ventura 13 and Sonoma 14 ISOs&lt;/li&gt;
&lt;li&gt;The commands you see have been executed on Ventura&lt;/li&gt;
&lt;li&gt;The VM will run on proxmox 7.x and on AMD Ryzen series 3000 cpu&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;hardware-acceleration-issues&quot;&gt;hardware acceleration issues &lt;a class=&quot;direct-link&quot; href=&quot;#hardware-acceleration-issues&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;There are some rendering issues when hardware acceleration is required, this is a known issue and it seems that is solvable only passing a GPU to the vm (not my use case).&lt;/p&gt;
&lt;p&gt;Sonoma in particular has some issues on the desktop, the image is not correctly rendered.&lt;/p&gt;
&lt;p&gt;These issues are known, there seem to be some workarounds with intel and nvidia gpus (&lt;a href=&quot;https://dortania.github.io/OpenCore-Post-Install/gpu-patching/intel-patching/#getting-started&quot;&gt;https://dortania.github.io/OpenCore-Post-Install/gpu-patching/intel-patching/#getting-started&lt;/a&gt;) but again, it&#39;s not my use case.&lt;/p&gt;
&lt;h2 id=&quot;virtual-(and-non)-hardware&quot;&gt;virtual (and non) hardware &lt;a class=&quot;direct-link&quot; href=&quot;#virtual-(and-non)-hardware&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The vm are running on a cpu Ryzen Series 3000,&lt;br&gt;
the disks are on an nvme drive.&lt;/p&gt;
&lt;p&gt;The vm has been installed using 4 cpu cores and 8gb of ram,&lt;br&gt;
now I am using it with 2 cores and 4gb of ram.&lt;/p&gt;
&lt;h1 id=&quot;create-the-iso%3A&quot;&gt;create the ISO: &lt;a class=&quot;direct-link&quot; href=&quot;#create-the-iso%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;(I&#39;m running these commands on macos ventura)&lt;/p&gt;
&lt;h2 id=&quot;check-the-available-software&quot;&gt;check the available software &lt;a class=&quot;direct-link&quot; href=&quot;#check-the-available-software&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;?@machine ventura % softwareupdate --list-full-installers

Finding available software
Software Update found the following full installers:
* Title: macOS Sonoma, Version: 14.1.1, Size: 12604952KiB, Build: 23B81, Deferred: NO
* Title: macOS Sonoma, Version: 14.1, Size: 12603757KiB, Build: 23B74, Deferred: NO
* Title: macOS Sonoma, Version: 14.0, Size: 12555162KiB, Build: 23A344, Deferred: NO
* Title: macOS Ventura, Version: 13.6.1, Size: 11662168KiB, Build: 22G313, Deferred: NO
* Title: macOS Ventura, Version: 13.6, Size: 11657005KiB, Build: 22G120, Deferred: NO
* Title: macOS Ventura, Version: 13.5.2, Size: 11655353KiB, Build: 22G91, Deferred: NO
* Title: macOS Ventura, Version: 13.5.1, Size: 11655520KiB, Build: 22G90, Deferred: NO
* Title: macOS Ventura, Version: 13.5, Size: 11654590KiB, Build: 22G74, Deferred: NO
* Title: macOS Ventura, Version: 13.4.1, Size: 11513284KiB, Build: 22F82, Deferred: NO
* Title: macOS Monterey, Version: 12.7.1, Size: 12110635KiB, Build: 21G920, Deferred: NO
* Title: macOS Monterey, Version: 12.7, Size: 12107687KiB, Build: 21G816, Deferred: NO
* Title: macOS Monterey, Version: 12.6.9, Size: 12111110KiB, Build: 21G726, Deferred: NO
* Title: macOS Monterey, Version: 12.6.8, Size: 12119078KiB, Build: 21G725, Deferred: NO
* Title: macOS Monterey, Version: 12.6.7, Size: 12115649KiB, Build: 21G651, Deferred: NO
* Title: macOS Big Sur, Version: 11.7.10, Size: 12125478KiB, Build: 20G1427, Deferred: NO
* Title: macOS Big Sur, Version: 11.7.9, Size: 12125714KiB, Build: 20G1426, Deferred: NO
* Title: macOS Big Sur, Version: 11.7.8, Size: 12120994KiB, Build: 20G1351, Deferred: NO
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;instructions-for-macos-13-ventura&quot;&gt;instructions for macOS 13 Ventura &lt;a class=&quot;direct-link&quot; href=&quot;#instructions-for-macos-13-ventura&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;install the software installer to create the iso&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;softwareupdate --fetch-full-installer --full-installer-version 13.6.1
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;cd ~/Desktop/Proxmox_Ventura/

DISK_SIZE=&amp;quot;15361m&amp;quot;
hdiutil create -o ~/Desktop/Proxmox_Ventura/Ventura.cdr -size $DISK_SIZE -layout GPTSPUD -fs HFS+J
hdiutil attach ~/Desktop/Proxmox_Ventura/Ventura.cdr.dmg -noverify -mountpoint /Volumes/install_build
sudo &amp;quot;/Applications/Install macOS Ventura.app/Contents/Resources/createinstallmedia&amp;quot;  --volume /Volumes/install_build --nointeraction --downloadassets
hdiutil detach &amp;quot;/Volumes/Shared Support&amp;quot;
hdiutil detach &amp;quot;/Volumes/Install macOS Ventura&amp;quot;
hdiutil convert Ventura.cdr.dmg -format UDTO -o Ventura.iso
mv Ventura.iso.cdr Ventura.iso
rm Ventura.cdr.dmg
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;instructions-for-macos-14-sonoma%3A&quot;&gt;instructions for macOS 14 Sonoma: &lt;a class=&quot;direct-link&quot; href=&quot;#instructions-for-macos-14-sonoma%3A&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;softwareupdate --fetch-full-installer --full-installer-version 14.1.1

cd ~/Desktop/Proxmox_Sonoma/

DISK_SIZE=&amp;quot;15361m&amp;quot;
hdiutil create -o ~/Desktop/Proxmox_Sonoma/Sonoma.cdr -size $DISK_SIZE -layout GPTSPUD -fs HFS+J
hdiutil attach ~/Desktop/Proxmox_Sonoma/Sonoma.cdr.dmg -noverify -mountpoint /Volumes/install_build
sudo &amp;quot;/Applications/Install macOS Sonoma.app/Contents/Resources/createinstallmedia&amp;quot; --volume /Volumes/install_build --nointeraction --downloadassets
hdiutil detach &amp;quot;/Volumes/Shared Support&amp;quot;
hdiutil detach &amp;quot;/Volumes/Install macOS Sonoma&amp;quot;
hdiutil convert Sonoma.cdr.dmg -format UDTO -o Sonoma.iso
mv Sonoma.iso.cdr Sonoma.iso
rm Sonoma.cdr.dmg

&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;possible-issues%3A&quot;&gt;possible issues: &lt;a class=&quot;direct-link&quot; href=&quot;#possible-issues%3A&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;note the &amp;quot;-layout GPTSPUD&amp;quot; instead of &amp;quot;-layout SPUD&amp;quot;, in the command:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;hdiutil create -o ~/Desktop/Proxmox_version/version.cdr -size $DISK_SIZE -layout GPTSPUD -fs HFS+J
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;it seems that was the change that made the script work,&lt;br&gt;
otherwise I received the error:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Erasing disk: 0%... 10%... 20%... 30%... 100%
Copying essential files...
Copying the macOS RecoveryOS...
Making disk bootable...
Failed to extract AssetData/boot/Firmware/Manifests/InstallerBoot/* from update bundle
The bless of the installer disk failed.
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;sources%3A&quot;&gt;sources: &lt;a class=&quot;direct-link&quot; href=&quot;#sources%3A&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://gist.github.com/julianxhokaxhiu/42332e67640daad8f18386eeec43ea73&quot;&gt;https://gist.github.com/julianxhokaxhiu/42332e67640daad8f18386eeec43ea73&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://forums.macrumors.com/threads/having-difficulties-creating-bootable-ventura-usb-installer-for-m2-mac-studio.2394738/&quot;&gt;https://forums.macrumors.com/threads/having-difficulties-creating-bootable-ventura-usb-installer-for-m2-mac-studio.2394738/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;preparation&quot;&gt;preparation &lt;a class=&quot;direct-link&quot; href=&quot;#preparation&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id=&quot;osk-key&quot;&gt;osk key &lt;a class=&quot;direct-link&quot; href=&quot;#osk-key&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;recover the osk key:&lt;br&gt;
it&#39;s listed in a court document: &lt;a href=&quot;https://www.rcfp.org/wp-content/uploads/imported/20120105_202426_apple_sealing.pdf&quot;&gt;https://www.rcfp.org/wp-content/uploads/imported/20120105_202426_apple_sealing.pdf&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;it seems like apple tried to take it down, arguing it was a trade secret.&lt;/p&gt;
&lt;p&gt;I tried to generate it randomly but I only came up with this string,&lt;br&gt;
it seems something is missing, maybe needs to be ROT13, I dunno.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;bheuneqjbexolgurfrjbeqfthneqrqcyrnfrqbagfgrny(p)NccyrPbzchgreVap
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;to check I would have needed to run this command to check but I don&#39;t have more time for this topic.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;echo &amp;quot;bheuneqjbexolgurfrjbeqfthneqrqcyrnfrqbagfgrny(p)NccyrPbzchgreVap&amp;quot; | tr &#39;A-Za-z&#39; &#39;N-ZA-Mn-za-m&#39;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;download-opencore&quot;&gt;download opencore &lt;a class=&quot;direct-link&quot; href=&quot;#download-opencore&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;download the latest release of opencore for proxmox: &lt;a href=&quot;https://github.com/thenickdude/KVM-Opencore/releases&quot;&gt;https://github.com/thenickdude/KVM-Opencore/releases&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;for this guide I&#39;ve used the v20&lt;/p&gt;
&lt;p&gt;decompress the archive and copy the iso, with the macos one, on proxmox&lt;/p&gt;
&lt;h2 id=&quot;proxmox&quot;&gt;proxmox &lt;a class=&quot;direct-link&quot; href=&quot;#proxmox&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;avoiding-bootloops&quot;&gt;avoiding bootloops &lt;a class=&quot;direct-link&quot; href=&quot;#avoiding-bootloops&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;to avoid bootloops&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;echo 1 &amp;gt; /sys/module/kvm/parameters/ignore_msrs

echo &amp;quot;options kvm ignore_msrs=Y&amp;quot; &amp;gt;&amp;gt; /etc/modprobe.d/kvm.conf

update-initramfs -k all -u
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;source: &lt;a href=&quot;https://www.nicksherlock.com/2022/10/installing-macos-13-ventura-on-proxmox/&quot;&gt;https://www.nicksherlock.com/2022/10/installing-macos-13-ventura-on-proxmox/&lt;/a&gt; section &amp;quot;Configure Proxmox&amp;quot;&lt;/p&gt;
&lt;h3 id=&quot;tsc&quot;&gt;TSC &lt;a class=&quot;direct-link&quot; href=&quot;#tsc&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;check if you have working TSC (time stamp counter):&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;dmesg | grep -i -e tsc -e clocksource
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;the output should be:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;tsc: Refined TSC clocksource calibration: 3399.998 MHz
clocksource: tsc: mask: 0xffffffffffffffff max_cycles: 0x31024cfe468, max_idle_ns: 440795307017 ns
clocksource: Switched to clocksource tsc
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;if you see this, then the TSC is not enabled:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;TSC synchronization [CPU#0 -&amp;gt; CPU#1]:
Measured 3358870891203288 cycles TSC warp between CPUs, turning off TSC clock.
tsc: Marking TSC unstable due to check_tsc_sync_source failed
clocksource: Switched to clocksource hpet
kvm: SMP vm created on host with unstable TSC; guest TSC will not be reliable
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;source: &lt;a href=&quot;https://www.nicksherlock.com/2022/10/installing-macos-13-ventura-on-proxmox/&quot;&gt;https://www.nicksherlock.com/2022/10/installing-macos-13-ventura-on-proxmox/&lt;/a&gt; section &amp;quot;Requirements&amp;quot;&lt;/p&gt;
&lt;h1 id=&quot;create-the-vm&quot;&gt;create the vm &lt;a class=&quot;direct-link&quot; href=&quot;#create-the-vm&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;follow: &lt;a href=&quot;https://www.nicksherlock.com/2022/10/installing-macos-13-ventura-on-proxmox/&quot;&gt;https://www.nicksherlock.com/2022/10/installing-macos-13-ventura-on-proxmox/&lt;/a&gt;&lt;br&gt;
steps &amp;quot;Create the VM&amp;quot; and &amp;quot;Configure Proxmox&amp;quot;&lt;/p&gt;
&lt;h2 id=&quot;notes&quot;&gt;notes &lt;a class=&quot;direct-link&quot; href=&quot;#notes&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;you&#39;ll need to edit the proxmox vm configfile,&lt;br&gt;
I am on AMD so I&#39;ve added this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;args: -device isa-applesmc,osk=&amp;quot;THE_OSK_KEY&amp;quot; -smbios type=2 -device usb-kbd,bus=ehci.0,port=2 -global nec-usb-xhci.msi=off -global ICH9-LPC.acpi-pci-hotplug-with-bridge-support=off -cpu Haswell-noTSX,vendor=GenuineIntel,+invtsc,+hypervisor,kvm=on,vmware-cpuid-freq=on
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;for intel:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;args: -device isa-applesmc,osk=&amp;quot;THE_OSK_KEY&amp;quot; -smbios type=2 -device usb-kbd,bus=ehci.0,port=2 -global nec-usb-xhci.msi=off -global ICH9-LPC.acpi-pci-hotplug-with-bridge-support=off -cpu host,vendor=GenuineIntel,+invtsc,+hypervisor,kvm=on,vmware-cpuid-freq=on
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;also remember to change “,media=cdrom” to “,cache=unsafe&amp;quot; otherwise it won&#39;t correctly boot.&lt;/p&gt;
&lt;h1 id=&quot;install-macos-ventura&quot;&gt;install macOS Ventura &lt;a class=&quot;direct-link&quot; href=&quot;#install-macos-ventura&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;upload the opencore ISO and Ventura ISO on Proxmox&lt;/li&gt;
&lt;li&gt;follow the steps in: &lt;a href=&quot;https://www.nicksherlock.com/2022/10/installing-macos-13-ventura-on-proxmox/&quot;&gt;https://www.nicksherlock.com/2022/10/installing-macos-13-ventura-on-proxmox/&lt;/a&gt;&lt;br&gt;
step &amp;quot;Install Ventura&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;the main things you want to keep in mind:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;remember that when the vm reboots for the installation steps you&#39;ll need to manually select &amp;quot;macos installer&amp;quot; in the boot menu, only when the installer has finished all the steps you&#39;ll see the same icon but with the disk name you choose when you erased the disk, in my case: &amp;quot;proxmox-sonoma&amp;quot;&lt;/li&gt;
&lt;li&gt;in the config wizard at the first boot: do not attach an icloud account right now because we need to fix the serial of the mac before&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;make-the-opencore-install-permament%3A&quot;&gt;make the opencore install permament: &lt;a class=&quot;direct-link&quot; href=&quot;#make-the-opencore-install-permament%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;check the disks:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;user@proxmox-sonoma ~ % diskutil list
/dev/disk0 (internal, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *85.9 GB    disk0
   1:                        EFI EFI                     209.7 MB   disk0s1
   2:                 Apple_APFS Container disk3         85.7 GB    disk0s2

/dev/disk1 (internal, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *16.1 GB    disk1
   1:                        EFI EFI                     209.7 MB   disk1s1
   2:                  Apple_HFS Install macOS Sonoma    15.8 GB    disk1s2

/dev/disk2 (internal, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *157.3 MB   disk2
   1:                        EFI EFI                     157.2 MB   disk2s1

/dev/disk3 (synthesized):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      APFS Container Scheme -                      +85.7 GB    disk3
                                 Physical Store disk0s2
   1:                APFS Volume proxmox-sonoma - Data   2.2 GB     disk3s1
   2:                APFS Volume Preboot                 2.0 GB     disk3s2
   3:                APFS Volume Recovery                1.2 GB     disk3s3
   4:                APFS Volume proxmox-sonoma          9.9 GB     disk3s4
   5:              APFS Snapshot com.apple.os.update-... 9.9 GB     disk3s4s1
   6:                APFS Volume VM                      1.1 MB     disk3s6
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;we want to copy the EFI partition from the Opencore iso to our main EFI partition on the macos disk,&lt;br&gt;
in this case the opencore efi partition is /dev/disk2s1 and the macos disk efi partition is /dev/disk0s1,&lt;br&gt;
so we&#39;ll copy them with this command:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo dd if=/dev/disk2s1 of=/dev/disk0s1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;reboot&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;source: &lt;a href=&quot;https://www.nicksherlock.com/2022/10/installing-macos-13-ventura-on-proxmox/&quot;&gt;https://www.nicksherlock.com/2022/10/installing-macos-13-ventura-on-proxmox/&lt;/a&gt;&lt;br&gt;
step &amp;quot;Make the OpenCore install permanent&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;activate-remote-management&quot;&gt;activate remote management &lt;a class=&quot;direct-link&quot; href=&quot;#activate-remote-management&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;since the proxmox console is a bit slugghish it&#39;s better if we work remotely on that vm,&lt;br&gt;
once the install is finished go in &amp;quot;System Settings&amp;quot; --&amp;gt; &amp;quot;General&amp;quot; --&amp;gt; &amp;quot;Sharing&amp;quot;&lt;br&gt;
and activate &amp;quot;Screen Sharing&amp;quot; and &amp;quot;Remote Login&amp;quot;&lt;/p&gt;
&lt;h2 id=&quot;screen-sharing&quot;&gt;screen sharing &lt;a class=&quot;direct-link&quot; href=&quot;#screen-sharing&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;is VNC&lt;/p&gt;
&lt;p&gt;you can define an arbitrary password to access the service&lt;/p&gt;
&lt;h2 id=&quot;remote-login&quot;&gt;remote login &lt;a class=&quot;direct-link&quot; href=&quot;#remote-login&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;is SSH&lt;br&gt;
we can connect simply via ssh using our username and password:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ssh user@192.168.1.16
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;next steps: enable ssh-key access and disable password login&lt;/p&gt;
&lt;h1 id=&quot;set-the-config.plist-parameters&quot;&gt;set the config.plist parameters &lt;a class=&quot;direct-link&quot; href=&quot;#set-the-config.plist-parameters&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;sources:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://dortania.github.io/OpenCore-Post-Install/universal/iservices.html&quot;&gt;https://dortania.github.io/OpenCore-Post-Install/universal/iservices.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;generate-the-correct-serial-number-and-mlb&quot;&gt;generate the correct serial number and MLB &lt;a class=&quot;direct-link&quot; href=&quot;#generate-the-correct-serial-number-and-mlb&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;retrieve the tool:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git clone --depth 1 https://github.com/acidanthera/OpenCorePkg.git
cd ./OpenCorePkg/Utilities/macserial/
make
chmod +x ./macserial
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;generate the serials:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;./macserial --num 1 --model &amp;quot;iMacPro1,1&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;the output will be like:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;V832AKJGA831 | B8562969GHIIUT017
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;the on on the left is our serial, the right one is the Board Serial (MLB)&lt;/p&gt;
&lt;h2 id=&quot;choose-mac-address-and-create-the-rom-address&quot;&gt;choose mac address and create the rom address &lt;a class=&quot;direct-link&quot; href=&quot;#choose-mac-address-and-create-the-rom-address&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;we have to choose a mac address which is tied to Apple,&lt;br&gt;
they start with: 00:16:CB&lt;br&gt;
so for example: 00:16:CB:AA:BB:CC&lt;/p&gt;
&lt;p&gt;the rom address is the mac address without &amp;quot;:&amp;quot; and all lowercase:&lt;br&gt;
0016cbaabbcc&lt;/p&gt;
&lt;h2 id=&quot;generate-a-uuid&quot;&gt;generate a uuid &lt;a class=&quot;direct-link&quot; href=&quot;#generate-a-uuid&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;just run &amp;quot;uudigen&amp;quot; and you will have something like:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;0DEE5A61-5BDE-431B-803C-3F8C40BCFE0B
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;mount-efi-partition&quot;&gt;mount EFI partition &lt;a class=&quot;direct-link&quot; href=&quot;#mount-efi-partition&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;our config.plist file is inside the EFI partition which is not mounted by default,&lt;br&gt;
mount our EFI partition and change to the correct partition:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo diskutil mount EFI
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;configure-the-config.plist&quot;&gt;configure the config.plist &lt;a class=&quot;direct-link&quot; href=&quot;#configure-the-config.plist&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;then we can edit the config.plist in&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/Volumes/EFI/EFI/OC/config.plist
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;add-serials&quot;&gt;add serials &lt;a class=&quot;direct-link&quot; href=&quot;#add-serials&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;[..CUT..]
&amp;lt;key&amp;gt;PlatformInfo&amp;lt;/key&amp;gt;
        &amp;lt;dict&amp;gt;
                &amp;lt;key&amp;gt;Automatic&amp;lt;/key&amp;gt;
                &amp;lt;true/&amp;gt;
                &amp;lt;key&amp;gt;CustomMemory&amp;lt;/key&amp;gt;
                &amp;lt;false/&amp;gt;
                &amp;lt;key&amp;gt;Generic&amp;lt;/key&amp;gt;
                &amp;lt;dict&amp;gt;
                        [..CUT..]
                        &amp;lt;key&amp;gt;MLB&amp;lt;/key&amp;gt;
                        &amp;lt;string&amp;gt;B8562969GHIIUT017&amp;lt;/string&amp;gt;
                        &amp;lt;key&amp;gt;ROM&amp;lt;/key&amp;gt;
                        &amp;lt;data&amp;gt;0016cbaabbcc&amp;lt;/data&amp;gt;
                        &amp;lt;key&amp;gt;SpoofVendor&amp;lt;/key&amp;gt;
                        &amp;lt;true/&amp;gt;
                        &amp;lt;key&amp;gt;SystemProductName&amp;lt;/key&amp;gt;
                        &amp;lt;string&amp;gt;iMacPro1,1&amp;lt;/string&amp;gt;
                        &amp;lt;key&amp;gt;SystemSerialNumber&amp;lt;/key&amp;gt;
                        &amp;lt;string&amp;gt;V832AKJGA831&amp;lt;/string&amp;gt;
                        &amp;lt;key&amp;gt;SystemUUID&amp;lt;/key&amp;gt;
                        &amp;lt;string&amp;gt;0DEE5A61-5BDE-431B-803C-3F8C40BCFE0B&amp;lt;/string&amp;gt;
                        [..CUT..]
    
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;fix-autoboot%3A&quot;&gt;fix autoboot: &lt;a class=&quot;direct-link&quot; href=&quot;#fix-autoboot%3A&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;also set the autoboot, otherwise it will alsways wait foruser input,&lt;br&gt;
in config.plist search Misc -&amp;gt; Boot -&amp;gt; Timeout&lt;br&gt;
and set it to something like &amp;quot;5&amp;quot;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[..CUT..]
        &amp;lt;key&amp;gt;Misc&amp;lt;/key&amp;gt;
        &amp;lt;dict&amp;gt;
                &amp;lt;key&amp;gt;BlessOverride&amp;lt;/key&amp;gt;
                &amp;lt;array/&amp;gt;
                &amp;lt;key&amp;gt;Boot&amp;lt;/key&amp;gt;
                &amp;lt;dict&amp;gt;
                        [..CUT..]
                        &amp;lt;key&amp;gt;Timeout&amp;lt;/key&amp;gt;
                        &amp;lt;integer&amp;gt;5&amp;lt;/integer&amp;gt; 
                        [..CUT..]

&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;remember-to-change-the-mac-address-on-proxmox&quot;&gt;remember to change the mac address on proxmox &lt;a class=&quot;direct-link&quot; href=&quot;#remember-to-change-the-mac-address-on-proxmox&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;in the hardware section change the macaddress in your vm config&lt;/p&gt;
&lt;h2 id=&quot;other-tips%3A&quot;&gt;other tips: &lt;a class=&quot;direct-link&quot; href=&quot;#other-tips%3A&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;also from: &lt;a href=&quot;https://www.nicksherlock.com/2022/10/installing-macos-13-ventura-on-proxmox/&quot;&gt;https://www.nicksherlock.com/2022/10/installing-macos-13-ventura-on-proxmox/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Disabling SIP (System Integrity Protection)&lt;br&gt;
Upgrading OpenCore&lt;/p&gt;
&lt;h1 id=&quot;other&quot;&gt;other &lt;a class=&quot;direct-link&quot; href=&quot;#other&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id=&quot;automatic-booting&quot;&gt;automatic booting &lt;a class=&quot;direct-link&quot; href=&quot;#automatic-booting&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;other than setting a timeout in the config.plist, if you don&#39;t encrypt the disk (that would require you to enter a password to unlock the disk) then the system will be reachable via ssh once booted.&lt;/p&gt;
&lt;h1 id=&quot;what-is-working%3A&quot;&gt;what is working: &lt;a class=&quot;direct-link&quot; href=&quot;#what-is-working%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;icloud login&lt;/li&gt;
&lt;li&gt;imessage&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;sources:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.nicksherlock.com/2022/10/installing-macos-13-ventura-on-proxmox/&quot;&gt;https://www.nicksherlock.com/2022/10/installing-macos-13-ventura-on-proxmox/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=X-_9eKyNxMU&amp;amp;t=795s&quot;&gt;https://www.youtube.com/watch?v=X-_9eKyNxMU&amp;amp;t=795s&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
	</entry>
	
	<entry>
		<title>FakeKitten 2, upload anything on amazon photos, now with encryption</title>
		<link href="https://blog.smemory.org/posts/20231103_01_fakekitten_2_upload_anything_amazon_photos/"/>
		<updated>2023-11-03T00:00:00+00:00</updated>
		<id>https://blog.smemory.org/posts/20231103_01_fakekitten_2_upload_anything_amazon_photos/</id>
		<content type="html">&lt;p&gt;&lt;a href=&quot;https://blog.smemory.org/img/20180105_01_fakekitten_01.jpg&quot;&gt;&lt;img src=&quot;https://blog.smemory.org/img/20180105_01_fakekitten_01.jpg&quot; alt=&quot;description&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;this was the happy cat we were using as deceit image in the previous version,&lt;/p&gt;
&lt;p&gt;now it looks like this:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.smemory.org/img/20231103_01_fakekitten_2_upload_anything_amazon_photos_01.jpeg&quot; alt=&quot;description&quot;&gt;&lt;/p&gt;
&lt;p&gt;the updates:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;[x] now uses random images&lt;/li&gt;
&lt;li&gt;[x] filename is of a raw file (.DNG) so Amazon Photos does not try to fiddle with the image&lt;/li&gt;
&lt;li&gt;[x] added encryption&lt;/li&gt;
&lt;li&gt;[x] checks for prerequisites (convert and gpg)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;you can find the old article here: &lt;a href=&quot;https://blog.smemory.org/posts/20231103_01_fakekitten_2_upload_anything_amazon_photos/20180105_01_fakekitten&quot;&gt;FakeKitten, or how to trick Amazon Prime Photos to store anything&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;let&#39;s see what changed:&lt;/p&gt;
&lt;p&gt;a simple script to upload whatever on Amazon Prime Photos&lt;/p&gt;
&lt;p&gt;¯\&lt;em&gt;(ツ)&lt;/em&gt;/¯&lt;/p&gt;
&lt;h2 id=&quot;why%3A&quot;&gt;why: &lt;a class=&quot;direct-link&quot; href=&quot;#why%3A&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Amazon Prime Photos allows you to upload everything as long as it&#39;s an &lt;a href=&quot;https://www.amazon.com/gp/help/customer/display.html?nodeId=GGU2SU8Y22DZYRMQ&quot;&gt;image&lt;/a&gt;,&lt;br&gt;
giving you unlimited storage (I expect them to do facial recognitioning or other unholy things with your images).&lt;/p&gt;
&lt;p&gt;so we can leverage this dynamic to upload any file to resemble an image,&lt;br&gt;
just by appending the original file at the end of a random image we are generating on the fly.&lt;/p&gt;
&lt;p&gt;the images will be saved as a raw image file, .DNG extension, so the site won&#39;t touch it trying to re-compress the image to save files&lt;/p&gt;
&lt;p&gt;I&#39;ve tried to upload files and managed to get 3.5GB without issues&lt;/p&gt;
&lt;h2 id=&quot;usage%3A&quot;&gt;usage: &lt;a class=&quot;direct-link&quot; href=&quot;#usage%3A&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;encoding%3A&quot;&gt;encoding: &lt;a class=&quot;direct-link&quot; href=&quot;#encoding%3A&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;./FakeKitten.sh yourfile.pdf encode
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;you will obtain a file named:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;FakeKitten_143442_yourfile.pdf_3a1863591abdce897987971928512865db_random.DNG
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;where the file name is composed like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[constant]\_[image blocksize]\_[originale filename]\_[sha1sum of the original file]\_[decoy image filename]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;at this point you can manually upload it on Amazon Prime Photos&lt;/p&gt;
&lt;h3 id=&quot;encoding-and-encrypt-your-file%3A&quot;&gt;encoding and encrypt your file: &lt;a class=&quot;direct-link&quot; href=&quot;#encoding-and-encrypt-your-file%3A&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;use encode_enc:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;./FakeKitten.sh yourfile.pdf encode_enc
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;this will use a symmetric password for the encryption with gpg,&lt;br&gt;
you will be asked for said password with a prompt&lt;/p&gt;
&lt;p&gt;the different thing with the normal encoding is the filename, which will be:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;FakeKitten&lt;strong&gt;ENC&lt;/strong&gt;_143442_yourfile.pdf**.gpg**_3a1863591abdce897987971928512865db_random.DNG&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;decoding%3A&quot;&gt;decoding: &lt;a class=&quot;direct-link&quot; href=&quot;#decoding%3A&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;decoding will automatically take care of differentiating between an encrypted and non-encrypted original file,&lt;br&gt;
if the file was encrypted you will be asked for the password&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;./FakeKitten.sh FakeKitten_143442_yourfile.pdf_3a1863591abdce897987971928512865db_random.DNG decode
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;you will obtain your original file:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;yourfile.pdf
&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id=&quot;the-new-script%3A&quot;&gt;The new script: &lt;a class=&quot;direct-link&quot; href=&quot;#the-new-script%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token shebang important&quot;&gt;#!/usr/bin/env bash&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; -z &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$1&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; -z &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$2&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$2&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;encode&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$2&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;decode&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$2&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;encode_enc&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;br&gt;	&lt;span class=&quot;token keyword&quot;&gt;then&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;launch the script with the desired filename and operation&quot;&lt;/span&gt;&lt;br&gt;	&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;./AmazonPrimeWhatever.sh FILENAME OPERATION(encode or decode)&quot;&lt;/span&gt;&lt;br&gt;	&lt;span class=&quot;token builtin class-name&quot;&gt;exit&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token keyword&quot;&gt;fi&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;# check for prerequisites:&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; -x &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;command&lt;/span&gt; -v convert&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;then&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;Error: convert (part of the imagemagick suite) is not installed.&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token file-descriptor important&quot;&gt;&amp;amp;2&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token builtin class-name&quot;&gt;exit&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token keyword&quot;&gt;fi&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$2&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;encode_enc&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; $1 &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;cut&lt;/span&gt; -d &lt;span class=&quot;token string&quot;&gt;&quot;_&quot;&lt;/span&gt; -f1&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;FakeKittenENC&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;then&lt;/span&gt;&lt;br&gt;	&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; -x &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;command&lt;/span&gt; -v gpg&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;then&lt;/span&gt;&lt;br&gt;	  &lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;Error: gpg is not installed, it is needed for encryption/decryption&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token file-descriptor important&quot;&gt;&amp;amp;2&lt;/span&gt;&lt;br&gt;	  &lt;span class=&quot;token builtin class-name&quot;&gt;exit&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;br&gt;	&lt;span class=&quot;token keyword&quot;&gt;fi&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token keyword&quot;&gt;fi&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$2&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;encode&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$2&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;encode_enc&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;then&lt;/span&gt;&lt;br&gt;        &lt;span class=&quot;token assign-left variable&quot;&gt;imagejpg&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;random.jpg&quot;&lt;/span&gt;&lt;br&gt;        &lt;span class=&quot;token assign-left variable&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;random.DNG&quot;&lt;/span&gt;&lt;br&gt;        &lt;span class=&quot;token comment&quot;&gt;#generate random image:&lt;/span&gt;&lt;br&gt;        &lt;span class=&quot;token assign-left variable&quot;&gt;mx&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;320&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token assign-left variable&quot;&gt;my&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;256&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;head&lt;/span&gt; -c &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$((&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;mx&lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;my&lt;span class=&quot;token variable&quot;&gt;))&lt;/span&gt;&lt;/span&gt;&quot;&lt;/span&gt; /dev/urandom &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; convert -depth &lt;span class=&quot;token number&quot;&gt;8&lt;/span&gt; -size &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;${mx}&lt;/span&gt;x&lt;span class=&quot;token variable&quot;&gt;${my}&lt;/span&gt;&quot;&lt;/span&gt; RGB:- &lt;span class=&quot;token variable&quot;&gt;$imagejpg&lt;/span&gt;&lt;br&gt;        &lt;span class=&quot;token function&quot;&gt;mv&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$imagejpg&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$image&lt;/span&gt;&lt;br&gt;        &lt;span class=&quot;token assign-left variable&quot;&gt;imagesize&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;du&lt;/span&gt; -b $image &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;cut&lt;/span&gt; -f1&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br&gt;	&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$2&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;encode&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;then&lt;/span&gt;&lt;br&gt;	        &lt;span class=&quot;token assign-left variable&quot;&gt;origsha&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;sha1sum $1 &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;cut&lt;/span&gt; -d &lt;span class=&quot;token string&quot;&gt;&quot; &quot;&lt;/span&gt; -f1&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br&gt;	        &lt;span class=&quot;token assign-left variable&quot;&gt;destimage&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;FakeKitten_&quot;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$imagesize&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;_&quot;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$1&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;_&quot;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$origsha&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;_&quot;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$image&lt;/span&gt;&lt;br&gt;	        &lt;span class=&quot;token function&quot;&gt;mv&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$image&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$destimage&lt;/span&gt;&lt;br&gt;	        &lt;span class=&quot;token function&quot;&gt;dd&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$1&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;bs&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;1M &lt;span class=&quot;token operator&quot;&gt;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$destimage&lt;/span&gt;&quot;&lt;/span&gt;&lt;br&gt;	        &lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;encode completed in &lt;span class=&quot;token variable&quot;&gt;$destimage&lt;/span&gt;&quot;&lt;/span&gt;&lt;br&gt;	&lt;span class=&quot;token keyword&quot;&gt;fi&lt;/span&gt;&lt;br&gt;	&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$2&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;encode_enc&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;then&lt;/span&gt;&lt;br&gt;		&lt;span class=&quot;token comment&quot;&gt;#&lt;/span&gt;&lt;br&gt;		gpg --symmetric --cipher-algo AES256 &lt;span class=&quot;token variable&quot;&gt;$1&lt;/span&gt;&lt;br&gt;		&lt;span class=&quot;token comment&quot;&gt;#&lt;/span&gt;&lt;br&gt;	        &lt;span class=&quot;token assign-left variable&quot;&gt;origsha&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;sha1sum $1.gpg &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;cut&lt;/span&gt; -d &lt;span class=&quot;token string&quot;&gt;&quot; &quot;&lt;/span&gt; -f1&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br&gt;	        &lt;span class=&quot;token assign-left variable&quot;&gt;destimage&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;FakeKittenENC_&quot;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$imagesize&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;_&quot;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$1&lt;/span&gt;.gpg&lt;span class=&quot;token string&quot;&gt;&quot;_&quot;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$origsha&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;_&quot;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$image&lt;/span&gt;&lt;br&gt;	        &lt;span class=&quot;token function&quot;&gt;mv&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$image&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$destimage&lt;/span&gt;&lt;br&gt;	        &lt;span class=&quot;token function&quot;&gt;dd&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$1&lt;/span&gt;.gpg &lt;span class=&quot;token assign-left variable&quot;&gt;bs&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;1M &lt;span class=&quot;token operator&quot;&gt;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$destimage&lt;/span&gt;&quot;&lt;/span&gt;&lt;br&gt;	        &lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;encode completed in &lt;span class=&quot;token variable&quot;&gt;$destimage&lt;/span&gt;&quot;&lt;/span&gt;&lt;br&gt;	&lt;span class=&quot;token keyword&quot;&gt;fi&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token keyword&quot;&gt;fi&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$2&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;decode&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;then&lt;/span&gt;&lt;br&gt;	&lt;span class=&quot;token assign-left variable&quot;&gt;imageconst&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; $1 &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;cut&lt;/span&gt; -d &lt;span class=&quot;token string&quot;&gt;&quot;_&quot;&lt;/span&gt; -f1&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br&gt;	&lt;span class=&quot;token assign-left variable&quot;&gt;imagebs&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; $1 &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;cut&lt;/span&gt; -d &lt;span class=&quot;token string&quot;&gt;&quot;_&quot;&lt;/span&gt; -f2&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br&gt;	&lt;span class=&quot;token assign-left variable&quot;&gt;origname&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; $1 &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;cut&lt;/span&gt; -d &lt;span class=&quot;token string&quot;&gt;&quot;_&quot;&lt;/span&gt; -f3&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br&gt;	&lt;span class=&quot;token assign-left variable&quot;&gt;origsha&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; $1 &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;cut&lt;/span&gt; -d &lt;span class=&quot;token string&quot;&gt;&quot;_&quot;&lt;/span&gt; -f4&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br&gt;	&lt;span class=&quot;token assign-left variable&quot;&gt;origimage&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; $1 &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;cut&lt;/span&gt; -d &lt;span class=&quot;token string&quot;&gt;&quot;_&quot;&lt;/span&gt; -f5&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;br&gt;	&lt;span class=&quot;token function&quot;&gt;dd&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$1&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;bs&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;1M &lt;span class=&quot;token assign-left variable&quot;&gt;skip&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$imagebs&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;iflag&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;skip_bytes &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$origname&lt;/span&gt;&quot;&lt;/span&gt;&lt;br&gt;&lt;br&gt;	&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$imageconst&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;FakeKittenENC&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;then&lt;/span&gt;&lt;br&gt;		&lt;span class=&quot;token comment&quot;&gt;#decrypt the file&lt;/span&gt;&lt;br&gt;		&lt;span class=&quot;token assign-left variable&quot;&gt;orignamenogpg&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$origname&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;sed&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;s/.gpg//&#39;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br&gt;		gpg --output &lt;span class=&quot;token variable&quot;&gt;$orignamenogpg&lt;/span&gt; --decrypt &lt;span class=&quot;token variable&quot;&gt;$origname&lt;/span&gt;&lt;br&gt;	&lt;span class=&quot;token keyword&quot;&gt;fi&lt;/span&gt;&lt;br&gt;&lt;br&gt;	&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;decode completed in &lt;span class=&quot;token variable&quot;&gt;$origname&lt;/span&gt;, checking file integrity&quot;&lt;/span&gt;&lt;br&gt;	&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$origsha&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;  &quot;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$origname&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$origname&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;.sha1&quot;&lt;/span&gt;&lt;br&gt;	&lt;span class=&quot;token assign-left variable&quot;&gt;shaoutput&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;sha1sum -c $origname&lt;span class=&quot;token string&quot;&gt;&quot;.sha1&quot;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br&gt;	&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$shaoutput&lt;/span&gt;&lt;br&gt;	&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$shaoutput&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt; *&lt;span class=&quot;token string&quot;&gt;&quot;OK&quot;&lt;/span&gt;* &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;then&lt;/span&gt;&lt;br&gt;		&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;br&gt;		&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;!!! FAILED SHA VERIFICATION!!! EXITING&quot;&lt;/span&gt;&lt;br&gt;		&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;!!! DELETING ALL CREATED FILES !!!&quot;&lt;/span&gt;&lt;br&gt;		&lt;span class=&quot;token function&quot;&gt;rm&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$origname&lt;/span&gt;&lt;br&gt;		&lt;span class=&quot;token function&quot;&gt;rm&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$origname&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;.sha1&quot;&lt;/span&gt;&lt;br&gt;		&lt;span class=&quot;token builtin class-name&quot;&gt;exit&lt;/span&gt;&lt;br&gt;	&lt;span class=&quot;token keyword&quot;&gt;fi&lt;/span&gt;&lt;br&gt;        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$imageconst&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;FakeKittenENC&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;then&lt;/span&gt;&lt;br&gt;		&lt;span class=&quot;token comment&quot;&gt;#remove the file that contains .gpg at the end&lt;/span&gt;&lt;br&gt;                &lt;span class=&quot;token function&quot;&gt;rm&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$origname&lt;/span&gt;&lt;br&gt;        &lt;span class=&quot;token keyword&quot;&gt;fi&lt;/span&gt;&lt;br&gt;	&lt;span class=&quot;token function&quot;&gt;rm&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$origname&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;.sha1&quot;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token keyword&quot;&gt;fi&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;end of my job&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
</content>
	</entry>
	
	<entry>
		<title>pfsense: install correct realtek driver</title>
		<link href="https://blog.smemory.org/posts/20230530_01_pfsense_install_correct_realtek_driver/"/>
		<updated>2023-05-30T00:00:00+00:00</updated>
		<id>https://blog.smemory.org/posts/20230530_01_pfsense_install_correct_realtek_driver/</id>
		<content type="html">&lt;h1 id=&quot;scope%3A&quot;&gt;Scope: &lt;a class=&quot;direct-link&quot; href=&quot;#scope%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I have pfsense installed on a pc with realtek NICs,&lt;br&gt;
pfsense does not include the driver for those NICs,&lt;br&gt;
Realtek NICs are unusable without the correct drivers.&lt;/p&gt;
&lt;h1 id=&quot;captain-hindsight-says%3A&quot;&gt;Captain Hindsight says: &lt;a class=&quot;direct-link&quot; href=&quot;#captain-hindsight-says%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&amp;quot;you should have bought an hardware with Intel NICs&amp;quot;&lt;/p&gt;
&lt;h1 id=&quot;problems-encountered%3A&quot;&gt;Problems encountered: &lt;a class=&quot;direct-link&quot; href=&quot;#problems-encountered%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;My WAN interface disconnected when dealing with moderate/high traffic,&lt;br&gt;
like a speedtest.&lt;/p&gt;
&lt;h1 id=&quot;solution%3A&quot;&gt;Solution: &lt;a class=&quot;direct-link&quot; href=&quot;#solution%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;install the realtek drivers&lt;/p&gt;
&lt;h1 id=&quot;updates-2026-03-13&quot;&gt;UPDATES 2026-03-13 &lt;a class=&quot;direct-link&quot; href=&quot;#updates-2026-03-13&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I&#39;ve upgraded to a newer version and on pfsense 2.7.2 you can install the realtek drivers directly from cli:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pkg search Realtek

realtek-re-kmod-198.00_3       Kernel driver for Realtek PCIe Ethernet Controllers
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;pkg install realtek-re-kmod-198.00_3

Updating pfSense-core repository catalogue...
Fetching meta.conf:   0%
Fetching packagesite.pkg:   0%
pfSense-core repository is up to date.
Updating pfSense repository catalogue...
Fetching meta.conf:   0%
Fetching packagesite.pkg:   0%
pfSense repository is up to date.
All repositories are up to date.
The following 1 package(s) will be affected (of 0 checked):

Installed packages to be UPGRADED:
	realtek-re-kmod: v196.04_3 -&amp;gt; 198.00_3 [pfSense]

Number of packages to be upgraded: 1

102 KiB to be downloaded.

Proceed with this action? [y/N]: y
[1/1] Fetching realtek-re-kmod-198.00_3.pkg: 100%  102 KiB 104.6kB/s    00:01    
Checking integrity... done (0 conflicting)
[1/1] Upgrading realtek-re-kmod from v196.04_3 to 198.00_3...
[1/1] Extracting realtek-re-kmod-198.00_3: 100%
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;then reboot and all goes swimmingly&lt;/p&gt;
&lt;p&gt;source:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.reddit.com/r/PFSENSE/comments/1f3ihl7/installation_guide_for_realtek_driver_install_for/&quot;&gt;https://www.reddit.com/r/PFSENSE/comments/1f3ihl7/installation_guide_for_realtek_driver_install_for/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blueprintcoders.com/download/realtek-driver-upgrade-instructions-for-pfsense-2-7-2/&quot;&gt;https://blueprintcoders.com/download/realtek-driver-upgrade-instructions-for-pfsense-2-7-2/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h1 id=&quot;which-version-am-i-running%3F%3A&quot;&gt;Which version am I running?: &lt;a class=&quot;direct-link&quot; href=&quot;#which-version-am-i-running%3F%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;to understand which version of freebsd you are running look at pfsense homepage under &amp;quot;System Information&amp;quot; --&amp;gt; &amp;quot;Version&amp;quot;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Version	2.6.0-RELEASE (amd64)
built on Mon Jan 31 19:57:53 UTC 2022
FreeBSD 12.3-STABLE
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;we are running &amp;quot;FreeBSD 12.3-STABLE&amp;quot;&lt;/p&gt;
&lt;h1 id=&quot;download-the-correct-realtek-driver%3A&quot;&gt;Download the correct realtek driver: &lt;a class=&quot;direct-link&quot; href=&quot;#download-the-correct-realtek-driver%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;the download link for our version is:&lt;br&gt;
&lt;a href=&quot;http://pkg.freebsd.org/FreeBSD:12:amd64/release_3/All/realtek-re-kmod-v196.04_3.pkg&quot;&gt;http://pkg.freebsd.org/FreeBSD:12:amd64/release_3/All/realtek-re-kmod-v196.04_3.pkg&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;but how to retrieve it?&lt;/p&gt;
&lt;p&gt;look at the link: &amp;quot;FreeBSD:12:amd64/release_3&amp;quot; means 12.3&lt;br&gt;
&amp;quot;release 3&amp;quot; is our &amp;quot;3&amp;quot;&lt;/p&gt;
&lt;p&gt;you can find the correct package version in the correct release repo following this:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;go in the main package download repo: &lt;a href=&quot;https://pkg.freebsd.org/&quot;&gt;https://pkg.freebsd.org&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;select your arch/version: FreeBSD:12:amd64&lt;br&gt;
(full link: &lt;a href=&quot;https://pkg.freebsd.org/FreeBSD:12:amd64/&quot;&gt;https://pkg.freebsd.org/FreeBSD:12:amd64/&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;select your specific release: release_3&lt;br&gt;
(full link: &lt;a href=&quot;https://pkg.freebsd.org/FreeBSD:12:amd64/release_3/&quot;&gt;https://pkg.freebsd.org/FreeBSD:12:amd64/release_3/&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;since we cannot freely browse /All path, you&#39;ll need to download the packagesite.txz and look in the packagesite.yaml for our realtek package by searching &amp;quot;realtek&amp;quot;,&lt;br&gt;
or you can use this oneliner:&lt;br&gt;
&lt;code&gt;wget -q -O - https://pkg.freebsd.org/FreeBSD:12:amd64/release_3/packagesite.txz | tar --to-stdout -Jxf - packagesite.yaml | grep realtek | yq -r &#39;.path&#39;&lt;/code&gt;&lt;br&gt;
that will output the package path, relative to your position:&lt;br&gt;
&amp;quot;All/realtek-re-kmod-v196.04_3.pkg&amp;quot;&lt;/li&gt;
&lt;li&gt;at this point you can combine the two paths:&lt;br&gt;
&amp;quot;&lt;a href=&quot;https://pkg.freebsd.org/FreeBSD:12:amd64/release_3/&quot;&gt;https://pkg.freebsd.org/FreeBSD:12:amd64/release_3/&lt;/a&gt;&amp;quot; + &amp;quot;All/realtek-re-kmod-v196.04_3.pkg&amp;quot;&lt;/li&gt;
&lt;li&gt;finally the complete path: &lt;a href=&quot;https://pkg.freebsd.org/FreeBSD:12:amd64/release_3/All/realtek-re-kmod-v196.04_3.pkg&quot;&gt;https://pkg.freebsd.org/FreeBSD:12:amd64/release_3/All/realtek-re-kmod-v196.04_3.pkg&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h1 id=&quot;install-the-driver%3A&quot;&gt;Install the driver: &lt;a class=&quot;direct-link&quot; href=&quot;#install-the-driver%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;install the package:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;fetch -v http://pkg.freebsd.org/FreeBSD:12:amd64/release_3/All/realtek-re-kmod-v196.04_3.pkg&lt;br&gt;pkg &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; realtek-re-kmod-198.00_1.pkg&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;add the correct lines to load the module on boot,&lt;br&gt;
I&#39;ve added them to /boot/loader.conf but I&#39;ve ween suggestions to add the lines to /boot/loader.conf.local&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;if_re_load=&amp;quot;YES&amp;quot;
if_re_name=&amp;quot;/boot/modules/if_re.ko&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;and then reboot to be safe,&lt;br&gt;
or manually load the module (see Bonus --&amp;gt; Manually load modules) /boot/modules/if_re.ko&lt;/p&gt;
&lt;h1 id=&quot;pfsense-advanced-config%3A&quot;&gt;Pfsense advanced config: &lt;a class=&quot;direct-link&quot; href=&quot;#pfsense-advanced-config%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;in the past I had problems with Hardware Checksum Offload, so I&#39;ve disabled it:&lt;/p&gt;
&lt;p&gt;in PFsense go to: System/Advanced/Networking&lt;/p&gt;
&lt;p&gt;and then check &amp;quot;Disable hardware checksum offload&amp;quot;&lt;/p&gt;
&lt;p&gt;then reboot&lt;/p&gt;
&lt;p&gt;after doing this my system was stable&lt;/p&gt;
&lt;h1 id=&quot;bonus%3A&quot;&gt;Bonus: &lt;a class=&quot;direct-link&quot; href=&quot;#bonus%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id=&quot;check-loaded-modules%3A&quot;&gt;Check loaded modules: &lt;a class=&quot;direct-link&quot; href=&quot;#check-loaded-modules%3A&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;kldstat&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;and you have to see &amp;quot;if_re.ko&amp;quot;:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;Id Refs Address                Size Name&lt;br&gt; &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;    &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; 0xffffffffxxxxxxxx   xxxxxx if_re.ko&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;manually-load-modules%3A&quot;&gt;Manually load modules: &lt;a class=&quot;direct-link&quot; href=&quot;#manually-load-modules%3A&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;kldload module_name.ko&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;list-installed-packages%3A&quot;&gt;List installed packages: &lt;a class=&quot;direct-link&quot; href=&quot;#list-installed-packages%3A&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;pkg info&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;remove-package%3A&quot;&gt;Remove package: &lt;a class=&quot;direct-link&quot; href=&quot;#remove-package%3A&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;pkg remove package_name_version&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id=&quot;sources%3A&quot;&gt;sources: &lt;a class=&quot;direct-link&quot; href=&quot;#sources%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.reddit.com/r/PFSENSE/comments/t872mx/fix_issues_with_realtek_nic_on_pfsense_260/&quot;&gt;https://www.reddit.com/r/PFSENSE/comments/t872mx/fix_issues_with_realtek_nic_on_pfsense_260/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
	</entry>
	
	<entry>
		<title>convert cbz file to epub</title>
		<link href="https://blog.smemory.org/posts/20230426_01_convert_cbz_to_epub/"/>
		<updated>2023-04-26T00:00:00+00:00</updated>
		<id>https://blog.smemory.org/posts/20230426_01_convert_cbz_to_epub/</id>
		<content type="html">&lt;h1 id=&quot;what-is-a-cbz%2Fcbr-file%3A&quot;&gt;what is a cbz/cbr file: &lt;a class=&quot;direct-link&quot; href=&quot;#what-is-a-cbz%2Fcbr-file%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;a .cbz file is a compressed archive with files inside&lt;/p&gt;
&lt;p&gt;cbz are Comic Book Zip files&lt;br&gt;
cbz are Comic Book Rar files&lt;/p&gt;
&lt;p&gt;They usually contain a folder and the filenames of the pages:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;comic_title.cbz&lt;br&gt;&lt;br&gt;comic_title&lt;br&gt;&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;-- page1.jpg&lt;br&gt;&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;-- page2.jpg&lt;br&gt;&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;-- page3.jpg&lt;br&gt;&#39;-- page4.jpg&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id=&quot;cbz-to-epub-conversion%3A&quot;&gt;cbz to epub conversion: &lt;a class=&quot;direct-link&quot; href=&quot;#cbz-to-epub-conversion%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id=&quot;conversion%3A&quot;&gt;conversion: &lt;a class=&quot;direct-link&quot; href=&quot;#conversion%3A&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;to convert a cbz to epub (for max compatibility) I&#39;ve triedto use Calibre but the results were underwhelming,&lt;br&gt;
using cbr_to_epub (&lt;a href=&quot;https://github.com/rafalcymerys/cbr_to_epub&quot;&gt;https://github.com/rafalcymerys/cbr_to_epub&lt;/a&gt;) is way better:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;cbr_to_epub -i &lt;span class=&quot;token string&quot;&gt;&quot;comic_title.cbz&quot;&lt;/span&gt; --tile &lt;span class=&quot;token string&quot;&gt;&quot;Comic Title&quot;&lt;/span&gt; --author &lt;span class=&quot;token string&quot;&gt;&quot;The Author&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;cleanup%3A&quot;&gt;cleanup: &lt;a class=&quot;direct-link&quot; href=&quot;#cleanup%3A&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;then you will have 2 files:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;comic_title.cbz&lt;br&gt;comic_title.cbz.epub&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;then you can bulk rename the converted files:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;find&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;.&lt;/span&gt; -name &lt;span class=&quot;token string&quot;&gt;&quot;*.epub&quot;&lt;/span&gt; -execdir &lt;span class=&quot;token function&quot;&gt;rename&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;s/.cbz//g&#39;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;{}&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;title%3A&quot;&gt;title: &lt;a class=&quot;direct-link&quot; href=&quot;#title%3A&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The title of the epub is in the metadata and is what the programs reading your epub will cosider for the title.&lt;/p&gt;
&lt;p&gt;My filename was something like this: &amp;quot;ComicName IssueNumber ComicTitle.cbz&amp;quot;&lt;/p&gt;
&lt;p&gt;so I wanted the filename without the extension to be the title of my epub.&lt;/p&gt;
&lt;h2 id=&quot;script%3A&quot;&gt;script: &lt;a class=&quot;direct-link&quot; href=&quot;#script%3A&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I am using a script to do that, recursively, in your folder:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token shebang important&quot;&gt;#!/usr/bin/env bash&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token assign-left variable&quot;&gt;author&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Your Author&quot;&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token for-or-select variable&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; *.cbz&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;do&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token assign-left variable&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; $i &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;cut&lt;/span&gt; -d &lt;span class=&quot;token string&quot;&gt;&quot;.&quot;&lt;/span&gt; -f &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br&gt;    cbr_to_epub -i &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$i&lt;/span&gt;&quot;&lt;/span&gt; --title &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$title&lt;/span&gt;&quot;&lt;/span&gt; --author &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$author&lt;/span&gt;&quot;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token keyword&quot;&gt;done&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token function&quot;&gt;find&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;.&lt;/span&gt; -name &lt;span class=&quot;token string&quot;&gt;&quot;*.epub&quot;&lt;/span&gt; -execdir &lt;span class=&quot;token function&quot;&gt;rename&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;s/.cbz//g&#39;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;{}&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token for-or-select variable&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; *.cbr&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;do&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token assign-left variable&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; $i &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;cut&lt;/span&gt; -d &lt;span class=&quot;token string&quot;&gt;&quot;.&quot;&lt;/span&gt; -f &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br&gt;    cbr_to_epub -i &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$i&lt;/span&gt;&quot;&lt;/span&gt; --title &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$title&lt;/span&gt;&quot;&lt;/span&gt; --author &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$author&lt;/span&gt;&quot;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token keyword&quot;&gt;done&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token function&quot;&gt;find&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;.&lt;/span&gt; -name &lt;span class=&quot;token string&quot;&gt;&quot;*.epub&quot;&lt;/span&gt; -execdir &lt;span class=&quot;token function&quot;&gt;rename&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;s/.cbr//g&#39;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;{}&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;#using: https://github.com/rafalcymerys/cbr_to_epub&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;NB: the script won&#39;t take into account some cases, for example when a cbz file is not using zip or when we have errors due to filenames inside the archives&lt;br&gt;
it was too much effort to also consider these cases in the script&lt;/p&gt;
&lt;h2 id=&quot;issues%3A&quot;&gt;issues: &lt;a class=&quot;direct-link&quot; href=&quot;#issues%3A&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;since a .cbz file is a collection of jpgs in a folder,&lt;br&gt;
and the epub will be built following the filename order,&lt;br&gt;
if we have a broken order, for example:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;-- Comic_Book&lt;br&gt;&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;   &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;-- 000.jpg&lt;br&gt;&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;   &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;-- &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;-Title_One-&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;.jpg&lt;br&gt;&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;   &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;-- &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;-Title_One-&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;.jpg&lt;br&gt;&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;   &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;-- &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;-Title_One-&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;.jpg&lt;br&gt;&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;   &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;-- &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;-Title_One-&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;11&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;.jpg&lt;br&gt;&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;   &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;-- &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;-Title_One-&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;12&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;.jpg&lt;br&gt;&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;   &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;-- &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;-Title_One-&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;.jpg&lt;br&gt;&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;   &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;-- &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;-Title_One-&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;21&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;.jpg&lt;br&gt;&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;   &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;-- &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;-Title_One-&lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;jpg&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;the file order will be followed even if it&#39;s clearly wrong,&lt;br&gt;
in thi case the pages will be mixed up.&lt;/p&gt;
&lt;p&gt;000.jpg is the cover.&lt;/p&gt;
&lt;p&gt;For this case I&#39;ve created a script that will fix my issue with filenames,&lt;br&gt;
it will work only on .cbz files since my issue was only on those:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token shebang important&quot;&gt;#!/usr/bin/env bash&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;# 0: WARNING&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;#&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;read&lt;/span&gt; -p &lt;span class=&quot;token string&quot;&gt;&quot;This process is destructive, I will remove your .cbz files, are you sure you want to continue, do you have a backup? &quot;&lt;/span&gt; -n &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; -r&lt;br&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt;   &lt;span class=&quot;token comment&quot;&gt;# (optional) move to a new line&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token environment constant&quot;&gt;$REPLY&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;~ ^&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;Yy&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;$ &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token keyword&quot;&gt;then&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;OK, going on..&quot;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Exiting&quot;&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token builtin class-name&quot;&gt;exit&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token keyword&quot;&gt;fi&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;# 1: decompress everything&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;#&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token for-or-select variable&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; *.cbz&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;do&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token assign-left variable&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; $i &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;cut&lt;/span&gt; -d &lt;span class=&quot;token string&quot;&gt;&quot;.&quot;&lt;/span&gt; -f &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token function&quot;&gt;unzip&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$i&lt;/span&gt;&quot;&lt;/span&gt; -d &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$title&lt;/span&gt;&quot;&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token function&quot;&gt;rm&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$i&lt;/span&gt;&quot;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token keyword&quot;&gt;done&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;# 2: fix filenames&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;#&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token function&quot;&gt;find&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;.&lt;/span&gt; -type f -name &lt;span class=&quot;token string&quot;&gt;&quot;*\(0\)*&quot;&lt;/span&gt; -execdir &lt;span class=&quot;token function&quot;&gt;rename&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;s/\(0\)/\(00\)/g&#39;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;{}&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token function&quot;&gt;find&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;.&lt;/span&gt; -type f -name &lt;span class=&quot;token string&quot;&gt;&quot;*\(1\)*&quot;&lt;/span&gt; -execdir &lt;span class=&quot;token function&quot;&gt;rename&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;s/\(1\)/\(01\)/g&#39;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;{}&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token function&quot;&gt;find&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;.&lt;/span&gt; -type f -name &lt;span class=&quot;token string&quot;&gt;&quot;*\(2\)*&quot;&lt;/span&gt; -execdir &lt;span class=&quot;token function&quot;&gt;rename&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;s/\(2\)/\(02\)/g&#39;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;{}&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token function&quot;&gt;find&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;.&lt;/span&gt; -type f -name &lt;span class=&quot;token string&quot;&gt;&quot;*\(3\)*&quot;&lt;/span&gt; -execdir &lt;span class=&quot;token function&quot;&gt;rename&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;s/\(3\)/\(03\)/g&#39;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;{}&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token function&quot;&gt;find&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;.&lt;/span&gt; -type f -name &lt;span class=&quot;token string&quot;&gt;&quot;*\(4\)*&quot;&lt;/span&gt; -execdir &lt;span class=&quot;token function&quot;&gt;rename&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;s/\(4\)/\(04\)/g&#39;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;{}&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token function&quot;&gt;find&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;.&lt;/span&gt; -type f -name &lt;span class=&quot;token string&quot;&gt;&quot;*\(5\)*&quot;&lt;/span&gt; -execdir &lt;span class=&quot;token function&quot;&gt;rename&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;s/\(5\)/\(05\)/g&#39;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;{}&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token function&quot;&gt;find&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;.&lt;/span&gt; -type f -name &lt;span class=&quot;token string&quot;&gt;&quot;*\(6\)*&quot;&lt;/span&gt; -execdir &lt;span class=&quot;token function&quot;&gt;rename&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;s/\(6\)/\(06\)/g&#39;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;{}&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token function&quot;&gt;find&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;.&lt;/span&gt; -type f -name &lt;span class=&quot;token string&quot;&gt;&quot;*\(7\)*&quot;&lt;/span&gt; -execdir &lt;span class=&quot;token function&quot;&gt;rename&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;s/\(7\)/\(07\)/g&#39;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;{}&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token function&quot;&gt;find&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;.&lt;/span&gt; -type f -name &lt;span class=&quot;token string&quot;&gt;&quot;*\(8\)*&quot;&lt;/span&gt; -execdir &lt;span class=&quot;token function&quot;&gt;rename&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;s/\(8\)/\(08\)/g&#39;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;{}&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token function&quot;&gt;find&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;.&lt;/span&gt; -type f -name &lt;span class=&quot;token string&quot;&gt;&quot;*\(9\)*&quot;&lt;/span&gt; -execdir &lt;span class=&quot;token function&quot;&gt;rename&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;s/\(9\)/\(09\)/g&#39;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;{}&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;# 3: recompress the folders and delete them&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;#&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token function&quot;&gt;find&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;.&lt;/span&gt; -type d -depth &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; ./dir_list.txt&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token function&quot;&gt;cat&lt;/span&gt; ./dir_list.txt&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token keyword&quot;&gt;while&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;&lt;span class=&quot;token environment constant&quot;&gt;IFS&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;read&lt;/span&gt; -r line&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;do&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;# Whitespace-safe EXCEPT newlines&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token function&quot;&gt;zip&lt;/span&gt; -r &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$line&lt;/span&gt;.cbz&quot;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$line&lt;/span&gt;&quot;&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token function&quot;&gt;rm&lt;/span&gt; -rf &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$line&lt;/span&gt;&quot;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token keyword&quot;&gt;done&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; ./dir_list.txt&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token function&quot;&gt;rm&lt;/span&gt; ./dir_list.txt&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;# 4: convert to epub and fix filename&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;#&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token assign-left variable&quot;&gt;author&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Your Author&quot;&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token for-or-select variable&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; *.cbz&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;do&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token assign-left variable&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; $i &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;cut&lt;/span&gt; -d &lt;span class=&quot;token string&quot;&gt;&quot;.&quot;&lt;/span&gt; -f &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br&gt;    cbr_to_epub -i &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$i&lt;/span&gt;&quot;&lt;/span&gt; --title &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$title&lt;/span&gt;&quot;&lt;/span&gt; --author &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$author&lt;/span&gt;&quot;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token keyword&quot;&gt;done&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token function&quot;&gt;find&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;.&lt;/span&gt; -name &lt;span class=&quot;token string&quot;&gt;&quot;*.epub&quot;&lt;/span&gt; -execdir &lt;span class=&quot;token function&quot;&gt;rename&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;s/.cbz//g&#39;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;{}&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id=&quot;problematic-cases%3A&quot;&gt;problematic cases: &lt;a class=&quot;direct-link&quot; href=&quot;#problematic-cases%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id=&quot;case-1%3A-broken-chars-in-the-archives&quot;&gt;case 1: broken chars in the archives &lt;a class=&quot;direct-link&quot; href=&quot;#case-1%3A-broken-chars-in-the-archives&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;our cbz file has non utf8 chars inside the archive&lt;/p&gt;
&lt;p&gt;decompress fip file&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;unzip&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;comic_title.cbz&quot;&lt;/span&gt; -d &lt;span class=&quot;token string&quot;&gt;&quot;comic_title&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;if you are on macOS and have decompress errors due to illegal chars in the filename, es:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;checkdir error:  cannot create comic_title
                 Illegal byte sequence
                 unable to process comic_title/page1_text??_text.jpg
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;use ditto to manage filename format errors:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;ditto -V -x -k --sequesterRsrc --rsrc &lt;span class=&quot;token string&quot;&gt;&quot;comic_title.cbz&quot;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;comic_title&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;then go into the folder and sanitize the filenames with detox:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;detox -r -v &lt;span class=&quot;token builtin class-name&quot;&gt;.&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;at this point you can re-create your cbz from the fixed folder:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;zip&lt;/span&gt; -r &lt;span class=&quot;token string&quot;&gt;&quot;comic_title.cbz&quot;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;comic_title&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;case-2%3A-cbz-is-not-in-zip-format&quot;&gt;case 2: cbz is not in zip format &lt;a class=&quot;direct-link&quot; href=&quot;#case-2%3A-cbz-is-not-in-zip-format&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;.rar files are not compatible with cbr_to_epub:&lt;/p&gt;
&lt;p&gt;decompress your rar archive:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;unrar&lt;/span&gt; x &lt;span class=&quot;token string&quot;&gt;&quot;comic_title.cbz&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;then just recreate the cbz file using zip:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;zip&lt;/span&gt; -r &lt;span class=&quot;token string&quot;&gt;&quot;comic_title.cbz&quot;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;comic_title&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
</content>
	</entry>
	
	<entry>
		<title>(sorta) monitoring two related systemd services</title>
		<link href="https://blog.smemory.org/posts/20230211_01_monitor_two_related_systemd_services/"/>
		<updated>2023-02-11T00:00:00+00:00</updated>
		<id>https://blog.smemory.org/posts/20230211_01_monitor_two_related_systemd_services/</id>
		<content type="html">&lt;p&gt;update: systemd supports this feature&lt;br&gt;
see: &lt;a href=&quot;https://stackoverflow.com/questions/47253020/systemd-stop-dependent-service-when-main-service-crashes&quot;&gt;https://stackoverflow.com/questions/47253020/systemd-stop-dependent-service-when-main-service-crashes&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&quot;scope%3A&quot;&gt;Scope: &lt;a class=&quot;direct-link&quot; href=&quot;#scope%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I need to stop service2 when service1 is down.&lt;/p&gt;
&lt;h1 id=&quot;why%3A&quot;&gt;Why: &lt;a class=&quot;direct-link&quot; href=&quot;#why%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;For example in &amp;quot;DIY balancer using DNS&amp;quot; I want to kill bind/named when haproxy is dead so I won&#39;t receive any connection that would not be served by haproxy.&lt;/p&gt;
&lt;h1 id=&quot;script%3A&quot;&gt;Script: &lt;a class=&quot;direct-link&quot; href=&quot;#script%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;the script is executed every n minutes by cron,&lt;br&gt;
it checks service1, if it&#39;s dead it checks the status of service2 and if needed it kills service2&lt;/p&gt;
&lt;p&gt;it also works in the reverse flow:&lt;br&gt;
when service1 is up it checks that service2 is up and running, if not it starts service2&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token shebang important&quot;&gt;#!/usr/bin/env bash&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token assign-left variable&quot;&gt;service1&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;haproxy.service&quot;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token assign-left variable&quot;&gt;service2&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;bind.service&quot;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token assign-left variable&quot;&gt;logfile&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;services_monitor.log&quot;&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;#check if service1 is running:&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; systemctl is-active --quiet &lt;span class=&quot;token variable&quot;&gt;$service1&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;then&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;date&lt;/span&gt; +&lt;span class=&quot;token string&quot;&gt;&quot;%Y-%m-%d_%H:%M:%S&quot;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt; -  &lt;span class=&quot;token variable&quot;&gt;$service1&lt;/span&gt; UP, which is good&quot;&lt;/span&gt;&lt;br&gt;&lt;br&gt;    &lt;span class=&quot;token comment&quot;&gt;#check if service2 is running, if not, let&#39;s start it:&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; systemctl is-active --quiet &lt;span class=&quot;token variable&quot;&gt;$service2&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;then&lt;/span&gt;&lt;br&gt;      &lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;date&lt;/span&gt; +&lt;span class=&quot;token string&quot;&gt;&quot;%Y-%m-%d_%H:%M:%S&quot;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt; - &lt;span class=&quot;token variable&quot;&gt;$service2&lt;/span&gt; UP, all is good&quot;&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt;&lt;br&gt;      &lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;date&lt;/span&gt; +&lt;span class=&quot;token string&quot;&gt;&quot;%Y-%m-%d_%H:%M:%S&quot;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt; - &lt;span class=&quot;token variable&quot;&gt;$service1&lt;/span&gt; is UP but &lt;span class=&quot;token variable&quot;&gt;$service2&lt;/span&gt; is DOWN, let&#39;s start &lt;span class=&quot;token variable&quot;&gt;$service2&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;tee&lt;/span&gt; -a &lt;span class=&quot;token variable&quot;&gt;$logfile&lt;/span&gt;&lt;br&gt;      systemctl start &lt;span class=&quot;token variable&quot;&gt;$service2&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token keyword&quot;&gt;fi&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;date&lt;/span&gt; +&lt;span class=&quot;token string&quot;&gt;&quot;%Y-%m-%d_%H:%M:%S&quot;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt; - &lt;span class=&quot;token variable&quot;&gt;$service1&lt;/span&gt; DOWN, which is bad&quot;&lt;/span&gt;&lt;br&gt;&lt;br&gt;    &lt;span class=&quot;token comment&quot;&gt;#check if service2 is running, if it is, let&#39;s stop it:&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; systemctl is-active --quiet &lt;span class=&quot;token variable&quot;&gt;$service2&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;then&lt;/span&gt;&lt;br&gt;      &lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;date&lt;/span&gt; +&lt;span class=&quot;token string&quot;&gt;&quot;%Y-%m-%d_%H:%M:%S&quot;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt; - &lt;span class=&quot;token variable&quot;&gt;$service1&lt;/span&gt; is DOWN but &lt;span class=&quot;token variable&quot;&gt;$service2&lt;/span&gt; UP, let&#39;s stop &lt;span class=&quot;token variable&quot;&gt;$service2&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;tee&lt;/span&gt; -a &lt;span class=&quot;token variable&quot;&gt;$logfile&lt;/span&gt;&lt;br&gt;      systemctl stop &lt;span class=&quot;token variable&quot;&gt;$service2&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt;&lt;br&gt;      &lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;date&lt;/span&gt; +&lt;span class=&quot;token string&quot;&gt;&quot;%Y-%m-%d_%H:%M:%S&quot;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt; - &lt;span class=&quot;token variable&quot;&gt;$service2&lt;/span&gt; is DOWN, all is good&quot;&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token keyword&quot;&gt;fi&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token keyword&quot;&gt;fi&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
</content>
	</entry>
	
	<entry>
		<title>Flashing an LSI SAS controller in 2022, AKA &quot;IT-mode&quot; and UEFI</title>
		<link href="https://blog.smemory.org/posts/20221016_01_flash-sas-controller-in-2022/"/>
		<updated>2022-10-16T00:00:00+00:00</updated>
		<id>https://blog.smemory.org/posts/20221016_01_flash-sas-controller-in-2022/</id>
		<content type="html">&lt;h1 id=&quot;scope%3A&quot;&gt;Scope: &lt;a class=&quot;direct-link&quot; href=&quot;#scope%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I have a controller, LSI SAS9217-4i4e, wit IR firmware and want to switch it to IT firmware.&lt;/p&gt;
&lt;h1 id=&quot;why%3A&quot;&gt;Why: &lt;a class=&quot;direct-link&quot; href=&quot;#why%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;For these SAS controllers there are 2 operating modes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;IR: raid features, your machine won&#39;t see the disk directly but will see the raid volumes from the raid controller&lt;/li&gt;
&lt;li&gt;IT: passtrough or pure-HBA mode, you machine will see the disks directly and you&#39;ll be able to manage them&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I want the IT mode because I have some SAS disks I need to format and I can&#39;t do it as I like in IR mode.&lt;/p&gt;
&lt;h1 id=&quot;ok%2C-but-i-meant-%22why-you-need-a-sas-controller%22%3A&quot;&gt;Ok, but I meant &amp;quot;why you need a SAS controller&amp;quot;: &lt;a class=&quot;direct-link&quot; href=&quot;#ok%2C-but-i-meant-%22why-you-need-a-sas-controller%22%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Well it&#39;s not obvious?&lt;br&gt;
In case it isn&#39;t, I have some drives lying around and wanted to wipe them.&lt;br&gt;
Also I should be able to play around with some SAS drive enclosure (a box that contains many SAS drives and exits with one or more sas cables).&lt;/p&gt;
&lt;h1 id=&quot;steps%3A&quot;&gt;Steps: &lt;a class=&quot;direct-link&quot; href=&quot;#steps%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;Download the files from broadcom site:
&lt;ul&gt;
&lt;li&gt;from here: &lt;a href=&quot;https://www.broadcom.com/site-search?q=SAS9217-4i4e&quot;&gt;https://www.broadcom.com/site-search?q=SAS9217-4i4e&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;download: 9217_4i4e_Package_P20_IR_IT_FW_BIOS_for_MSDOS_Windows.zip&lt;/li&gt;
&lt;li&gt;download: Installer_P20_for_UEFI.zip&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;With Rufus (on Windows, yes I know..) create a USB key
&lt;ul&gt;
&lt;li&gt;not bootable since we are using UEFI&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Create the usb key:
&lt;ul&gt;
&lt;li&gt;download the EFI Shell from: &lt;a href=&quot;https://github.com/tianocore/edk/raw/master/Other/Maintained/Application/UefiShell/bin/x64/Shell_Full.efi&quot;&gt;https://github.com/tianocore/edk/raw/master/Other/Maintained/Application/UefiShell/bin/x64/Shell_Full.efi&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;add it to your usb key in the root renamed shell.efi&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Copy the SAS controller files, from the archies fcopy these files to the root of your usb drive::
&lt;ul&gt;
&lt;li&gt;from Installer_P20_for_UEFI.zip copy:
&lt;ul&gt;
&lt;li&gt;/Installer_P20_for_UEFI/sas2flash_efi_ebc_rel/sas2flash.efi (the flash utility)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;from 9217_4i4e_Package_P20_IR_IT_FW_BIOS_for_MSDOS_Windows.zip copy:
&lt;ul&gt;
&lt;li&gt;/9217_4i4e_Package_P20_IR_IT_FW_BIOS_for_MSDOS_Windows/sasbios_rel/mptsas2.rom (the controller bios)&lt;/li&gt;
&lt;li&gt;/9217_4i4e_Package_P20_IR_IT_FW_BIOS_for_MSDOS_Windows/Firmware/HBA_9207_4i4e_IT/9207-4i4e.bin (the controller firmware)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;The final folder structure should be like this:
&lt;ul&gt;
&lt;li&gt;
&lt;pre&gt;&lt;code&gt;.
├── 9207-4i4e.bin
├── autorun.ico
├── autorun.inf
├── mptsas2.rom
├── sas2flash.efi
├── shell.efi
└── System Volume Information
    └── WPSettings.dat
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Prepare the PC:
&lt;ul&gt;
&lt;li&gt;disconnect as many disks/peripherals you can from your pc leaving just the controller if possible&lt;/li&gt;
&lt;li&gt;connect your usb drive&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Start the EFI shell (tested on my Asus motherboard):
&lt;ul&gt;
&lt;li&gt;boot your pc&lt;/li&gt;
&lt;li&gt;go in the BIOS pressing F2 at boot&lt;/li&gt;
&lt;li&gt;in the last page select &amp;quot;Open EFI shell from USB drive&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;in the EFI shell:
&lt;ul&gt;
&lt;li&gt;execute &amp;quot;map&amp;quot; to see the drivesm they will be &amp;quot;fs0, fs1 etc..&amp;quot;&lt;/li&gt;
&lt;li&gt;identify your correct disk (for example there is written &amp;quot;USB&amp;quot; in the description)&lt;/li&gt;
&lt;li&gt;mount the drive: &amp;quot;mount fs1&amp;quot;&lt;/li&gt;
&lt;li&gt;change folder &amp;quot;fs1:&amp;quot;&lt;/li&gt;
&lt;li&gt;list folder content: &amp;quot;dir&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Flash the controller:
&lt;ul&gt;
&lt;li&gt;execute &amp;quot;sas2flash.efi -listall&amp;quot; to list the controller&lt;/li&gt;
&lt;li&gt;execute &amp;quot;sas2flash.efi -o -e 6&amp;quot; to clear the controller bios&lt;/li&gt;
&lt;li&gt;execute &amp;quot;sas2flash.efi -o -f 9207-4i4e.bin -b mptsas2.rom&amp;quot; to flash the new firmware and bios on the controller&lt;/li&gt;
&lt;li&gt;execute &amp;quot;sas2flash.efi -listall&amp;quot; to list the controller&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Check your work:
&lt;ul&gt;
&lt;li&gt;reboot the computer&lt;/li&gt;
&lt;li&gt;enter in the controller bios (when prompted press &amp;quot;CTRL+C&amp;quot;&lt;/li&gt;
&lt;li&gt;select the controller and you&#39;ll see that it&#39;s now in IT mode&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Congrats!&lt;/li&gt;
&lt;/ol&gt;
&lt;h1 id=&quot;sources%3A&quot;&gt;Sources: &lt;a class=&quot;direct-link&quot; href=&quot;#sources%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://digitalcardboard.com/blog/2014/07/09/flashing-it-firmware-to-the-lsi-sas-9211-8i-hba-2014-efi-recipe/&quot;&gt;https://digitalcardboard.com/blog/2014/07/09/flashing-it-firmware-to-the-lsi-sas-9211-8i-hba-2014-efi-recipe/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.truenas.com/community/threads/sas2flash-easier-alternative.30789/page-2&quot;&gt;https://www.truenas.com/community/threads/sas2flash-easier-alternative.30789/page-2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://forums.servethehome.com/index.php?threads/help-with-hp-9207-4i4e-needed-firmware-update-problem-lsi-sas2308.34666/&quot;&gt;https://forums.servethehome.com/index.php?threads/help-with-hp-9207-4i4e-needed-firmware-update-problem-lsi-sas2308.34666/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.truenas.com/community/threads/sas2flash-easier-alternative.30789/#post-199640&quot;&gt;https://www.truenas.com/community/threads/sas2flash-easier-alternative.30789/#post-199640&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://serverfault.com/questions/679175/failed-to-initialize-pal-while-upgrading-an-lsi-9211-8i-to-it&quot;&gt;https://serverfault.com/questions/679175/failed-to-initialize-pal-while-upgrading-an-lsi-9211-8i-to-it&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
</content>
	</entry>
	
	<entry>
		<title>docker-compose systemd unit file</title>
		<link href="https://blog.smemory.org/posts/20220809_01_docker-compose_systemd_unit/"/>
		<updated>2022-08-09T00:00:00+00:00</updated>
		<id>https://blog.smemory.org/posts/20220809_01_docker-compose_systemd_unit/</id>
		<content type="html">&lt;h1 id=&quot;scope%3A&quot;&gt;Scope: &lt;a class=&quot;direct-link&quot; href=&quot;#scope%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;creating a systemd unit file for a docker-compose service&lt;/p&gt;
&lt;h1 id=&quot;unit-file%3A&quot;&gt;Unit file: &lt;a class=&quot;direct-link&quot; href=&quot;#unit-file%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;edit /etc/systemd/system/something.service&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token assign-left variable&quot;&gt;Description&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;Docker Compose &lt;span class=&quot;token function&quot;&gt;service&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token assign-left variable&quot;&gt;Requires&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;docker.service&lt;br&gt;&lt;span class=&quot;token assign-left variable&quot;&gt;After&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;docker.service&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;Service&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token assign-left variable&quot;&gt;Type&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;oneshot&lt;br&gt;&lt;span class=&quot;token assign-left variable&quot;&gt;RemainAfterExit&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;yes&lt;br&gt;&lt;span class=&quot;token assign-left variable&quot;&gt;WorkingDirectory&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;/data/docker-compose/service&lt;br&gt;&lt;span class=&quot;token assign-left variable&quot;&gt;ExecStart&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;/usr/local/bin/docker-compose up -d&lt;br&gt;&lt;span class=&quot;token assign-left variable&quot;&gt;ExecStop&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;/usr/local/bin/docker-compose down&lt;br&gt;&lt;span class=&quot;token assign-left variable&quot;&gt;TimeoutStartSec&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;Install&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token assign-left variable&quot;&gt;WantedBy&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;multi-user.target&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;then start and enable the unit on boot:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;systemctl &lt;span class=&quot;token builtin class-name&quot;&gt;enable&lt;/span&gt; --now something.service&lt;/code&gt;&lt;/pre&gt;
</content>
	</entry>
	
	<entry>
		<title>SSO with lldap, Authelia and Nginx</title>
		<link href="https://blog.smemory.org/posts/20220713_01_sso-with-lldap-authelia-and-nginx/"/>
		<updated>2022-07-13T00:00:00+00:00</updated>
		<id>https://blog.smemory.org/posts/20220713_01_sso-with-lldap-authelia-and-nginx/</id>
		<content type="html">&lt;h1 id=&quot;scope%3A&quot;&gt;Scope: &lt;a class=&quot;direct-link&quot; href=&quot;#scope%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I wanted to play with a (lightweight) directory service and an identity access management solution to be able to manage the access to some of my sites.&lt;/p&gt;
&lt;h1 id=&quot;software%3A&quot;&gt;Software: &lt;a class=&quot;direct-link&quot; href=&quot;#software%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h3 id=&quot;lldap%3A&quot;&gt;lldap: &lt;a class=&quot;direct-link&quot; href=&quot;#lldap%3A&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/nitnelave/lldap&quot;&gt;lldap&lt;/a&gt;&lt;br&gt;
is a lightweight implementation of ldap, lacks some features (like ldaps or clustering) but is ok for my needs right now.&lt;br&gt;
Has &lt;a href=&quot;https://github.com/nitnelave/lldap/tree/main/example_configs&quot;&gt;many example config file&lt;/a&gt; for compatible services.&lt;/p&gt;
&lt;h3 id=&quot;authelia%3A&quot;&gt;Authelia: &lt;a class=&quot;direct-link&quot; href=&quot;#authelia%3A&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/nitnelave/lldap/tree/main/example_configs&quot;&gt;Authelia&lt;/a&gt;&lt;br&gt;
is a IAM and is layer between your applications/users and ldap.&lt;br&gt;
It has a nice portal and allows you user to configure their devices.&lt;/p&gt;
&lt;h3 id=&quot;nginx%3A&quot;&gt;Nginx: &lt;a class=&quot;direct-link&quot; href=&quot;#nginx%3A&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;my reverse proxy of choice, from nginx I can choose which site needs to be authenticated before accessing.&lt;/p&gt;
&lt;h1 id=&quot;docker-compose%3A&quot;&gt;docker-compose: &lt;a class=&quot;direct-link&quot; href=&quot;#docker-compose%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I’ve used docker-compose for lldap and Authelia,&lt;br&gt;
pre-reqs:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;#create the user for your service:&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token function&quot;&gt;useradd&lt;/span&gt; -u &lt;span class=&quot;token number&quot;&gt;50000&lt;/span&gt; -U -M -s /bin/false docker_ldap&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;#create the folder for the local mappings for docker:&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token function&quot;&gt;mkdir&lt;/span&gt; -p /data/lldap /data/authelia&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;#change the permission on the folders:&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token function&quot;&gt;chown&lt;/span&gt; -R &lt;span class=&quot;token number&quot;&gt;50000&lt;/span&gt;:50000 /data/lldap&lt;br&gt;&lt;span class=&quot;token function&quot;&gt;chown&lt;/span&gt; -R &lt;span class=&quot;token number&quot;&gt;50000&lt;/span&gt;:50000 /data/authelia&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;the docker-compose.yml:&lt;/p&gt;
&lt;pre class=&quot;language-yml&quot;&gt;&lt;code class=&quot;language-yml&quot;&gt;&lt;span class=&quot;token key atrule&quot;&gt;services&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token key atrule&quot;&gt;lldap&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token key atrule&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; nitnelave/lldap&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;stable&lt;br&gt;    &lt;span class=&quot;token comment&quot;&gt;# Change this to the user:group you want.&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token key atrule&quot;&gt;user&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; “50000&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;50000”&lt;br&gt;    &lt;span class=&quot;token key atrule&quot;&gt;ports&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;br&gt;      &lt;span class=&quot;token comment&quot;&gt;# For LDAP&lt;/span&gt;&lt;br&gt;      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; “3890&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;3890”&lt;br&gt;      &lt;span class=&quot;token comment&quot;&gt;# For the web front-end&lt;/span&gt;&lt;br&gt;      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; “17170&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;17170”&lt;br&gt;    &lt;span class=&quot;token key atrule&quot;&gt;volumes&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;br&gt;      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; “/data/lldap&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;/data”&lt;br&gt;    &lt;span class=&quot;token key atrule&quot;&gt;environment&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;br&gt;      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; LLDAP_JWT_SECRET=YOUR_SECRET&lt;br&gt;      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; LLDAP_LDAP_USER_PASS=YOUR_PASS&lt;br&gt;      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; LLDAP_LDAP_BASE_DN=dc=example&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;dc=com&lt;br&gt;&lt;br&gt;  &lt;span class=&quot;token key atrule&quot;&gt;authelia&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token key atrule&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; authelia/authelia&lt;br&gt;    &lt;span class=&quot;token key atrule&quot;&gt;container_name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; authelia&lt;br&gt;    &lt;span class=&quot;token key atrule&quot;&gt;volumes&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;br&gt;      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; /data/authelia&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;/config&lt;br&gt;    &lt;span class=&quot;token key atrule&quot;&gt;user&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; “50000&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;50000”&lt;br&gt;    &lt;span class=&quot;token key atrule&quot;&gt;ports&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;br&gt;      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; “9091&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;9091”&lt;br&gt;    &lt;span class=&quot;token key atrule&quot;&gt;restart&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; unless&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;stopped&lt;br&gt;    &lt;span class=&quot;token key atrule&quot;&gt;healthcheck&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;br&gt;      &lt;span class=&quot;token key atrule&quot;&gt;disable&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean important&quot;&gt;true&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token key atrule&quot;&gt;environment&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;br&gt;      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; TZ=Europe/Rome&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;you’ll have to add the Authelia configfile in /data/authelia/configuration.yml&lt;br&gt;
which should look something like this (without comments):&lt;/p&gt;
&lt;pre class=&quot;language-yaml&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;---&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token key atrule&quot;&gt;theme&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; auto&lt;br&gt;&lt;span class=&quot;token key atrule&quot;&gt;jwt_secret&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;123107213701371937937&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token key atrule&quot;&gt;default_redirection_url&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; https&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;//auth.example.com/&lt;br&gt;&lt;span class=&quot;token key atrule&quot;&gt;default_2fa_method&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; “totp”&lt;br&gt;&lt;span class=&quot;token key atrule&quot;&gt;server&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token key atrule&quot;&gt;host&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0.0.0.0&lt;br&gt;  &lt;span class=&quot;token key atrule&quot;&gt;port&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;9091&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token key atrule&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; “”&lt;br&gt;  &lt;span class=&quot;token key atrule&quot;&gt;asset_path&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; /config/assets/&lt;br&gt;  &lt;span class=&quot;token key atrule&quot;&gt;read_buffer_size&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;4096&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token key atrule&quot;&gt;write_buffer_size&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;4096&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token key atrule&quot;&gt;enable_pprof&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean important&quot;&gt;false&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token key atrule&quot;&gt;enable_expvars&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean important&quot;&gt;false&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token key atrule&quot;&gt;disable_healthcheck&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean important&quot;&gt;false&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token key atrule&quot;&gt;tls&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token key atrule&quot;&gt;key&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; “”&lt;br&gt;    &lt;span class=&quot;token key atrule&quot;&gt;certificate&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; “”&lt;br&gt;    &lt;span class=&quot;token key atrule&quot;&gt;client_certificates&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token key atrule&quot;&gt;headers&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token key atrule&quot;&gt;csp_template&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; “”&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token key atrule&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token key atrule&quot;&gt;level&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; debug&lt;br&gt;  &lt;span class=&quot;token key atrule&quot;&gt;format&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; text&lt;br&gt;  &lt;span class=&quot;token key atrule&quot;&gt;file_path&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; /config/authelia.log&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token key atrule&quot;&gt;telemetry&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token key atrule&quot;&gt;metrics&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token key atrule&quot;&gt;enabled&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean important&quot;&gt;false&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token key atrule&quot;&gt;address&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; tcp&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;//0.0.0.0&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;9959&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token key atrule&quot;&gt;totp&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token key atrule&quot;&gt;disable&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean important&quot;&gt;false&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token key atrule&quot;&gt;issuer&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; auth.example.com&lt;br&gt;  &lt;span class=&quot;token key atrule&quot;&gt;algorithm&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; sha1&lt;br&gt;  &lt;span class=&quot;token key atrule&quot;&gt;digits&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;6&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token key atrule&quot;&gt;period&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;30&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token key atrule&quot;&gt;skew&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token key atrule&quot;&gt;secret_size&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;32&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token key atrule&quot;&gt;webauthn&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token key atrule&quot;&gt;disable&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean important&quot;&gt;false&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token key atrule&quot;&gt;timeout&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 60s&lt;br&gt;  &lt;span class=&quot;token key atrule&quot;&gt;display_name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Authelia&lt;br&gt;  &lt;span class=&quot;token key atrule&quot;&gt;attestation_conveyance_preference&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; indirect&lt;br&gt;  &lt;span class=&quot;token key atrule&quot;&gt;user_verification&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; preferred&lt;br&gt;  &lt;br&gt;&lt;span class=&quot;token key atrule&quot;&gt;ntp&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token key atrule&quot;&gt;address&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; “time.cloudflare.com&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;123”&lt;br&gt;  &lt;span class=&quot;token key atrule&quot;&gt;version&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token key atrule&quot;&gt;max_desync&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 3s&lt;br&gt;  &lt;span class=&quot;token key atrule&quot;&gt;disable_startup_check&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean important&quot;&gt;false&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token key atrule&quot;&gt;disable_failure&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean important&quot;&gt;false&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token key atrule&quot;&gt;authentication_backend&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token key atrule&quot;&gt;password_reset&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token key atrule&quot;&gt;disable&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean important&quot;&gt;false&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token key atrule&quot;&gt;refresh_interval&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 1m&lt;br&gt;  &lt;span class=&quot;token key atrule&quot;&gt;ldap&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token key atrule&quot;&gt;implementation&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; custom&lt;br&gt;    &lt;span class=&quot;token key atrule&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; ldap&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;//lldap&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;3890&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token key atrule&quot;&gt;timeout&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 5s&lt;br&gt;    &lt;span class=&quot;token key atrule&quot;&gt;start_tls&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean important&quot;&gt;false&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token key atrule&quot;&gt;base_dn&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; dc=example&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;dc=com&lt;br&gt;    &lt;span class=&quot;token key atrule&quot;&gt;username_attribute&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; uid&lt;br&gt;    &lt;span class=&quot;token key atrule&quot;&gt;additional_users_dn&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; ou=people&lt;br&gt;    &lt;span class=&quot;token key atrule&quot;&gt;users_filter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; (&lt;span class=&quot;token important&quot;&gt;&amp;amp;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;username_attribute&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;=&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;input&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;)(objectClass=person))&lt;br&gt;    &lt;span class=&quot;token key atrule&quot;&gt;additional_groups_dn&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; ou=groups&lt;br&gt;    &lt;span class=&quot;token key atrule&quot;&gt;groups_filter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; (member=&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;dn&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;)&lt;br&gt;    &lt;span class=&quot;token key atrule&quot;&gt;group_name_attribute&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; cn&lt;br&gt;    &lt;span class=&quot;token key atrule&quot;&gt;mail_attribute&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; mail&lt;br&gt;    &lt;span class=&quot;token key atrule&quot;&gt;display_name_attribute&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; displayName&lt;br&gt;    &lt;span class=&quot;token key atrule&quot;&gt;user&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; uid=admin&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;ou=people&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;dc=example&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;dc=com&lt;br&gt;    &lt;span class=&quot;token key atrule&quot;&gt;password&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; ‘password’&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token key atrule&quot;&gt;password_policy&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token key atrule&quot;&gt;standard&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token key atrule&quot;&gt;enabled&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean important&quot;&gt;false&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token key atrule&quot;&gt;min_length&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;8&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token key atrule&quot;&gt;max_length&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token key atrule&quot;&gt;require_uppercase&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean important&quot;&gt;true&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token key atrule&quot;&gt;require_lowercase&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean important&quot;&gt;true&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token key atrule&quot;&gt;require_number&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean important&quot;&gt;true&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token key atrule&quot;&gt;require_special&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean important&quot;&gt;true&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token key atrule&quot;&gt;zxcvbn&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token key atrule&quot;&gt;enabled&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean important&quot;&gt;false&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token key atrule&quot;&gt;min_score&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token key atrule&quot;&gt;access_control&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token key atrule&quot;&gt;default_policy&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; deny&lt;br&gt;  &lt;span class=&quot;token key atrule&quot;&gt;rules&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;domain&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; ‘public.example.com’&lt;br&gt;      &lt;span class=&quot;token key atrule&quot;&gt;policy&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; bypass&lt;br&gt;&lt;br&gt;    &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;domain&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; ‘www.example.com’&lt;br&gt;      &lt;span class=&quot;token key atrule&quot;&gt;policy&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; two_factor&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token key atrule&quot;&gt;session&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; authelia_session&lt;br&gt;  &lt;span class=&quot;token key atrule&quot;&gt;domain&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; example.com&lt;br&gt;  &lt;span class=&quot;token key atrule&quot;&gt;same_site&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; lax&lt;br&gt;  &lt;span class=&quot;token key atrule&quot;&gt;secret&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; insecure_session_secret&lt;br&gt;  &lt;span class=&quot;token key atrule&quot;&gt;expiration&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 1h&lt;br&gt;  &lt;span class=&quot;token key atrule&quot;&gt;inactivity&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 5m&lt;br&gt;  &lt;span class=&quot;token key atrule&quot;&gt;remember_me_duration&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 1M&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token key atrule&quot;&gt;regulation&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token key atrule&quot;&gt;max_retries&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token key atrule&quot;&gt;find_time&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 2m&lt;br&gt;  &lt;span class=&quot;token key atrule&quot;&gt;ban_time&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 5m&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token key atrule&quot;&gt;storage&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token key atrule&quot;&gt;encryption_key&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;123123123123123123123123123123123123123123123&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token key atrule&quot;&gt;local&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token key atrule&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; /config/db.sqlite3&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token key atrule&quot;&gt;notifier&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token key atrule&quot;&gt;disable_startup_check&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean important&quot;&gt;true&lt;/span&gt;&lt;br&gt;&lt;br&gt;  &lt;span class=&quot;token key atrule&quot;&gt;smtp&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token key atrule&quot;&gt;host&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; smtp.mail.domain&lt;br&gt;    &lt;span class=&quot;token key atrule&quot;&gt;port&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;587&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token key atrule&quot;&gt;timeout&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 5s&lt;br&gt;    &lt;span class=&quot;token key atrule&quot;&gt;username&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; auth.examplecom@mail.domain&lt;br&gt;    &lt;span class=&quot;token key atrule&quot;&gt;password&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; password&lt;br&gt;    &lt;span class=&quot;token key atrule&quot;&gt;sender&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; “auth.example.com &amp;lt;auth.examplecom@mail.domain&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;”&lt;br&gt;    &lt;span class=&quot;token key atrule&quot;&gt;identifier&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Auth_examplecom&lt;br&gt;    &lt;span class=&quot;token key atrule&quot;&gt;subject&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; “&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;auth.example.com&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;title&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;”&lt;br&gt;    &lt;span class=&quot;token key atrule&quot;&gt;startup_check_address&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; check@test.domain&lt;br&gt;    &lt;span class=&quot;token key atrule&quot;&gt;disable_require_tls&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean important&quot;&gt;false&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token key atrule&quot;&gt;disable_html_emails&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean important&quot;&gt;false&lt;/span&gt;&lt;br&gt;&lt;br&gt;    &lt;span class=&quot;token key atrule&quot;&gt;tls&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;br&gt;      &lt;span class=&quot;token key atrule&quot;&gt;skip_verify&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean important&quot;&gt;false&lt;/span&gt;&lt;br&gt;      &lt;span class=&quot;token key atrule&quot;&gt;minimum_version&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; TLS1.2&lt;br&gt;&lt;span class=&quot;token punctuation&quot;&gt;...&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Notes:&lt;br&gt;
see “default_policy: deny” this means that if you don’t create a rule for your site (or a rule with a wildcard) then you’ll receive a 403 “Access Denied” after the authentication, ask me how I know :D&lt;/p&gt;
&lt;p&gt;lldap has it’s own config (I had to write this from scratch since the container won’t create the correct defaults:&lt;/p&gt;
&lt;pre class=&quot;language-toml&quot;&gt;&lt;code class=&quot;language-toml&quot;&gt;&lt;span class=&quot;token key property&quot;&gt;ldap_port&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3890&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token key property&quot;&gt;http_port&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;17170&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token key property&quot;&gt;jwt_secret&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; “&lt;span class=&quot;token number&quot;&gt;123123123123123123&lt;/span&gt;”&lt;br&gt;&lt;span class=&quot;token key property&quot;&gt;ldap_base_dn&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; “dc&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;example&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token key property&quot;&gt;dc&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;com”&lt;br&gt;&lt;span class=&quot;token key property&quot;&gt;ldap_user_dn&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; “admin”&lt;br&gt;&lt;span class=&quot;token key property&quot;&gt;ldap_user_pass&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; “password”&lt;br&gt;&lt;span class=&quot;token key property&quot;&gt;database_url&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; “sqlite:///data/users&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;db?mode&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;rwc”&lt;br&gt;&lt;span class=&quot;token key property&quot;&gt;key_file&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; “/data/private_key”&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token table class-name&quot;&gt;smtp_options&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token key property&quot;&gt;enable_password_reset&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token key property&quot;&gt;server&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;“smtp&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;mail&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;domain”&lt;br&gt;&lt;span class=&quot;token key property&quot;&gt;port&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;587&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token key property&quot;&gt;tls_required&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token key property&quot;&gt;user&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;“auth&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;examplecom@mail&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;domain”&lt;br&gt;&lt;span class=&quot;token key property&quot;&gt;password&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;“password”&lt;br&gt;&lt;span class=&quot;token key property&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;“LLDAP Admin &amp;lt;auth&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;examplecom@mail&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;domain&gt;”&lt;br&gt;&lt;span class=&quot;token key property&quot;&gt;reply_to&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;“Do not reply &amp;lt;noreply@examplecom&gt;”&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;start the container and access lldap’s web interface on port 17170 with user admin and password what-you-set, then you’ll be able to create other users.&lt;/p&gt;
&lt;h1 id=&quot;nginx%3A-2&quot;&gt;Nginx: &lt;a class=&quot;direct-link&quot; href=&quot;#nginx%3A-2&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;this is really everything you need to know:&lt;br&gt;
&lt;a href=&quot;https://www.authelia.com/integration/proxies/nginx/&quot;&gt;https://www.authelia.com/integration/proxies/nginx/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I’ve put all Authelia’s files in a dedicated config folder and linked them in there,&lt;br&gt;
REMEMBER to create the rules for your site in Authelia’s config.&lt;/p&gt;
&lt;p&gt;My nginx config:&lt;/p&gt;
&lt;pre class=&quot;language-nginx&quot;&gt;&lt;code class=&quot;language-nginx&quot;&gt;&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;#auth.example.com&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token keyword&quot;&gt;server&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;       &lt;span class=&quot;token keyword&quot;&gt;listen&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;80&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;       &lt;span class=&quot;token keyword&quot;&gt;server_name&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;auth&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;example&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;com&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;       &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;301&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;https&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$server_name&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$request_uri&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;       &lt;span class=&quot;token comment&quot;&gt;#LOGS:&lt;/span&gt;&lt;br&gt;       &lt;span class=&quot;token keyword&quot;&gt;access_log&lt;/span&gt;  &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;var&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;log&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;nginx&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;auth&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;example&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;com_access&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;log&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;       &lt;span class=&quot;token keyword&quot;&gt;error_log&lt;/span&gt;  &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;var&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;log&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;nginx&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;auth&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;example&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;com_error&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;log&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token keyword&quot;&gt;server&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;        &lt;span class=&quot;token keyword&quot;&gt;listen&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;443&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;ssl&lt;/span&gt; http2&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;        &lt;span class=&quot;token keyword&quot;&gt;server_name&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;auth&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;example&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;com&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;        &lt;span class=&quot;token comment&quot;&gt;#SSL:&lt;/span&gt;&lt;br&gt;        &lt;span class=&quot;token keyword&quot;&gt;ssl&lt;/span&gt; on&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;        &lt;span class=&quot;token keyword&quot;&gt;ssl_certificate&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;etc&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;letsencrypt&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;live&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;auth&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;example&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;com&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;fullchain&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;pem&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;        &lt;span class=&quot;token keyword&quot;&gt;ssl_certificate_key&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;etc&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;letsencrypt&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;live&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;auth&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;example&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;com&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;privkey&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;pem&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;        &lt;span class=&quot;token keyword&quot;&gt;ssl_session_cache&lt;/span&gt; shared&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;SSL&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;m&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;        &lt;span class=&quot;token comment&quot;&gt;#LOGS:&lt;/span&gt;&lt;br&gt;        &lt;span class=&quot;token keyword&quot;&gt;access_log&lt;/span&gt;  &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;var&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;log&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;nginx&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;auth&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;example&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;com_access&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;log&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;        &lt;span class=&quot;token keyword&quot;&gt;error_log&lt;/span&gt;  &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;var&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;log&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;nginx&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;auth&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;example&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;com_error&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;log&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;        &lt;span class=&quot;token keyword&quot;&gt;location&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;          &lt;span class=&quot;token keyword&quot;&gt;proxy_pass&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;http&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;192.168&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;.43&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;.170&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;9091&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;          &lt;span class=&quot;token keyword&quot;&gt;include&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;etc&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;nginx&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;conf&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;d&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;authelia&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;proxy&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;conf&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;#www.example.com&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token keyword&quot;&gt;server&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;        &lt;span class=&quot;token keyword&quot;&gt;listen&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;80&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;        &lt;span class=&quot;token keyword&quot;&gt;server_name&lt;/span&gt; www&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;example&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;com&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;301&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$scheme&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$server_name&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$request_uri&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;        &lt;span class=&quot;token comment&quot;&gt;#LOGS:&lt;/span&gt;&lt;br&gt;        &lt;span class=&quot;token keyword&quot;&gt;access_log&lt;/span&gt;  &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;var&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;log&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;nginx&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;www&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;example&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;com_access&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;log&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;        &lt;span class=&quot;token keyword&quot;&gt;error_log&lt;/span&gt;  &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;var&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;log&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;nginx&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;www&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;example&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;com_error&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;log&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token keyword&quot;&gt;server&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;        &lt;span class=&quot;token keyword&quot;&gt;listen&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;443&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;ssl&lt;/span&gt; http2&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;        &lt;span class=&quot;token keyword&quot;&gt;server_name&lt;/span&gt; www&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;example&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;com&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;        &lt;span class=&quot;token comment&quot;&gt;#SSL:&lt;/span&gt;&lt;br&gt;        &lt;span class=&quot;token keyword&quot;&gt;ssl&lt;/span&gt; on&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;        &lt;span class=&quot;token keyword&quot;&gt;ssl_certificate&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;etc&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;letsencrypt&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;live&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;www&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;example&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;com&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;fullchain&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;pem&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;        &lt;span class=&quot;token keyword&quot;&gt;ssl_certificate_key&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;etc&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;letsencrypt&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;live&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;www&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;example&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;com&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;privkey&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;pem&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;        &lt;span class=&quot;token keyword&quot;&gt;ssl_session_cache&lt;/span&gt; shared&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;SSL&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;m&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;        &lt;span class=&quot;token comment&quot;&gt;#LOGS:&lt;/span&gt;&lt;br&gt;        &lt;span class=&quot;token keyword&quot;&gt;access_log&lt;/span&gt;  &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;var&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;log&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;nginx&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;www&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;example&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;com_access&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;log&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;        &lt;span class=&quot;token keyword&quot;&gt;error_log&lt;/span&gt;  &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;var&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;log&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;nginx&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;www&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;example&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;com_error&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;log&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;        &lt;span class=&quot;token comment&quot;&gt;#&lt;/span&gt;&lt;br&gt;        &lt;span class=&quot;token comment&quot;&gt;#authelia:&lt;/span&gt;&lt;br&gt;        &lt;span class=&quot;token keyword&quot;&gt;include&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;etc&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;nginx&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;conf&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;d&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;authelia&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;authelia&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;location&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;conf&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;        &lt;span class=&quot;token comment&quot;&gt;#&lt;/span&gt;&lt;br&gt;        &lt;span class=&quot;token keyword&quot;&gt;location&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;          &lt;span class=&quot;token keyword&quot;&gt;include&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;etc&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;nginx&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;conf&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;d&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;authelia&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;proxy&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;conf&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;          &lt;span class=&quot;token keyword&quot;&gt;include&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;etc&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;nginx&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;conf&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;d&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;authelia&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;authelia&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;authrequest&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;conf&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;          &lt;span class=&quot;token keyword&quot;&gt;root&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;var&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;www&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;example&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;com&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id=&quot;authelia-rules-examples%3A&quot;&gt;Authelia rules examples: &lt;a class=&quot;direct-link&quot; href=&quot;#authelia-rules-examples%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;in this example inly the users in the group “www_site_users” will be able to access the site &lt;a href=&quot;http://www.example.com/&quot;&gt;www.example.com&lt;/a&gt; using the 2 factor authentication, the admin users in the group “www_site_admins” will not be able to access any site of &lt;a href=&quot;http://example.com/&quot;&gt;example.com&lt;/a&gt;:&lt;/p&gt;
&lt;pre class=&quot;language-yaml&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;    &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;domain&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; ‘www.example.com’&lt;br&gt;      &lt;span class=&quot;token key atrule&quot;&gt;policy&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; two_factor&lt;br&gt;      &lt;span class=&quot;token key atrule&quot;&gt;subject&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; ‘group&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;www_site_users’&lt;br&gt;&lt;br&gt;    &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;domain&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; ‘&lt;span class=&quot;token important&quot;&gt;*.example.com’&lt;/span&gt;&lt;br&gt;      &lt;span class=&quot;token key atrule&quot;&gt;policy&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; deny&lt;br&gt;      &lt;span class=&quot;token key atrule&quot;&gt;subject&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; ‘group&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;www_site_admins&lt;/code&gt;&lt;/pre&gt;
</content>
	</entry>
	
	<entry>
		<title>Zigbee Sonoff Door (contact) to Leak Sensor</title>
		<link href="https://blog.smemory.org/posts/20220622_01_zigbee-door-sensor-to-leak-sensor/"/>
		<updated>2022-06-22T00:00:00+00:00</updated>
		<id>https://blog.smemory.org/posts/20220622_01_zigbee-door-sensor-to-leak-sensor/</id>
		<content type="html">&lt;h1 id=&quot;update%3A&quot;&gt;UPDATE: &lt;a class=&quot;direct-link&quot; href=&quot;#update%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;The sensor has been very unreliable and detected phantom contacts, especially at 3 in the morning, even after applying heat shrink tubing on the contacts.&lt;br&gt;
I’ve ended up taking an Aqara Leak sensor, un screwing the contacts (they are done like this on purpose) and attaching the isolated wire to those. It’s working well.&lt;/p&gt;
&lt;h1 id=&quot;scope%3A&quot;&gt;Scope: &lt;a class=&quot;direct-link&quot; href=&quot;#scope%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Conversion of a Sonoff SNZB-04 contact (door/window) sensor to leak (or contact) sensor and code for Homebridge,&lt;br&gt;
possibly retaining the reed switch (magnet) functionality.&lt;/p&gt;
&lt;p&gt;Preferably modular so I can attach different &amp;quot;probes&amp;quot; for different use cases.&lt;/p&gt;
&lt;h1 id=&quot;why%3A&quot;&gt;Why: &lt;a class=&quot;direct-link&quot; href=&quot;#why%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I have a spare contact sensor and need a leak sensor,&lt;br&gt;
I have decided to convert this one instead of buying a new one.&lt;/p&gt;
&lt;h1 id=&quot;physical%3A&quot;&gt;Physical: &lt;a class=&quot;direct-link&quot; href=&quot;#physical%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I&#39;ve soldered 2 wires to the reed swith that would normally close the circuit when a magentic field is applied.&lt;br&gt;
In this way we can close the circuit physically.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.smemory.org/img/20220622_01_zigbee-door-sensor-to-leak-sensor_01.JPG&quot;&gt;&lt;img src=&quot;https://blog.smemory.org/img/20220622_01_zigbee-door-sensor-to-leak-sensor_01.JPG&quot; alt=&quot;description&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.smemory.org/img/20220622_01_zigbee-door-sensor-to-leak-sensor_02.JPG&quot;&gt;&lt;img src=&quot;https://blog.smemory.org/img/20220622_01_zigbee-door-sensor-to-leak-sensor_02.JPG&quot; alt=&quot;description&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I&#39;ve also modified the case a bit to allow the wires to come out and be soldered to the screw clamps:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.smemory.org/img/20220622_01_zigbee-door-sensor-to-leak-sensor_03.JPG&quot;&gt;&lt;img src=&quot;https://blog.smemory.org/img/20220622_01_zigbee-door-sensor-to-leak-sensor_03.JPG&quot; alt=&quot;description&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.smemory.org/img/20220622_01_zigbee-door-sensor-to-leak-sensor_04.JPG&quot;&gt;&lt;img src=&quot;https://blog.smemory.org/img/20220622_01_zigbee-door-sensor-to-leak-sensor_04.JPG&quot; alt=&quot;description&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;this way I can &amp;quot;mount&amp;quot; it in it&#39;s final location:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.smemory.org/img/20220622_01_zigbee-door-sensor-to-leak-sensor_05.JPG&quot;&gt;&lt;img src=&quot;https://blog.smemory.org/img/20220622_01_zigbee-door-sensor-to-leak-sensor_05.JPG&quot; alt=&quot;description&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;yep, not my proudest soldering work.&lt;/p&gt;
&lt;h1 id=&quot;software%3A&quot;&gt;Software: &lt;a class=&quot;direct-link&quot; href=&quot;#software%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Using Homebdridge i wanted to define my sensor as a leak sensor insted of a contact sensor.&lt;/p&gt;
&lt;p&gt;My config for the contact sensor:&lt;/p&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;        &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token string&quot;&gt;&quot;accessory&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;mqttthing&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token string&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;contactSensor&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token string&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Sonoff_Door01&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token string&quot;&gt;&quot;url&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;mqtt://192.168.0.10:1883&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token string&quot;&gt;&quot;username&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;homebridge&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token string&quot;&gt;&quot;password&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;password&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token string&quot;&gt;&quot;topics&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;                &lt;span class=&quot;token string&quot;&gt;&quot;getContactSensorState&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;                    &lt;span class=&quot;token string&quot;&gt;&quot;topic&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;tele/tasmota_ABCDEF/Sonoff_Door01/SENSOR&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;                    &lt;span class=&quot;token string&quot;&gt;&quot;apply&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;return JSON.parse(message).ZbReceived[&#39;0xABCD&#39;].Contact;&quot;&lt;/span&gt;&lt;br&gt;                &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;                &lt;span class=&quot;token string&quot;&gt;&quot;getStatusLowBattery&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;                    &lt;span class=&quot;token string&quot;&gt;&quot;topic&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;tele/tasmota_ABCDEF/Sonoff_Door01/SENSOR&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;                    &lt;span class=&quot;token string&quot;&gt;&quot;apply&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;return JSON.parse(message).ZbReceived[&#39;0xABCD&#39;].BatteryPercentage;&quot;&lt;/span&gt;&lt;br&gt;                &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token string&quot;&gt;&quot;integerValue&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;true&quot;&lt;/span&gt;&lt;br&gt;        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;My configuration for the leak sensor:&lt;/p&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;        &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token string&quot;&gt;&quot;accessory&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;mqttthing&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token string&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;leakSensor&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token string&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Sonoff_Door01_LEAK&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token string&quot;&gt;&quot;url&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;mqtt://192.168.0.10:1883&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token string&quot;&gt;&quot;username&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;homebridge&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token string&quot;&gt;&quot;password&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;password&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token string&quot;&gt;&quot;topics&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;                &lt;span class=&quot;token string&quot;&gt;&quot;getLeakDetected&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;                    &lt;span class=&quot;token string&quot;&gt;&quot;topic&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;tele/tasmota_ABCDEF/Sonoff_Door01/SENSOR&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;                    &lt;span class=&quot;token string&quot;&gt;&quot;apply&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;return !(JSON.parse(message).ZbReceived[&#39;0xABCD&#39;].Contact);&quot;&lt;/span&gt;&lt;br&gt;                &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;                &lt;span class=&quot;token string&quot;&gt;&quot;getStatusLowBattery&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;                    &lt;span class=&quot;token string&quot;&gt;&quot;topic&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;tele/tasmota_ABCDEF/Sonoff_Door01/SENSOR&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;                    &lt;span class=&quot;token string&quot;&gt;&quot;apply&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;return JSON.parse(message).ZbReceived[&#39;0xABCD&#39;].BatteryPercentage;&quot;&lt;/span&gt;&lt;br&gt;                &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token string&quot;&gt;&quot;integerValue&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;true&quot;&lt;/span&gt;&lt;br&gt;        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;notice the negation &amp;quot;!&amp;quot; in the &amp;quot;getLeakDetected&amp;quot; &amp;quot;apply&amp;quot; section,&lt;br&gt;
this is used because the normal state of the contact sensor is:&lt;/p&gt;
&lt;p&gt;&amp;quot;Contact&amp;quot;:1 if it&#39;s open&lt;/p&gt;
&lt;p&gt;&amp;quot;Contact&amp;quot;:0 if it&#39;s closed&lt;/p&gt;
&lt;p&gt;I needed to invert the status otherwise the leak sensor would be always in &amp;quot;leak detection&amp;quot; when there was no contact, thus the use of &amp;quot;!&amp;quot;.&lt;br&gt;
This has been done since I haven&#39;t found another way to define this in other ways.&lt;/p&gt;
&lt;p&gt;The alert arrives promptly and is considered an high-priority alert:&lt;br&gt;
&lt;a href=&quot;https://blog.smemory.org/img/20220622_01_zigbee-door-sensor-to-leak-sensor_06.jpeg&quot;&gt;&lt;img src=&quot;https://blog.smemory.org/img/20220622_01_zigbee-door-sensor-to-leak-sensor_06.jpeg&quot; alt=&quot;description&quot;&gt;&lt;/a&gt;&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>exported iCloud photos have the wrong date</title>
		<link href="https://blog.smemory.org/posts/20220602_01_icloud_photos_date/"/>
		<updated>2022-06-02T00:00:00+00:00</updated>
		<id>https://blog.smemory.org/posts/20220602_01_icloud_photos_date/</id>
		<content type="html">&lt;h1 id=&quot;scope%3A&quot;&gt;Scope: &lt;a class=&quot;direct-link&quot; href=&quot;#scope%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;One of my friends has a problem:&lt;br&gt;
they use iCloud photos to save/backup photos from the iPhone and want to create an out-of-iCloud backup of the photos on their mac.&lt;/p&gt;
&lt;p&gt;The issue is that the photos are exported with consecutive names (es: IMG_1234.JPG) and the files have the creation/modification date of the moment you exported them from Photos to disk.&lt;/p&gt;
&lt;p&gt;In this way the real date of the photo is only in Exif data, but we cannot see it directly or sort the photos using the file date.&lt;/p&gt;
&lt;p&gt;My friend asked me to create a script to rename the photos with the correct capture date.&lt;/p&gt;
&lt;h1 id=&quot;prerequisites%3A&quot;&gt;Prerequisites: &lt;a class=&quot;direct-link&quot; href=&quot;#prerequisites%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;brew
&lt;ul&gt;
&lt;li&gt;to install exiftool&lt;/li&gt;
&lt;li&gt;install it via: &lt;a href=&quot;https://brew.sh/&quot;&gt;https://brew.sh/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;exiftool
&lt;ul&gt;
&lt;li&gt;install it via brew:&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://formulae.brew.sh/formula/exiftool&quot;&gt;https://formulae.brew.sh/formula/exiftool&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;script%3A&quot;&gt;Script: &lt;a class=&quot;direct-link&quot; href=&quot;#script%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token shebang important&quot;&gt;#!/bin/bash&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;#check if the required tool is installed&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt; exiftool &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; /dev/null &lt;span class=&quot;token operator&quot;&gt;&lt;span class=&quot;token file-descriptor important&quot;&gt;2&lt;/span&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token file-descriptor important&quot;&gt;&amp;amp;1&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;then&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;exiftool is not installed, exiting&quot;&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token builtin class-name&quot;&gt;exit&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token keyword&quot;&gt;fi&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;#main cycle:&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token for-or-select variable&quot;&gt;file&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$@&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;do&lt;/span&gt;&lt;br&gt;&lt;br&gt;  &lt;span class=&quot;token comment&quot;&gt;#clean variables every cycle&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token assign-left variable&quot;&gt;filedate&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token assign-left variable&quot;&gt;folder&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token assign-left variable&quot;&gt;extensione&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token assign-left variable&quot;&gt;newname&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;br&gt;&lt;br&gt;  &lt;span class=&quot;token comment&quot;&gt;#differentiate between files that need diferent fields in exiftool:&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$file&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; *&lt;span class=&quot;token string&quot;&gt;&quot;.MOV&quot;&lt;/span&gt;* &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;then&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token assign-left variable&quot;&gt;newname&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;exiftool -d &lt;span class=&quot;token string&quot;&gt;&quot;%Y-%m-%dT%H-%M-%S%z&quot;&lt;/span&gt; -MediaCreateDate -S -s &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$file&lt;/span&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token assign-left variable&quot;&gt;newname&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;exiftool -d &lt;span class=&quot;token string&quot;&gt;&quot;%Y-%m-%dT%H-%M-%S%z&quot;&lt;/span&gt; -DateTimeOriginal -S -s &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$file&lt;/span&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token keyword&quot;&gt;fi&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt; -z &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$newname&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;then&lt;/span&gt;&lt;br&gt;&lt;br&gt;    &lt;span class=&quot;token assign-left variable&quot;&gt;extension&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; $&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;file//*.&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br&gt;    &lt;br&gt;    &lt;span class=&quot;token comment&quot;&gt;#differentiate if file is in the same folder or another:&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$file&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; *&lt;span class=&quot;token string&quot;&gt;&quot;/&quot;&lt;/span&gt;* &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;then&lt;/span&gt;&lt;br&gt;      &lt;span class=&quot;token assign-left variable&quot;&gt;folder&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$file&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;cut&lt;/span&gt; -d/ -f1&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;    &lt;br&gt;      &lt;span class=&quot;token function&quot;&gt;mv&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$file&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$folder&lt;/span&gt;/&lt;span class=&quot;token variable&quot;&gt;$newname&lt;/span&gt;.&lt;span class=&quot;token variable&quot;&gt;$extension&lt;/span&gt;&quot;&lt;/span&gt;    &lt;br&gt;      &lt;span class=&quot;token comment&quot;&gt;#debug:&lt;/span&gt;&lt;br&gt;      &lt;span class=&quot;token comment&quot;&gt;#echo &quot;rebuilt: &quot; &quot;$folder/$newname.$extension&quot;&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt;&lt;br&gt;      &lt;span class=&quot;token function&quot;&gt;mv&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$file&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$newname&lt;/span&gt;.&lt;span class=&quot;token variable&quot;&gt;$extension&lt;/span&gt;&quot;&lt;/span&gt;    &lt;br&gt;      &lt;span class=&quot;token comment&quot;&gt;#debug:&lt;/span&gt;&lt;br&gt;      &lt;span class=&quot;token comment&quot;&gt;#echo &quot;rebuilt: &quot; &quot;$newname.$extension&quot;&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token keyword&quot;&gt;fi&lt;/span&gt;&lt;br&gt;&lt;br&gt;  &lt;span class=&quot;token keyword&quot;&gt;fi&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;#DEBUG:&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token comment&quot;&gt;#echo &quot;newname: &quot; &quot;$newname&quot;&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token comment&quot;&gt;#echo &quot;file: &quot; &quot;$file&quot;&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token comment&quot;&gt;#echo &quot;extension: &quot; &quot;$extension&quot;&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token comment&quot;&gt;#echo &quot;folder: &quot; &quot;$folder&quot;&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token comment&quot;&gt;#echo &quot;- - - - - - - - - - &quot;&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token keyword&quot;&gt;done&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id=&quot;usage%3A&quot;&gt;Usage: &lt;a class=&quot;direct-link&quot; href=&quot;#usage%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;just run the script against a single file or a folder:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;#single file:&lt;/span&gt;&lt;br&gt;./rename.sh IMG_1234.JPG&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;#folder:&lt;/span&gt;&lt;br&gt;./rename.sh _WORKDIR/*&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id=&quot;unupported-files%3A&quot;&gt;Unupported files: &lt;a class=&quot;direct-link&quot; href=&quot;#unupported-files%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;The script ignores filetypes that don&#39;t contain (interesting) exif data,&lt;br&gt;
for example images downloaded from the web.&lt;/p&gt;
&lt;p&gt;Those files will not be renamed and will retain their original filename.&lt;/p&gt;
&lt;h1 id=&quot;notes%3A&quot;&gt;Notes: &lt;a class=&quot;direct-link&quot; href=&quot;#notes%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h3 id=&quot;different-files%2C-different-exif-data%3A&quot;&gt;different files, different exif data: &lt;a class=&quot;direct-link&quot; href=&quot;#different-files%2C-different-exif-data%3A&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;I&#39;ve noticed that .MOV files contain exif data but on another field,&lt;br&gt;
other file types may behave differently.&lt;/p&gt;
&lt;h3 id=&quot;iso-8601%3A&quot;&gt;ISO 8601: &lt;a class=&quot;direct-link&quot; href=&quot;#iso-8601%3A&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;I&#39;ve tried to follow &lt;a href=&quot;https://en.wikipedia.org/wiki/ISO_8601&quot;&gt;ISO 8601&lt;/a&gt; for the dates but MacOS doesn&#39;t like &amp;quot;:&amp;quot; in the filenames and in the GUI Finder automatically translates that in &amp;quot;/&amp;quot;.&lt;/p&gt;
&lt;p&gt;So our filenames will look like:&lt;br&gt;
2022-06-02T13-04-45+0000&lt;/p&gt;
&lt;p&gt;Instead of:&lt;br&gt;
2022-06-02T13:04:45+0000&lt;/p&gt;
&lt;h3 id=&quot;certified-for%3A&quot;&gt;certified for: &lt;a class=&quot;direct-link&quot; href=&quot;#certified-for%3A&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The script has been ran and tested on macOS Big Sur 11.6.6&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>RFB: request for banners</title>
		<link href="https://blog.smemory.org/posts/20220528_01_RFB_request_for_banners/"/>
		<updated>2022-05-28T00:00:00+00:00</updated>
		<id>https://blog.smemory.org/posts/20220528_01_RFB_request_for_banners/</id>
		<content type="html">&lt;h1 id=&quot;notice%3A&quot;&gt;Notice: &lt;a class=&quot;direct-link&quot; href=&quot;#notice%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;The facts, all banners, commands, and ouputs portrayed in this post are fictitious.&lt;br&gt;
No identification with actual IPs (assigned or retired), banners, scans, and products is intended or should be inferred.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.smemory.org/img/20220527_01_RFB_request_for_banners_01.png&quot;&gt;&lt;img src=&quot;https://blog.smemory.org/img/20220527_01_RFB_request_for_banners_01.png&quot; alt=&quot;description&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&quot;scope%3A&quot;&gt;Scope: &lt;a class=&quot;direct-link&quot; href=&quot;#scope%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;What if we, hypothetically, wanted to retrieve all the banners of ssh server exposed on the internet?&lt;br&gt;
This post analyzes the hypothetical steps I would undertake.&lt;/p&gt;
&lt;h1 id=&quot;why%3A&quot;&gt;Why: &lt;a class=&quot;direct-link&quot; href=&quot;#why%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Say that we have an honeypot that has hardcoded the ssh banner,&lt;br&gt;
I may want to see which are the most common banners to better blend it amongst real ssh servers.&lt;/p&gt;
&lt;p&gt;There&#39;s also a simpler way described at the end of the post.&lt;/p&gt;
&lt;h1 id=&quot;the-scan%3A&quot;&gt;The scan: &lt;a class=&quot;direct-link&quot; href=&quot;#the-scan%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;First of all we need to define what we mean by &amp;quot;all ssh servers exposed&amp;quot;,&lt;br&gt;
I think we can be more than happy considering only port 22 TCP and not possible different custom ports.&lt;/p&gt;
&lt;p&gt;Furthermore I sensed that it would be not wise to scan the &lt;em&gt;whole&lt;/em&gt; 0.0.0.0/0 subnet, since there are organizations and people on it&#39;s space that are touchy towards unwanted scans,&lt;br&gt;
it would be a clever idea to use an exclusion list to skip those IPs and CIDRs, a suitable list looks like this: &lt;a href=&quot;https://github.com/robertdavidgraham/masscan/blob/master/data/exclude.conf&quot;&gt;exclude.conf&lt;/a&gt; (in the same repo of masscan).&lt;/p&gt;
&lt;h1 id=&quot;the-scanner%3A&quot;&gt;The scanner: &lt;a class=&quot;direct-link&quot; href=&quot;#the-scanner%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I would use masscan since it has many features and it looks like it&#39;s very fast.&lt;/p&gt;
&lt;p&gt;The command I think it would look like this:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;masscan &lt;span class=&quot;token number&quot;&gt;0.0&lt;/span&gt;.0.0/0 -p22 --banners --source-ip &lt;span class=&quot;token number&quot;&gt;192.168&lt;/span&gt;.0.3 --excludefile exclude.conf -oJ output.json --rate &lt;span class=&quot;token number&quot;&gt;100000&lt;/span&gt; --connection-timeout &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Note that for banner scanning we need to provide another ip in the same network, the &amp;quot;--source-ip&amp;quot;, see [&lt;a href=&quot;https://github.com/robertdavidgraham/masscan/#banner-checking&quot;&gt;0&lt;/a&gt;]&lt;/p&gt;
&lt;p&gt;I would then output everything to a Json file to be able to work the data with Elastic.&lt;/p&gt;
&lt;p&gt;For the rate I expect 100000 to be a fair value.&lt;/p&gt;
&lt;p&gt;For the connection timeout I expect that 1sec would be more than ok to distinguish between a valid ssh server and something else.&lt;/p&gt;
&lt;p&gt;I expect the final file to weight abount 4GB and the scan to take about 10+ hours to complete.&lt;/p&gt;
&lt;h1 id=&quot;processing-data%3A&quot;&gt;Processing data: &lt;a class=&quot;direct-link&quot; href=&quot;#processing-data%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;After grepping only the lines containing the banners from the output file of masscan,&lt;br&gt;
I would totally use Elastic importing the Json and applying the geo-ip filter on the ip field:&lt;/p&gt;
&lt;p&gt;I would filter the outputed json data of masscan selecting only the lines with banners:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;grep&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;banner&quot;&lt;/span&gt; output.json &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; output_onlybanners.json&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;the Logstash config file to import that data would be like:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;input {
   file {
      start_position =&amp;gt; &amp;quot;beginning&amp;quot;
      path =&amp;gt; &amp;quot;output_onlybanners.json&amp;quot;
      sincedb_path =&amp;gt; &amp;quot;/dev/null&amp;quot;
      codec =&amp;gt;   json
      type =&amp;gt; &amp;quot;json-log&amp;quot;
   }
}

filter {
    if [type] == &amp;quot;json-log&amp;quot; {
        date {
            match =&amp;gt; [ &amp;quot;timestamp&amp;quot;, &amp;quot;UNIX&amp;quot; ]
        }
    }

    geoip {
      default_database_type =&amp;gt; &amp;quot;City&amp;quot;
      source =&amp;gt; &amp;quot;ip&amp;quot;
      tag_on_failure =&amp;gt; [&amp;quot;geoip-city-failed&amp;quot;]
    }

    geoip {
      default_database_type =&amp;gt; &amp;quot;ASN&amp;quot;
      source =&amp;gt; &amp;quot;ip&amp;quot;
      tag_on_failure =&amp;gt; [&amp;quot;geoip-asn-failed&amp;quot;]
    }

}

output {
  elasticsearch {
       hosts =&amp;gt; &amp;quot;http://localhost:9200&amp;quot;
       index =&amp;gt; &amp;quot;bannerscan&amp;quot;
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;and I would start the import with this command:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;/usr/share/logstash/bin/logstash -f logstash.conf&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id=&quot;reading-data%3A&quot;&gt;Reading data: &lt;a class=&quot;direct-link&quot; href=&quot;#reading-data%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Once imported in Elastic we could create our dashboards with Kibana and see which banners are more common so we could select one to use with our honeypot to better blend it.&lt;/p&gt;
&lt;p&gt;so our hypothetical list of the most common banners might be something like this:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SSH-2.0-OpenSSH_8.4p1 Debian-5&lt;/li&gt;
&lt;li&gt;SSH-2.0-OpenSSH_8.2p1 Ubuntu-4ubuntu0.5&lt;/li&gt;
&lt;li&gt;SSH-2.0-OpenSSH_7.2p2 Ubuntu-4ubuntu2.10&lt;/li&gt;
&lt;li&gt;SSH-2.0-dropbear_2017.75&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;the-much-simpler-way%3A&quot;&gt;The much simpler way: &lt;a class=&quot;direct-link&quot; href=&quot;#the-much-simpler-way%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;from your machine ask your ssh client the version:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;ssh&lt;/span&gt; -V &lt;span class=&quot;token operator&quot;&gt;&lt;span class=&quot;token file-descriptor important&quot;&gt;2&lt;/span&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token file-descriptor important&quot;&gt;&amp;amp;1&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;/dev/null &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;cut&lt;/span&gt; -f1 -d&lt;span class=&quot;token string&quot;&gt;&#39;,&#39;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;which results in:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;OpenSSH_7.9p1 Debian-10+deb10u2
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;where the banner taken from a telnet/other connection on the ssh port would be:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;SSH-2.0-OpenSSH_7.9p1 Debian-10+deb10u2
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;so the difference lies just in that &amp;quot;SSH-2.0-&amp;quot; we can add to the string, resulting in this command:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ssh_banner=$(ssh -V 2&amp;gt;&amp;amp;1 &amp;gt;/dev/null | cut -f1 -d&#39;,&#39;) ; echo &amp;quot;SSH-2.0-&amp;quot;$ssh_banner
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;info%3A&quot;&gt;INFO: &lt;a class=&quot;direct-link&quot; href=&quot;#info%3A&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The IPs in the IPv4 space are 4,294,967,296 (2^32) in total, since there are 588,514,304 reserved addresses in the end we have 3,706,452,992 public addresses. [&lt;a href=&quot;https://stackoverflow.com/a/2437185/17756526&quot;&gt;1&lt;/a&gt;]&lt;/p&gt;
&lt;h2 id=&quot;todo%3A&quot;&gt;TODO: &lt;a class=&quot;direct-link&quot; href=&quot;#todo%3A&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[ ]&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;links%3A&quot;&gt;links: &lt;a class=&quot;direct-link&quot; href=&quot;#links%3A&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
</content>
	</entry>
	
	<entry>
		<title>MapleGrid: DIY distributed SSH honeypot using ELK stack</title>
		<link href="https://blog.smemory.org/posts/20220525_01_maplegrid_honeypot/"/>
		<updated>2022-05-25T00:00:00+00:00</updated>
		<id>https://blog.smemory.org/posts/20220525_01_maplegrid_honeypot/</id>
		<content type="html">&lt;p&gt;&lt;a href=&quot;https://blog.smemory.org/img/20220525_01_maplegrid_honeypot_01.png&quot;&gt;&lt;img src=&quot;https://blog.smemory.org/img/20220525_01_maplegrid_honeypot_01.png&quot; alt=&quot;description&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&quot;scope%3A&quot;&gt;Scope: &lt;a class=&quot;direct-link&quot; href=&quot;#scope%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Building an honeypot &amp;quot;network&amp;quot; with a central instance that aggregates the data collected.&lt;/p&gt;
&lt;h1 id=&quot;idea%3A&quot;&gt;Idea: &lt;a class=&quot;direct-link&quot; href=&quot;#idea%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.smemory.org/img/20220525_01_maplegrid_honeypot_02.png&quot;&gt;&lt;img src=&quot;https://blog.smemory.org/img/20220525_01_maplegrid_honeypot_02.png&quot; alt=&quot;description&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The idea is having as many &amp;quot;leaves&amp;quot; as we may so we can sense the &amp;quot;wind&amp;quot; and send everything to a central &amp;quot;trunk&amp;quot; where the info is processed.&lt;br&gt;
This way we can have our little network of ssh honeypots and do something with the data.&lt;/p&gt;
&lt;p&gt;the &amp;quot;leaves&amp;quot; will leverage &lt;a href=&quot;https://github.com/regit/pshitt&quot;&gt;Pshitt&lt;/a&gt; made by &lt;a href=&quot;https://github.com/regit&quot;&gt;regit&lt;/a&gt;, a python program that simulates an ssh server with user/pass authentication.&lt;br&gt;
Differently from a real ssh server Pshitt stores the data of the brute force access in json format, for example:&lt;/p&gt;
&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;&quot;username&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;user&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;try&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;src_port&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;47097&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;software_version&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;libssh2_1.4.2&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;timestamp&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2022-05-25T19:50:00.123456&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;src_ip&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;123.123.123.123&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;mac&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;hmac-sha1&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;cipher&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;aes128-ctr&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;password&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;password&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;username&lt;/li&gt;
&lt;li&gt;try: number of 3 tries allowed before disconnection&lt;/li&gt;
&lt;li&gt;src_port&lt;/li&gt;
&lt;li&gt;software_version&lt;/li&gt;
&lt;li&gt;timestamp&lt;/li&gt;
&lt;li&gt;src_ip&lt;/li&gt;
&lt;li&gt;mac&lt;/li&gt;
&lt;li&gt;cipher&lt;/li&gt;
&lt;li&gt;password&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;components%3A&quot;&gt;Components: &lt;a class=&quot;direct-link&quot; href=&quot;#components%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h3 id=&quot;pshitt&quot;&gt;pshitt &lt;a class=&quot;direct-link&quot; href=&quot;#pshitt&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;our ssh honeypot&lt;/p&gt;
&lt;h3 id=&quot;filebeat&quot;&gt;filebeat &lt;a class=&quot;direct-link&quot; href=&quot;#filebeat&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;a lightweight log-shipper to be used on the leaves&lt;/p&gt;
&lt;h3 id=&quot;logstash&quot;&gt;logstash &lt;a class=&quot;direct-link&quot; href=&quot;#logstash&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;where we do a little processing of the data and add geo-ip data&lt;br&gt;
I tried using logstash directly on the leaves but it&#39;s too resource hungry&lt;/p&gt;
&lt;h3 id=&quot;elasticsearch&quot;&gt;elasticsearch &lt;a class=&quot;direct-link&quot; href=&quot;#elasticsearch&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;where we store our data&lt;/p&gt;
&lt;h3 id=&quot;kibana&quot;&gt;kibana &lt;a class=&quot;direct-link&quot; href=&quot;#kibana&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;used for exploring data and creating dashboards&lt;/p&gt;
&lt;h1 id=&quot;network-configuration%3A&quot;&gt;Network configuration: &lt;a class=&quot;direct-link&quot; href=&quot;#network-configuration%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;On the leaves I assume we will have a public ip address, so we can expose:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;port 22: pshitt&lt;/li&gt;
&lt;li&gt;port 22222: the real ssh server we need to manage the machine&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The trunk would not need any exposed port (at least by design) since we should be able to reoute everything via a VPN or protected connection,&lt;br&gt;
in case we cannot do anything like that the port we need to expose:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;port 5044: logstash for filebeat&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;how-to%3A&quot;&gt;How-To: &lt;a class=&quot;direct-link&quot; href=&quot;#how-to%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id=&quot;%22trunk%22-node-(elk-stack)%3A&quot;&gt;&amp;quot;Trunk&amp;quot; node (ELK stack): &lt;a class=&quot;direct-link&quot; href=&quot;#%22trunk%22-node-(elk-stack)%3A&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;install%3A&quot;&gt;Install: &lt;a class=&quot;direct-link&quot; href=&quot;#install%3A&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;install and configure Elasticsearch on a machine,&lt;br&gt;
preferably with some cores and some GB of ram (I am using 4 cores and 6GB ram),&lt;br&gt;
since I am not very keen on ELK (and I am leveraging this project to learn something), I have used these articles: [&lt;a href=&quot;https://medium.com/devops-dudes/how-to-deploy-elasticsearch-5b1105e3063a&quot;&gt;0&lt;/a&gt;] and [&lt;a href=&quot;https://www.elastic.co/guide/en/elasticsearch/reference/current/deb.html&quot;&gt;1&lt;/a&gt;]&lt;/p&gt;
&lt;p&gt;NB: this is a single node &amp;quot;quick and dirty&amp;quot; installation of Elasticsearch and Kibana for a POC.&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;#install ELK v7.x:&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token function&quot;&gt;wget&lt;/span&gt; -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; apt-key &lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt; -&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token function&quot;&gt;apt-get&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; apt-transport-https&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;deb https://artifacts.elastic.co/packages/7.x/apt stable main&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;tee&lt;/span&gt; -a /etc/apt/sources.list.d/elastic-7.x.list&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token function&quot;&gt;apt&lt;/span&gt; update&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token function&quot;&gt;apt&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; elasticsearch kibana logstash filebeat&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;#filebeat is onyl needed if you wish to host the honeypot on the trunk node&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token function&quot;&gt;cat&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt;EOF &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; /etc/elasticsearch/elasticsearch.yml&lt;br&gt;cluster.name: maplegrid&lt;br&gt;node.name: maplenode-01&lt;br&gt;path.data: /var/lib/elasticsearch&lt;br&gt;path.logs: /var/log/elasticsearch&lt;br&gt;network.host: &lt;span class=&quot;token number&quot;&gt;0.0&lt;/span&gt;.0.0&lt;br&gt;discovery.type: single-node&lt;br&gt;node.ingest: &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;br&gt;EOF&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token function&quot;&gt;cat&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt;EOF &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; /etc/kibana/kibana.yml&lt;br&gt;server.port: &lt;span class=&quot;token number&quot;&gt;5601&lt;/span&gt;&lt;br&gt;server.host: &lt;span class=&quot;token string&quot;&gt;&quot;0.0.0.0&quot;&lt;/span&gt;&lt;br&gt;server.name: &lt;span class=&quot;token string&quot;&gt;&quot;maplegrid-kibana&quot;&lt;/span&gt;&lt;br&gt;elasticsearch.hosts: &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;http://localhost:9200&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;br&gt;EOF&lt;br&gt;&lt;br&gt;systemctl &lt;span class=&quot;token builtin class-name&quot;&gt;enable&lt;/span&gt; elasticsearch&lt;br&gt;systemctl &lt;span class=&quot;token builtin class-name&quot;&gt;enable&lt;/span&gt; logstash&lt;br&gt;systemctl &lt;span class=&quot;token builtin class-name&quot;&gt;enable&lt;/span&gt; kibana&lt;br&gt;systemctl start elasticsearch&lt;br&gt;systemctl start logstash&lt;br&gt;systemctl start kibana&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;check-if-elasticsearch-is-ok%3A&quot;&gt;Check if Elasticsearch is ok: &lt;a class=&quot;direct-link&quot; href=&quot;#check-if-elasticsearch-is-ok%3A&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;at this point you should be able to ask Elastic how it feels:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; -XGET http://localhost:9200/_cluster/health?pretty&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;expecting an answer like this:&lt;/p&gt;
&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token property&quot;&gt;&quot;cluster_name&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;maplegrid&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token property&quot;&gt;&quot;status&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;yellow&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token property&quot;&gt;&quot;timed_out&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token property&quot;&gt;&quot;number_of_nodes&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token property&quot;&gt;&quot;number_of_data_nodes&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token property&quot;&gt;&quot;active_primary_shards&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;15&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token property&quot;&gt;&quot;active_shards&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;15&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token property&quot;&gt;&quot;relocating_shards&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token property&quot;&gt;&quot;initializing_shards&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token property&quot;&gt;&quot;unassigned_shards&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token property&quot;&gt;&quot;delayed_unassigned_shards&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token property&quot;&gt;&quot;number_of_pending_tasks&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token property&quot;&gt;&quot;number_of_in_flight_fetch&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token property&quot;&gt;&quot;task_max_waiting_in_queue_millis&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token property&quot;&gt;&quot;active_shards_percent_as_number&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;83.33333333333334&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;and you should be able to connect to Kibana on the ip address of the server on port 5601.&lt;/p&gt;
&lt;h3 id=&quot;logstash-config%3A&quot;&gt;Logstash config: &lt;a class=&quot;direct-link&quot; href=&quot;#logstash-config%3A&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;now we can configure Logstash:&lt;/p&gt;
&lt;p&gt;edit /etc/logstash/conf.d/pshitt.conf&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;input {
  beats {
    port =&amp;gt; 5044
  }
}

filter {
    # warn logstash that timestamp is the one to use
    if [type] == &amp;quot;json-log&amp;quot; {
        date {
            match =&amp;gt; [ &amp;quot;timestamp&amp;quot;, &amp;quot;ISO8601&amp;quot; ]
        }
    }

    geoip {
      default_database_type =&amp;gt; &amp;quot;City&amp;quot;
      source =&amp;gt; &amp;quot;src_ip&amp;quot;
      tag_on_failure =&amp;gt; [&amp;quot;geoip-city-failed&amp;quot;]
    }

    geoip {
      default_database_type =&amp;gt; &amp;quot;ASN&amp;quot;
      source =&amp;gt; &amp;quot;src_ip&amp;quot;
      tag_on_failure =&amp;gt; [&amp;quot;geoip-asn-failed&amp;quot;]
    }

}

output {
  elasticsearch {
       hosts =&amp;gt; &amp;quot;http://localhost:9200&amp;quot;
       index =&amp;gt; &amp;quot;pshitt&amp;quot;
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;As you can see our input is not a file but we&#39;ll listen on port 5044 for our remote filebeat clients.&lt;/p&gt;
&lt;p&gt;The &amp;quot;geo-ip&amp;quot; part is needed to add the geo-data info starting from the attacker IP,&lt;br&gt;
the split configuration is needed because the filter can process &amp;quot;City&amp;quot; or &amp;quot;ASN&amp;quot; data but not both at the same time,&lt;br&gt;
so we need to split the configuration. Thanks to leandrojmp [&lt;a href=&quot;https://web.leandrojmp.com/posts/en/2020/10/logstash-geoip&quot;&gt;2&lt;/a&gt;].&lt;/p&gt;
&lt;p&gt;The output is out Elasticsearch node.&lt;/p&gt;
&lt;p&gt;the restart Logstash:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;systemctl retart logstash&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;in case you need to debug logstash (I had to), you can read: /var/log/logstash/logstash-plain.log&lt;/p&gt;
&lt;h2 id=&quot;%22leaf%22-node-(honeypot-%2B-logshipper)%3A&quot;&gt;&amp;quot;Leaf&amp;quot; node (honeypot + logshipper): &lt;a class=&quot;direct-link&quot; href=&quot;#%22leaf%22-node-(honeypot-%2B-logshipper)%3A&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I&#39;ve create an Ansible playbook to configure everything but we&#39;ll obviously see the steps,&lt;br&gt;
it&#39;s been test on both Debian 9 and 10.&lt;/p&gt;
&lt;h3 id=&quot;ansible-playbook%3A&quot;&gt;Ansible Playbook: &lt;a class=&quot;direct-link&quot; href=&quot;#ansible-playbook%3A&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Playbook: &lt;a href=&quot;https://blog.smemory.org/img/20220525_01_maplegrid_honeypot_files/maplegrid.yml&quot;&gt;maplegrid.yml&lt;/a&gt;&lt;br&gt;
Variables file: &lt;a href=&quot;https://blog.smemory.org/img/20220525_01_maplegrid_honeypot_files/maplegrid_variables.yml&quot;&gt;maplegrid_variables.yml&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;add-elastic-repo-and-install-filebeat%3A&quot;&gt;Add elastic repo and install filebeat: &lt;a class=&quot;direct-link&quot; href=&quot;#add-elastic-repo-and-install-filebeat%3A&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; -fsSL https://artifacts.elastic.co/GPG-KEY-elasticsearch &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; apt-key &lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt; -&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token function&quot;&gt;apt-get&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; apt-transport-https&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;deb https://artifacts.elastic.co/packages/7.x/apt stable main&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;tee&lt;/span&gt; -a /etc/apt/sources.list.d/elastic-7.x.list&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token function&quot;&gt;apt&lt;/span&gt; update&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token function&quot;&gt;apt&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; filebeat&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;change-ports%3A&quot;&gt;change ports: &lt;a class=&quot;direct-link&quot; href=&quot;#change-ports%3A&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;in /etc/ssh/sshd_config we&#39;ll change the port to 22222&lt;br&gt;
Port 22222&lt;/p&gt;
&lt;p&gt;(if you are using it, but you really should) in fail2ban we are gonna change the port of the ssh jail to 22222,&lt;br&gt;
look for the config:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;sshd&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;br&gt;port    &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;ssh&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;and change it to:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;sshd&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;br&gt;port    &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;22222&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;!!!!!!!FIX YOU FIREWALL TO ALLOW CONNECTION ON PORT 22222!!!!!!!! (Ansible will do this for you if you are using iptables, otherwise it&#39;s your task)&lt;/p&gt;
&lt;p&gt;then restart fail2ban and ssh:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;systemctl restart fail2ban&lt;br&gt;systemctl restart &lt;span class=&quot;token function&quot;&gt;ssh&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;in this moment your connection will remain active,&lt;br&gt;
it&#39;s the moment if you can ssh into the machine on port 22222:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;ssh&lt;/span&gt; user@machine -p &lt;span class=&quot;token number&quot;&gt;22222&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;pshitt%3A&quot;&gt;Pshitt: &lt;a class=&quot;direct-link&quot; href=&quot;#pshitt%3A&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;install the dependencies of pshitt:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;apt&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; python-pip&lt;br&gt;pip &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; python-daemon argparse paramiko&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;clone the repo of Pshitt in /srv/pshitt:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; clone https://github.com/regit/pshitt /srv/pshitt&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;create the systemd unitfile we are going to use to start the service,&lt;br&gt;
create the log directory and enable+start pshitt:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;cat&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt;EOF &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; /etc/systemd/system/pshitt.service&lt;br&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;Unit&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token assign-left variable&quot;&gt;Description&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;pshitt &lt;span class=&quot;token function&quot;&gt;service&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token assign-left variable&quot;&gt;Wants&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;network-online.target&lt;br&gt;&lt;span class=&quot;token assign-left variable&quot;&gt;After&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;network-online.target&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;Service&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token assign-left variable&quot;&gt;ExecStart&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;/srv/pshitt/pshitt.py -p &lt;span class=&quot;token number&quot;&gt;22&lt;/span&gt; -k /etc/ssh/ssh_host_rsa_key -o /var/log/pshitt/data.json -l /var/log/pshitt/log.log&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;Install&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token assign-left variable&quot;&gt;WantedBy&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;multi-user.target&lt;br&gt;EOF&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token function&quot;&gt;mkdir&lt;/span&gt; /var/log/pshitt&lt;br&gt;&lt;br&gt;systemctl &lt;span class=&quot;token builtin class-name&quot;&gt;enable&lt;/span&gt; pshitt&lt;br&gt;systemctl start pshitt&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;notice the &amp;quot;-k /etc/ssh/ssh_host_rsa_key&amp;quot;,&lt;br&gt;
we are using the keys of our real machine and not the ones shipped with pshitt to avoid being discovered.&lt;/p&gt;
&lt;p&gt;at this point if you try to log into your honeypot:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;ssh&lt;/span&gt; -o &lt;span class=&quot;token assign-left variable&quot;&gt;PreferredAuthentications&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;password -o &lt;span class=&quot;token assign-left variable&quot;&gt;PubkeyAuthentication&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;no user@YOUR_PUB_IP -p &lt;span class=&quot;token number&quot;&gt;22&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;you should se an entry in /var/log/pshitt/data.json&lt;/p&gt;
&lt;h3 id=&quot;filebeat%3A&quot;&gt;Filebeat: &lt;a class=&quot;direct-link&quot; href=&quot;#filebeat%3A&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;now we can configure filebeat to send the data to logstash (change the strings starting with &amp;quot;YOUR_&amp;quot;:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;cat&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt;EOF &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; /etc/filebeat/filebeat.yml&lt;br&gt;filebeat.inputs:&lt;br&gt;- type: log&lt;br&gt;  enabled: &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;br&gt;  paths:&lt;br&gt;    - /var/log/pshitt/data.json&lt;br&gt;  json.keys_under_root: &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;br&gt;&lt;br&gt;processors:&lt;br&gt;  - drop_fields:&lt;br&gt;      fields: &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;beat&quot;&lt;/span&gt;, &lt;span class=&quot;token string&quot;&gt;&quot;source&quot;&lt;/span&gt;, &lt;span class=&quot;token string&quot;&gt;&quot;prospector&quot;&lt;/span&gt;, &lt;span class=&quot;token string&quot;&gt;&quot;offset&quot;&lt;/span&gt;, &lt;span class=&quot;token string&quot;&gt;&quot;host&quot;&lt;/span&gt;, &lt;span class=&quot;token string&quot;&gt;&quot;log&quot;&lt;/span&gt;, &lt;span class=&quot;token string&quot;&gt;&quot;input&quot;&lt;/span&gt;, &lt;span class=&quot;token string&quot;&gt;&quot;event&quot;&lt;/span&gt;, &lt;span class=&quot;token string&quot;&gt;&quot;fileset&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;br&gt;  - add_fields:&lt;br&gt;      target: &lt;span class=&quot;token string&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;br&gt;      fields:&lt;br&gt;        pshitt_host: YOUR_LEAF_NODE_NAME&lt;br&gt;&lt;br&gt;output.logstash:&lt;br&gt;  hosts: &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;YOUR_LOGSTASH_IP:YOUR_LOGASTASH_BEAT-PORT&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;#Filebeat service logging:&lt;/span&gt;&lt;br&gt;logging.level: info&lt;br&gt;logging.to_files: &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;br&gt;logging.files:&lt;br&gt;  path: /var/log/filebeat&lt;br&gt;  name: filebeat&lt;br&gt;  keepfiles: &lt;span class=&quot;token number&quot;&gt;7&lt;/span&gt;&lt;br&gt;  permissions: 0640&lt;br&gt;EOF&lt;br&gt;&lt;br&gt;systemctl &lt;span class=&quot;token builtin class-name&quot;&gt;enable&lt;/span&gt; filebeat&lt;br&gt;systemctl start filebeat&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;at this point if we try another login on the honeypot we should see the data in Kibana.&lt;/p&gt;
&lt;h3 id=&quot;kibana%3A&quot;&gt;Kibana: &lt;a class=&quot;direct-link&quot; href=&quot;#kibana%3A&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;log into Kibana and create a new index pattern:&lt;/p&gt;
&lt;p&gt;Management --&amp;gt; Kibana --&amp;gt; Index Patterns --&amp;gt; New&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Name: pshitt*&lt;/li&gt;
&lt;li&gt;Timestamp field: @timestamp&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;now go to:&lt;/p&gt;
&lt;p&gt;Analytics --&amp;gt; Discover&lt;/p&gt;
&lt;p&gt;select your index pattern and you should see some data&lt;/p&gt;
&lt;p&gt;we can also create dashboards ( Analytics --&amp;gt; Dashboard ),&lt;br&gt;
I&#39;ve tried to export what I did (it still lacks geo-ip data since I have some issues), but I don&#39;t know if the import works:&lt;/p&gt;
&lt;p&gt;Kibana Dashboard: &lt;a href=&quot;https://blog.smemory.org/img/20220525_01_maplegrid_honeypot_files/kibana_dashboard.njson&quot;&gt;kibana_dashboard.njson&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;My dashboard:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.smemory.org/img/20220525_01_maplegrid_honeypot_03.png&quot;&gt;&lt;img src=&quot;https://blog.smemory.org/img/20220525_01_maplegrid_honeypot_03.png&quot; alt=&quot;description&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This is the data from 1 hour, we can see the ingestion from different &amp;quot;leaves&amp;quot;.&lt;/p&gt;
&lt;p&gt;with the field &amp;quot;pshitt_host&amp;quot; we can understand which leaf sent the data,&lt;br&gt;
actually filebeat adds some data so the same info, taken from the vm hostname of the leaf is also found in  &amp;quot;agent.hostname&amp;quot; and &amp;quot;&lt;a href=&quot;http://agent.name/&quot;&gt;agent.name&lt;/a&gt;&amp;quot;,&lt;br&gt;
I&#39;ve added it anyway because in the first tests with Logstash I hadn&#39;t the additional fields.&lt;/p&gt;
&lt;h1 id=&quot;%22historical-data%22%3A&quot;&gt;&amp;quot;Historical data&amp;quot;: &lt;a class=&quot;direct-link&quot; href=&quot;#%22historical-data%22%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;one of the next steps would be importing the &amp;quot;Historical&amp;quot; data:&lt;/p&gt;
&lt;p&gt;This data comes from when I had the predecessor of maplegrid online, which collector more than 5 million unique records in the timespan of 2016-2019 (with some service disruptions in the middle),&lt;br&gt;
at the time the idea was &amp;quot;retrieving&amp;quot; other people&#39;s wordlist&lt;/p&gt;
&lt;p&gt;Obviously the relevance of the data regarding the IPs is not very much today, but might be interesting to see the statistics of username and passwords, other than testing everything with much more data than now.&lt;/p&gt;
&lt;p&gt;On this regard, this is the Logstash configuration to ingest from a local json file:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;input {
   file {
      start_position =&amp;gt; &amp;quot;beginning&amp;quot;
      path =&amp;gt; &amp;quot;/var/log/pshitt/data.json&amp;quot;
      sincedb_path =&amp;gt; &amp;quot;/dev/null&amp;quot;
      codec =&amp;gt;   json
      type =&amp;gt; &amp;quot;json-log&amp;quot;
   }
}

filter {
    if [type] == &amp;quot;json-log&amp;quot; {
        date {
            match =&amp;gt; [ &amp;quot;timestamp&amp;quot;, &amp;quot;ISO8601&amp;quot; ]
        }
    }

    geoip {
      default_database_type =&amp;gt; &amp;quot;City&amp;quot;
      source =&amp;gt; &amp;quot;src_ip&amp;quot;
      tag_on_failure =&amp;gt; [&amp;quot;geoip-city-failed&amp;quot;]
    }

    geoip {
      default_database_type =&amp;gt; &amp;quot;ASN&amp;quot;
      source =&amp;gt; &amp;quot;src_ip&amp;quot;
      tag_on_failure =&amp;gt; [&amp;quot;geoip-asn-failed&amp;quot;]
    }

    mutate {
      add_field =&amp;gt; { &amp;quot;pshitt_host&amp;quot; =&amp;gt; &amp;quot;YOUR_ORIGINAL_HOST&amp;quot; }
    }    
}

output {
  elasticsearch {
       hosts =&amp;gt; &amp;quot;http://localhost:9200&amp;quot;
       index =&amp;gt; &amp;quot;YOUR_ANOTHER_INDEX&amp;quot;
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;and you can execute logstash with a single config file like this:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;/usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/YOUR_CONFIGFILE.conf&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;todo%3A&quot;&gt;TODO: &lt;a class=&quot;direct-link&quot; href=&quot;#todo%3A&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[ ] kibana/logstash: fix geo-data&lt;/li&gt;
&lt;li&gt;[ ] elasticsearch: understand clustering/data redundancy&lt;/li&gt;
&lt;li&gt;[ ] elasticsearch: understand indexes&lt;/li&gt;
&lt;li&gt;[ ] enable passwords on Elasticsearch and Kibana&lt;/li&gt;
&lt;li&gt;[ ] import &amp;quot;historical&amp;quot; data&lt;/li&gt;
&lt;li&gt;[ ] add the ssh version in pshitt:
&lt;ul&gt;
&lt;li&gt;pshitt hardcodes &amp;quot;OpenSSH_6.6.1p1 Debian-5&amp;quot; as the ssh version, it should be changed to the real one of the vm (or randomly picked from a list) to avoid the fact that it&#39;s an honeypot&lt;/li&gt;
&lt;li&gt;to retrieve the local ssh version: ssh -V 2&amp;gt;&amp;amp;1 &amp;gt;/dev/null | cut -f1 -d&#39;,&#39;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;[ ] add the public ip of the leaf to the data
&lt;ul&gt;
&lt;li&gt;this way we can apply geo-ip also to the dest_ip and try to plot that&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;notes%3A&quot;&gt;Notes: &lt;a class=&quot;direct-link&quot; href=&quot;#notes%3A&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;the &amp;quot;trunk&amp;quot; vm (ELK stack):
&lt;ul&gt;
&lt;li&gt;OS: Debian 10&lt;/li&gt;
&lt;li&gt;CPU: 4 core&lt;/li&gt;
&lt;li&gt;RAM: 6gb&lt;/li&gt;
&lt;li&gt;Disk: 40gb&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;2 &amp;quot;leaves&amp;quot;:
&lt;ul&gt;
&lt;li&gt;OS: Debian 9&lt;/li&gt;
&lt;li&gt;CPU: 1 core&lt;/li&gt;
&lt;li&gt;RAM: 0.5gb&lt;/li&gt;
&lt;li&gt;Disk: 10gb&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;2 &amp;quot;leaves&amp;quot;:
&lt;ul&gt;
&lt;li&gt;OS: Debian 10&lt;/li&gt;
&lt;li&gt;CPU: 1 core&lt;/li&gt;
&lt;li&gt;RAM: 0.5gb&lt;/li&gt;
&lt;li&gt;Disk: 10gb&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;links%3A&quot;&gt;links: &lt;a class=&quot;direct-link&quot; href=&quot;#links%3A&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
</content>
	</entry>
	
	<entry>
		<title>DIY balancer using DNS</title>
		<link href="https://blog.smemory.org/posts/20220201_01_diy-balancer-with-dns/"/>
		<updated>2022-02-01T00:00:00+00:00</updated>
		<id>https://blog.smemory.org/posts/20220201_01_diy-balancer-with-dns/</id>
		<content type="html">&lt;p&gt;&lt;a href=&quot;https://blog.smemory.org/img/20220201_01-diy-balancer-with-dns_01.jpg&quot;&gt;&lt;img src=&quot;https://blog.smemory.org/img/20220201_01-diy-balancer-with-dns_01.jpg&quot; alt=&quot;description&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&quot;scope%3A&quot;&gt;Scope: &lt;a class=&quot;direct-link&quot; href=&quot;#scope%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;The scope of this project is to provide a pre-tested layer of protection for the publication of a service, via an external machine, ideally a cheap vps without any important data onboard.&lt;/p&gt;
&lt;p&gt;This approach allows us to have &amp;quot;higly mobile&amp;quot; services since the won&#39;t be directly published to the world.&lt;/p&gt;
&lt;h3 id=&quot;requisites%3A&quot;&gt;Requisites: &lt;a class=&quot;direct-link&quot; href=&quot;#requisites%3A&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;no sensitive data on the external machines (so NO ssl certificates)&lt;/li&gt;
&lt;li&gt;somewhat redundant&lt;/li&gt;
&lt;li&gt;easy-ish to manage&lt;/li&gt;
&lt;li&gt;almost-&amp;quot;cattle&amp;quot; approach to the external machines&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;pros%3A&quot;&gt;Pros: &lt;a class=&quot;direct-link&quot; href=&quot;#pros%3A&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;decoupling the exit (or entrance) point of a service and it&#39;s location&lt;/li&gt;
&lt;li&gt;almost open participation: if someone in your trust circle wants to contribute, may manage an external machine&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;cons%3A&quot;&gt;Cons: &lt;a class=&quot;direct-link&quot; href=&quot;#cons%3A&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;managing overhead&lt;/li&gt;
&lt;li&gt;more machines&lt;/li&gt;
&lt;li&gt;latency (greater the path, greater the latency)&lt;/li&gt;
&lt;li&gt;the central power remains whomever manages the DNS&lt;/li&gt;
&lt;li&gt;HSTS might break how haproxy reads the SNI request and redirects without terminating the https protocol&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;idea%3A&quot;&gt;Idea: &lt;a class=&quot;direct-link&quot; href=&quot;#idea%3A&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.smemory.org/img/20220201_01-diy-balancer-with-dns_02.jpg&quot;&gt;&lt;img src=&quot;https://blog.smemory.org/img/20220201_01-diy-balancer-with-dns_02.jpg&quot; alt=&quot;description&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;layers%3A&quot;&gt;layers: &lt;a class=&quot;direct-link&quot; href=&quot;#layers%3A&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;external%3A&quot;&gt;External: &lt;a class=&quot;direct-link&quot; href=&quot;#external%3A&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;in this layer we find the external machines, they are configured with:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;haproxy&lt;/li&gt;
&lt;li&gt;bind&lt;/li&gt;
&lt;li&gt;auto updater script to pull the config changes from a git&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;the dns records of the services are pointed to those machines,&lt;br&gt;
see the BIND section for more info on the redundancy approach.&lt;/p&gt;
&lt;h3 id=&quot;vpn%3A&quot;&gt;VPN: &lt;a class=&quot;direct-link&quot; href=&quot;#vpn%3A&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;this layer provides a layer of anonimity and flexibility between the external machines and the ones with the services onboard.&lt;/p&gt;
&lt;p&gt;we made this with a full-mesh network like tinc, which provides a &amp;quot;virtual L2 switch&amp;quot; with alle the machines connected.&lt;/p&gt;
&lt;p&gt;the services machines and the external ones connect to these 2 (or more) machines&lt;/p&gt;
&lt;h3 id=&quot;services%3A&quot;&gt;Services: &lt;a class=&quot;direct-link&quot; href=&quot;#services%3A&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;in this layer we find the machines that provide the actual services&lt;/p&gt;
&lt;h2 id=&quot;what-we-use%3A&quot;&gt;what we use: &lt;a class=&quot;direct-link&quot; href=&quot;#what-we-use%3A&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;haproxy%3A&quot;&gt;haproxy: &lt;a class=&quot;direct-link&quot; href=&quot;#haproxy%3A&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;to proxy the connections without terminating the SSL, thus not having any SSL certificate on the external machines, we need to use haproxy to read the SNI and, using ACLs, send the connection to the correct backend.&lt;/p&gt;
&lt;h3 id=&quot;bind%3A&quot;&gt;bind: &lt;a class=&quot;direct-link&quot; href=&quot;#bind%3A&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;bind provides our poor-fella&#39;s redundancy to our machines,&lt;br&gt;
this is done by hosting a bind instance on every external machine and delegating a zone to each of them, for example: &lt;a href=&quot;http://balanced.domain.net/&quot;&gt;balanced.domain.net&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;domain hosting configuration example:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;balanced 300 IN NS machine01.domain.net.
balanced 300 IN NS machine02.domain.net.
balanced 300 IN NS machine03.domain.net.

machine01 300 IN A 100.100.100.1
machine02 300 IN A 100.100.100.2
machine03 300 IN A 100.100.100.3
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;every machine&#39;s bind has a record for a common host inside that zone that is pointed to the machine itself, for example: &lt;a href=&quot;http://publish.balanced.domain.net/&quot;&gt;publish.balanced.domain.net&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;bind configuration on machine01 example:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ORIGIN .
; ---Area 1---
$TTL 300      ; 5min

; ---Area 2---
balanced.domain.net       IN      SOA     machine01.balanced.domain.net. root.balanced.domain.net. (
                                  2021100101 ; serial
                                  300      ; refresh (5 min)
                                  300      ; retry (5 min)
                                  600     ; expire (10 min)
                                  300      ; minimum (5 min)
                                );
; ---Area 3---
                IN      NS      machine01.balanced.domain.net.
; ---Area 4---

$ORIGIN balanced.domain.net.
;NOTE: machine01 is the server that solves the names
machine01               300     IN      A        100.100.100.1

;NOTE: here we can define the content of our zone:
publish                 30      IN      A       100.100.100.1
balanced.domain.net.    300     IN      A       100.100.100.1

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;in this way when we ask the dns for &amp;quot;&lt;a href=&quot;http://publish.balanced.domain.net/&quot;&gt;publish.balanced.domain.net&lt;/a&gt;&amp;quot;, we are told to go ask the 3 machines to solve the zone &amp;quot;&lt;a href=&quot;http://balanced.domain.net/&quot;&gt;balanced.domain.net&lt;/a&gt;&amp;quot;, the first machine that we ask to, and is able to solve names, is the one that will deliver our service.&lt;/p&gt;
&lt;p&gt;there are no primary and secondary servers, in this configuration all the dns are equal.&lt;/p&gt;
&lt;p&gt;example:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;we ask the root servers who has &amp;quot;&lt;a href=&quot;http://publish.balanced.domain.net/&quot;&gt;publish.balanced.domain.net&lt;/a&gt;&amp;quot;&lt;/li&gt;
&lt;li&gt;the root servers say that &amp;quot;&lt;a href=&quot;http://domain.net/&quot;&gt;domain.net&lt;/a&gt;&amp;quot; is managed by the main name-servers for our domain (hoster)&lt;/li&gt;
&lt;li&gt;we ask for &amp;quot;&lt;a href=&quot;http://publish.balanced.domain.net/&quot;&gt;publish.balanced.domain.net&lt;/a&gt;&amp;quot; at the main name-servers for our domain (hoster)&lt;/li&gt;
&lt;li&gt;the hoster&#39;s name-servers answer to that the zone &amp;quot;&lt;a href=&quot;http://balanced.domain.net/&quot;&gt;balanced.domain.net&lt;/a&gt;&amp;quot; is solved by:
&lt;ul&gt;
&lt;li&gt;&amp;quot;&lt;a href=&quot;http://machine01.domain.net/&quot;&gt;machine01.domain.net&lt;/a&gt;&amp;quot;&lt;/li&gt;
&lt;li&gt;&amp;quot;&lt;a href=&quot;http://machine02.domain.net/&quot;&gt;machine02.domain.net&lt;/a&gt;&amp;quot;&lt;/li&gt;
&lt;li&gt;&amp;quot;&lt;a href=&quot;http://machine03.domain.net/&quot;&gt;machine03.domain.net&lt;/a&gt;&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;we ask for &amp;quot;&lt;a href=&quot;http://publish.balanced.domain.net/&quot;&gt;publish.balanced.domain.net&lt;/a&gt;&amp;quot; to machine02 (choosing randomly or at best by lowest latency [&lt;a href=&quot;https://serverfault.com/questions/629429/do-dns-servers-get-queried-in-round-robin-random-or-some-other-fashion&quot;&gt;0&lt;/a&gt;] [&lt;a href=&quot;http://dns.measurement-factory.com/writings/wessels-pam2004-paper.pdf&quot;&gt;1&lt;/a&gt;])&lt;/li&gt;
&lt;li&gt;machine02 answers that &amp;quot;&lt;a href=&quot;http://balanced.domain.net/&quot;&gt;balanced.domain.net&lt;/a&gt;&amp;quot; is solved by &amp;quot;&lt;a href=&quot;http://machine02.balanced.domain.net/&quot;&gt;machine02.balanced.domain.net&lt;/a&gt;&amp;quot; (as specified in the zone file)&lt;/li&gt;
&lt;li&gt;machine02 finally answers that &amp;quot;&lt;a href=&quot;http://publish.balanced.domain.net/&quot;&gt;publish.balanced.domain.net&lt;/a&gt;&amp;quot; is itself, so 100.100.100.2&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;file-sync%3A&quot;&gt;file sync: &lt;a class=&quot;direct-link&quot; href=&quot;#file-sync%3A&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;we want to sync all the configurations on the various servers from a single, maybe shared, point&lt;br&gt;
to do that we&#39;ll use a git repo where we&#39;ll add the configuration,&lt;br&gt;
a script called by cron will check every 2min if the repo changes and download new haproxy config files and restart the service.&lt;/p&gt;
&lt;h2 id=&quot;ansible%3A&quot;&gt;Ansible: &lt;a class=&quot;direct-link&quot; href=&quot;#ansible%3A&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I&#39;ve create an Ansible playbook to create the configurations for you,&lt;br&gt;
the playbook will:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;install dependencies&lt;/li&gt;
&lt;li&gt;install haproxy&lt;/li&gt;
&lt;li&gt;generate ssh keypair for git repo and siplay them for you to add them to the repo&lt;/li&gt;
&lt;li&gt;checkout git repo to retrieve haproxy config to be used&lt;/li&gt;
&lt;li&gt;configure cron to run the sync of the haproxy script every 5min&lt;/li&gt;
&lt;li&gt;configure bind&lt;/li&gt;
&lt;li&gt;create http folder and start http demo server on port 8000&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You&#39;ll be able to visit the site on http and see a demo page.&lt;/p&gt;
&lt;p&gt;For configuration/running just follow instructions in the README file.&lt;/p&gt;
&lt;p&gt;Archive: &lt;a href=&quot;https://blog.smemory.org/img/20220201_01-diy-balancer-with-dns_files/Ansible_DEMO.tgz&quot;&gt;Ansible_DEMO.tgz&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;the content of the archive:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Ansible_DEMO/
Ansible_DEMO/README.md
Ansible_DEMO/repo/
Ansible_DEMO/repo/git_hap-config_autoupdate.j2
Ansible_DEMO/repo/index.j2
Ansible_DEMO/repo/bind_zone.j2
Ansible_DEMO/variables.yml
Ansible_DEMO/run_all.sh
Ansible_DEMO/haproxy.cfg_EXAMPLE
Ansible_DEMO/hosts.yml
Ansible_DEMO/final_output.sh
Ansible_DEMO/main.yml
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;this wants a git repo with your haproxy configfile, just the haproxy.cfg,&lt;br&gt;
I&#39;ve added an example in the archive.&lt;/p&gt;
&lt;h2 id=&quot;todo%3A&quot;&gt;todo: &lt;a class=&quot;direct-link&quot; href=&quot;#todo%3A&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[ ] bind: check TTLs and optimize&lt;/li&gt;
&lt;li&gt;[ ] bind: better define failover behaviour&lt;/li&gt;
&lt;li&gt;[x] bind: define who-asks-what-to-who in a question-answer way&lt;/li&gt;
&lt;li&gt;[X] hap: example configs&lt;/li&gt;
&lt;li&gt;[X] filesync: example config&lt;/li&gt;
&lt;li&gt;[ ] docs: better images with more info&lt;/li&gt;
&lt;li&gt;[X] docs: specify different zones for the external machines to increase redundancy&lt;/li&gt;
&lt;li&gt;[ ] docs: list ports required&lt;/li&gt;
&lt;li&gt;[x] create ansible playbook to automate the tasks&lt;/li&gt;
&lt;li&gt;[ ] general: check if HSTS might break haproxy SNI redirect&lt;/li&gt;
&lt;li&gt;[ ] filesync: add gpg repo signing&lt;/li&gt;
&lt;li&gt;[ ] filesync: add verify of commit sign when auto updating config file&lt;/li&gt;
&lt;li&gt;[x] filesync: add configfile check before copying and restarting service&lt;/li&gt;
&lt;li&gt;[x] filesync: add overwrite of local file if differs with the repo&#39;s one&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;links%3A&quot;&gt;links: &lt;a class=&quot;direct-link&quot; href=&quot;#links%3A&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
</content>
	</entry>
	
	<entry>
		<title>Ejabberd server, selfhosting our chat audio-videocall server</title>
		<link href="https://blog.smemory.org/posts/20220123_01_ejabberd_xmpp_server/"/>
		<updated>2022-01-23T00:00:00+00:00</updated>
		<id>https://blog.smemory.org/posts/20220123_01_ejabberd_xmpp_server/</id>
		<content type="html">&lt;h1 id=&quot;why%3A&quot;&gt;Why: &lt;a class=&quot;direct-link&quot; href=&quot;#why%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I&#39;ve used a Jabber service provided by a friend until now but I wanted to selfhost mine.&lt;br&gt;
In addition we wanted to debug some incompatibilities with iOS clients like Siskin IM with a brand new installation.&lt;/p&gt;
&lt;h1 id=&quot;guide-i&#39;ve-followed%3A&quot;&gt;Guide I&#39;ve followed: &lt;a class=&quot;direct-link&quot; href=&quot;#guide-i&#39;ve-followed%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I&#39;ve followed this post:&lt;br&gt;
&lt;a href=&quot;https://www.aroundtheglobe.biz/posts/20210819-your_own_xmpp_server_with_ejabberd_on_Debian_11_Bullseye.html&quot;&gt;https://www.aroundtheglobe.biz/posts/20210819-your_own_xmpp_server_with_ejabberd_on_Debian_11_Bullseye.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Most of it is perfect and correct,&lt;br&gt;
just the part about Letsencrypt have changed in the last version I think (see dedicated part)&lt;/p&gt;
&lt;p&gt;I&#39;ve also tried to link all the resources I&#39;ve used in the post and the configfiles.&lt;/p&gt;
&lt;p&gt;for the advanced configs I&#39;ve followed:&lt;br&gt;
&lt;a href=&quot;https://www.process-one.net/blog/how-to-configure-ejabberd-to-get-100-in-xmpp-compliance-test/&quot;&gt;https://www.process-one.net/blog/how-to-configure-ejabberd-to-get-100-in-xmpp-compliance-test/&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&quot;result%3A&quot;&gt;Result: &lt;a class=&quot;direct-link&quot; href=&quot;#result%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;[x] chat between devices on the same installation&lt;/li&gt;
&lt;li&gt;[x] chat between devices on other instances&lt;/li&gt;
&lt;li&gt;[x] audio call on same instance&lt;/li&gt;
&lt;li&gt;[x] audio call with users on other instances&lt;/li&gt;
&lt;li&gt;[x] video call on same instance&lt;/li&gt;
&lt;li&gt;[x] video call with users on other instances&lt;/li&gt;
&lt;li&gt;[x] attachments exchange on same instance&lt;/li&gt;
&lt;li&gt;[x] attachments exchange with users on other instances&lt;/li&gt;
&lt;li&gt;[x] delivery of messages sent when the client was offline&lt;/li&gt;
&lt;li&gt;[] sign up page for users (not in my use case)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;and 100% score on &lt;a href=&quot;https://compliance.conversations.im/&quot;&gt;XMPP Compliance Tester&lt;/a&gt;:&lt;br&gt;
&lt;a href=&quot;https://blog.smemory.org/img/20220123_01_ejabberd_xmpp_server_01.png&quot;&gt;&lt;img src=&quot;https://blog.smemory.org/img/20220123_01_ejabberd_xmpp_server_01.png&quot; alt=&quot;description&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&quot;let&#39;s-start%3A&quot;&gt;Let&#39;s start: &lt;a class=&quot;direct-link&quot; href=&quot;#let&#39;s-start%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;what we are using:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;public facing server (I&#39;ve used Debian 11)&lt;/li&gt;
&lt;li&gt;iptables (you&#39;ll need the ability to open ports)&lt;/li&gt;
&lt;li&gt;domain config (you&#39;ll need to have control over your DNS domain config)&lt;/li&gt;
&lt;li&gt;ejabberd 21.01-2 from Debian 11 &amp;quot;standard&amp;quot; repos&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;install-ejabberd%3A&quot;&gt;Install Ejabberd: &lt;a class=&quot;direct-link&quot; href=&quot;#install-ejabberd%3A&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;apt&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; ejabberd&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id=&quot;firewalling%3A&quot;&gt;Firewalling: &lt;a class=&quot;direct-link&quot; href=&quot;#firewalling%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;We&#39;ll need some (a lot) of ports:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;tcp/5222 for ejabberd_c2s&lt;/li&gt;
&lt;li&gt;tcp/5223 for ejabberd_c2s TLS&lt;/li&gt;
&lt;li&gt;tcp/5269 for ejabberd_s2s_in&lt;/li&gt;
&lt;li&gt;tcp/5270 for ejabberd_s2s_in TLS&lt;/li&gt;
&lt;li&gt;tcp/5280 for ejabberd_http&lt;/li&gt;
&lt;li&gt;tcp/5443 for ejabberd_http TLS&lt;/li&gt;
&lt;li&gt;tcp/5349 for ejabberd_stun UDP&lt;/li&gt;
&lt;li&gt;udp/3478 for ejabberd_stun TCP&lt;/li&gt;
&lt;li&gt;tcp/49152:65535 for turn TCP&lt;/li&gt;
&lt;li&gt;udp/49152:65535 for turn UDP&lt;/li&gt;
&lt;li&gt;tcp/80 to be redirected to tcp/5280&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;the redirection of port 80 to 5280 is used to allow certbot to generate certificates for our installation, ejabberd will run as a non-privileged user so it won&#39;t be able to open ports under 1000.&lt;/p&gt;
&lt;p&gt;iptables config:&lt;/p&gt;
&lt;pre class=&quot;language-editorconfig&quot;&gt;&lt;code class=&quot;language-editorconfig&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# Generated by iptables-save v1.8.7 on Sun Jan 23 17:33:37 2022&lt;/span&gt;&lt;br&gt;*filter&lt;br&gt;:INPUT DROP [0:0]&lt;br&gt;:FORWARD DROP [0:0]&lt;br&gt;:OUTPUT ACCEPT [41917:19766826]&lt;br&gt;:fail2ban-ssh - [0:0]&lt;br&gt;-A INPUT -i lo -j ACCEPT&lt;br&gt;-A INPUT -p tcp -m multiport --dports 22 -j fail2ban-ssh&lt;br&gt;-A INPUT -i eth0 -p tcp -m tcp --dport 22 -j ACCEPT&lt;br&gt;-A INPUT -i eth0 -p tcp -m tcp --dport 80 -j ACCEPT&lt;br&gt;-A INPUT -i eth0 -p tcp -m tcp --dport 5222 -m comment --comment &quot;ejabberd_c2s plain&quot; -j ACCEPT&lt;br&gt;-A INPUT -i eth0 -p tcp -m tcp --dport 5223 -m comment --comment &quot;ejabberd_c2s tls&quot; -j ACCEPT&lt;br&gt;-A INPUT -i eth0 -p tcp -m tcp --dport 5269 -m comment --comment &quot;ejabberd_s2s_in plain&quot; -j ACCEPT&lt;br&gt;-A INPUT -i eth0 -p tcp -m tcp --dport 5270 -m comment --comment &quot;ejabberd_s2s_in tls&quot; -j ACCEPT&lt;br&gt;-A INPUT -i eth0 -p tcp -m tcp --dport 5443 -m comment --comment &quot;ejabberd_http TLS&quot; -j ACCEPT&lt;br&gt;-A INPUT -i eth0 -p tcp -m tcp --dport 5280 -m comment --comment &quot;ejabberd_http plain&quot; -j ACCEPT&lt;br&gt;-A INPUT -i eth0 -p tcp -m tcp --dport 5349 -m comment --comment &quot;ejabberd_stun TCP&quot; -j ACCEPT&lt;br&gt;-A INPUT -i eth0 -p udp -m udp --dport 3478 -m comment --comment &quot;ejabberd_stun UDP&quot; -j ACCEPT&lt;br&gt;-A INPUT -i eth0 -p udp -m udp -m multiport --dports 49152:65535 -m comment --comment &quot;stun UDP&quot; -j ACCEPT&lt;br&gt;-A INPUT -i eth0 -p tcp -m tcp -m multiport --dports 49152:65535 -m comment --comment &quot;stun TCP&quot; -j ACCEPT&lt;br&gt;-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT&lt;br&gt;-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT&lt;br&gt;-A INPUT -j DROP&lt;br&gt;-A OUTPUT -o lo -j ACCEPT&lt;br&gt;-A fail2ban-ssh -j RETURN&lt;br&gt;COMMIT&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;# Completed on Sun Jan 23 17:33:37 2022&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;# Generated by iptables-save v1.8.7 on Sun Jan 23 17:33:37 2022&lt;/span&gt;&lt;br&gt;*nat&lt;br&gt;:PREROUTING ACCEPT [281:19041]&lt;br&gt;:INPUT ACCEPT [307:20513]&lt;br&gt;:OUTPUT ACCEPT [1287:92719]&lt;br&gt;:POSTROUTING ACCEPT [1287:92719]&lt;br&gt;-A PREROUTING -i eth0 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 5280&lt;br&gt;-A OUTPUT -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 5280&lt;br&gt;COMMIT&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;# Completed on Sun Jan 23 17:33:37 2022&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id=&quot;net-config%3A&quot;&gt;NET Config: &lt;a class=&quot;direct-link&quot; href=&quot;#net-config%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I&#39;ve used a VPS that has a local IP and a Public ip, but the second one is not directly on the network interface of our VM.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Public IP: 111.222.333.444&lt;/li&gt;
&lt;li&gt;Private IP: 192.168.1.10&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;our domain will be: &lt;a href=&quot;http://banana.io/&quot;&gt;banana.io&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;(the IPs and domain are fictional)&lt;/p&gt;
&lt;h1 id=&quot;dns-config%3A&quot;&gt;DNS config: &lt;a class=&quot;direct-link&quot; href=&quot;#dns-config%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;we&#39;ll need to configure some subdomains:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;@&lt;/li&gt;
&lt;li&gt;conference&lt;/li&gt;
&lt;li&gt;proxy&lt;/li&gt;
&lt;li&gt;pubsub&lt;/li&gt;
&lt;li&gt;upload&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;pointing at our server (see: &lt;a href=&quot;https://www.process-one.net/blog/ejabberd-xmpp-server-useful-configuration-steps/&quot;&gt;https://www.process-one.net/blog/ejabberd-xmpp-server-useful-configuration-steps/&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;and some SRV records for clients and servers, see: &lt;a href=&quot;https://wiki.xmpp.org/web/SRV_Records&quot;&gt;https://wiki.xmpp.org/web/SRV_Records&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;our final DNS config:&lt;/p&gt;
&lt;pre class=&quot;language-editorconfig&quot;&gt;&lt;code class=&quot;language-editorconfig&quot;&gt;@ 300 IN A 111.222.333.444&lt;br&gt;conference 300 IN A 111.222.333.444&lt;br&gt;proxy 300 IN A 111.222.333.444&lt;br&gt;pubsub 300 IN A 111.222.333.444&lt;br&gt;upload 300 IN A 111.222.333.444&lt;br&gt;&lt;br&gt;_stun._tcp 300 IN SRV 5 0 3478 conference.banana.io.&lt;br&gt;_stun._udp 300 IN SRV 5 0 3478 conference.banana.io.&lt;br&gt;_stuns._tcp 300 IN SRV 5 0 5349 conference.banana.io.&lt;br&gt;_turn._tcp 300 IN SRV 5 0 3478 conference.banana.io.&lt;br&gt;_turn._udp 300 IN SRV 5 0 3478 conference.banana.io.&lt;br&gt;_turns._tcp 300 IN SRV 5 0 5349 conference.banana.io.&lt;br&gt;_xmpp-client._tcp 300 IN SRV 5 0 5222 conference.banana.io.&lt;br&gt;_xmpp-server._tcp 300 IN SRV 5 0 5269 conference.banana.io.&lt;br&gt;_xmpps-client._tcp 300 IN SRV 5 0 5223 conference.banana.io.&lt;br&gt;_xmpps-server._tcp 300 IN SRV 5 0 5270 conference.banana.io.&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I want to try to do the same but on a subdomain, like &lt;a href=&quot;http://chat.banana.io/&quot;&gt;chat.banana.io&lt;/a&gt; instead of &lt;a href=&quot;http://banana.io/&quot;&gt;banana.io&lt;/a&gt; (these are fictional domains)&lt;/p&gt;
&lt;h1 id=&quot;create-the-uploads-folder%3A&quot;&gt;Create the uploads folder: &lt;a class=&quot;direct-link&quot; href=&quot;#create-the-uploads-folder%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;pre&gt;&lt;code&gt;mkdir -p /var/www/upload
chown ejabberd:ejabberd /var/www/upload
&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id=&quot;ejabberd-config%3A&quot;&gt;Ejabberd config: &lt;a class=&quot;direct-link&quot; href=&quot;#ejabberd-config%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;we can find the config in: /etc/ejabberd/ejabberd.yml&lt;/p&gt;
&lt;pre class=&quot;language-editorconfig&quot;&gt;&lt;code class=&quot;language-editorconfig&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;###&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;###              ejabberd configuration file&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;###&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;### The parameters used in this configuration file are explained at&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;###&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;###       https://docs.ejabberd.im/admin/configuration&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;###&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;### The configuration file is written in YAML.&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;### *******************************************************&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;### *******           !!! WARNING !!!               *******&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;### *******     YAML IS INDENTATION SENSITIVE       *******&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;### ******* MAKE SURE YOU INDENT SECTIONS CORRECTLY *******&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;### *******************************************************&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;### Refer to http://en.wikipedia.org/wiki/YAML for the brief description.&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;###&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;# loglevel: Verbosity of log files generated by ejabberd&lt;/span&gt;&lt;br&gt;loglevel: info&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;# rotation: Disable ejabberd&#39;s internal log rotation, as the Debian package&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;# uses logrotate(8).&lt;/span&gt;&lt;br&gt;log_rotate_count: 0&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;# hosts: Domains served by ejabberd.&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;# You can define one or several, for example:&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;# hosts:&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;#   - &quot;example.net&quot;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;#   - &quot;example.com&quot;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;#   - &quot;example.org&quot;&lt;/span&gt;&lt;br&gt;&lt;br&gt;hosts:&lt;br&gt;  - banana.io&lt;br&gt;&lt;br&gt;certfiles:&lt;br&gt;  - &quot;/etc/ejabberd/ejabberd.pem&quot;&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;#  - /etc/letsencrypt/live/localhost/fullchain.pem&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;#  - /etc/letsencrypt/live/localhost/privkey.pem&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;# TLS configuration&lt;/span&gt;&lt;br&gt;define_macro:&lt;br&gt;  &#39;TLS_CIPHERS&#39;: &quot;HIGH:!aNULL:!eNULL:!3DES:@STRENGTH&quot;&lt;br&gt;  &#39;TLS_OPTIONS&#39;:&lt;br&gt;    - &quot;no_sslv3&quot;&lt;br&gt;    - &quot;no_tlsv1&quot;&lt;br&gt;    - &quot;no_tlsv1_1&quot;&lt;br&gt;    - &quot;cipher_server_preference&quot;&lt;br&gt;    - &quot;no_compression&quot;&lt;br&gt;    &lt;span class=&quot;token comment&quot;&gt;# &#39;DH_FILE&#39;: &quot;/path/to/dhparams.pem&quot;&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token comment&quot;&gt;# generated with: openssl dhparam -out dhparams.pem 2048&lt;/span&gt;&lt;br&gt;&lt;br&gt;c2s_ciphers: &#39;TLS_CIPHERS&#39;&lt;br&gt;c2s_protocol_options: &#39;TLS_OPTIONS&#39;&lt;br&gt;s2s_protocol_options: &#39;TLS_OPTIONS&#39;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;#s2s_ciphers: &#39;TLS_CIPHERS&#39;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;###&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;### SOURCE: https://www.process-one.net/blog/securing-ejabberd-with-tls-encryption/&lt;/span&gt;&lt;br&gt;s2s_use_starttls: required&lt;br&gt;s2s_dhfile: /etc/ssl/ejabberd/dh2048.pem&lt;br&gt;s2s_ciphers: &quot;ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256&quot;&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;# c2s_dhfile: &#39;DH_FILE&#39;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;# s2s_dhfile: &#39;DH_FILE&#39;&lt;/span&gt;&lt;br&gt;&lt;br&gt;listen:&lt;br&gt;  -&lt;br&gt;    port: 5222&lt;br&gt;    ip: 0.0.0.0&lt;br&gt;    module: ejabberd_c2s&lt;br&gt;    max_stanza_size: 262144&lt;br&gt;    shaper: c2s_shaper&lt;br&gt;    access: c2s&lt;br&gt;    starttls_required: true&lt;br&gt;    &lt;span class=&quot;token comment&quot;&gt;#protocol_options: &#39;TLS_OPTIONS&#39;&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token comment&quot;&gt;###&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token comment&quot;&gt;### SOURCE: https://www.process-one.net/blog/securing-ejabberd-with-tls-encryption/&lt;/span&gt;&lt;br&gt;    protocol_options:&lt;br&gt;      - no_sslv2&lt;br&gt;      - no_sslv3&lt;br&gt;      - no_tlsv1&lt;br&gt;      - no_tlsv1_1&lt;br&gt;    ciphers: &quot;ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256&quot;&lt;br&gt;    starttls: true&lt;br&gt;    tls_compression: false&lt;br&gt;    dhfile: /etc/ssl/ejabberd/dh2048.pem    &lt;br&gt;  -&lt;br&gt;    port: 5223&lt;br&gt;    ip: 0.0.0.0&lt;br&gt;    module: ejabberd_c2s&lt;br&gt;    max_stanza_size: 262144&lt;br&gt;    shaper: c2s_shaper&lt;br&gt;    access: c2s&lt;br&gt;    tls: true&lt;br&gt;    protocol_options: &#39;TLS_OPTIONS&#39;&lt;br&gt;  -&lt;br&gt;    port: 5269&lt;br&gt;    ip: 0.0.0.0&lt;br&gt;    module: ejabberd_s2s_in&lt;br&gt;    max_stanza_size: 524288&lt;br&gt;    &lt;span class=&quot;token comment&quot;&gt;###&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token comment&quot;&gt;### SOURCE: https://www.process-one.net/blog/securing-ejabberd-with-tls-encryption/&lt;/span&gt;&lt;br&gt;    protocol_options:&lt;br&gt;      - no_sslv2&lt;br&gt;      - no_sslv3&lt;br&gt;      - no_tlsv1&lt;br&gt;      - no_tlsv1_1&lt;br&gt;  -&lt;br&gt;    port: 5443&lt;br&gt;    ip: 0.0.0.0&lt;br&gt;    module: ejabberd_http&lt;br&gt;    tls: true&lt;br&gt;    protocol_options: &#39;TLS_OPTIONS&#39;&lt;br&gt;    request_handlers:&lt;br&gt;      /api: mod_http_api&lt;br&gt;      /bosh: mod_bosh&lt;br&gt;      &lt;span class=&quot;token comment&quot;&gt;## /captcha: ejabberd_captcha&lt;/span&gt;&lt;br&gt;      /upload: mod_http_upload&lt;br&gt;      /ws: ejabberd_http_ws&lt;br&gt;  -&lt;br&gt;    port: 5280&lt;br&gt;    ip: 0.0.0.0&lt;br&gt;    module: ejabberd_http&lt;br&gt;    tls: false&lt;br&gt;    protocol_options: &#39;TLS_OPTIONS&#39;&lt;br&gt;    request_handlers:&lt;br&gt;      &lt;span class=&quot;token comment&quot;&gt;#/admin: ejabberd_web_admin&lt;/span&gt;&lt;br&gt;      /.well-known/acme-challenge: ejabberd_acme&lt;br&gt;  -&lt;br&gt;    port: 3478&lt;br&gt;    &lt;span class=&quot;token comment&quot;&gt;#ip: 0.0.0.0&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token comment&quot;&gt;#transport: udp&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token comment&quot;&gt;#module: ejabberd_stun&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token comment&quot;&gt;#use_turn: true&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token comment&quot;&gt;### The server&#39;s public IPv4 address:&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token comment&quot;&gt;#turn_ipv4_address: &quot;111.222.333.444&quot;&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token comment&quot;&gt;## The server&#39;s public IPv6 address:&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token comment&quot;&gt;# turn_ipv6_address: &quot;2001:db8::3&quot;&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token comment&quot;&gt;###&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token comment&quot;&gt;### SOURCE:&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token comment&quot;&gt;### https://www.process-one.net/blog/how-to-set-up-ejabberd-video-voice-calling/&lt;/span&gt;&lt;br&gt;    transport: udp&lt;br&gt;    module: ejabberd_stun&lt;br&gt;    use_turn: true&lt;br&gt;    turn_min_port: 49152&lt;br&gt;    turn_max_port: 65535&lt;br&gt;    &lt;span class=&quot;token comment&quot;&gt;## The server&#39;s public IPv4 address:&lt;/span&gt;&lt;br&gt;    turn_ipv4_address: 111.222.333.444&lt;br&gt;  -&lt;br&gt;    port: 5349&lt;br&gt;    &lt;span class=&quot;token comment&quot;&gt;###&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token comment&quot;&gt;### SOURCE:&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token comment&quot;&gt;### https://www.process-one.net/blog/how-to-set-up-ejabberd-video-voice-calling/&lt;/span&gt;&lt;br&gt;    transport: tcp&lt;br&gt;    module: ejabberd_stun&lt;br&gt;    use_turn: true&lt;br&gt;    tls: true&lt;br&gt;    turn_min_port: 49152&lt;br&gt;    turn_max_port: 65535&lt;br&gt;    &lt;span class=&quot;token comment&quot;&gt;#ip returns an error if the ip is not on the interface, so we need to sepcify the private ip here:&lt;/span&gt;&lt;br&gt;    ip: 192.168.1.10&lt;br&gt;    turn_ipv4_address: 111.222.333.444&lt;br&gt;  -&lt;br&gt;    port: 1883&lt;br&gt;    ip: 0.0.0.0&lt;br&gt;    module: mod_mqtt&lt;br&gt;    backlog: 1000&lt;br&gt;&lt;br&gt;&lt;br&gt;acme:&lt;br&gt;  &lt;span class=&quot;token comment&quot;&gt;## Staging environment&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token comment&quot;&gt;#ca_url: https://acme-staging-v02.api.letsencrypt.org/directory&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token comment&quot;&gt;## Production environment (the default):&lt;/span&gt;&lt;br&gt;  ca_url: https://acme-v02.api.letsencrypt.org/directory&lt;br&gt;  auto: true&lt;br&gt;  &lt;span class=&quot;token comment&quot;&gt;#contact: &quot;user@banana.io&quot;&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token comment&quot;&gt;#ca_url: &quot;https://acme-v02.api.letsencrypt.org&quot;&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;## Disabling digest-md5 SASL authentication. digest-md5 requires plain-text&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;## password storage (see auth_password_format option).&lt;/span&gt;&lt;br&gt;disable_sasl_mechanisms:&lt;br&gt;  - &quot;digest-md5&quot;&lt;br&gt;  - &quot;X-OAUTH2&quot;&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;## Store the plain passwords or hashed for SCRAM:&lt;/span&gt;&lt;br&gt;auth_password_format: scram&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;## Full path to a script that generates the image.&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;## captcha_cmd: &quot;/usr/share/ejabberd/captcha.sh&quot;&lt;/span&gt;&lt;br&gt;&lt;br&gt;acl:&lt;br&gt;  admin:&lt;br&gt;     user:&lt;br&gt;       - &quot;admin@banana.io&quot;&lt;br&gt;&lt;br&gt;  local:&lt;br&gt;    user_regexp: &quot;&quot;&lt;br&gt;  loopback:&lt;br&gt;    ip:&lt;br&gt;      - 127.0.0.0/8&lt;br&gt;&lt;br&gt;access_rules:&lt;br&gt;  local:&lt;br&gt;    allow: local&lt;br&gt;  c2s:&lt;br&gt;    deny: blocked&lt;br&gt;    allow: all&lt;br&gt;  announce:&lt;br&gt;    allow: admin&lt;br&gt;  configure:&lt;br&gt;    allow: admin&lt;br&gt;  muc_create:&lt;br&gt;    allow: local&lt;br&gt;  pubsub_createnode:&lt;br&gt;    allow: local&lt;br&gt;  trusted_network:&lt;br&gt;    allow: loopback&lt;br&gt;&lt;br&gt;api_permissions:&lt;br&gt;  &quot;console commands&quot;:&lt;br&gt;    from:&lt;br&gt;      - ejabberd_ctl&lt;br&gt;    who: all&lt;br&gt;    what: &quot;*&quot;&lt;br&gt;  &quot;admin access&quot;:&lt;br&gt;    who:&lt;br&gt;      access:&lt;br&gt;        allow:&lt;br&gt;          - acl: loopback&lt;br&gt;          - acl: admin&lt;br&gt;      oauth:&lt;br&gt;        scope: &quot;ejabberd:admin&quot;&lt;br&gt;        access:&lt;br&gt;          allow:&lt;br&gt;            - acl: loopback&lt;br&gt;            - acl: admin&lt;br&gt;    what:&lt;br&gt;      - &quot;*&quot;&lt;br&gt;      - &quot;!stop&quot;&lt;br&gt;      - &quot;!start&quot;&lt;br&gt;  &quot;public commands&quot;:&lt;br&gt;    who:&lt;br&gt;      ip: 127.0.0.1/8&lt;br&gt;    what:&lt;br&gt;      - status&lt;br&gt;      - connected_users_number&lt;br&gt;&lt;br&gt;shaper:&lt;br&gt;  normal:&lt;br&gt;    rate: 3000&lt;br&gt;    burst_size: 20000&lt;br&gt;  fast: 200000&lt;br&gt;&lt;br&gt;shaper_rules:&lt;br&gt;  max_user_sessions: 10&lt;br&gt;  max_user_offline_messages:&lt;br&gt;    5000: admin&lt;br&gt;    100: all&lt;br&gt;  c2s_shaper:&lt;br&gt;    none: admin&lt;br&gt;    normal: all&lt;br&gt;  s2s_shaper: fast&lt;br&gt;&lt;br&gt;modules:&lt;br&gt;  mod_adhoc: {}&lt;br&gt;  mod_admin_extra: {}&lt;br&gt;  mod_announce:&lt;br&gt;    access: announce&lt;br&gt;  mod_avatar: {}&lt;br&gt;  mod_blocking: {}&lt;br&gt;  mod_bosh: {}&lt;br&gt;  mod_caps: {}&lt;br&gt;  mod_carboncopy: {}&lt;br&gt;  mod_client_state: {}&lt;br&gt;  mod_configure: {}&lt;br&gt;  &lt;span class=&quot;token comment&quot;&gt;## mod_delegation: {}   # for xep0356&lt;/span&gt;&lt;br&gt;  mod_disco: {}&lt;br&gt;  mod_fail2ban: {}&lt;br&gt;  mod_http_api: {}&lt;br&gt;&lt;br&gt;  mod_http_upload:&lt;br&gt;    put_url: https://@HOST@:5443/upload&lt;br&gt;    docroot: /var/www/upload&lt;br&gt;    custom_headers:&lt;br&gt;      &quot;Access-Control-Allow-Origin&quot;: &quot;https://@HOST@&quot;&lt;br&gt;      &quot;Access-Control-Allow-Methods&quot;: &quot;GET,HEAD,PUT,OPTIONS&quot;&lt;br&gt;      &quot;Access-Control-Allow-Headers&quot;: &quot;Content-Type&quot;&lt;br&gt;      &lt;span class=&quot;token comment&quot;&gt;#SOURCE: https://www.process-one.net/blog/how-to-configure-ejabberd-to-get-100-in-xmpp-compliance-test/&lt;/span&gt;&lt;br&gt;&lt;br&gt;  mod_last: {}&lt;br&gt;&lt;br&gt;  mod_mam:&lt;br&gt;    &lt;span class=&quot;token comment&quot;&gt;## Mnesia is limited to 2GB, better to use an SQL backend&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token comment&quot;&gt;## For small servers SQLite is a good fit and is very easy&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token comment&quot;&gt;## to configure. Uncomment this when you have SQL configured:&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token comment&quot;&gt;## db_type: sql&lt;/span&gt;&lt;br&gt;    assume_mam_usage: true&lt;br&gt;    default: always&lt;br&gt;&lt;br&gt;  mod_mqtt: {}&lt;br&gt;  mod_muc:&lt;br&gt;    access:&lt;br&gt;      - allow&lt;br&gt;    access_admin:&lt;br&gt;      - allow: admin&lt;br&gt;    access_create: muc_create&lt;br&gt;    access_persistent: muc_create&lt;br&gt;    access_mam:&lt;br&gt;      - allow&lt;br&gt;    default_room_options:&lt;br&gt;      mam: true&lt;br&gt;      &lt;span class=&quot;token comment&quot;&gt;### SOURCE: https://www.process-one.net/blog/ejabberd-xmpp-server-useful-configuration-steps/&lt;/span&gt;&lt;br&gt;      allow_subscription: true&lt;br&gt;      persistent: true  &lt;br&gt;  mod_muc_admin: {}&lt;br&gt;  mod_offline:&lt;br&gt;    access_max_user_messages: max_user_offline_messages&lt;br&gt;  mod_ping: {}&lt;br&gt;  mod_pres_counter:&lt;br&gt;    count: 5&lt;br&gt;    interval: 60&lt;br&gt;  mod_privacy: {}&lt;br&gt;  mod_private: {}&lt;br&gt;  mod_proxy65:&lt;br&gt;    access: local&lt;br&gt;    max_connections: 5&lt;br&gt;  mod_pubsub:&lt;br&gt;    access_createnode: pubsub_createnode&lt;br&gt;    plugins:&lt;br&gt;      - flat&lt;br&gt;      - pep&lt;br&gt;    force_node_config:&lt;br&gt;      &quot;eu.siacs.conversations.axolotl.*&quot;:&lt;br&gt;        access_model: open&lt;br&gt;      &lt;span class=&quot;token comment&quot;&gt;## Avoid buggy clients to make their bookmarks public&lt;/span&gt;&lt;br&gt;      storage:bookmarks:&lt;br&gt;        access_model: whitelist&lt;br&gt;  mod_push: {}&lt;br&gt;  mod_push_keepalive: {}&lt;br&gt;  &lt;span class=&quot;token comment&quot;&gt;## mod_register:&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token comment&quot;&gt;##   ## Only accept registration requests from the &quot;trusted&quot;&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token comment&quot;&gt;##   ## network (see access_rules section above).&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token comment&quot;&gt;##   ## Think twice before enabling registration from any&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token comment&quot;&gt;##   ## address. See the Jabber SPAM Manifesto for details:&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token comment&quot;&gt;##   ## https://github.com/ge0rg/jabber-spam-fighting-manifesto&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token comment&quot;&gt;##   ip_access: trusted_network&lt;/span&gt;&lt;br&gt;  mod_register:&lt;br&gt;    ip_access: trusted_network&lt;br&gt;  mod_roster:&lt;br&gt;    versioning: true&lt;br&gt;  mod_s2s_dialback: {}&lt;br&gt;  mod_shared_roster: {}&lt;br&gt;  mod_sic: {}&lt;br&gt;  mod_stream_mgmt:&lt;br&gt;    resend_on_timeout: if_offline&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;### SOURCE: https://www.process-one.net/blog/how-to-set-up-ejabberd-video-voice-calling/&lt;/span&gt;&lt;br&gt;  mod_stun_disco:&lt;br&gt;    credentials_lifetime: 12h&lt;br&gt;    services:&lt;br&gt;        -&lt;br&gt;          host: 111.222.333.444&lt;br&gt;          port: 3478&lt;br&gt;          type: stun&lt;br&gt;          transport: udp&lt;br&gt;          restricted: false&lt;br&gt;        -&lt;br&gt;          host: 111.222.333.444&lt;br&gt;          port: 3478&lt;br&gt;          type: turn&lt;br&gt;          transport: udp&lt;br&gt;          restricted: true&lt;br&gt;        -&lt;br&gt;          host: banana.io&lt;br&gt;          port: 5349&lt;br&gt;          type: stuns&lt;br&gt;          transport: tcp&lt;br&gt;          restricted: false&lt;br&gt;        -&lt;br&gt;          host: banana.io&lt;br&gt;          port: 5349&lt;br&gt;          type: turns&lt;br&gt;          transport: tcp&lt;br&gt;          restricted: true&lt;br&gt;  mod_vcard:&lt;br&gt;    search: false&lt;br&gt;  mod_vcard_xupdate: {}&lt;br&gt;  mod_version:&lt;br&gt;    show_os: false&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;### Local Variables:&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;### mode: yaml&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;### End:&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;### vim: set filetype=yaml tabstop=8&lt;/span&gt;&lt;br&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;generate-dh-key%3A&quot;&gt;Generate DH key: &lt;a class=&quot;direct-link&quot; href=&quot;#generate-dh-key%3A&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;mkdir&lt;/span&gt; /etc/ssl/ejabberd/&lt;br&gt;openssl dhparam -out /etc/ssl/ejabberd/dh2048.pem &lt;span class=&quot;token number&quot;&gt;2048&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;start-the-server%3A&quot;&gt;Start the server: &lt;a class=&quot;direct-link&quot; href=&quot;#start-the-server%3A&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;systemctl start ejabberd.service&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id=&quot;about-letsencrypt&quot;&gt;About letsencrypt &lt;a class=&quot;direct-link&quot; href=&quot;#about-letsencrypt&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;NB: I HAVE TO RE-TEST THIS PART:&lt;/p&gt;
&lt;p&gt;In one of the latest versions ejabberd supports natively letsencrypt,&lt;br&gt;
just some notes:&lt;/p&gt;
&lt;p&gt;From my experience it&#39;s better to start with &amp;quot;auto: false&amp;quot; in your ejabberd &amp;quot;acme&amp;quot; configuration,&lt;br&gt;
and issue manually the generation of the certificates:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;ejabberdctl request-certificate all&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;for the webroot give: /etc/ejabberd&lt;/p&gt;
&lt;p&gt;when the certificates have been generated then you can switch to &amp;quot;auto: true&amp;quot;&lt;/p&gt;
&lt;p&gt;also:&lt;br&gt;
when testing remember to change &amp;quot;ca_url&amp;quot; to the staging url&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://acme-staging-v02.api.letsencrypt.org/directory&quot;&gt;https://acme-staging-v02.api.letsencrypt.org/directory&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;otherwise you&#39;ll incur in letsencrypt&#39;s rate limiting, see: &lt;a href=&quot;https://letsencrypt.org/docs/rate-limits/&quot;&gt;https://letsencrypt.org/docs/rate-limits/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;you can check the certificates with this command:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;ejabberdctl list-certificates&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;sample output:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;conference.banana.io	/var/lib/ejabberd/acme/live/11111	true
proxy.banana.io		/var/lib/ejabberd/acme/live/22222	true
pubsub.banana.io	/var/lib/ejabberd/acme/live/33333	true
banana.io		/var/lib/ejabberd/acme/live/44444	true
upload.banana.io	/var/lib/ejabberd/acme/live/55555	true
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;NB: I&#39;ve yet to test the autorenew but I suppose it should be automatic.&lt;/p&gt;
&lt;p&gt;see: &lt;a href=&quot;https://docs.ejabberd.im/admin/configuration/basic/#acme&quot;&gt;https://docs.ejabberd.im/admin/configuration/basic/#acme&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;NB:&lt;br&gt;
in ejabberd config we are not using ejabberd.pem (I&#39;ve deleted it),&lt;br&gt;
if you want to remove the entry you have to remove also &amp;quot;certfiles:&amp;quot;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#certfiles:
#  - &amp;quot;/etc/ejabberd/ejabberd.pem&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;otherwise you&#39;ll get this error:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Failed to start ejabberd application: Invalid value of option certfiles: Expected list, got empty string instead
&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id=&quot;useful-stuff%3A&quot;&gt;Useful stuff: &lt;a class=&quot;direct-link&quot; href=&quot;#useful-stuff%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h3 id=&quot;create-user%3A&quot;&gt;Create user: &lt;a class=&quot;direct-link&quot; href=&quot;#create-user%3A&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;ejabberdctl register USERNAME banana.io PASSWORD&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;logs-(are-your-friends)%3A&quot;&gt;Logs (are your friends): &lt;a class=&quot;direct-link&quot; href=&quot;#logs-(are-your-friends)%3A&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;tail&lt;/span&gt; -f /var/log/ejabberd/*&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id=&quot;migrating-to-a-new-server%3A&quot;&gt;Migrating to a new server: &lt;a class=&quot;direct-link&quot; href=&quot;#migrating-to-a-new-server%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;copy:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/etc/ejabberd
/etc/ssl/ejabberd
/var/lib/ejabberd
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;to the new machine,&lt;br&gt;
if the Erlang node name is the same (it seems it&#39;s based on the hostname of the machine) then you&#39;re set, otherwise you&#39;ll need to convert the Mnesia database following this guide at &amp;quot;Change Computer Hostname&amp;quot;:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.ejabberd.im/admin/guide/managing/&quot;&gt;https://docs.ejabberd.im/admin/guide/managing/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I&#39;ve not followed the guide since I&#39;ve managed to keep the hostnames the same so i&#39;ve just moved the files and installed ejabberd, and voila&#39;, i was set to go.&lt;/p&gt;
&lt;h1 id=&quot;clustering%3A&quot;&gt;Clustering: &lt;a class=&quot;direct-link&quot; href=&quot;#clustering%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Not in my todo list, but here it is:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.ejabberd.im/admin/guide/clustering/&quot;&gt;https://docs.ejabberd.im/admin/guide/clustering/&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&quot;sources%3A&quot;&gt;Sources: &lt;a class=&quot;direct-link&quot; href=&quot;#sources%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://www.aroundtheglobe.biz/posts/20210819-your_own_xmpp_server_with_ejabberd_on_Debian_11_Bullseye.html&quot;&gt;https://www.aroundtheglobe.biz/posts/20210819-your_own_xmpp_server_with_ejabberd_on_Debian_11_Bullseye.html&lt;/a&gt;&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>Home Automation</title>
		<link href="https://blog.smemory.org/posts/20220109_01_home_automation/"/>
		<updated>2022-01-07T00:00:00+00:00</updated>
		<id>https://blog.smemory.org/posts/20220109_01_home_automation/</id>
		<content type="html">&lt;h1 id=&quot;index%3A&quot;&gt;Index: &lt;a class=&quot;direct-link&quot; href=&quot;#index%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#preface%3A&quot;&gt;Preface&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#platform%3A&quot;&gt;Platform&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#sensors%3A&quot;&gt;Sensors&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#tasmota%3A&quot;&gt;Tasmota&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#zigbee%3A&quot;&gt;Zigbee&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#homekit-native-devices%3A&quot;&gt;Homekit Native Devices&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#homebridge%3A&quot;&gt;Homebridge&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#home-assistant%3A&quot;&gt;Home Assitant&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#telegraf%2C-influx-and-grafana%3A&quot;&gt;Telegraf, Influx and Grafana&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#todo%3A&quot;&gt;Todo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#homebridge-examples%3A&quot;&gt;Homebridge examples&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#straight-mqtt-integration%3A&quot;&gt;Straight MQTT integration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#zigbee-devices%3A&quot;&gt;Zigbee devices&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;preface%3A&quot;&gt;Preface: &lt;a class=&quot;direct-link&quot; href=&quot;#preface%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;With the help of a friend, I wanted to try to see how deep was the rabbit&#39;s hole of self-made home automation,&lt;br&gt;
this is the full extent of the installation which now has been reduced:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.smemory.org/img/20220109_01_home_automation_01.png&quot;&gt;&lt;img src=&quot;https://blog.smemory.org/img/20220109_01_home_automation_01.png&quot; alt=&quot;description&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;MQTT: is my MQTT server made with Mosquitto&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;homeassistant: is the Home Assistant installation&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;homebridge: is the Homebridge isntallation&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Tasmotized Devices: are all devices running Tasmota&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;MQTT Generic Devices: are devices sending/receiving MQTT messages (without Tasmota)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ZBBridge: allows ZigBee devices to speak MQTT&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Apple Devices: are an iPhone or iPad&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Android/other Devices: are Android/other OS devices that supports Home Assistant&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Telegraf: is a service that reads MQTT messages and puts the metrics into InfluxDB&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Influxdb and Grafana: is my system to record and plot metrics&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Homekit Native Devices: are devices working only with homekit network (like a smart plug)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Homekit Hub: can be an Apple TV, an Homepod or an iPad&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;platform%3A&quot;&gt;Platform: &lt;a class=&quot;direct-link&quot; href=&quot;#platform%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;After installing and using Home Assistant for a bit, I decided to decouple the MQTT server, which will be the center of my installation, and the rest.&lt;/p&gt;
&lt;p&gt;In this way Home Assistant wil be a &amp;quot;satellite&amp;quot; of MQTT like all the other parts.&lt;/p&gt;
&lt;p&gt;In the end we have two main ways to interact with the sensors:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;via Home Assistant&lt;/li&gt;
&lt;li&gt;via Apple Home&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;sensors%3A&quot;&gt;Sensors: &lt;a class=&quot;direct-link&quot; href=&quot;#sensors%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;We are using different types of sensors:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Tasmota (Wifi devices)&lt;/li&gt;
&lt;li&gt;Homekit Native (Wifi devices)&lt;/li&gt;
&lt;li&gt;ZigBee (Zigbee protocol)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;tasmota%3A&quot;&gt;Tasmota: &lt;a class=&quot;direct-link&quot; href=&quot;#tasmota%3A&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://tasmota.github.io/docs/&quot;&gt;Tasmota&lt;/a&gt; is an open source firmware for ESP devices that allows you to control the flashed device via MQTT, WebUi or http.&lt;/p&gt;
&lt;p&gt;We use Tasmota flashing it&#39;s firmware on commercial devices or self-made devices, here is a &lt;a href=&quot;https://templates.blakadder.com/&quot;&gt;list of supported tasmota devices&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;NB: You could flash Tasmota via Tuya-convert on Tuya devices but unfortunately Tuya updated it&#39;s devices so no conversion can take place on-the-fly or worst, they use something different than ESP boards so Tasmota is not supported anymore on those devices.&lt;/p&gt;
&lt;p&gt;here we&#39;ll see the devices I use with Tasmota:&lt;/p&gt;
&lt;h3 id=&quot;sonoff-mini%3A&quot;&gt;Sonoff Mini: &lt;a class=&quot;direct-link&quot; href=&quot;#sonoff-mini%3A&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;An in-wall switch module I used to take over existing &lt;em&gt;single&lt;/em&gt; switches and make them remotely controlled,&lt;br&gt;
this retains the functionality of the physical switch that now is connected to the Sonoff Mini.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://templates.blakadder.com/sonoff_mini.html&quot;&gt;https://templates.blakadder.com/sonoff_mini.html&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;shelly-1%3A&quot;&gt;Shelly 1: &lt;a class=&quot;direct-link&quot; href=&quot;#shelly-1%3A&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;An in-wall switch module like Sonoff Mini but I sued it for double deviators.&lt;br&gt;
&lt;a href=&quot;https://templates.blakadder.com/shelly_1.html&quot;&gt;https://templates.blakadder.com/shelly_1.html&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;koogeek-w-dexi%3A&quot;&gt;Koogeek W-DEXI: &lt;a class=&quot;direct-link&quot; href=&quot;#koogeek-w-dexi%3A&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;A power-monitoring plug&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://templates.blakadder.com/kogeek_W-DEXI.html&quot;&gt;https://templates.blakadder.com/kogeek_W-DEXI.html&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;arilux-lc03-rgb-module%3A&quot;&gt;Arilux LC03 RGB Module: &lt;a class=&quot;direct-link&quot; href=&quot;#arilux-lc03-rgb-module%3A&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;An RGB controller&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://templates.blakadder.com/arilux_SL-LC_03.html&quot;&gt;https://templates.blakadder.com/arilux_SL-LC_03.html&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;ikea-vindriktning%3A&quot;&gt;Ikea Vindriktning: &lt;a class=&quot;direct-link&quot; href=&quot;#ikea-vindriktning%3A&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;I&#39;ve &amp;quot;Tasmotized&amp;quot; this device adding an ESP-8266 inside it.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://blakadder.com/vindriktning-tasmota/&quot;&gt;https://blakadder.com/vindriktning-tasmota/&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;node-mcus&quot;&gt;Node-MCUs &lt;a class=&quot;direct-link&quot; href=&quot;#node-mcus&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;These are ESP-8266 self-made devices:&lt;/p&gt;
&lt;p&gt;I have some of them, one is connected to a relay board to act as a switch and open a door (otherwise opened with a push-button),&lt;br&gt;
another has a DHT22 to act as a thermometer-hygrometer, another has a IR emitter to send IR messages to interact (blindly, so no messages a received back) with IR-controlled appliances.&lt;/p&gt;
&lt;h3 id=&quot;sonoff-zbbridge%3A&quot;&gt;Sonoff ZBBridge: &lt;a class=&quot;direct-link&quot; href=&quot;#sonoff-zbbridge%3A&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This device is a Sonoff Zigbee Bridge, reflashed with tasmota.&lt;/p&gt;
&lt;p&gt;It allows me to integrate ZigBee devices with the rest of the isntallation (see ZigBee chapter).&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://zigbee.blakadder.com/Sonoff_ZBBridge.html&quot;&gt;https://zigbee.blakadder.com/Sonoff_ZBBridge.html&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;zigbee%3A&quot;&gt;Zigbee: &lt;a class=&quot;direct-link&quot; href=&quot;#zigbee%3A&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Zigbee is a low-power consumption standard for small meshed local network of wireless devices.&lt;/p&gt;
&lt;p&gt;Usually, for home automation, you&#39;ll need an hub to integrate ZigBee devices in your installation, I&#39;ve used a ZBBridge reflashed with Tasmota, this allows me to have a zigbee2tasmota integration, my goal however was just having a zigbee-mqtt compatibility layer.&lt;/p&gt;
&lt;p&gt;There many vendors that produce devices compatible with my implementation, I found a compatibility Repository here: &lt;a href=&quot;https://zigbee.blakadder.com/zigbee2tasmota.html&quot;&gt;Blakadder Zigbee Device Compatibility Repository&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The devices are battery powered, but only send a message when there is a change of state, for example a thermomter-hygrometer will send a message only when temp/hum changes.&lt;/p&gt;
&lt;p&gt;This allows to have a long battery life (allegedly).&lt;/p&gt;
&lt;p&gt;Right Now I am using:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Sonoff SNZB-01 &lt;a href=&quot;https://zigbee.blakadder.com/Sonoff_SNZB-01.html&quot;&gt;Wireless Switch&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Sonoff SNZB-02 &lt;a href=&quot;https://zigbee.blakadder.com/Sonoff_SNZB-02.html&quot;&gt;Temperature And Humidity Sensor&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Sonoff SNZB-03 &lt;a href=&quot;https://zigbee.blakadder.com/Sonoff_SNZB-03.html&quot;&gt;Motion Sensor&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Sonoff SNZB-04 &lt;a href=&quot;https://zigbee.blakadder.com/Sonoff_SNZB-04.html&quot;&gt;Wireless Door/Window Sensor&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Ikea Tradfri E1745 &lt;a href=&quot;https://zigbee.blakadder.com/Ikea_E1745.html&quot;&gt;Tradfri Motion Sensor&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Ikea Tradfri &lt;a href=&quot;https://zigbee.blakadder.com/Ikea_LED1836G9-E27.html&quot;&gt;LED bulb E27 806 lumen, dimmable&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Ikea Tradfri E1743 &lt;a href=&quot;https://zigbee.blakadder.com/Ikea_E1743.html&quot;&gt;Tradfri ON/OFF Switch&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Aqara Smart Plug &lt;a href=&quot;https://zigbee.blakadder.com/Aqara_SP-EUC01.html&quot;&gt;SP-EUC01&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All the Sonoff devices are well made, compact and work very well.&lt;br&gt;
The Ikea ones are a bit disappointing, the motion sensor for example sends just a message when it detects motion and not when it stops detecting, it just resets after 180 seconds,&lt;br&gt;
the ON/OFF switch worked for 1 day and the disappeared and won&#39;t talk with the bridge..&lt;/p&gt;
&lt;h2 id=&quot;zb_repeater&quot;&gt;ZB_Repeater &lt;a class=&quot;direct-link&quot; href=&quot;#zb_repeater&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Some of the always-powered devices (not the battery ones) like the Aqara Smart Plug or the IKEA Tradfri bulb, can act as mesh repeater in the ZigBee network, in this way if your Bridge does not cover all your area you can rely on the Repeater.&lt;/p&gt;
&lt;p&gt;NB: in my experience I had to re-join the devices to the bridge after adding the repeaters, otherwise they won&#39;t mesh with them.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.smemory.org/img/20220109_01_home_automation_03.png&quot;&gt;&lt;img src=&quot;https://blog.smemory.org/img/20220109_01_home_automation_03.png&quot; alt=&quot;description&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;homekit-native-devices%3A&quot;&gt;Homekit Native Devices: &lt;a class=&quot;direct-link&quot; href=&quot;#homekit-native-devices%3A&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I am using some Meross/Refoss Wifi smart plugs.&lt;br&gt;
They have static DHCP mappings and are denied any network destination via the firewall.&lt;/p&gt;
&lt;h1 id=&quot;homebridge%3A&quot;&gt;Homebridge: &lt;a class=&quot;direct-link&quot; href=&quot;#homebridge%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://homebridge.io/&quot;&gt;Homebridge&lt;/a&gt; is a fantastic piece of software that allows you to integrate many non-supported devices in your Homekit installation,&lt;br&gt;
you can use many of the available plugins,&lt;br&gt;
I am using homebridge-mqttthing to use my MQTT devices, some examples: &lt;a href=&quot;#homebridge-examples%3A&quot;&gt;Homebridge examples&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&quot;homekit%3A&quot;&gt;Homekit: &lt;a class=&quot;direct-link&quot; href=&quot;#homekit%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Homekit is Apple devices&#39;s native home management software.&lt;br&gt;
Paired with an Hub, which is a device that is always on and connected to your network, it allows you to create automations and use the devices from outsoide of your wifi network.&lt;/p&gt;
&lt;h1 id=&quot;home-assistant%3A&quot;&gt;Home Assistant: &lt;a class=&quot;direct-link&quot; href=&quot;#home-assistant%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Does the same as Homekit, in a much more flexible way.&lt;/p&gt;
&lt;h1 id=&quot;telegraf%2C-influx-and-grafana%3A&quot;&gt;Telegraf, Influx and Grafana: &lt;a class=&quot;direct-link&quot; href=&quot;#telegraf%2C-influx-and-grafana%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;or &amp;quot;TIG&amp;quot;.&lt;br&gt;
it&#39;s what I already use to collect and plot metrics,&lt;br&gt;
so I wanted to add the metrics of the new devices, for example the Sonoff Temp/Hum and Ikea&#39;s Vindriktning.&lt;br&gt;
Telegraf has an &lt;a href=&quot;https://www.influxdata.com/integration/mqtt-monitoring/&quot;&gt;MQTT Consumer Plugin&lt;/a&gt;, the version that is working for me is Telegraf &amp;gt;= 1.21.&lt;/p&gt;
&lt;p&gt;These is my /etc/telegraf/telegraf.d/mqtt.conf:&lt;/p&gt;
&lt;pre class=&quot;language-editorconfig&quot;&gt;&lt;code class=&quot;language-editorconfig&quot;&gt;&lt;span class=&quot;token section keyword&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;inputs.mqtt_consumer&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token property&quot;&gt;servers&lt;/span&gt; &lt;span class=&quot;token value string&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; [&quot;tcp://192.168.1.110:1883&quot;] &lt;/span&gt;&lt;span class=&quot;token comment&quot;&gt;#your mqtt server&lt;/span&gt;&lt;br&gt;&lt;br&gt;  &lt;span class=&quot;token comment&quot;&gt;## Topics that will be subscribed to.&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token property&quot;&gt;topics&lt;/span&gt; &lt;span class=&quot;token value string&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; [&lt;/span&gt;&lt;br&gt;    &quot;tele/tasmota_ZBBridge/ZB_Sonoff_Temp01/SENSOR&quot;,              &lt;span class=&quot;token comment&quot;&gt;###Zigbee Temp01&lt;/span&gt;&lt;br&gt;    &quot;tele/tasmota_Vindriktning/SENSOR&quot;,                               &lt;span class=&quot;token comment&quot;&gt;###VINDRIKTNING Tasmota&lt;/span&gt;&lt;br&gt;  ]&lt;br&gt;&lt;br&gt;  &lt;span class=&quot;token property&quot;&gt;qos&lt;/span&gt; &lt;span class=&quot;token value string&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; 0&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token property&quot;&gt;connection_timeout&lt;/span&gt; &lt;span class=&quot;token value string&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &quot;30s&quot;&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token property&quot;&gt;username&lt;/span&gt; &lt;span class=&quot;token value string&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &quot;user&quot;	&lt;/span&gt;&lt;span class=&quot;token comment&quot;&gt;#influxdb user&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token property&quot;&gt;password&lt;/span&gt; &lt;span class=&quot;token value string&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &quot;pass&quot;	&lt;/span&gt;&lt;span class=&quot;token comment&quot;&gt;#influxdb pass&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token property&quot;&gt;data_format&lt;/span&gt; &lt;span class=&quot;token value string&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &quot;json&quot;&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token section keyword&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;processors.regex&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token section keyword&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;processors.regex.field_rename&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token property&quot;&gt;pattern&lt;/span&gt; &lt;span class=&quot;token value string&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &#39;(^ZbReceived_)\w+_&#39;&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token property&quot;&gt;replacement&lt;/span&gt; &lt;span class=&quot;token value string&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &quot;${2}&quot;&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token section keyword&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;outputs.influxdb&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token property&quot;&gt;urls&lt;/span&gt; &lt;span class=&quot;token value string&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; [&quot;http://localhost:8086&quot;]&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token property&quot;&gt;database&lt;/span&gt; &lt;span class=&quot;token value string&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &quot;sensors&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;pay particular attention to &amp;quot;processors.regex&amp;quot;&lt;br&gt;
(AFAIK available from Telegraf &amp;gt;= 1.21),&lt;br&gt;
since it&#39;s the component that keeps our metric collectioning sane.&lt;/p&gt;
&lt;p&gt;Without this block all our measurement would contain the Topic, for example if we receive a message:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;tele/tasmota_ZBBridge/ZB_Sonoff_Temp01/SENSOR {&amp;quot;ZbReceived&amp;quot;:{&amp;quot;0x1111&amp;quot;:{&amp;quot;Device&amp;quot;:&amp;quot;0x1111&amp;quot;,&amp;quot;Name&amp;quot;:&amp;quot;ZB_Sonoff_Temp01&amp;quot;,&amp;quot;Humidity&amp;quot;:94.84,&amp;quot;Endpoint&amp;quot;:1,&amp;quot;LinkQuality&amp;quot;:34}}}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Telegraf would log the metric like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ZbReceived_0x1111_Humidity
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;when we just want &amp;quot;Humidity&amp;quot; because having more than 1 Thermometer would drive us crazy with many different metrics,&lt;br&gt;
after the processor.regex our metric looks like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Humidity
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This applies particularly to Zigbee devices as you can see from &amp;quot;ZbReceived&amp;quot;.&lt;/p&gt;
&lt;p&gt;This is the other configfile of telegraf (the main one), /etc/telegraf/telegraf.conf:&lt;/p&gt;
&lt;pre class=&quot;language-editorconfig&quot;&gt;&lt;code class=&quot;language-editorconfig&quot;&gt;&lt;span class=&quot;token section keyword&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;global_tags&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token section keyword&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;agent&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token property&quot;&gt;logfile&lt;/span&gt; &lt;span class=&quot;token value string&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &quot;/var/log/telegraf/telegraf.log&quot;&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token property&quot;&gt;interval&lt;/span&gt; &lt;span class=&quot;token value string&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &quot;10s&quot;&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token property&quot;&gt;round_interval&lt;/span&gt; &lt;span class=&quot;token value string&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; true&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token property&quot;&gt;metric_batch_size&lt;/span&gt; &lt;span class=&quot;token value string&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; 1000&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token property&quot;&gt;metric_buffer_limit&lt;/span&gt; &lt;span class=&quot;token value string&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; 10000&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token property&quot;&gt;collection_jitter&lt;/span&gt; &lt;span class=&quot;token value string&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &quot;0s&quot;&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token property&quot;&gt;flush_interval&lt;/span&gt; &lt;span class=&quot;token value string&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &quot;10s&quot;&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token property&quot;&gt;flush_jitter&lt;/span&gt; &lt;span class=&quot;token value string&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &quot;0s&quot;&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token property&quot;&gt;precision&lt;/span&gt; &lt;span class=&quot;token value string&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &quot;&quot;&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token property&quot;&gt;hostname&lt;/span&gt; &lt;span class=&quot;token value string&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &quot;&quot;&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token property&quot;&gt;omit_hostname&lt;/span&gt; &lt;span class=&quot;token value string&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; false&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;the result:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.smemory.org/img/20220109_01_home_automation_02.png&quot;&gt;&lt;img src=&quot;https://blog.smemory.org/img/20220109_01_home_automation_02.png&quot; alt=&quot;description&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;as you can see the metrics from the Zigbee devices are not always updated, on the contrary of Tasmota&#39;s ones that are updated on a schedule.&lt;/p&gt;
&lt;h1 id=&quot;todo%3A&quot;&gt;Todo: &lt;a class=&quot;direct-link&quot; href=&quot;#todo%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Nodered&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;homebridge-examples%3A&quot;&gt;Homebridge examples: &lt;a class=&quot;direct-link&quot; href=&quot;#homebridge-examples%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id=&quot;straight-mqtt-integration%3A&quot;&gt;Straight MQTT integration: &lt;a class=&quot;direct-link&quot; href=&quot;#straight-mqtt-integration%3A&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;tasmota-wdexi-plug%2C-sonoff-mini%2C-shelly-1%2C-%3A&quot;&gt;Tasmota WDexi Plug, Sonoff Mini, Shelly 1, : &lt;a class=&quot;direct-link&quot; href=&quot;#tasmota-wdexi-plug%2C-sonoff-mini%2C-shelly-1%2C-%3A&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;        &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token property&quot;&gt;&quot;accessory&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;mqttthing&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token property&quot;&gt;&quot;plugin_map&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;                &lt;span class=&quot;token property&quot;&gt;&quot;plugin_name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;homebridge-mqttthing&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;                &lt;span class=&quot;token property&quot;&gt;&quot;index&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token property&quot;&gt;&quot;topics&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;                &lt;span class=&quot;token property&quot;&gt;&quot;getOn&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;stat/tasmota01/POWER&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;                &lt;span class=&quot;token property&quot;&gt;&quot;setOn&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;cmnd/tasmota01/POWER&quot;&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token property&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;lightbulb&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token property&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Tasmotized-WDEXI&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token property&quot;&gt;&quot;url&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;mqtt://192.168.1.110:1883&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token property&quot;&gt;&quot;username&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;username&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token property&quot;&gt;&quot;password&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;password&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token property&quot;&gt;&quot;onValue&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;ON&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token property&quot;&gt;&quot;offValue&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;OFF&quot;&lt;/span&gt;&lt;br&gt;        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;nodemcu-temp-and-hum%3A&quot;&gt;NodeMCU Temp and Hum: &lt;a class=&quot;direct-link&quot; href=&quot;#nodemcu-temp-and-hum%3A&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;        &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token property&quot;&gt;&quot;accessory&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;mqttthing&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token property&quot;&gt;&quot;plugin_map&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;                &lt;span class=&quot;token property&quot;&gt;&quot;plugin_name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;homebridge-mqttthing&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;                &lt;span class=&quot;token property&quot;&gt;&quot;index&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token property&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;temperatureSensor&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token property&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Tasmota-NodeMCU-01_Temperature&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token property&quot;&gt;&quot;url&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;mqtt://192.168.1.110:1883&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token property&quot;&gt;&quot;username&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;username&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token property&quot;&gt;&quot;password&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;password&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token property&quot;&gt;&quot;topics&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;                &lt;span class=&quot;token property&quot;&gt;&quot;getCurrentTemperature&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;                    &lt;span class=&quot;token property&quot;&gt;&quot;topic&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;tele/tasmota_Nodemcu01/SENSOR&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;                    &lt;span class=&quot;token property&quot;&gt;&quot;apply&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;return JSON.parse(message).AM2301.Temperature;&quot;&lt;/span&gt;&lt;br&gt;                &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;        &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token property&quot;&gt;&quot;accessory&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;mqttthing&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token property&quot;&gt;&quot;plugin_map&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;                &lt;span class=&quot;token property&quot;&gt;&quot;plugin_name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;homebridge-mqttthing&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;                &lt;span class=&quot;token property&quot;&gt;&quot;index&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token property&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;humiditySensor&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token property&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Tasmota-NodeMCU-01_Humidity&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token property&quot;&gt;&quot;url&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;mqtt://192.168.1.110:1883&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token property&quot;&gt;&quot;username&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;username&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token property&quot;&gt;&quot;password&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;password&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token property&quot;&gt;&quot;topics&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;                &lt;span class=&quot;token property&quot;&gt;&quot;getCurrentRelativeHumidity&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;                    &lt;span class=&quot;token property&quot;&gt;&quot;topic&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;tele/tasmota_Nodemcu01/SENSOR&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;                    &lt;span class=&quot;token property&quot;&gt;&quot;apply&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;return JSON.parse(message).AM2301.Humidity;&quot;&lt;/span&gt;&lt;br&gt;                &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;rgb-controller%3A&quot;&gt;RGB Controller: &lt;a class=&quot;direct-link&quot; href=&quot;#rgb-controller%3A&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;NB: it uses the plugin &amp;quot;sonoff-tasmota-mqtt-hsb&amp;quot;&lt;/p&gt;
&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;        &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token property&quot;&gt;&quot;plugin_map&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;                &lt;span class=&quot;token property&quot;&gt;&quot;plugin_name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;homebridge-sonoff-tasmota-mqtt-hsb&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;                &lt;span class=&quot;token property&quot;&gt;&quot;index&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token property&quot;&gt;&quot;accessory&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;sonoff-tasmota-mqtt-hsb&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token property&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;STUDIO - Scrivania Led RGB - Tasmota-RGB-01&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token property&quot;&gt;&quot;url&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;mqtt://192.168.1.110:1883&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token property&quot;&gt;&quot;username&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;username&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token property&quot;&gt;&quot;password&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;password&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token property&quot;&gt;&quot;caption&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;test_rgb&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token property&quot;&gt;&quot;topics&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;                &lt;span class=&quot;token property&quot;&gt;&quot;setOn&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;cmnd/tasmota_RGB/Power&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;                &lt;span class=&quot;token property&quot;&gt;&quot;setHsb&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;cmnd/tasmota_RGB/HSBColor&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;                &lt;span class=&quot;token property&quot;&gt;&quot;status&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;stat/tasmota_RGB/RESULT&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;                &lt;span class=&quot;token property&quot;&gt;&quot;getHsb&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;stat/tasmota_RGB/HSBColor&quot;&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;ikea-vindriktning%3A-2&quot;&gt;Ikea Vindriktning: &lt;a class=&quot;direct-link&quot; href=&quot;#ikea-vindriktning%3A-2&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;        &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token property&quot;&gt;&quot;accessory&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;mqttthing&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token property&quot;&gt;&quot;plugin_map&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;                &lt;span class=&quot;token property&quot;&gt;&quot;plugin_name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;homebridge-mqttthing&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;                &lt;span class=&quot;token property&quot;&gt;&quot;index&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token property&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;airQualitySensor&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token property&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Vindriktning&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token property&quot;&gt;&quot;url&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;mqtt://192.168.1.110:1883&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token property&quot;&gt;&quot;username&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;username&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token property&quot;&gt;&quot;password&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;password&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token property&quot;&gt;&quot;topics&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;                &lt;span class=&quot;token property&quot;&gt;&quot;getAirQuality&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;                    &lt;span class=&quot;token property&quot;&gt;&quot;topic&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;tele/tasmota_Vindriktning/SENSOR&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;                    &lt;span class=&quot;token property&quot;&gt;&quot;apply&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;return (JSON.parse(message).VINDRIKTNING[&#39;PM2.5&#39;] &gt; 55 ? &#39;POOR&#39; : JSON.parse(message).VINDRIKTNING[&#39;PM2.5&#39;] &gt; 35 ? &#39;INFERIOR&#39; : JSON.parse(message).VINDRIKTNING[&#39;PM2.5&#39;] &gt; 12 ? &#39;FAIR&#39; : JSON.parse(message).VINDRIKTNING[&#39;PM2.5&#39;] &gt; 4 ? &#39;GOOD&#39; : JSON.parse(message).VINDRIKTNING[&#39;PM2.5&#39;] &amp;lt;= 3 ? &#39;EXCELLENT&#39; : &#39;UNKNOWN&#39;);&quot;&lt;/span&gt;&lt;br&gt;                &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;                &lt;span class=&quot;token property&quot;&gt;&quot;getPM2_5Density&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;                    &lt;span class=&quot;token property&quot;&gt;&quot;topic&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;tele/tasmota_Vindriktning/SENSOR&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;                    &lt;span class=&quot;token property&quot;&gt;&quot;apply&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;return JSON.parse(message).VINDRIKTNING[&#39;PM2.5&#39;];&quot;&lt;/span&gt;&lt;br&gt;                &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token property&quot;&gt;&quot;airQualityValues&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;br&gt;                &lt;span class=&quot;token string&quot;&gt;&quot;UNKNOWN&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;                &lt;span class=&quot;token string&quot;&gt;&quot;EXCELLENT&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;                &lt;span class=&quot;token string&quot;&gt;&quot;GOOD&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;                &lt;span class=&quot;token string&quot;&gt;&quot;FAIR&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;                &lt;span class=&quot;token string&quot;&gt;&quot;INFERIOR&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;                &lt;span class=&quot;token string&quot;&gt;&quot;POOR&quot;&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;br&gt;        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;zigbee-devices%3A&quot;&gt;ZigBee devices: &lt;a class=&quot;direct-link&quot; href=&quot;#zigbee-devices%3A&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;this is a bit trickier since when you send a command via MQTT it also needs to be sent via Zigbee,&lt;br&gt;
so you have to add &amp;quot;ZbSend&amp;quot; command and payload.&lt;/p&gt;
&lt;h3 id=&quot;sonoff-motion-sensor%3A&quot;&gt;Sonoff Motion Sensor: &lt;a class=&quot;direct-link&quot; href=&quot;#sonoff-motion-sensor%3A&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;        &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token property&quot;&gt;&quot;accessory&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;mqttthing&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token property&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;occupancySensor&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token property&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;ZB_Sonoff_Move01&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token property&quot;&gt;&quot;url&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;mqtt://192.168.1.110:1883&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token property&quot;&gt;&quot;username&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;username&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token property&quot;&gt;&quot;password&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;password&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token property&quot;&gt;&quot;topics&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;                &lt;span class=&quot;token property&quot;&gt;&quot;getOccupancyDetected&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;                    &lt;span class=&quot;token property&quot;&gt;&quot;topic&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;tele/Tasmota_ZBBridge/ZB_Sonoff_Move01/SENSOR&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;                    &lt;span class=&quot;token property&quot;&gt;&quot;apply&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;return JSON.parse(message).ZbReceived[&#39;0x1111&#39;].Occupancy;&quot;&lt;/span&gt;&lt;br&gt;                &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token property&quot;&gt;&quot;integerValue&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;true&quot;&lt;/span&gt;&lt;br&gt;        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;sonoff-button%3A&quot;&gt;Sonoff Button: &lt;a class=&quot;direct-link&quot; href=&quot;#sonoff-button%3A&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;        &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token property&quot;&gt;&quot;accessory&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;mqttthing&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token property&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;statelessProgrammableSwitch&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token property&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;ZB_Sonoff_Butt01&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token property&quot;&gt;&quot;url&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;mqtt://192.168.1.110:1883&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token property&quot;&gt;&quot;username&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;username&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token property&quot;&gt;&quot;password&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;password&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token property&quot;&gt;&quot;topics&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;                &lt;span class=&quot;token property&quot;&gt;&quot;getSwitch&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;                    &lt;span class=&quot;token property&quot;&gt;&quot;topic&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;tele/Tasmota_ZBBridge/ZB_Sonoff_Butt01/SENSOR&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;                    &lt;span class=&quot;token property&quot;&gt;&quot;apply&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;return JSON.parse(message).ZbReceived[&#39;0x2222&#39;].Power;&quot;&lt;/span&gt;&lt;br&gt;                &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token property&quot;&gt;&quot;switchValues&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;br&gt;                &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;                &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;                &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;br&gt;        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;sonoff-temp-and-hum-sensor%3A&quot;&gt;Sonoff Temp and Hum sensor: &lt;a class=&quot;direct-link&quot; href=&quot;#sonoff-temp-and-hum-sensor%3A&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;        &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token property&quot;&gt;&quot;accessory&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;mqttthing&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token property&quot;&gt;&quot;plugin_map&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;                &lt;span class=&quot;token property&quot;&gt;&quot;plugin_name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;homebridge-mqttthing&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;                &lt;span class=&quot;token property&quot;&gt;&quot;index&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token property&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;temperatureSensor&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token property&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;ZB_Temp01 - TEMP&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token property&quot;&gt;&quot;url&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;mqtt://192.168.1.110:1883&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token property&quot;&gt;&quot;username&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;username&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token property&quot;&gt;&quot;password&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;password&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token property&quot;&gt;&quot;topics&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;                &lt;span class=&quot;token property&quot;&gt;&quot;getCurrentTemperature&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;tele/Tasmota_ZBBridge/ZB_Sonoff_Temp01/SENSOR$.ZbReceived[*].Temperature&quot;&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;        &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token property&quot;&gt;&quot;accessory&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;mqttthing&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token property&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;humiditySensor&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token property&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;ZB_Temp01 - HUM&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token property&quot;&gt;&quot;url&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;mqtt://192.168.1.110:1883&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token property&quot;&gt;&quot;username&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;username&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token property&quot;&gt;&quot;password&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;password&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token property&quot;&gt;&quot;topics&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;                &lt;span class=&quot;token property&quot;&gt;&quot;getCurrentRelativeHumidity&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;tele/Tasmota_ZBBridge/ZB_Sonoff_Temp01/SENSOR$.ZbReceived[*].Humidity&quot;&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;sonoff-door-sensor%3A&quot;&gt;Sonoff Door sensor: &lt;a class=&quot;direct-link&quot; href=&quot;#sonoff-door-sensor%3A&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;        &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token property&quot;&gt;&quot;accessory&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;mqttthing&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token property&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;contactSensor&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token property&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;ZB_Sonoff_Door01&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token property&quot;&gt;&quot;url&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;mqtt://192.168.1.110:1883&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token property&quot;&gt;&quot;username&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;username&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token property&quot;&gt;&quot;password&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;password&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token property&quot;&gt;&quot;topics&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;                &lt;span class=&quot;token property&quot;&gt;&quot;getContactSensorState&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;                    &lt;span class=&quot;token property&quot;&gt;&quot;topic&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;tele/Tasmota_ZBBridge/ZB_Sonoff_Door01/SENSOR&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;                    &lt;span class=&quot;token property&quot;&gt;&quot;apply&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;return JSON.parse(message).ZbReceived[&#39;0x4444&#39;].Contact;&quot;&lt;/span&gt;&lt;br&gt;                &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token property&quot;&gt;&quot;integerValue&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;true&quot;&lt;/span&gt;&lt;br&gt;        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;aqara-plug%3A&quot;&gt;Aqara Plug: &lt;a class=&quot;direct-link&quot; href=&quot;#aqara-plug%3A&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;        &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token property&quot;&gt;&quot;accessory&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;mqttthing&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token property&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;outlet&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token property&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;ZB_Aqara_Plug01&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token property&quot;&gt;&quot;url&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;mqtt://192.168.1.110:1883&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token property&quot;&gt;&quot;username&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;username&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token property&quot;&gt;&quot;password&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;password&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token property&quot;&gt;&quot;topics&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;                &lt;span class=&quot;token property&quot;&gt;&quot;getOn&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;                    &lt;span class=&quot;token property&quot;&gt;&quot;topic&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;tele/Tasmota_ZBBridge/ZB_Aqara_Plug01/SENSOR&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;                    &lt;span class=&quot;token property&quot;&gt;&quot;apply&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;return JSON.parse(message).ZbReceived[&#39;0x5555&#39;].Power;&quot;&lt;/span&gt;&lt;br&gt;                &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;                &lt;span class=&quot;token property&quot;&gt;&quot;setOn&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;                    &lt;span class=&quot;token property&quot;&gt;&quot;topic&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;cmnd/Tasmota_ZBBridge/ZB_Aqara_Plug01/ZbSend&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;                    &lt;span class=&quot;token property&quot;&gt;&quot;apply&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;return &#39;{\&quot;device\&quot;:\&quot;0x5555\&quot;, \&quot;send\&quot;:{\&quot;Power\&quot;:&#39; + message + &#39;}}&#39;&quot;&lt;/span&gt;&lt;br&gt;                &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token property&quot;&gt;&quot;integerValue&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;true&quot;&lt;/span&gt;&lt;br&gt;        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;tradfri-dimmerable-bulb%3A&quot;&gt;Tradfri Dimmerable Bulb: &lt;a class=&quot;direct-link&quot; href=&quot;#tradfri-dimmerable-bulb%3A&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;        &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token property&quot;&gt;&quot;accessory&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;mqttthing&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token property&quot;&gt;&quot;plugin_map&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;                &lt;span class=&quot;token property&quot;&gt;&quot;plugin_name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;homebridge-mqttthing&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;                &lt;span class=&quot;token property&quot;&gt;&quot;index&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token property&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;lightbulb&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token property&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;ZB_Tradfri_Bulb11&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token property&quot;&gt;&quot;url&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;mqtt://192.168.1.110:1883&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token property&quot;&gt;&quot;username&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;username&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token property&quot;&gt;&quot;password&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;password&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token property&quot;&gt;&quot;topics&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;                &lt;span class=&quot;token property&quot;&gt;&quot;getOn&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;                    &lt;span class=&quot;token property&quot;&gt;&quot;topic&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;tele/Tasmota_ZBBridge/ZB_Tradfri_Bulb11/SENSOR&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;                    &lt;span class=&quot;token property&quot;&gt;&quot;apply&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;return JSON.parse(message).ZbReceived[&#39;0x6666&#39;].Power;&quot;&lt;/span&gt;&lt;br&gt;                &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;                &lt;span class=&quot;token property&quot;&gt;&quot;setOn&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;                    &lt;span class=&quot;token property&quot;&gt;&quot;topic&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;cmnd/Tasmota_ZBBridge/ZB_Tradfri_Bulb11/ZbSend&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;                    &lt;span class=&quot;token property&quot;&gt;&quot;apply&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;return &#39;{\&quot;device\&quot;:\&quot;0x6666\&quot;,\&quot;send\&quot;:{\&quot;Power\&quot;:\&quot;&#39; + message + &#39;\&quot;}}&#39;&quot;&lt;/span&gt;&lt;br&gt;                &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;                &lt;span class=&quot;token property&quot;&gt;&quot;getBrightness&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;                    &lt;span class=&quot;token property&quot;&gt;&quot;topic&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;tele/Tasmota_ZBBridge/ZB_Tradfri_Bulb11/SENSOR&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;                    &lt;span class=&quot;token property&quot;&gt;&quot;apply&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;return Math.round(JSON.parse(message).ZbReceived[&#39;0x6666&#39;].Dimmer / 2.55)&quot;&lt;/span&gt;&lt;br&gt;                &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;                &lt;span class=&quot;token property&quot;&gt;&quot;setBrightness&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;                    &lt;span class=&quot;token property&quot;&gt;&quot;topic&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;cmnd/Tasmota_ZBBridge/ZB_Tradfri_Bulb11/ZbSend&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;                    &lt;span class=&quot;token property&quot;&gt;&quot;apply&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;return &#39;{\&quot;device\&quot;:\&quot;0x6666\&quot;,\&quot;send\&quot;:{\&quot;Dimmer\&quot;:&#39; + Math.round(message * 2.55) + &#39;}}&#39;&quot;&lt;/span&gt;&lt;br&gt;                &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token property&quot;&gt;&quot;onValue&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;1&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token property&quot;&gt;&quot;offValue&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;0&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token property&quot;&gt;&quot;integerValue&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;true&quot;&lt;/span&gt;&lt;br&gt;        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
</content>
	</entry>
	
	<entry>
		<title>What Is A Computer, Tests on a Lent iPad</title>
		<link href="https://blog.smemory.org/posts/20220106_01_what_is_a_computer_ipad/"/>
		<updated>2022-01-06T00:00:00+00:00</updated>
		<id>https://blog.smemory.org/posts/20220106_01_what_is_a_computer_ipad/</id>
		<content type="html">&lt;h1 id=&quot;preface%3A&quot;&gt;Preface: &lt;a class=&quot;direct-link&quot; href=&quot;#preface%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I&#39;ve been lent an iPad (with usb-c port) and wanted to test the motto &lt;a href=&quot;https://www.youtube.com/watch?v=3S5BLs51yDQ&quot;&gt;&amp;quot;What&#39;s a computer?&amp;quot;&lt;/a&gt;,&lt;br&gt;
so I&#39;ve tried to use it as a companion device (NB: not my main device which still is and will be a proper computer).&lt;/p&gt;
&lt;p&gt;the device has:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;11&amp;quot; screen&lt;/li&gt;
&lt;li&gt;usb-c port&lt;/li&gt;
&lt;li&gt;external keyboard with trackpad (not Apple)&lt;/li&gt;
&lt;li&gt;glass screen protector&lt;/li&gt;
&lt;li&gt;not an M1 model&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;checklist%3A&quot;&gt;Checklist: &lt;a class=&quot;direct-link&quot; href=&quot;#checklist%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h3 id=&quot;important-features%3A&quot;&gt;Important features: &lt;a class=&quot;direct-link&quot; href=&quot;#important-features%3A&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;[x] git repos: can pull (also in a local folder), modify and push multiple repos, using Working Copy (20usd) which also has a very nice editor.&lt;/li&gt;
&lt;li&gt;[ ] syncthing: there is a closed source client (Mobius Sync), not tried and don&#39;t think I will&lt;/li&gt;
&lt;li&gt;[x] nextcloud: supported via it&#39;s official app, seems to work well&lt;/li&gt;
&lt;li&gt;[x] password manager: sorta yes with workaround, see dedicated section&lt;/li&gt;
&lt;li&gt;[x] external monitor support: yes, see dedicated section&lt;/li&gt;
&lt;li&gt;[x] local shell: yes with iSH, see dedicated section&lt;/li&gt;
&lt;li&gt;[x] local port forwarding via ssh: yes in iSH with caveats.&lt;/li&gt;
&lt;li&gt;[x] printing: yes with airprint, see dedicated section&lt;/li&gt;
&lt;li&gt;[x] VPN: yes/sorta, see Comms and dedicated section&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;comms%3A&quot;&gt;Comms: &lt;a class=&quot;direct-link&quot; href=&quot;#comms%3A&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;[~] whatsapp: via web version in a browser, no notifications but works well enough for me&lt;/li&gt;
&lt;li&gt;[x] telegram: has app with multiple clients supported, so no sweat here&lt;/li&gt;
&lt;li&gt;[x] signal: has app and will join as a connected device&lt;/li&gt;
&lt;li&gt;[x] jabber: via chatsecure, works but the problem is with the omemo keys which get scrambled and my interlocutors get pissed.&lt;/li&gt;
&lt;li&gt;[ ] TINC vpn: not supported, only via cydia&lt;/li&gt;
&lt;li&gt;[x] WireGuard VPN: supported and very well via it&#39;s app&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;misc%3A&quot;&gt;Misc: &lt;a class=&quot;direct-link&quot; href=&quot;#misc%3A&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;[ ] Isolate work apps: no multiple user support&lt;/li&gt;
&lt;li&gt;[ ] Multiple identities in browser: not supported&lt;/li&gt;
&lt;li&gt;[ ] adblock on youtube: not supported&lt;/li&gt;
&lt;li&gt;[ ] sorta no adblock in the browser (you can do something in settings)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;devices%3A&quot;&gt;Devices: &lt;a class=&quot;direct-link&quot; href=&quot;#devices%3A&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;[~] AC511 Dell Soundbar: supported if connected directly, but not trough USB-C hub&lt;/li&gt;
&lt;li&gt;[x] USB-c hub with power delivery to connect everything with one cable&lt;/li&gt;
&lt;li&gt;[x] Usb storage devices: pens and disks work, they mustn&#39;t be power hungry.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;ish%3A&quot;&gt;iSH: &lt;a class=&quot;direct-link&quot; href=&quot;#ish%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;The joy of my eyes: &lt;a href=&quot;https://ish.app/&quot;&gt;iSH&lt;/a&gt;&lt;br&gt;
it&#39;s Linux shell environment running locally, using a usermode x86 emulator, based on Alpine.&lt;br&gt;
It&#39;s performances are not stellar since it&#39;s an emulation, but you have a complete (but limited) working environment.&lt;/p&gt;
&lt;p&gt;PROs:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;almost complete work environment&lt;/li&gt;
&lt;li&gt;SSH port forwarding works well, as long as you keep iSH in the foreground, which with split screen view is quite comfortable and usable, when iSH goes in background after a bit the SSH sessions goes down and with it your port forwarding.&lt;/li&gt;
&lt;li&gt;ability to install packages with &amp;quot;apk add&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;CONs:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Lack of ALT or ESC button: even on hardware keyboards like the ones in the cases there is no ALT or ESC, but you can work around it with a soft-button in the bar of iSH, hardware keyboard connected via bluetooth however have the ALT key and with the best testeditor (obviously nano) works very well.&lt;/li&gt;
&lt;li&gt;NO NETWORK SUPPORT: you can use the network but you cannot modify anything, this means that tinc vpn won&#39;t work because it would modify netowkr interfaces, however Wireguard, via it&#39;s app, provides everything I need.&lt;/li&gt;
&lt;li&gt;slow, but that&#39;s a compromise worth doing.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;password-manager%3A&quot;&gt;Password Manager: &lt;a class=&quot;direct-link&quot; href=&quot;#password-manager%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I am using &lt;a href=&quot;https://www.passwordstore.org/&quot;&gt;Unix Pass&lt;/a&gt; as my password manager,&lt;br&gt;
because it&#39;s on CLI and because I can use a gpg key to encrypt and decrypt my passwords, I can keep everything in sync with a git repo and it&#39;s fully functional.&lt;br&gt;
I&#39;ve tested with a new keypair and repo, in iSH and there&#39;s everything you need to have: git, pass, gpg, It&#39;s not very fast but it works.&lt;br&gt;
It has no completion with tab when you go around in the secrets list.&lt;/p&gt;
&lt;h1 id=&quot;vpn%3A&quot;&gt;VPN: &lt;a class=&quot;direct-link&quot; href=&quot;#vpn%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;some of my VPNs are Tinc vpn, which unfortuntely is not supported.&lt;br&gt;
However wireguard has a very good app that works well,&lt;br&gt;
I&#39;ve tried bridging multiple vpns on a vm so I can connect via wireguard but use resources on the Tinc vpn and it works, quite well (you&#39;ll exit &amp;quot;natted&amp;quot; to the Tinc vpn, with the Tinc ip of the bridge machine).&lt;br&gt;
Other more commercial VPNs are supported but don&#39;t need &#39;em.&lt;/p&gt;
&lt;h1 id=&quot;external-monitor%3A&quot;&gt;External Monitor: &lt;a class=&quot;direct-link&quot; href=&quot;#external-monitor%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Works well via adapter or via USB-c powered HUB,&lt;br&gt;
it won&#39;t cover the whole monitor, I am using a 1920x1080 screen and I have 2 black bars to keep the aspect ratio of the iPad monitor,&lt;br&gt;
on almost 47cm of horizontal I have 38cm of image and 9cm of black bars (4.5cm per side).&lt;/p&gt;
&lt;h1 id=&quot;printing%3A&quot;&gt;Printing: &lt;a class=&quot;direct-link&quot; href=&quot;#printing%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Works with a workaround:&lt;br&gt;
I&#39;ve installed an old Single Board Computer with CUPS and enabled an AirPrint server.&lt;br&gt;
I think I followed this &lt;a href=&quot;https://www.linuxbabe.com/ubuntu/set-up-cups-print-server-ubuntu-bonjour-ipp-samba-airprint&quot;&gt;guide&lt;/a&gt;&lt;br&gt;
Works surprisingly well.&lt;/p&gt;
&lt;h1 id=&quot;accessories%3A&quot;&gt;Accessories: &lt;a class=&quot;direct-link&quot; href=&quot;#accessories%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;There&#39;s a wide gamut of accessories for these devices,&lt;br&gt;
with a lot of money to spend.&lt;br&gt;
The keyboards with a decent touchpad that support gestures make the iPad a notebook, more surface-y, like device.&lt;br&gt;
The gestures on the trackpad are really nice and ease moving between apps.&lt;/p&gt;
&lt;h1 id=&quot;media-consumption%3A&quot;&gt;Media consumption: &lt;a class=&quot;direct-link&quot; href=&quot;#media-consumption%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;It was made for media consumption, so we are ok.&lt;/p&gt;
&lt;h1 id=&quot;battery-life%3A&quot;&gt;Battery life: &lt;a class=&quot;direct-link&quot; href=&quot;#battery-life%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;From what I&#39;ve tried the battery life is very good, confronted with my old Surface Go the iPad can show 1h of Netflix or do 1h of videocall using very little battery,&lt;br&gt;
I think that it would last more than a day.&lt;/p&gt;
&lt;h1 id=&quot;conlusions%3A&quot;&gt;Conlusions: &lt;a class=&quot;direct-link&quot; href=&quot;#conlusions%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;The experience is eerly,&lt;br&gt;
it&#39;s quite a capable device that wants to look like a computer but still tries to keep it&#39;s distance from being one. (I&#39;m still doubtful why Apple won&#39;t run MacOs on the M1 iPad.)&lt;/p&gt;
&lt;p&gt;Limited to my (uncommon) use case: this solution has many compromises, particularly security wise:&lt;br&gt;
it can do almost everything I need swiftly, but I have to trust it (or it&#39;s apps) with some of my most beloved &amp;quot;keys&amp;quot;.&lt;/p&gt;
&lt;p&gt;This device looks like the missing link between a PC and a device that can be mobile, that lasts on battery and has a neat interface (more when paired with a trackpad and keyboard),&lt;br&gt;
and it looks like a device that is keeping all the promises the Surface Go made, promises that even on Windows (Linux is clunkier on the Go) are not kept.&lt;/p&gt;
&lt;p&gt;It feels like choosing between what it couldn&#39;t be and a compromise.&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>Automating Eleventy Fetching, Building and Publishing</title>
		<link href="https://blog.smemory.org/posts/20220104_01_automate_eleventy_publish/"/>
		<updated>2022-01-04T00:00:00+00:00</updated>
		<id>https://blog.smemory.org/posts/20220104_01_automate_eleventy_publish/</id>
		<content type="html">&lt;h1 id=&quot;scope%3A&quot;&gt;Scope: &lt;a class=&quot;direct-link&quot; href=&quot;#scope%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Automating the publishing of eleventy static blog&lt;/p&gt;
&lt;h1 id=&quot;how%3A&quot;&gt;How: &lt;a class=&quot;direct-link&quot; href=&quot;#how%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;You will need:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;linux vm (I&#39;ve used Debian 11)&lt;/li&gt;
&lt;li&gt;git repo&lt;/li&gt;
&lt;li&gt;eleventy docker image (I&#39;ve used &lt;a href=&quot;https://github.com/femtopixel/docker-eleventy&quot;&gt;https://github.com/femtopixel/docker-eleventy&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;web server or service of your choice to host your static site&lt;/li&gt;
&lt;li&gt;script to check git repo and start the build if there are any changes&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;pros-and-cons%3A&quot;&gt;Pros and cons: &lt;a class=&quot;direct-link&quot; href=&quot;#pros-and-cons%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Pros:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Automatic&lt;/li&gt;
&lt;li&gt;simple to manage&lt;/li&gt;
&lt;li&gt;difficult to break&lt;/li&gt;
&lt;li&gt;allows to choose when to deploy with &amp;quot;deploy.YES&amp;quot; file&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Cons:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Very simple site&lt;/li&gt;
&lt;li&gt;If you want to force a deploy you have to interact with the vm in charge of building the blog&lt;/li&gt;
&lt;li&gt;I&#39;ve not implemented any warning if something goes wrong, I can only see if it works once the site is published&lt;/li&gt;
&lt;li&gt;I don&#39;t leverage the ability of eleventy to serve the static site locally before deploying.&lt;/li&gt;
&lt;li&gt;the built site is not on the git repo since it will be built by a remote machine&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;prerequisites%3A&quot;&gt;Prerequisites: &lt;a class=&quot;direct-link&quot; href=&quot;#prerequisites%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;git&lt;/li&gt;
&lt;li&gt;docker&lt;/li&gt;
&lt;li&gt;rsync&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;instructions%3A&quot;&gt;Instructions: &lt;a class=&quot;direct-link&quot; href=&quot;#instructions%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;first of all install docker (that&#39;s your task) and pull the image we are gonna use:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;docker pull femtopixel/eleventy&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;check that we have the image:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;#docker images&lt;/span&gt;&lt;br&gt;REPOSITORY            TAG       IMAGE ID       CREATED       SIZE&lt;br&gt;femtopixel/eleventy   latest    6c68eb8fdb99   &lt;span class=&quot;token number&quot;&gt;13&lt;/span&gt; days ago   301MB&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I&#39;m keeping my eleventy work folder in sync on a git repository,&lt;br&gt;
my script is in charge of checking the repo and rebuilding the site:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;(every 5min via cronjob) checks if the repo has been modified, if yes:&lt;/li&gt;
&lt;li&gt;pulls repo&lt;/li&gt;
&lt;li&gt;checks if the file &amp;quot;deploy.YES: is present, if yes:&lt;/li&gt;
&lt;li&gt;launches the container rebuilding the static site&lt;/li&gt;
&lt;li&gt;rsyncs the static site&#39;s files to the web vm&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You have to manually create the file &amp;quot;deploy.YES&amp;quot; in your elventy root folder&lt;/p&gt;
&lt;p&gt;the script:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token shebang important&quot;&gt;#!/usr/bin/env bash&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;#variables:&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token assign-left variable&quot;&gt;ssh_key&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;/root/.ssh/id_rsa&quot;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token assign-left variable&quot;&gt;git_repo&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;git@somegitserver.net:YourUser/YouRepo.git&quot;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token assign-left variable&quot;&gt;folder_dest&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;/data/blog&quot;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token assign-left variable&quot;&gt;blog_folder&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;/data/blog&quot;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token assign-left variable&quot;&gt;deploy_file&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;deploy.YES&quot;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token assign-left variable&quot;&gt;rsync_source&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;/_site/&quot;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token assign-left variable&quot;&gt;rsync_user&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;rsyncuser&quot;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token assign-left variable&quot;&gt;rsync_host&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;web_vm&quot;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token assign-left variable&quot;&gt;rsync_dest&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;/var/www/vhosts/my_blog/&quot;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token assign-left variable&quot;&gt;logfile&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;/data/blog/autoupdate_script.log&quot;&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;#wake up ssh:&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;eval&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;`&lt;/span&gt;ssh-agent&lt;span class=&quot;token variable&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;br&gt;ssh-add &lt;span class=&quot;token variable&quot;&gt;$ssh_key&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;#update the status of the repo (without pulling or modifing):&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; -C &lt;span class=&quot;token variable&quot;&gt;$folder_dest&lt;/span&gt; fetch&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;#store the status of the repo:&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token assign-left variable&quot;&gt;git_before&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; -C $folder_dest rev-parse HEAD&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token assign-left variable&quot;&gt;git_after&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; -C $folder_dest rev-parse @&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;u&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;#compare the status before and after the fetch, if it is different it means there are change in the repo. so we will need to pull it and update the files:&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$git_before&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$git_after&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;then&lt;/span&gt;&lt;br&gt;	&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;date&lt;/span&gt; +&lt;span class=&quot;token string&quot;&gt;&quot;%Y-%m-%d_%H:%M:%S&quot;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt; - INFO - the repo has been modified, doing my thing&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;tee&lt;/span&gt; -a &lt;span class=&quot;token variable&quot;&gt;$logfile&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; -C &lt;span class=&quot;token variable&quot;&gt;$folder_dest&lt;/span&gt; reset --hard&lt;br&gt;	&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; -C &lt;span class=&quot;token variable&quot;&gt;$folder_dest&lt;/span&gt; pull --ff-only&lt;br&gt;	&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; -f &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$folder_dest&lt;/span&gt;/&lt;span class=&quot;token variable&quot;&gt;$deploy_file&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;then&lt;/span&gt;&lt;br&gt;	  &lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;date&lt;/span&gt; +&lt;span class=&quot;token string&quot;&gt;&quot;%Y-%m-%d_%H:%M:%S&quot;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt; - INFO - deploy file is present, doing my thing&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;tee&lt;/span&gt; -a &lt;span class=&quot;token variable&quot;&gt;$logfile&lt;/span&gt;&lt;br&gt;	  &lt;span class=&quot;token function&quot;&gt;rm&lt;/span&gt; -rf &lt;span class=&quot;token variable&quot;&gt;$blog_folder&lt;/span&gt;/_site/*&lt;br&gt;	  &lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$folder_dest&lt;/span&gt;/&lt;span class=&quot;token variable&quot;&gt;$deploy_file&lt;/span&gt; exists, deploying&quot;&lt;/span&gt;&lt;br&gt;	  docker run --rm -v &lt;span class=&quot;token variable&quot;&gt;$blog_folder&lt;/span&gt;:/app --name eleventy femtopixel/eleventy --output&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;/app/_site/&lt;br&gt;	  &lt;span class=&quot;token function&quot;&gt;rsync&lt;/span&gt; -avhz --progress &lt;span class=&quot;token variable&quot;&gt;$blog_folder&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$rsync_source&lt;/span&gt; -e &lt;span class=&quot;token string&quot;&gt;&quot;ssh -i &lt;span class=&quot;token variable&quot;&gt;$ssh_key&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$rsync_user&lt;/span&gt;@&lt;span class=&quot;token variable&quot;&gt;$rsync_host&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$rsync_dest&lt;/span&gt;&lt;br&gt;	&lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt;&lt;br&gt;	  &lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;date&lt;/span&gt; +&lt;span class=&quot;token string&quot;&gt;&quot;%Y-%m-%d_%H:%M:%S&quot;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt; - INFO - deploy file is NOT present, NOTE DEPLOYING&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;tee&lt;/span&gt; -a &lt;span class=&quot;token variable&quot;&gt;$logfile&lt;/span&gt;&lt;br&gt;	  &lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt;&lt;br&gt;	&lt;span class=&quot;token keyword&quot;&gt;fi&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt;&lt;br&gt;	&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;date&lt;/span&gt; +&lt;span class=&quot;token string&quot;&gt;&quot;%Y-%m-%d_%H:%M:%S&quot;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt; - INFO - the repo is the same as before, staying put 5 more minutes&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;tee&lt;/span&gt; -a &lt;span class=&quot;token variable&quot;&gt;$logfile&lt;/span&gt;&lt;br&gt;	&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token keyword&quot;&gt;fi&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;- - -&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;tee&lt;/span&gt; -a &lt;span class=&quot;token variable&quot;&gt;$logfile&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;eval&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;ssh-agent -k&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&quot;&lt;/span&gt;&lt;br&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;obviously:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;chmod&lt;/span&gt; +x /data/autoupdate_script.sh&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;cron:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;*/5 *	* * *	root	bash /data/autoupdate_script.sh &amp;gt; /dev/null
&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id=&quot;deploy.yes%3A&quot;&gt;deploy.YES: &lt;a class=&quot;direct-link&quot; href=&quot;#deploy.yes%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;using the file &amp;quot;deploy.YES&amp;quot; we can choose when to deploy,&lt;br&gt;
the script is built so if the file is found the build and sync with the webserver take place,&lt;br&gt;
otherwise the site won&#39;t be built.&lt;br&gt;
This way we can continue to work on the repo and sync it, maybe working on multiple devices without publishing the site until we are ready.&lt;/p&gt;
&lt;h1 id=&quot;git%3A&quot;&gt;Git: &lt;a class=&quot;direct-link&quot; href=&quot;#git%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I&#39;ve added the ssh key used to pull the git repo under the &amp;quot;Deploy keys&amp;quot; of the single repo,&lt;br&gt;
these keys are read-only by default, so we know the only action can be a non-write one.&lt;/p&gt;
&lt;h1 id=&quot;web-server%3A&quot;&gt;Web server: &lt;a class=&quot;direct-link&quot; href=&quot;#web-server%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I&#39;m using a simple apache server, it&#39;s a static site!&lt;/p&gt;
&lt;h1 id=&quot;conclusions%3A&quot;&gt;Conclusions: &lt;a class=&quot;direct-link&quot; href=&quot;#conclusions%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;the site you are reading right now has been built with this flow,&lt;br&gt;
so it look like it works!&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;related post: &lt;a href=&quot;https://blog.smemory.org/posts/20200830_01_blog-migration/&quot;&gt;Dumb-migrating from a static Wordpress to Eleventy&lt;/a&gt;&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>Check if your public ip is soiled, also with desktop notifications</title>
		<link href="https://blog.smemory.org/posts/20210412_01_check_soiled_ip/"/>
		<updated>2021-04-12T00:00:00+00:00</updated>
		<id>https://blog.smemory.org/posts/20210412_01_check_soiled_ip/</id>
		<content type="html">&lt;h1 id=&quot;why%3A&quot;&gt;Why: &lt;a class=&quot;direct-link&quot; href=&quot;#why%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;In the era of remote connections, Smart Working, Work From Home and Work From Anywhere, your Public IP might change often and you might end up with a &amp;quot;soiled&amp;quot; IP, an IP that has been used to spam, brute-force or other unpleasant behaviours you don&#39;t want to be associated with.&lt;/p&gt;
&lt;p&gt;So I felt the need to check the rating of my public ip, since it might change from time to time and some cloud services might check your ip rating and raise a red flag in case you are connecting from one of those unwelcome ips.&lt;/p&gt;
&lt;p&gt;I&#39;ve written a modular script in bash so it can be implemented to generate a notification on Windows or your favourite flavour of Linux.&lt;/p&gt;
&lt;p&gt;The script has been updated to support WSL, Linux and MacOsX out of the box,&lt;br&gt;
and has been tested on WSL (v1) and Ubuntu 20.04 Desktop.&lt;/p&gt;
&lt;h1 id=&quot;prerequisites%3A&quot;&gt;Prerequisites: &lt;a class=&quot;direct-link&quot; href=&quot;#prerequisites%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;to run the script you&#39;ll need:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;curl&lt;/li&gt;
&lt;li&gt;jq&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;only on Windows you&#39;ll need:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;WSL (v1, not tested nor supported on WSL2)&lt;/li&gt;
&lt;li&gt;BurntToast (see the rest of the guide for instructions)&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;retrieve-your-ip%3A&quot;&gt;Retrieve your ip: &lt;a class=&quot;direct-link&quot; href=&quot;#retrieve-your-ip%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I&#39;ll use a service I love which is &lt;a href=&quot;http://ifconfig.co/&quot;&gt;ifconfig.co&lt;/a&gt;,&lt;br&gt;
it&#39;s a no-nonsense what-is-my-ip, and perfectly queryable with many tools like curl,&lt;br&gt;
so if&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; http://ifconfig.co/ip&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;you just have your ip, ready to be used in a variable.&lt;/p&gt;
&lt;h1 id=&quot;apis-to-check-ips-blacklist%3A&quot;&gt;APIs to check ips blacklist: &lt;a class=&quot;direct-link&quot; href=&quot;#apis-to-check-ips-blacklist%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I&#39;ve used &lt;a href=&quot;http://abusedipdb.com/&quot;&gt;abusedipdb.com&lt;/a&gt;:&lt;br&gt;
on &lt;a href=&quot;https://www.abuseipdb.com/&quot;&gt;https://www.abuseipdb.com/&lt;/a&gt; register an account and on &lt;a href=&quot;https://www.abuseipdb.com/account/api&quot;&gt;https://www.abuseipdb.com/account/api&lt;/a&gt; request a new API key&lt;/p&gt;
&lt;p&gt;For the free tier account you have 1000 checks/day (&lt;a href=&quot;https://www.abuseipdb.com/pricing&quot;&gt;https://www.abuseipdb.com/pricing&lt;/a&gt;),&lt;br&gt;
that translates to about to being able to do a check every 1.5minutes on a single ip,&lt;br&gt;
which is way more than I need since I&#39;ll be checking every 15min for 12 hours = 48 checks/day.&lt;/p&gt;
&lt;p&gt;So I&#39;ll be able to use the same API key with the same script on different machines,&lt;br&gt;
or, way better, I can create different API keys for every script, in the end the limit of my free account is common for all my API keys.&lt;/p&gt;
&lt;h1 id=&quot;bash-script%3A&quot;&gt;Bash script: &lt;a class=&quot;direct-link&quot; href=&quot;#bash-script%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;(in WSL or Linux) I&#39;ve put my script in my home,&lt;br&gt;
so: /home/myuser/iptest.sh&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token shebang important&quot;&gt;#!/bin/bash&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;#VARIABLES:&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token assign-left variable&quot;&gt;ip_current&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; ifconfig.co/ip&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;#ip_current=&quot;INSERT_BAD_IP&quot;             #this is for testing purposes, if you want to test your script with a known bad ip you can insert it here, decomment this line and comment the other ip_current. you can find a bad ip on the site https://www.abuseipdb.com/ in homepage under &quot;Recently Reported IPs:&quot;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token assign-left variable&quot;&gt;ip_status&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;NULL&quot;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token assign-left variable&quot;&gt;notification&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;!!WARNING!!_Your_IP_is_SOILED!_&quot;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token assign-left variable&quot;&gt;api_key&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;INSERT_YOUR_API_KEY&quot;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token assign-left variable&quot;&gt;wsl_applogo&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot; -Applogo C:/Location/Of/Your/Image.png &quot;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token assign-left variable&quot;&gt;linux_logo&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot; -i /usr/share/icons/gnome/32x32/emblems/emblem-important.png &quot;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token assign-left variable&quot;&gt;platform&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;unknown&#39;&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;#PLATFORM CHECK, to verify which platform the script is running on:&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token assign-left variable&quot;&gt;unamestr&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;uname&lt;/span&gt; -a&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$unamestr&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; *&lt;span class=&quot;token string&quot;&gt;&quot;Microsoft&quot;&lt;/span&gt;* &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;then&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token assign-left variable&quot;&gt;platform&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;wsl&#39;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token keyword&quot;&gt;elif&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$unamestr&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; *&lt;span class=&quot;token string&quot;&gt;&quot;FreeBSD&quot;&lt;/span&gt;* &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;then&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token assign-left variable&quot;&gt;platform&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;freebsd&#39;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token keyword&quot;&gt;elif&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$unamestr&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; *&lt;span class=&quot;token string&quot;&gt;&quot;Darwin&quot;&lt;/span&gt;* &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;then&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token assign-left variable&quot;&gt;platform&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;macosx&#39;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token keyword&quot;&gt;elif&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$unamestr&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; *&lt;span class=&quot;token string&quot;&gt;&quot;Linux&quot;&lt;/span&gt;* &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;then&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token assign-left variable&quot;&gt;platform&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;linux&#39;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token keyword&quot;&gt;fi&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;#DEBUGGING (platform):&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;# echo $platform&quot;&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;#PRECHECKS, checking if the needed software is installed:&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$platform&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;wsl&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;then&lt;/span&gt;&lt;br&gt;	&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;platform is unknown, exiting&quot;&lt;/span&gt;&lt;br&gt;	&lt;span class=&quot;token builtin class-name&quot;&gt;exit&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token keyword&quot;&gt;fi&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$platform&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;linux&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$platform&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;wsl&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$platform&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;macosx&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;then&lt;/span&gt;&lt;br&gt;	&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;command&lt;/span&gt; -v jq &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&gt;&lt;/span&gt; /dev/null&lt;br&gt;	&lt;span class=&quot;token keyword&quot;&gt;then&lt;/span&gt;&lt;br&gt;		&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;jq not found, install jq&quot;&lt;/span&gt;&lt;br&gt;		&lt;span class=&quot;token builtin class-name&quot;&gt;exit&lt;/span&gt;&lt;br&gt;	&lt;span class=&quot;token keyword&quot;&gt;fi&lt;/span&gt;&lt;br&gt;	&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;command&lt;/span&gt; -v &lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&gt;&lt;/span&gt; /dev/null&lt;br&gt;	&lt;span class=&quot;token keyword&quot;&gt;then&lt;/span&gt;&lt;br&gt;		&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;curl not found, install curl&quot;&lt;/span&gt;&lt;br&gt;		&lt;span class=&quot;token builtin class-name&quot;&gt;exit&lt;/span&gt;&lt;br&gt;	&lt;span class=&quot;token keyword&quot;&gt;fi&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token keyword&quot;&gt;fi&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$platform&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;wsl&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;then&lt;/span&gt;&lt;br&gt;	&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;/mnt/c/windows/System32/WindowsPowerShell/v1.0/powershell.exe Get-Module -ListAvailable -Name BurntToast&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; *&lt;span class=&quot;token string&quot;&gt;&quot;BurntToast&quot;&lt;/span&gt;* &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;then&lt;/span&gt;&lt;br&gt;                &lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;BurntToast not found, install BurntToast&quot;&lt;/span&gt;&lt;br&gt;                &lt;span class=&quot;token builtin class-name&quot;&gt;exit&lt;/span&gt;&lt;br&gt;        &lt;span class=&quot;token keyword&quot;&gt;fi&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token keyword&quot;&gt;fi&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;#Retrieve ip status&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token assign-left variable&quot;&gt;ip_status&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; -s -G https://api.abuseipdb.com/api/v2/check --data-urlencode &lt;span class=&quot;token string&quot;&gt;&quot;ipAddress=&lt;span class=&quot;token variable&quot;&gt;$ip_current&lt;/span&gt;&quot;&lt;/span&gt; -d &lt;span class=&quot;token assign-left variable&quot;&gt;maxAgeInDays&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;30&lt;/span&gt; -H &lt;span class=&quot;token string&quot;&gt;&quot;Key: &lt;span class=&quot;token variable&quot;&gt;$api_key&lt;/span&gt;&quot;&lt;/span&gt; -H &lt;span class=&quot;token string&quot;&gt;&quot;Accept: application/json&quot;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;#Check if the output of curl is ok:&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$ip_status&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;NULL&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;then&lt;/span&gt;&lt;br&gt;	&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;curl failed&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;	&lt;span class=&quot;token builtin class-name&quot;&gt;exit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token keyword&quot;&gt;fi&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;#Extract the data we need from the json answer:&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token assign-left variable&quot;&gt;ip_reports&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; $ip_status &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; jq -c  &lt;span class=&quot;token string&quot;&gt;&#39;.[] | .totalReports&#39;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token assign-left variable&quot;&gt;ip_users&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; $ip_status &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; jq -c  &lt;span class=&quot;token string&quot;&gt;&#39;.[] | .numDistinctUsers&#39;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token assign-left variable&quot;&gt;ip_whitelist&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; $ip_status &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; jq -c  &lt;span class=&quot;token string&quot;&gt;&#39;.[] | .isWhitelisted&#39;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token assign-left variable&quot;&gt;ip_score&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; $ip_status &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; jq -c  &lt;span class=&quot;token string&quot;&gt;&#39;.[] | .abuseConfidenceScore&#39;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;#DEBUGGING (uncomment as you like):&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;#echo $ip_status&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;#echo $ip_status_clean&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;#echo $ip_reports&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;#echo $ip_users&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;#echo $ip_whitelist&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;#echo $ip_score&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;#Write last execution time to file (that&#39;s also debugging):&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;updated on &lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;date&lt;/span&gt; +%Y%m%d-%H%M&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; /tmp/iptest.last&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;#Check the ip parameters and generate notification if over threshold:&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$ip_reports&lt;/span&gt;&quot;&lt;/span&gt; -ge &lt;span class=&quot;token string&quot;&gt;&quot;20&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$ip_users&lt;/span&gt;&quot;&lt;/span&gt; -ge &lt;span class=&quot;token string&quot;&gt;&quot;5&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;ip_whitelist&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;false&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$ip_score&lt;/span&gt;&quot;&lt;/span&gt; -ge &lt;span class=&quot;token string&quot;&gt;&quot;50&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token keyword&quot;&gt;then&lt;/span&gt;&lt;br&gt;	&lt;span class=&quot;token keyword&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$platform&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt;&lt;br&gt;	wsl&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;br&gt;	   /mnt/c/windows/System32/WindowsPowerShell/v1.0//powershell.exe -command New-BurntToastNotification &lt;span class=&quot;token variable&quot;&gt;$wsl_applogo&lt;/span&gt; -Text &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$notification&lt;/span&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$ip_current&lt;/span&gt;&quot;&lt;/span&gt;&lt;br&gt;	&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;	linux&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;br&gt;	  &lt;span class=&quot;token function&quot;&gt;notify-send&lt;/span&gt; -u critical &lt;span class=&quot;token variable&quot;&gt;$linux_logo&lt;/span&gt; -t &lt;span class=&quot;token number&quot;&gt;300000&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$notification&lt;/span&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$ip_current&lt;/span&gt;&quot;&lt;/span&gt;&lt;br&gt;	&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;	macosx&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;br&gt;	  osascript -e &lt;span class=&quot;token string&quot;&gt;&#39;display notification &quot;It is better to change your IP&quot; with title &quot;YO!&quot; subtitle &quot;&lt;span class=&quot;token variable&quot;&gt;$notification&lt;/span&gt;&quot;&quot;&lt;span class=&quot;token variable&quot;&gt;$ip_current&lt;/span&gt;&quot;&#39;&lt;/span&gt;&lt;br&gt;	&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;	&lt;span class=&quot;token keyword&quot;&gt;esac&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token keyword&quot;&gt;fi&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;NB:&lt;br&gt;
you (might) need to change:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;api_key=&amp;quot;INSERT_YOUR_API_KEY&amp;quot; with your api key&lt;/li&gt;
&lt;li&gt;#ip_current=&amp;quot;INSERT_BAD_IP&amp;quot; (optional) with a bad ip to test notifications switching &amp;quot;ip_current&amp;quot; variables&lt;/li&gt;
&lt;li&gt;notification variable, or anyway the text you want on the notification should not have spaces, you can workaround this issue but it wasn&#39;t one of my priority, see here: &lt;a href=&quot;https://vepsalainen.eu/posts/5_implementing_containerized_pihole/&quot;&gt;https://vepsalainen.eu/posts/5_implementing_containerized_pihole/&lt;/a&gt; section &amp;quot;Windows 10 update notifier&amp;quot;&lt;/li&gt;
&lt;li&gt;wsl_applogo variable with the location of your image on Windows&lt;/li&gt;
&lt;li&gt;linux_logo variable has been fixed to one of the icons in the system library, which should work on different systems, fell free to change it.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;variable-outputs%3A&quot;&gt;variable outputs: &lt;a class=&quot;direct-link&quot; href=&quot;#variable-outputs%3A&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;these are examples of the debugging variables output in case of:&lt;/p&gt;
&lt;p&gt;an ip that&#39;s ok:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ip_reports = 0&lt;/li&gt;
&lt;li&gt;ip_users = 0&lt;/li&gt;
&lt;li&gt;ip_whitelist = null&lt;/li&gt;
&lt;li&gt;ip_score = 0&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;an ip that is soiled:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ip_reports = 276&lt;/li&gt;
&lt;li&gt;ip_users = 122&lt;/li&gt;
&lt;li&gt;ip_whitelist = false&lt;/li&gt;
&lt;li&gt;ip_score = 100&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;the thresholds I set (for a period of 30days):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ip_reports &amp;gt;= 20&lt;/li&gt;
&lt;li&gt;ip_users &amp;gt;= 5&lt;/li&gt;
&lt;li&gt;ip_whitelist = false&lt;/li&gt;
&lt;li&gt;ip_score &amp;gt;= 50&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;any violation of these thresholds triggers the warning.&lt;/p&gt;
&lt;p&gt;these thresholds are a work in progress.&lt;/p&gt;
&lt;h1 id=&quot;windows%3A&quot;&gt;Windows: &lt;a class=&quot;direct-link&quot; href=&quot;#windows%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I use WSL: Windows Subsystem for Linux version 1,&lt;br&gt;
since I am not using WSL2 this guide is not tested with WSL2.&lt;/p&gt;
&lt;h2 id=&quot;install-burnttoast-for-notifications-on-windows%3A&quot;&gt;Install BurntToast for notifications on windows: &lt;a class=&quot;direct-link&quot; href=&quot;#install-burnttoast-for-notifications-on-windows%3A&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;install BurntToast for notifications:&lt;/p&gt;
&lt;pre class=&quot;language-powershell&quot;&gt;&lt;code class=&quot;language-powershell&quot;&gt;&lt;span class=&quot;token function&quot;&gt;Install-Module&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;Name BurntToast&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;if needed set the execution policy as required:&lt;/p&gt;
&lt;pre class=&quot;language-powershell&quot;&gt;&lt;code class=&quot;language-powershell&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;#Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;then import the module and test a notification:&lt;/p&gt;
&lt;pre class=&quot;language-powershell&quot;&gt;&lt;code class=&quot;language-powershell&quot;&gt;&lt;span class=&quot;token function&quot;&gt;Import-Module&lt;/span&gt; BurntToast&lt;br&gt;&lt;span class=&quot;token function&quot;&gt;New-BurntToastNotification&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;Text hello&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;source: &lt;a href=&quot;https://github.com/microsoft/WSL/issues/2466&quot;&gt;https://github.com/microsoft/WSL/issues/2466&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;notification-image-support&quot;&gt;Notification image support &lt;a class=&quot;direct-link&quot; href=&quot;#notification-image-support&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;if you want to add personality to your warnings you can add an image like:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.smemory.org/img/20210412_01_check_soiled_ip_03.png&quot; alt=&quot;description&quot;&gt;&lt;/p&gt;
&lt;pre class=&quot;language-powershell&quot;&gt;&lt;code class=&quot;language-powershell&quot;&gt;&lt;span class=&quot;token function&quot;&gt;New-BurntToastNotification&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;Applogo C:\Location\Of\Your\Image&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;png &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;Text notification_with_image&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;NB: the image path must be from the Windows system point of view, not WSL, hence C:...&lt;/p&gt;
&lt;p&gt;the result will be:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.smemory.org/img/20210412_01_check_soiled_ip_04.png&quot; alt=&quot;description&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;auto-run-cron-on-wsl-on-win%3A&quot;&gt;auto-run Cron on WSL on Win: &lt;a class=&quot;direct-link&quot; href=&quot;#auto-run-cron-on-wsl-on-win%3A&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;we need to enable cron so our script can run unattended,&lt;br&gt;
so edit your sudoers file with&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; visudo&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;and add this line:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;%sudo ALL=NOPASSWD: /etc/init.d/cron start
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;then on Win run this command in cmd-run:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;explorer.exe shell:startup
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;and create a new shortcut with this location:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;C:\Windows\System32\wsl.exe sudo /etc/init.d/cron start
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;and choose a name (I choose WSL_Start_Cron)&lt;/p&gt;
&lt;p&gt;then doubleclick your newly created shortcut to run it&lt;/p&gt;
&lt;p&gt;if you execute&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;ps&lt;/span&gt; -ef &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;grep&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;cron&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;now you&#39;ll see that cron is running,&lt;br&gt;
I&#39;ve tested rebooting and after the system comes up everything works fine.&lt;/p&gt;
&lt;p&gt;source: &lt;a href=&quot;https://www.linkedin.com/pulse/wsl-linux-daemons-including-cron-john-west?articleId=6730365747916365824&quot;&gt;https://www.linkedin.com/pulse/wsl-linux-daemons-including-cron-john-west?articleId=6730365747916365824&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;##configure cron to run the script:&lt;/p&gt;
&lt;p&gt;on your shell edit your crontab:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;crontab&lt;/span&gt; -e&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;add this line at the end of the file (changing &amp;quot;myuser&amp;quot; with your actual user):&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;*/15 8-19       * * 1-5 /home/myuser/iptest.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;how&#39;s the schedule:&lt;br&gt;
you can use the good old Crontab Guru to fiddle with it fi you are not very keen with crontab: &lt;a href=&quot;https://crontab.guru/#&quot;&gt;https://crontab.guru/#&lt;/a&gt;&lt;em&gt;/15_8-19_&lt;/em&gt;_*_1-5&lt;/p&gt;
&lt;p&gt;tl;dr: MON-FRI from 8 to 19 every 15min = slighlty extended work hours.&lt;/p&gt;
&lt;p&gt;director&#39;s cut:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;*/15 = every 15 minutes (on :00, :15, :30 and :45)&lt;/li&gt;
&lt;li&gt;8-19 = all hours between 08:00 and 19:00&lt;/li&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;= all days of the month&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;= all months&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;1-5 = only between monday (1) and friday (5)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;notification-result-on-windows%3A&quot;&gt;Notification result on Windows: &lt;a class=&quot;direct-link&quot; href=&quot;#notification-result-on-windows%3A&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;(the ip shown in the notifications is not mine, I took one from the blacklist)&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.smemory.org/img/20210412_01_check_soiled_ip_01.png&quot; alt=&quot;description&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.smemory.org/img/20210412_01_check_soiled_ip_02.png&quot; alt=&quot;description&quot;&gt;&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>Kindle 4 NT Jailbreaking and converting to a dashboard</title>
		<link href="https://blog.smemory.org/posts/20210407_01_kindle_jailbreak_dashboard/"/>
		<updated>2021-04-07T00:00:00+00:00</updated>
		<id>https://blog.smemory.org/posts/20210407_01_kindle_jailbreak_dashboard/</id>
		<content type="html">&lt;h1 id=&quot;preface%3A&quot;&gt;Preface: &lt;a class=&quot;direct-link&quot; href=&quot;#preface%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I collect some useful metrics of my house on influxdb, and I&#39;d like to have them ready to be glanced.&lt;/p&gt;
&lt;h1 id=&quot;device%3A&quot;&gt;Device: &lt;a class=&quot;direct-link&quot; href=&quot;#device%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Kindle 4th gen Non Touch (K4 NT)&lt;/p&gt;
&lt;h1 id=&quot;preparation%3A&quot;&gt;Preparation: &lt;a class=&quot;direct-link&quot; href=&quot;#preparation%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Donwload:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Kindle 4 JailBreak | kindle-k4-jailbreak-1.8.N-r16252.tar.xz&lt;/li&gt;
&lt;li&gt;USBNetwork Hack | kindle-usbnetwork-0.57.N-r18392.tar.xz&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;from: &lt;a href=&quot;https://www.mobileread.com/forums/showthread.php?t=225030&quot;&gt;https://www.mobileread.com/forums/showthread.php?t=225030&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;and unzip both files&lt;/p&gt;
&lt;h1 id=&quot;jailbreaking%3A&quot;&gt;Jailbreaking: &lt;a class=&quot;direct-link&quot; href=&quot;#jailbreaking%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;follow the instructions from: &lt;a href=&quot;https://wiki.mobileread.com/wiki/Kindle4NTHacking&quot;&gt;https://wiki.mobileread.com/wiki/Kindle4NTHacking&lt;/a&gt;&lt;br&gt;
which are:&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Download and unzip the jailbreak.
&lt;ul&gt;
&lt;li&gt;Plug in the Kindle and copy the data.tar.gz &amp;amp; ENABLE_DIAGS files plus the diagnostic_logs folders to the Kindle&#39;s USB drive&#39;s root&lt;/li&gt;
&lt;li&gt;Safely remove the USB cable and restart the Kindle (Menu -&amp;gt; Settings -&amp;gt; Menu -&amp;gt; Restart)&lt;/li&gt;
&lt;li&gt;Once the device restarts into diagnostics mode, select &amp;quot;D) Exit, Reboot or Disable Diags&amp;quot; (using the 5-way keypad)&lt;/li&gt;
&lt;li&gt;Select &amp;quot;R) Reboot System&amp;quot; and &amp;quot;Q) To continue&amp;quot; (following on-screen instructions, when it tells you to use &#39;FW Left&#39; to select an option, it means left on the 5-way keypad)&lt;/li&gt;
&lt;li&gt;Wait about 20 seconds: you should see the Jailbreak screen for a while, and the device should then restart normally&lt;/li&gt;
&lt;li&gt;After the Kindle restarts, you should see a new book titled &amp;quot;You are Jailbroken&amp;quot;, if you see this, the jailbreak has been successful.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;h1 id=&quot;usbnetwork%3A&quot;&gt;usbNetwork: &lt;a class=&quot;direct-link&quot; href=&quot;#usbnetwork%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;once you are sure everything is ok, you can install usbnetwork&lt;br&gt;
connect your kindle to your pc and move the file Update_usbnetwork_0.57.N_k4_install.bin into your kindle root folder&lt;/p&gt;
&lt;p&gt;then in kindle&#39;s settings select &amp;quot;Update Your Kindle&amp;quot;&lt;/p&gt;
&lt;p&gt;now read carefully the file README_FIRST.txt&lt;br&gt;
be careful: when the instructions say to put the commands&lt;br&gt;
;debugOn and ~usbNetwork in the searchbar you can rach that by clicking the keyboard button in yor home screen (it&#39;s not  options --&amp;gt; Search)&lt;/p&gt;
&lt;p&gt;you can put your ssh pubkeys in /usbnet/etc/authorized_keys&lt;/p&gt;
&lt;p&gt;and configure your /usbnet/etc/config file,&lt;br&gt;
after testing everything was ok I&#39;ve settled for these config:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;HOST_IP=192.168.15.201
KINDLE_IP=192.168.15.244
K3_WIFI=&amp;quot;true&amp;quot;
K3_WIFI_SSHD_ONLY=&amp;quot;true&amp;quot;
USE_OPENSSH=&amp;quot;false&amp;quot;
USE_VOLUMD=&amp;quot;true&amp;quot;
QUIET_DROPBEAR=&amp;quot;false&amp;quot;
TWEAK_MAC_ADDRESS=&amp;quot;false&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;where I&#39;ve only modified &amp;quot;K3_WIFI&amp;quot; and &amp;quot;K3_WIFI_SSHD_ONLY&amp;quot;&lt;/p&gt;
&lt;p&gt;the workflow I&#39;ve used has been:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;copy my keys in /usbnet/etc/authorized_keys&lt;/li&gt;
&lt;li&gt;enable usbnet with the commands ;debugOn and ~usbNetwork&lt;/li&gt;
&lt;li&gt;test that it worked ok&lt;/li&gt;
&lt;li&gt;then enabled:
&lt;ul&gt;
&lt;li&gt;K3_WIFI=&amp;quot;true&amp;quot;&lt;/li&gt;
&lt;li&gt;K3_WIFI_SSHD_ONLY=&amp;quot;true&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;at this point I am able to reach the fs of the device connecting it via usb and reach it on the network via ssh&lt;/li&gt;
&lt;li&gt;find the device&#39;s mac-address and create a reservation on the net (optional)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;NB: if you don&#39;t use ssh keys it asks you for a password which should be retrievable from the serial of the device using this site: &lt;a href=&quot;https://www.sven.de/kindle/&quot;&gt;https://www.sven.de/kindle/&lt;/a&gt;&lt;br&gt;
but unfortunately that did not work tou for me.&lt;/p&gt;
&lt;h1 id=&quot;kaul%3A&quot;&gt;KAUL: &lt;a class=&quot;direct-link&quot; href=&quot;#kaul%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I&#39;ve tried to install KUAL but I&#39;ve not succeded,&lt;br&gt;
it should ease some configurations like enabling usbnet.&lt;/p&gt;
&lt;p&gt;I didn&#39;t needed it in the end so I didn&#39;t put too much effort in it&lt;br&gt;
KUAL: &lt;a href=&quot;https://www.mobileread.com/forums/showthread.php?t=203326&quot;&gt;https://www.mobileread.com/forums/showthread.php?t=203326&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&quot;dashboard%3A&quot;&gt;Dashboard: &lt;a class=&quot;direct-link&quot; href=&quot;#dashboard%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I&#39;ve liked this project: &lt;a href=&quot;https://github.com/pascalw/kindle-dash&quot;&gt;https://github.com/pascalw/kindle-dash&lt;/a&gt;&lt;br&gt;
because it simplifies the process rendering a dashboard image on a remote server then retrieving that image and displaying it on the kindle.&lt;/p&gt;
&lt;p&gt;follo the instructions here to install it: &lt;a href=&quot;https://github.com/pascalw/kindle-dash#installation&quot;&gt;https://github.com/pascalw/kindle-dash#installation&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&quot;dashboard-config%3A&quot;&gt;Dashboard config: &lt;a class=&quot;direct-link&quot; href=&quot;#dashboard-config%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I&#39;ve edited my configuration as follows:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;export WIFI_TEST_IP=${WIFI_TEST_IP:-1.1.1.1}                                                         
export REFRESH_SCHEDULE=${REFRESH_SCHEDULE:-&amp;quot;*/5 7-23,0-2 * * *&amp;quot;}                                    
export TIMEZONE=${TIMEZONE:-&amp;quot;Europe/Rome&amp;quot;}                                                           
export FULL_DISPLAY_REFRESH_RATE=${FULL_DISPLAY_REFRESH_RATE:-4}                                     
export SLEEP_SCREEN_INTERVAL=3600                                                                    
export LOW_BATTERY_REPORTING=${LOW_BATTERY_REPORTING:-true}                                          
export LOW_BATTERY_THRESHOLD_PERCENT=10   
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I&#39;ve edited only LOW_BATTERY_REPORTING to true, the TIMEZONE and REFRESH_SCHEDULE&lt;/p&gt;
&lt;h1 id=&quot;dashboard-tweaks%3A&quot;&gt;Dashboard tweaks: &lt;a class=&quot;direct-link&quot; href=&quot;#dashboard-tweaks%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id=&quot;update-time-and-battery%3A&quot;&gt;update time and battery: &lt;a class=&quot;direct-link&quot; href=&quot;#update-time-and-battery%3A&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;see: &lt;a href=&quot;https://github.com/pascalw/kindle-dash/issues/13&quot;&gt;https://github.com/pascalw/kindle-dash/issues/13&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I want a line that displays the battery status and the last update time, especially in the first period of debugging.&lt;/p&gt;
&lt;p&gt;in your /mnt/us/dashboard/local/dash.sh&lt;br&gt;
find the &amp;quot;refresh_dashboard&amp;quot; function and add this line:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/usr/sbin/eips 1 39 &amp;quot;last update: $(date -Iminutes) battery: $(gasgauge-info -c | sed &#39;s/%//g&#39;)&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;refresh_dashboard() {
  echo &amp;quot;Refreshing dashboard&amp;quot;
  &amp;quot;$DIR/wait-for-wifi.sh&amp;quot; &amp;quot;$WIFI_TEST_IP&amp;quot;

  &amp;quot;$FETCH_DASHBOARD_CMD&amp;quot; &amp;quot;$DASH_PNG&amp;quot;

  if [ $num_refresh -eq $FULL_DISPLAY_REFRESH_RATE ]; then
    num_refresh=0

    # trigger a full refresh once in every 4 refreshes, to keep the screen clean
    echo &amp;quot;Full screen refresh&amp;quot;
    /usr/sbin/eips -f -g &amp;quot;$DASH_PNG&amp;quot;
    /usr/sbin/eips 1 39 &amp;quot;last update: $(date -Iminutes) battery: $(gasgauge-info -c | sed &#39;s/%//g&#39;)&amp;quot;

  else
    echo &amp;quot;Partial screen refresh&amp;quot;
    /usr/sbin/eips -g &amp;quot;$DASH_PNG&amp;quot;
    /usr/sbin/eips 1 39 &amp;quot;last update: $(date -Iminutes) battery: $(gasgauge-info -c | sed &#39;s/%//g&#39;)&amp;quot;
  fi

  num_refresh=$((num_refresh+1))
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;starting-and-stopping-the-dashboard%3A&quot;&gt;starting and stopping the dashboard: &lt;a class=&quot;direct-link&quot; href=&quot;#starting-and-stopping-the-dashboard%3A&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;starting:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;run: /mnt/us/dashboard/start.sh&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;stopping:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;short press the power button&lt;/li&gt;
&lt;li&gt;your device will wake up for 10sec&lt;/li&gt;
&lt;li&gt;connect via ssh&lt;/li&gt;
&lt;li&gt;run: /mnt/us/dashboard/stop.sh&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;at this point that&#39;s what you sould do to revert to normal functionality:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/mnt/us/dashboard/stop.sh
lipc-set-prop com.lab126.powerd preventScreenSaver 0
echo ondemand &amp;gt;/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
initctl start webreader
/etc/init.d/framework start
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;also a device reboot works well :D&lt;/p&gt;
&lt;p&gt;see: &lt;a href=&quot;https://github.com/pascalw/kindle-dash/issues/12&quot;&gt;https://github.com/pascalw/kindle-dash/issues/12&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;changing-the-image%3A&quot;&gt;changing the image: &lt;a class=&quot;direct-link&quot; href=&quot;#changing-the-image%3A&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;edit: /mnt/us/dashboard/local/fetch-dashboard.sh&lt;br&gt;
changing the line:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$(dirname $0)/../ht -d -q -o &amp;quot;$1&amp;quot; get https://raw.githubusercontent.com/pascalw/kindle-dash/master/example/example.png
&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id=&quot;creating-my-own-dashboard%3A&quot;&gt;creating my own dashboard: &lt;a class=&quot;direct-link&quot; href=&quot;#creating-my-own-dashboard%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;dependencies:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;apt-get install ImageMagic jq curl
yum install ImageMagick jq curl gnu-free-mono-fonts
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I&#39;ve some data on influxdb, so with API calls I can retrieve the last value of what I need:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;home_temp=$(curl -s -G &#39;http://192.168.0.4:8086/query&#39; --data-urlencode &amp;quot;db=home&amp;quot; --data-urlencode &amp;quot;q=SELECT LAST(\&amp;quot;value\&amp;quot;) FROM \&amp;quot;temp\&amp;quot; WHERE \&amp;quot;sensor\&amp;quot; = &#39;home&#39;&amp;quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;then i can retrieve the clean value I need and round it to 1 decimal:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;home_temp_cl=$(echo $home_temp | jq -r &amp;quot;(.results[0].series[0].columns), (.results[0].series[0].values[]) | @csv&amp;quot; | tail -1 | cut -d, -f2 | awk &#39;{printf(&amp;quot;%.1f\n&amp;quot;, $1)}&#39;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;at this point I can create a simple txt file with all the values I need:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;echo &amp;quot;Home temp: &amp;quot;$home_temp_cl &amp;gt; /tmp/dashboard.txt
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;then we can convert the txt file in an image:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;convert -size 600x800 xc:white -font &amp;quot;FreeMono-Bold&amp;quot; -density 70 -pointsize 48 -gravity center -fill black -annotate +15+15 &amp;quot;@/tmp/dashboard.txt&amp;quot; /tmp/dashboard.png
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;NB: I&#39;ve encountered some problems due to this part of the command: &amp;quot;@/tmp/dashboard.txt&amp;quot;&lt;br&gt;
under &#39;buntu I had to edit /etc/ImageMagick-6/policy.xml&lt;br&gt;
and comment out:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;policy domain=&amp;quot;path&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;@*&amp;quot;/&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;that became:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;!--  &amp;lt;policy domain=&amp;quot;path&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;@*&amp;quot;/&amp;gt; --&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;that was due to a security configuration of ImageMagick&lt;/p&gt;
&lt;p&gt;under Centos the line was already disabled, and that was the default of the package.&lt;/p&gt;
&lt;p&gt;output image:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.smemory.org/img/20210407_01_kindle_jailbreak_dashboard_01.png&quot; alt=&quot;description&quot;&gt;&lt;/p&gt;
&lt;p&gt;NB: sometimes the kindle renders a white image instead of the correct one,&lt;br&gt;
it seemed to be a problem of text being too near the border.&lt;br&gt;
I did not understand if that was the real issue or not but fiddling with &amp;quot;density&amp;quot; and &amp;quot;pointsize&amp;quot; in convert did the trick.&lt;/p&gt;
&lt;h1 id=&quot;hosting-the-image%3A&quot;&gt;Hosting the image: &lt;a class=&quot;direct-link&quot; href=&quot;#hosting-the-image%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;then you have to host it somewhere to make it available to the kindle&lt;br&gt;
that&#39;s up to you&lt;/p&gt;
&lt;h1 id=&quot;final-result%3A&quot;&gt;Final result: &lt;a class=&quot;direct-link&quot; href=&quot;#final-result%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;and that&#39;s the final result:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.smemory.org/img/20210407_01_kindle_jailbreak_dashboard_02.png&quot; alt=&quot;description&quot;&gt;&lt;/p&gt;
&lt;p&gt;obviously my dashboard has more data,&lt;br&gt;
but that&#39;s none of your beeswax.&lt;/p&gt;
&lt;h1 id=&quot;todo%3A&quot;&gt;Todo: &lt;a class=&quot;direct-link&quot; href=&quot;#todo%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;[ ] modify the &amp;quot;dashboard&amp;quot; creation script to sample data for 5min then make an average (I don&#39;t want an extemporary value)&lt;/li&gt;
&lt;li&gt;[ ] create a dashboard that is nicer, maybe with images and text, maybe using dashbling? ( &lt;a href=&quot;https://github.com/pascalw/dashbling&quot;&gt;https://github.com/pascalw/dashbling&lt;/a&gt; )&lt;/li&gt;
&lt;li&gt;[ ] get external data like weather forecast and display it&lt;/li&gt;
&lt;/ul&gt;
</content>
	</entry>
	
	<entry>
		<title>Proxmox cluster with dishomogeneous cpu types</title>
		<link href="https://blog.smemory.org/posts/20210315_01_proxmox-cpu-flags/"/>
		<updated>2021-03-15T00:00:00+00:00</updated>
		<id>https://blog.smemory.org/posts/20210315_01_proxmox-cpu-flags/</id>
		<content type="html">&lt;h1 id=&quot;tl%3Bdr%3A&quot;&gt;TL;DR: &lt;a class=&quot;direct-link&quot; href=&quot;#tl%3Bdr%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;NO:&lt;br&gt;
for live migration within a proxmox cluster build it with same cpus&lt;/p&gt;
&lt;h1 id=&quot;preface%3A&quot;&gt;Preface: &lt;a class=&quot;direct-link&quot; href=&quot;#preface%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I have a proxmox cluster built with what I find lying around or is cheap enough to be justifiable,&lt;br&gt;
so I have different cpu types in the cluster nodes: Amd Ryzen (node1) and Intel i5 (node2).&lt;/p&gt;
&lt;p&gt;Using the default cpu type, that has a limited set of instructions, everything work as intended, particularly live migration between the hosts.&lt;/p&gt;
&lt;h1 id=&quot;tests%3A&quot;&gt;Tests: &lt;a class=&quot;direct-link&quot; href=&quot;#tests%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I&#39;ve then tried to edit the custom cpu types (/etc/pve/virtual-guest/cpu-models.conf) adding a custom one that has more cpu instructions thatn the base kvm64 cpu.&lt;/p&gt;
&lt;p&gt;But I did not find a reliable way to tell which flags were compatible with the underlying host.&lt;/p&gt;
&lt;p&gt;I know that the best scenario is to run a cluster with homogeneous hardware, but I also know that this is what I have available :D&lt;/p&gt;
&lt;p&gt;So, my aim is to create a &lt;a href=&quot;https://pve.proxmox.com/pve-docs/cpu-models.conf.5.html&quot;&gt;custom cpu profile&lt;/a&gt; that contains the flags that are common to both the nodes cpus, so I can have better performance thank the standard kvm64.&lt;/p&gt;
&lt;p&gt;So I wrote myself a script to try to match the flags that are common to both the nodes:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;#clean the working file:&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; result.txt&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token function&quot;&gt;cat&lt;/span&gt; host1.txt &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;tr&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot; &quot;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token entity&quot; title=&quot;\n&quot;&gt;\n&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; host1_list.txt&lt;br&gt;&lt;span class=&quot;token function&quot;&gt;cat&lt;/span&gt; host2.txt &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;tr&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot; &quot;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token entity&quot; title=&quot;\n&quot;&gt;\n&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; host2_list.txt&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;#loop the list of flags from node 2 against list of flags of node1 and display only the commone ones:&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token keyword&quot;&gt;while&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;read&lt;/span&gt; p&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;do&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token function&quot;&gt;grep&lt;/span&gt; -E &lt;span class=&quot;token string&quot;&gt;&quot;(^| )&lt;span class=&quot;token variable&quot;&gt;$p&lt;/span&gt;( |$)&quot;&lt;/span&gt; host1_list.txt &lt;span class=&quot;token operator&quot;&gt;&gt;&gt;&lt;/span&gt; result.txt&lt;br&gt;&lt;span class=&quot;token keyword&quot;&gt;done&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; host2_list.txt&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;#format the flags to be used in a proxmox custom cpus file, see: https://pve.proxmox.com/pve-docs/cpu-models.conf.5.html&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;# sed &#39;:a;N;$!ba;s/\n/;+/g&#39; : substitutes the carriage returns with ;+&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;# sed &#39;s/;//&#39; : removes the first occurrence of ; from the line&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token assign-left variable&quot;&gt;flags&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;cat&lt;/span&gt; result.txt &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;sed&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;:a;N;&lt;span class=&quot;token variable&quot;&gt;$!&lt;/span&gt;ba;s/&lt;span class=&quot;token entity&quot; title=&quot;\n&quot;&gt;\n&lt;/span&gt;/;+/g&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;sed&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;s/;//&#39;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;#echo the configurations to write to: /etc/pve/virtual-guest/cpu-models.conf&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;##############################################&quot;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;cpu-model: test&quot;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;    flags &lt;span class=&quot;token variable&quot;&gt;$flags&lt;/span&gt;&quot;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;    phys-bits host&quot;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;    hidden 0&quot;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;    hv-vendor-id proxmox&quot;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;    reported-model kvm64&quot;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;##############################################&quot;&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;#remove workfiles not needed anymore:&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token function&quot;&gt;rm&lt;/span&gt; host1_list.txt host2_list.txt result.txt&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;usage%3A&quot;&gt;Usage: &lt;a class=&quot;direct-link&quot; href=&quot;#usage%3A&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;pre class=&quot;language-md&quot;&gt;&lt;code class=&quot;language-md&quot;&gt;&lt;span class=&quot;token title important&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;#&lt;/span&gt; Proxmox_Cpu_Flags&lt;/span&gt;&lt;br&gt;trying to find minimum cpu flags common to 2 nodes in a cluster&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token title important&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;##&lt;/span&gt; Usage:&lt;/span&gt;&lt;br&gt;execute lscpu on your proxmox nodes, and take the output of the line &quot;Flags:&quot;, for example:&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token code&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;```&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token code-block&quot;&gt;Flags:               fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx f16c rdrand lahf_lm abm cpuid_fault epb invpcid_single pti tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid xsaveopt dtherm ida arat pln pts&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token punctuation&quot;&gt;```&lt;/span&gt;&lt;/span&gt;&lt;br&gt;and save the content without the &quot;Flags:&quot; part in the files:&lt;br&gt;&lt;span class=&quot;token list punctuation&quot;&gt;*&lt;/span&gt; host1.txt&lt;br&gt;&lt;span class=&quot;token list punctuation&quot;&gt;*&lt;/span&gt; host2.txt&lt;br&gt;&lt;br&gt;I&#39;ve used host2.txt with the older cpu but it should be the same&lt;br&gt;&lt;br&gt;Then execute compare.sh, you should have an output similar to:&lt;br&gt;&lt;span class=&quot;token code&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;```&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token code-block&quot;&gt;##############################################&lt;br&gt;cpu-model: test&lt;br&gt;    flags +fpu;+vme;+de;+pse;+tsc;+msr;+pae;+mce;+cx8;+apic;+sep;+mtrr;+pge;+mca;+cmov;+pat;+pse36;+clflush;+mmx;+fxsr;+sse;+sse2;+ht;+syscall;+nx;+pdpe1gb;+rdtscp;+lm;+constant_tsc;+rep_good;+nopl;+nonstop_tsc;+cpuid;+aperfmperf;+pni;+pclmulqdq;+monitor;+ssse3;+fma;+cx16;+sse4_1;+sse4_2;+movbe;+popcnt;+aes;+xsave;+avx;+f16c;+rdrand;+lahf_lm;+abm;+3dnowprefetch;+ssbd;+ibpb;+fsgsbase;+bmi1;+avx2;+smep;+bmi2;+rdseed;+adx;+smap;+clflushopt;+xsaveopt;+xsavec;+xgetbv1;+xsaves;+arat&lt;br&gt;    phys-bits host&lt;br&gt;    hidden 0&lt;br&gt;    hv-vendor-id proxmox&lt;br&gt;    reported-model kvm64&lt;br&gt;##############################################&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token punctuation&quot;&gt;```&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;br&gt;this should be inserted on your proxmox node (one is enough) in the file: /etc/pve/virtual-guest/cpu-models.conf&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token title important&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;##&lt;/span&gt; Nota bene:&lt;/span&gt;&lt;br&gt;right now it&#39;s not working as intended (I&#39;m posting on r/proxmox to ask for help)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;But it&#39;s not working as hoped:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I&#39;ve tried to boot the VM on Node1 using the new cpu profile gives me many errors on cpu flags incompatible:&lt;/li&gt;
&lt;li&gt;I had to remove:aperfmperfconstant_tsccpuidnonstop_tscnoplrep_goodhtmonitor&lt;/li&gt;
&lt;li&gt;once I removed the incompatible cpu flags on AMD it works ok&lt;/li&gt;
&lt;li&gt;I&#39;ve tried to migrate to Node2 the vm and it crashed due to non compatible cpu flag:&lt;/li&gt;
&lt;li&gt;I had to remove:ssbd&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;so I tried again to start the vm on Node1 and migrate to Node2, this time I got a nice kernel panic, which is the same output I get when I just start the vm on Node2 without the migration.&lt;/p&gt;
&lt;p&gt;image of kernel panic:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.smemory.org/img/20210315_01_proxmox-cpu-flags_01.jpg&quot; alt=&quot;description&quot;&gt;&lt;/p&gt;
&lt;p&gt;So there&#39;s obviously something wrong in my process, but I am not understanding what, maybe the compatibility is not supported among different cpu types or I am starting from some very wrong assumptions.&lt;/p&gt;
&lt;p&gt;I&#39;ve found another &lt;a href=&quot;https://www.reddit.com/r/Amd/comments/9ys735/live_migration_is_working_between_amd_and_intel/&quot;&gt;thread&lt;/a&gt; where OP selected Ivy-Bridge or Sandy-Bridge to enhance compatibility for migration between the hosts he/she had (Amd and Intel),my question is:is there a reliable way to determine the highest cpu flags/cpu profile supported by both machines?(other than trial and error selecting the various cpu types and trying a live migration)&lt;/p&gt;
&lt;h1 id=&quot;reddit-post-and-suggestions%3A&quot;&gt;Reddit post and suggestions: &lt;a class=&quot;direct-link&quot; href=&quot;#reddit-post-and-suggestions%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I&#39;ve posted a questione on r/proxmox: &lt;a href=&quot;https://www.reddit.com/r/Proxmox/comments/m4yi0q/how_to_determine_maximum_cpu_type_for_the_whole/&quot;&gt;post&lt;/a&gt;&lt;br&gt;
and &lt;a href=&quot;https://www.reddit.com/user/elettronik&quot;&gt;u/elettronik&lt;/a&gt; gave me some insights I flew over.&lt;/p&gt;
&lt;p&gt;Live migration for me is not essential, since most of the projects I host are not that sensitive to a soft and controlled shutdown and re-power on, so it definitely could be a way.&lt;/p&gt;
&lt;p&gt;After another bit of fiddling and trying I&#39;ve managed to fix what I think are the address size in the config file, setting it to the lowest value:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cpu-model: test3
flags +fpu;+de;+pse;+tsc;+msr;+pae;+mce;+cx8;+apic;+sep;+mtrr;+pge;+mca;+cmov;+pat;+pse36;+clflush;+mmx;+fxsr;+sse;+sse2;+syscall;+nx;+pdpe1gb;+rdtscp;+lm;+pni;+pclmulqdq;+ssse3;+cx16;+sse4_1;+sse4_2;+movbe;+popcnt;+aes;+xsave;+rdrand;+lahf_lm;+abm;+fsgsbase;+bmi1;+smep;+bmi2;+adx;+smap;+clflushopt;+xsaveopt;+xgetbv1;+arat;+hypervisor
phys-bits 39
hidden 0
hv-vendor-id proxmox
reported-model kvm64
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The flags are tested with:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;qemu-system-x86_64 -cpu qemu64,check,+fpu,+de,+pse,+tsc,+msr,+pae,+mce,+cx8,+apic,+sep,+mtrr,+pge,+mca,+cmov,+pat,+pse36,+clflush,+mmx,+fxsr,+sse,+sse2,+syscall,+nx,+pdpe1gb,+rdtscp,+lm,+pni,+pclmulqdq,+ssse3,+cx16,+sse4_1,+sse4_2,+movbe,+popcnt,+aes,+xsave,+rdrand,+lahf_lm,+abm,+fsgsbase,+bmi1,+smep,+bmi2,+adx,+smap,+clflushopt,+xsaveopt,+xgetbv1,+arat,+hypervisor&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;which with the flag &amp;quot;check&amp;quot; outputs errors in case the flags are not supported on the host, so this seems a reliable way to determine which flags are supported and which not.&lt;/p&gt;
&lt;p&gt;So:&lt;br&gt;
dual cpu works ok also on Ryzen, live migration is ok to Intel but the other way around the kernel panics.&lt;/p&gt;
&lt;h1 id=&quot;conclusions%3A&quot;&gt;Conclusions: &lt;a class=&quot;direct-link&quot; href=&quot;#conclusions%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Right now I&#39;ve decided to stick with the default kvm64 for all the vms until I&#39;ll need some more performance or on the specific vms that will benefit from a broader set of cpu instructions, in the near future I will evaluate the possibility to apply a broader set of instructions but losing live migrations.&lt;/p&gt;
&lt;p&gt;So, for reliable production hardware stick with Proxmox&#39;s manual and create cluster with same cpu types on the hosts,&lt;br&gt;
otherwise you know what your problems might be.&lt;/p&gt;
&lt;h1 id=&quot;bonus%3A&quot;&gt;Bonus: &lt;a class=&quot;direct-link&quot; href=&quot;#bonus%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;benchmark of different cpu flags:&lt;/p&gt;
&lt;p&gt;128/256 F = with AES flag&lt;br&gt;
128/256 N = without AWS flag&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;text-align:center&quot;&gt;&lt;/th&gt;
&lt;th style=&quot;text-align:center&quot;&gt;128 F&lt;/th&gt;
&lt;th style=&quot;text-align:center&quot;&gt;256 F&lt;/th&gt;
&lt;th style=&quot;text-align:center&quot;&gt;128 N&lt;/th&gt;
&lt;th style=&quot;text-align:center&quot;&gt;256 N&lt;/th&gt;
&lt;th style=&quot;text-align:center&quot;&gt;128 FvsN&lt;/th&gt;
&lt;th style=&quot;text-align:center&quot;&gt;256 FvsN&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:center&quot;&gt;16B&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;662910&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;609306&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;154295&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;116026&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;4.2x&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;5.2x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:center&quot;&gt;64B&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;1414566&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;1040415&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;173676&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;127442&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;8x&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;6x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:center&quot;&gt;256B&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;1460026&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;1069234&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;187151&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;131995&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;7.8x&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;8x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:center&quot;&gt;1KB&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;1476740&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;1075118&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;375774&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;272275&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;4x&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;4x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:center&quot;&gt;8KB&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;1475370&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;1073244&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;383018&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;278899&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;3.8x&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;3.8x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:center&quot;&gt;16KB&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;1478732&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;1073479&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;383800&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;280018&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;3.8x&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;3.8x&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;test run as&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;openssl speed -evp aes-128-cbc&lt;br&gt;openssl speed -evp aes-256-cbc&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;obviously it&#39;s a single test but one can see the improvement.&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>Surface Go Dual Boot Secureboot</title>
		<link href="https://blog.smemory.org/posts/20201111_01_surface-go-dual-secureboot/"/>
		<updated>2020-11-11T00:00:00+00:00</updated>
		<id>https://blog.smemory.org/posts/20201111_01_surface-go-dual-secureboot/</id>
		<content type="html">&lt;h1 id=&quot;preface%3A&quot;&gt;Preface: &lt;a class=&quot;direct-link&quot; href=&quot;#preface%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;The goal of this guide is to have Windows 10 and Ubuntu installed on a Surface device (I&#39;ve tested this on the Go and should work the same on the Go2),&lt;br&gt;
with secureboot enabled for both of them.&lt;/p&gt;
&lt;p&gt;The version used in this guide are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Win10 20H2 Pro (Pro has full bitlocker support)&lt;/li&gt;
&lt;li&gt;Ubuntu Mate 20.04.1 LTS&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;prerequisites%3A&quot;&gt;Prerequisites: &lt;a class=&quot;direct-link&quot; href=&quot;#prerequisites%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;disabling Fast Startup:
&lt;ul&gt;
&lt;li&gt;in: Control Panel --&amp;gt; hardware and Sound --&amp;gt; Power Options --&amp;gt; System Settings&lt;br&gt;
select &amp;quot;Choose what the power buttons do&amp;quot;&lt;br&gt;
and then unlock the buttons on the bottom clicking on &amp;quot;Change Settings that are not curently available&amp;quot;&lt;br&gt;
and deselect &amp;quot;Turn on gast start-up (recommended)&amp;quot;&lt;br&gt;
then click on &amp;quot;save changes&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;surface Device installed with Win10&lt;/li&gt;
&lt;li&gt;usb pen with Ubuntu 20.04 on it:
&lt;ul&gt;
&lt;li&gt;you should create the drive downloading the ISO and dd&#39;ing it on the drive:&lt;br&gt;
dd if=ubuntu.iso of=/dev/sdX bs=1M status=progress,&lt;br&gt;
in this way you are shure to have a UEFI boot drive&lt;br&gt;
I&#39;ve used Ubuntu Mate 20.04.1 LTS&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;patience&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;win10-pre-tasks%3A&quot;&gt;Win10 pre-tasks: &lt;a class=&quot;direct-link&quot; href=&quot;#win10-pre-tasks%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;If enabled, disable bitlocker from Win10 bitlocker menu,&lt;br&gt;
wait for the decryption to finish.&lt;/p&gt;
&lt;p&gt;Shrink the windows partition form the disk manager to leave space for ubuntu.&lt;/p&gt;
&lt;p&gt;Reboot in advanced mode to boot from the USB drive with ubuntu:&lt;br&gt;
hold &amp;quot;shift&amp;quot; while clicking on &amp;quot;reboot&amp;quot;,&lt;br&gt;
you&#39;ll be in windows recovery mode, select &amp;quot;other disk&amp;quot; and select &amp;quot;Linpus ...&amp;quot; to boot in ubuntu&lt;/p&gt;
&lt;h1 id=&quot;ubuntu-live-tasks%3A&quot;&gt;Ubuntu Live tasks: &lt;a class=&quot;direct-link&quot; href=&quot;#ubuntu-live-tasks%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id=&quot;shrinking%3A&quot;&gt;Shrinking: &lt;a class=&quot;direct-link&quot; href=&quot;#shrinking%3A&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;fire up utubntu live and with gparted move Win10&#39;s recovery partition back to leave all the empty space in the end:&lt;/p&gt;
&lt;p&gt;before:&lt;br&gt;
&lt;img src=&quot;https://blog.smemory.org/img/20201111_01_SurfaceGo_HowToDualBoot_01.png&quot; alt=&quot;description&quot;&gt;&lt;/p&gt;
&lt;p&gt;after:&lt;br&gt;
&lt;img src=&quot;https://blog.smemory.org/img/20201111_01_SurfaceGo_HowToDualBoot_02.png&quot; alt=&quot;description&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;partitioning%3A&quot;&gt;Partitioning: &lt;a class=&quot;direct-link&quot; href=&quot;#partitioning%3A&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;with gparted create the new partitions as follows:&lt;/p&gt;
&lt;p&gt;5: efi partition in fat32, flags boot and esp (will be mounted on /boot/efi)&lt;br&gt;
6: /boot partition in ext2 (will be mounted on /boot)&lt;br&gt;
7: luks partition&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Number  Start   End     Size    File system  Name                          Flags
 1      1049kB  274MB   273MB   fat32        EFI system partition          boot, esp
 2      274MB   408MB   134MB                Microsoft reserved partition  msftres
 3      408MB   95,1GB  94,7GB  ntfs         Basic data partition          msftdata
 4      95,1GB  96,1GB  1074MB  ntfs         Basic data partition          hidden, diag
 5      96,1GB  96,7GB  537MB   fat32        EFI System Partition          boot, esp
 6      96,7GB  97,2GB  537MB   ext2
 7      97,2GB  128GB   30,8GB
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;luks%3A&quot;&gt;Luks: &lt;a class=&quot;direct-link&quot; href=&quot;#luks%3A&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;format the 7th partition that we&#39;ll use with luks:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;cryptsetup luksFormat /dev/nvme0n1p7&lt;br&gt;cryptsetup luksOpen /dev/nvme0n1p7 CRY_main&lt;br&gt;&lt;br&gt;pvcreate /dev/mapper/CRY_main&lt;br&gt;vgcreate VG_main /dev/mapper/CRY_main&lt;br&gt;&lt;br&gt;lvcreate -L 15G -n LV_root VG_main&lt;br&gt;lvcreate -L 2G -C y -n LV_swap VG_main&lt;br&gt;&lt;br&gt;vgchange -a y&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;format the EFi partition:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;mkfs.vfat /dev/nvme0n1p5&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;ubuntu-installer%3A&quot;&gt;Ubuntu installer: &lt;a class=&quot;direct-link&quot; href=&quot;#ubuntu-installer%3A&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;now fire up the ubuntu common installer from the desktop icon,&lt;br&gt;
and continue with the normal selection:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;minimal installation&lt;/li&gt;
&lt;li&gt;download updates while installing ubuntu mate&lt;/li&gt;
&lt;li&gt;install third party software...
&lt;ul&gt;
&lt;li&gt;configure secureboot
&lt;ul&gt;
&lt;li&gt;choosing a password of your choosing&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;the last part is very important since it will allow you to enroll the newly created MOK key in the machine&#39;s UEFI&lt;/p&gt;
&lt;p&gt;in the partitioning part do:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;select efi nvme0n1p5 and select &amp;quot;Use as&amp;quot; &amp;quot;EFI System Partition&amp;quot;&lt;/li&gt;
&lt;li&gt;select boot nvme0n1p6 and select &amp;quot;Use as&amp;quot; &amp;quot;ext2&amp;quot; and mount on /boot, do format&lt;/li&gt;
&lt;li&gt;select /dev/mapper/VG_main-LV_root &amp;quot;Use as&amp;quot; &amp;quot;ext4&amp;quot; and mount on /&lt;/li&gt;
&lt;li&gt;select /dev/mapper/VG_main-LV_swap &amp;quot;Use as&amp;quot; swap&lt;/li&gt;
&lt;li&gt;select install the bootloader on the efi partition: nvme0n1p5&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;and continue the installation&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DO NOT REBOOT&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;DO NOT REBOOT&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;DO NOT REBOOT&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&quot;post-installation-tasks%3A&quot;&gt;Post-installation tasks: &lt;a class=&quot;direct-link&quot; href=&quot;#post-installation-tasks%3A&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;once finished do not reboot,&lt;/p&gt;
&lt;p&gt;mount the newly created system on /mnt creating the environment for chrooting correctly:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;mount&lt;/span&gt; /dev/mapper/VG_main-LV_root /mnt&lt;br&gt;&lt;span class=&quot;token function&quot;&gt;mount&lt;/span&gt; /dev/nvme0n1p6 /mnt/boot&lt;br&gt;&lt;span class=&quot;token function&quot;&gt;mount&lt;/span&gt; /dev/nvme0n1p5 /mnt/boot/efi&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token function&quot;&gt;mount&lt;/span&gt; --bind /dev /mnt/dev&lt;br&gt;&lt;span class=&quot;token function&quot;&gt;mount&lt;/span&gt; -t proc proc /mnt/proc&lt;br&gt;&lt;span class=&quot;token function&quot;&gt;mount&lt;/span&gt; -t sysfs sys /mnt/sys&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;then chroot in to the newly prepared folder:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;chroot&lt;/span&gt; /mnt&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;in-the-chroot%3A&quot;&gt;In the chroot: &lt;a class=&quot;direct-link&quot; href=&quot;#in-the-chroot%3A&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;blkid &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;grep&lt;/span&gt; -i luks&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;take the field &amp;quot;UUID&amp;quot;&lt;br&gt;
ES:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/dev/nvme0n1p7: UUID=&amp;quot;11111111-2222-3333-4444-555566667777&amp;quot; TYPE=&amp;quot;crypto_LUKS&amp;quot; PARTUUID=&amp;quot;aaaaaaaa-bbbb-cccc-dddd-eeeeffffaaaa&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;in this case it&#39;s: 11111111-2222-3333-4444-555566667777&lt;/p&gt;
&lt;p&gt;edit the file /etc/crypttab (if not present create)&lt;br&gt;
and add:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;CRY_main UUID=11111111-2222-3333-4444-555566667777 none luks,discard
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;NOTE: the name shall be the same as you opened the crypt device in steps&lt;/p&gt;
&lt;p&gt;then recrate the system boot environment:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;grub-install&lt;br&gt;update-initramfs -u -k all&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;and exit the chroot with a simple&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;exit&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;now you can reboot your system.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;be very aware of the next steps!&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&quot;enrolling-mok-key-to-secureboot%3A&quot;&gt;Enrolling MOK Key to Secureboot: &lt;a class=&quot;direct-link&quot; href=&quot;#enrolling-mok-key-to-secureboot%3A&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;you will be greeted by the UEFI Key manager, where you will be able to enroll the new key for secureboot:&lt;/p&gt;
&lt;p&gt;choose &amp;quot;Enroll MOK&amp;quot;&lt;br&gt;
&lt;img src=&quot;https://blog.smemory.org/img/20201111_01_SurfaceGo_HowToDualBoot_03.png&quot; alt=&quot;description&quot;&gt;&lt;/p&gt;
&lt;p&gt;then &amp;quot;continue&amp;quot;&lt;br&gt;
&lt;img src=&quot;https://blog.smemory.org/img/20201111_01_SurfaceGo_HowToDualBoot_04.png&quot; alt=&quot;description&quot;&gt;&lt;/p&gt;
&lt;p&gt;select &amp;quot;Yes&amp;quot;&lt;br&gt;
&lt;img src=&quot;https://blog.smemory.org/img/20201111_01_SurfaceGo_HowToDualBoot_05.png&quot; alt=&quot;description&quot;&gt;&lt;/p&gt;
&lt;p&gt;then insert the password you selected during ubuntu installation&lt;br&gt;
&lt;img src=&quot;https://blog.smemory.org/img/20201111_01_SurfaceGo_HowToDualBoot_06.png&quot; alt=&quot;description&quot;&gt;&lt;/p&gt;
&lt;p&gt;and then select &amp;quot;reboot&amp;quot;&lt;br&gt;
&lt;img src=&quot;https://blog.smemory.org/img/20201111_01_SurfaceGo_HowToDualBoot_07.png&quot; alt=&quot;description&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;after-the-reboot%3A&quot;&gt;After the reboot: &lt;a class=&quot;direct-link&quot; href=&quot;#after-the-reboot%3A&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;now the system should restart and you should be greeted by grub&#39;s selection screen,&lt;br&gt;
there you can choose to boot in Ubuntu or in Windows (which has been detected by the installer)&lt;/p&gt;
&lt;h2 id=&quot;re-activating-bitlocker&quot;&gt;Re-activating bitlocker &lt;a class=&quot;direct-link&quot; href=&quot;#re-activating-bitlocker&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;after booting to windows you can re-activate bitlocker,&lt;br&gt;
maybe setting a custom passphrase at boot so your system won&#39;t load automatically without your input.&lt;br&gt;
see: &lt;a href=&quot;https://blog.smemory.org/posts/20190325_01_surface-go-bitlocker/&quot;&gt;Win10 - Surface Go - Bitlocker with TPM and advanced pin&lt;/a&gt;&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>Debian 9-13 unlock luks root at boot via ssh</title>
		<link href="https://blog.smemory.org/posts/20200914_02_Debian_9_and_10_boot_luks_unlock/"/>
		<updated>2020-09-14T00:00:00+00:00</updated>
		<id>https://blog.smemory.org/posts/20200914_02_Debian_9_and_10_boot_luks_unlock/</id>
		<content type="html">&lt;p&gt;based on: &lt;a href=&quot;https://stinkyparkia.wordpress.com/2014/10/14/remote-unlocking-luks-encrypted-lvm-using-dropbear-ssh-in-ubuntu-server-14-04-1-with-static-ipst/&quot;&gt;https://stinkyparkia.wordpress.com/2014/10/14/remote-unlocking-luks-encrypted-lvm-using-dropbear-ssh-in-ubuntu-server-14-04-1-with-static-ipst/&lt;/a&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id=&quot;updated-for-debian-12-(2024-12-04)-and-tested-on-debian-13-(2025-12-02)&quot;&gt;updated for debian 12 (2024-12-04) and tested on debian 13 (2025-12-02) &lt;a class=&quot;direct-link&quot; href=&quot;#updated-for-debian-12-(2024-12-04)-and-tested-on-debian-13-(2025-12-02)&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;NB: in an upgrade from 11 to 12 if you tell the installer not to overwrite your configfiles averything will be moved to the new file names and work correctly out-of-the-box&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;apt&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; -yy dropbear-initramfs cryptsetup-initramfs lvm2&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;add your keys to: /etc/dropbear/initramfs/authorized_keys&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;nano&lt;/span&gt; /etc/dropbear/initramfs/authorized_keys&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;add your network interface config to: /etc/initramfs-tools/initramfs.conf&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;nano&lt;/span&gt; /etc/initramfs-tools/initramfs.conf&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;DEVICE=eth0
IP=192.168.0.10::192.168.0.1:255.255.255.0:your-hostname:eth0:off
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;to automatically call the script to unlock your disk upon entering dropbear add the line to this file:&lt;br&gt;
(source: &lt;a href=&quot;https://www.arminpech.de/2019/12/23/debian-unlock-luks-root-partition-remotely-by-ssh-using-dropbear/&quot;&gt;https://www.arminpech.de/2019/12/23/debian-unlock-luks-root-partition-remotely-by-ssh-using-dropbear/&lt;/a&gt;)&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;nano&lt;/span&gt; /etc/dropbear/initramfs/dropbear.conf&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;DROPBEAR_OPTIONS=&amp;quot;-RFEsjk -c /bin/cryptroot-unlock&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;and finally update initramfs:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;update-initramfs -k all -u&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id=&quot;old-versions-(up-to-debian-11)&quot;&gt;old versions (up to debian 11) &lt;a class=&quot;direct-link&quot; href=&quot;#old-versions-(up-to-debian-11)&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;apt-get&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; -yy dropbear-initramfs cryptsetup-initramfs lvm2&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;add your keys to: /etc/dropbear-initramfs/authorized_keys&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;nano&lt;/span&gt; /etc/dropbear-initramfs/authorized_keys&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;add your network interface config to: /etc/initramfs-tools/initramfs.conf&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;nano&lt;/span&gt; /etc/initramfs-tools/initramfs.conf&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;DEVICE=eth0
IP=192.168.0.10::192.168.0.1:255.255.255.0:your-hostname:eth0:off
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;to automatically call the script to unlock your disk upon entering dropbear add the line to this file:&lt;br&gt;
(source: &lt;a href=&quot;https://www.arminpech.de/2019/12/23/debian-unlock-luks-root-partition-remotely-by-ssh-using-dropbear/&quot;&gt;https://www.arminpech.de/2019/12/23/debian-unlock-luks-root-partition-remotely-by-ssh-using-dropbear/&lt;/a&gt;)&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;nano&lt;/span&gt; /etc/dropbear-initramfs/config&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;DROPBEAR_OPTIONS=&amp;quot;-RFEsjk -c /bin/cryptroot-unlock&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;and finally update initramfs:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;update-initramfs -k all -u&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id=&quot;end&quot;&gt;END &lt;a class=&quot;direct-link&quot; href=&quot;#end&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h3 id=&quot;notes-for-particular-cases%3A&quot;&gt;NOTES for particular cases: &lt;a class=&quot;direct-link&quot; href=&quot;#notes-for-particular-cases%3A&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id=&quot;device-drivers%3A&quot;&gt;device drivers: &lt;a class=&quot;direct-link&quot; href=&quot;#device-drivers%3A&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;sometimes, in case you are using exotic net drivers, you&#39;ll need to add your device modules to initram modules:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;echo $(while read m _; do \
/sbin/modinfo -F filename &amp;quot;$m&amp;quot;; done &amp;lt;/proc/modules |sed -nr \
&amp;quot;s@^/lib/modules/`uname -r`/kernel/drivers/net(/.*)?/([^/]+)\.ko\$@\2@p&amp;quot;)   &amp;gt;&amp;gt; /etc/initramfs-tools/modules
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;then edit /etc/initramfs-tools/modules since the modules will be on the same line:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;tap r8169 realtek
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;to&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;tap
r8169
realtek
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;after-upgrading%2C-dropbear&#39;s-net-won&#39;t-work-anymore%3A&quot;&gt;after upgrading, dropbear&#39;s net won&#39;t work anymore: &lt;a class=&quot;direct-link&quot; href=&quot;#after-upgrading%2C-dropbear&#39;s-net-won&#39;t-work-anymore%3A&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;I had this problem on a specific system: a Proxmox based debian 10 updated to 11 (and proxmox 6.4 to 7.2).&lt;br&gt;
After the update I could not unlock the machine remotely, after a lot of debugging I&#39;ve settled on this &amp;quot;fix&amp;quot;:&lt;br&gt;
changing the ip address....&lt;/p&gt;
&lt;p&gt;I&#39;ve always used the same IP address for unlocking via dropbear and for the system,&lt;br&gt;
but for some obscure reason this isn&#39;t working anymore.&lt;/p&gt;
&lt;p&gt;so the system for example will have 192.168.0.10 and the dropbear unlock ip: 192.168.0.11&lt;/p&gt;
&lt;p&gt;To add obscurity to this issue, I have another machine that is working perfectly with the same ip on os &amp;amp; dropbear.&lt;/p&gt;
&lt;p&gt;This behaviour is confirmed also after change subnet to the server.&lt;/p&gt;
&lt;p&gt;I have no idea why.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;OLD GUIDE:&lt;/strong&gt;&lt;br&gt;
until mid 2020 I&#39;ve used this script to unlock the disk:&lt;/p&gt;
&lt;p&gt;to automatically unlock the disk with the command &amp;quot;unlock&amp;quot; add this file:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;nano&lt;/span&gt; /etc/initramfs-tools/hooks/crypt_unlock.sh&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token shebang important&quot;&gt;#!/bin/sh&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;#&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;# By Stinky Parkia&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;# https://stinkyparkia.wordpress.com/2014/10/14/remote-unlocking-luks-encrypted-lvm-using-dropbear-ssh-in-ubuntu-server-14-04-1-with-static-ipst/&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token assign-left variable&quot;&gt;PREREQ&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;dropbear&quot;&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token function-name function&quot;&gt;prereqs&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$PREREQ&lt;/span&gt;&quot;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token keyword&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$1&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt;&lt;br&gt;    prereqs&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;br&gt;    prereqs&lt;br&gt;    &lt;span class=&quot;token builtin class-name&quot;&gt;exit&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token keyword&quot;&gt;esac&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;${CONFDIR}&lt;/span&gt;/initramfs.conf&quot;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;.&lt;/span&gt; /usr/share/initramfs-tools/hook-functions&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;${DROPBEAR}&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;n&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; -r &lt;span class=&quot;token string&quot;&gt;&quot;/etc/crypttab&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;then&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token function&quot;&gt;cat&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;${DESTDIR}&lt;/span&gt;/bin/unlock&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;EOF&lt;br&gt;#!/bin/sh&lt;br&gt;if PATH=/lib/unlock:/bin:/sbin /scripts/local-top/cryptroot; then&lt;br&gt;    kill \&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;ps&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;grep&lt;/span&gt; cryptroot &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;grep&lt;/span&gt; -v &lt;span class=&quot;token string&quot;&gt;&quot;grep&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;awk&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;{print \&lt;span class=&quot;token variable&quot;&gt;$1&lt;/span&gt;}&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;br&gt;    # following line kill the remote shell right after the passphrase has&lt;br&gt;    # been entered.&lt;br&gt;    kill -9 \&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;ps&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;grep&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;\-sh&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;grep&lt;/span&gt; -v &lt;span class=&quot;token string&quot;&gt;&quot;grep&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;awk&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;{print \&lt;span class=&quot;token variable&quot;&gt;$1&lt;/span&gt;}&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;br&gt;    exit 0&lt;br&gt;fi&lt;br&gt;exit 1&lt;br&gt;EOF&lt;/span&gt;&lt;br&gt;&lt;br&gt;    &lt;span class=&quot;token function&quot;&gt;chmod&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;755&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;${DESTDIR}&lt;/span&gt;/bin/unlock&quot;&lt;/span&gt;&lt;br&gt;&lt;br&gt;    &lt;span class=&quot;token function&quot;&gt;mkdir&lt;/span&gt; -p &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;${DESTDIR}&lt;/span&gt;/lib/unlock&quot;&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token function&quot;&gt;cat&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;${DESTDIR}&lt;/span&gt;/lib/unlock/plymouth&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;EOF&lt;br&gt;#!/bin/sh&lt;br&gt;[ &quot;\&lt;span class=&quot;token variable&quot;&gt;$1&lt;/span&gt;&quot; == &quot;--ping&quot; ] &amp;amp;&amp;amp; exit 1&lt;br&gt;/bin/plymouth &quot;\&lt;span class=&quot;token variable&quot;&gt;$@&lt;/span&gt;&quot;&lt;br&gt;EOF&lt;/span&gt;&lt;br&gt;&lt;br&gt;    &lt;span class=&quot;token function&quot;&gt;chmod&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;755&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;${DESTDIR}&lt;/span&gt;/lib/unlock/plymouth&quot;&lt;/span&gt;&lt;br&gt;&lt;br&gt;    &lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; To unlock root-partition run &lt;span class=&quot;token string&quot;&gt;&quot;unlock&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;${DESTDIR}&lt;/span&gt;/etc/motd&lt;br&gt;&lt;span class=&quot;token keyword&quot;&gt;fi&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
</content>
	</entry>
	
	<entry>
		<title>Debian 10 Buster various problems</title>
		<link href="https://blog.smemory.org/posts/20200914_01_Debian_10_Buster_problems/"/>
		<updated>2020-09-14T00:00:00+00:00</updated>
		<id>https://blog.smemory.org/posts/20200914_01_Debian_10_Buster_problems/</id>
		<content type="html">&lt;h1 id=&quot;preface&quot;&gt;Preface &lt;a class=&quot;direct-link&quot; href=&quot;#preface&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I&#39;ve always used Debian&lt;br&gt;
And I&#39;ve loved it&lt;br&gt;
because it &lt;s&gt;is&lt;/s&gt; was straightforward and you could easily solve your issues searching the net.&lt;/p&gt;
&lt;h1 id=&quot;issue&quot;&gt;Issue &lt;a class=&quot;direct-link&quot; href=&quot;#issue&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I had some issues because some common (from 20years to now) commands were no longer available,&lt;br&gt;
commands like&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;reboot&lt;/li&gt;
&lt;li&gt;shutdown&lt;/li&gt;
&lt;li&gt;iptables-whatever&lt;/li&gt;
&lt;li&gt;etc..&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;and it seemed pretty strange.&lt;/p&gt;
&lt;h1 id=&quot;workaround&quot;&gt;Workaround &lt;a class=&quot;direct-link&quot; href=&quot;#workaround&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I found out that all these executables are already present in the folder /sbin or /usr/sbin,&lt;br&gt;
but these folder are not in the PATH variable.&lt;/p&gt;
&lt;p&gt;searching a bit it should be due to /etc/profile:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# /etc/profile: system-wide .profile file for the Bourne shell (sh(1))&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;# and Bourne compatible shells (bash(1), ksh(1), ash(1), ...).&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;id&lt;/span&gt; -u&lt;span class=&quot;token variable&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&quot;&lt;/span&gt; -eq &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;then&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token assign-left variable&quot;&gt;&lt;span class=&quot;token environment constant&quot;&gt;PATH&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin&quot;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token assign-left variable&quot;&gt;&lt;span class=&quot;token environment constant&quot;&gt;PATH&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games&quot;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token keyword&quot;&gt;fi&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token environment constant&quot;&gt;PATH&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;${&lt;span class=&quot;token environment constant&quot;&gt;PS1&lt;/span&gt;-}&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;then&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;${&lt;span class=&quot;token environment constant&quot;&gt;BASH&lt;/span&gt;-}&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token environment constant&quot;&gt;$BASH&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;/bin/sh&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;then&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token comment&quot;&gt;# The file bash.bashrc already sets the default PS1.&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token comment&quot;&gt;# PS1=&#39;\h:\w\$ &#39;&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; -f /etc/bash.bashrc &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;then&lt;/span&gt;&lt;br&gt;      &lt;span class=&quot;token builtin class-name&quot;&gt;.&lt;/span&gt; /etc/bash.bashrc&lt;br&gt;    &lt;span class=&quot;token keyword&quot;&gt;fi&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;id&lt;/span&gt; -u&lt;span class=&quot;token variable&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&quot;&lt;/span&gt; -eq &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;then&lt;/span&gt;&lt;br&gt;      &lt;span class=&quot;token assign-left variable&quot;&gt;&lt;span class=&quot;token environment constant&quot;&gt;PS1&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;# &#39;&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt;&lt;br&gt;      &lt;span class=&quot;token assign-left variable&quot;&gt;&lt;span class=&quot;token environment constant&quot;&gt;PS1&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;$ &#39;&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token keyword&quot;&gt;fi&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token keyword&quot;&gt;fi&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token keyword&quot;&gt;fi&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; -d /etc/profile.d &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;then&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token for-or-select variable&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; /etc/profile.d/*.sh&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;do&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; -r &lt;span class=&quot;token variable&quot;&gt;$i&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;then&lt;/span&gt;&lt;br&gt;      &lt;span class=&quot;token builtin class-name&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$i&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token keyword&quot;&gt;fi&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token keyword&quot;&gt;done&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token builtin class-name&quot;&gt;unset&lt;/span&gt; i&lt;br&gt;&lt;span class=&quot;token keyword&quot;&gt;fi&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;which will load the second line of PATH and not the first one that includes our much needed /sbin and /usr/sbin&lt;/p&gt;
&lt;p&gt;the solution is to add to&lt;br&gt;
/etc/environment&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token assign-left variable&quot;&gt;&lt;span class=&quot;token environment constant&quot;&gt;PATH&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;which will fix the system, at least for my needs.&lt;/p&gt;
&lt;h1 id=&quot;ansible-task&quot;&gt;Ansible task &lt;a class=&quot;direct-link&quot; href=&quot;#ansible-task&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Ansible task to achieve that:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;    - name: Fix Debian10&#39;s shitty executables paths
      lineinfile:
        dest: /etc/environment
        line: &#39;PATH=&amp;quot;/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin&amp;quot;&#39;
        state: present
      when: ansible_distribution == &#39;Debian&#39; and ansible_distribution_major_version == &#39;10&#39;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;so, the issue is fixed, but please Debian, ripijate.&lt;/p&gt;
&lt;h1 id=&quot;update&quot;&gt;Update &lt;a class=&quot;direct-link&quot; href=&quot;#update&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;As a wise friend of mine pointed out, changing user with&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;su&lt;/span&gt; root&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;is not the same as doing&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;su&lt;/span&gt; - root&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;since it won&#39;t open a new shell and use the correct variables.&lt;br&gt;
more here:&lt;br&gt;
&lt;a href=&quot;https://unix.stackexchange.com/questions/15611/what-is-the-difference-between-su-and-su-root&quot;&gt;https://unix.stackexchange.com/questions/15611/what-is-the-difference-between-su-and-su-root&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;so 50/50 contributory negligence, ball in the center.&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>Dumb-migrating from a static Wordpress to Eleventy</title>
		<link href="https://blog.smemory.org/posts/20200830_01_blog-migration/"/>
		<updated>2020-08-30T00:00:00+00:00</updated>
		<id>https://blog.smemory.org/posts/20200830_01_blog-migration/</id>
		<content type="html">&lt;p&gt;My first blog was a wordpress installation on a hosted site,&lt;br&gt;
then it got moved to a full vm under my control,&lt;br&gt;
then it got shutdown and forgot for some months,&lt;br&gt;
then it was recovered and lived for brief moments just when writing entries because the &amp;quot;live&amp;quot; site was actually a static export on S3.&lt;/p&gt;
&lt;p&gt;Then today, wordpress has been decommissioned &#39;cause it was useless to keep something alive when the hassle of using it was more than the usefullness of it.&lt;/p&gt;
&lt;p&gt;So I&#39;ve migrated the old wordpress to &lt;a href=&quot;https://www.11ty.dev/&quot;&gt;Eleventy&lt;/a&gt; using &lt;a href=&quot;https://github.com/11ty/eleventy-base-blog&quot;&gt;eleventy-base-blog&lt;/a&gt;,&lt;br&gt;
this allows me to edit the blog entries easily from CLI, preview it locally and upload the site with a simple &amp;quot;aws s3 sync&amp;quot;.&lt;/p&gt;
&lt;p&gt;The migration has been done without automatic tools,&lt;br&gt;
all the entries have been dumb-migrated by hand, and it shows since the formatting has to be fixed on many pages.&lt;/p&gt;
&lt;h2 id=&quot;installation%3A&quot;&gt;Installation: &lt;a class=&quot;direct-link&quot; href=&quot;#installation%3A&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;br&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;apt-get&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; nodejs&lt;br&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;apt-get&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt; init -y&lt;br&gt;&lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; @11ty/eleventy --save-dev&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;running-and-serving%3A&quot;&gt;Running and serving: &lt;a class=&quot;direct-link&quot; href=&quot;#running-and-serving%3A&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;running eleventy to build the static site:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;npx @11ty/eleventy&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;to run and serve eleventy locally:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;npx @11ty/eleventy --serve&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;and you&#39;ll find your site on localhost:8080&lt;/p&gt;
&lt;p&gt;TODO:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;fix formatting&lt;/li&gt;
&lt;/ul&gt;
</content>
	</entry>
	
	<entry>
		<title>Win10 - Surface Go - Bitlocker with TPM and advanced pin</title>
		<link href="https://blog.smemory.org/posts/20190325_01_surface-go-bitlocker/"/>
		<updated>2019-03-25T00:00:00+00:00</updated>
		<id>https://blog.smemory.org/posts/20190325_01_surface-go-bitlocker/</id>
		<content type="html">&lt;h2 id=&quot;preface%3A&quot;&gt;Preface: &lt;a class=&quot;direct-link&quot; href=&quot;#preface%3A&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The aim of this article is to configure Bitlocker to ask for a password on boot so the protected system will not be avilable without user interaction.&lt;/p&gt;
&lt;p&gt;This is updated to 2020-11-11, on Win10 20H2&lt;/p&gt;
&lt;p&gt;NB: I am not advocating the use of bitlocker instead of other approaches, nor I am saying that it&#39;s secure.&lt;br&gt;
I am writing this guide for cases where you are forced or need to use a device with Win10, and are able to at least make it a bit more secure or more difficult for an attacker to access your data.&lt;/p&gt;
&lt;h2 id=&quot;modify-group-policies%3A&quot;&gt;Modify group policies: &lt;a class=&quot;direct-link&quot; href=&quot;#modify-group-policies%3A&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;execute gpedit.msc to edit the Bitlocker policies and go to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Computer Configuration&lt;/li&gt;
&lt;li&gt;Administrative Templates&lt;/li&gt;
&lt;li&gt;Windows Components&lt;/li&gt;
&lt;li&gt;BitLocker Drive Encryption&lt;/li&gt;
&lt;li&gt;Operating System Drives&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;then edit:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Require additional authentication ad startup&lt;/li&gt;
&lt;li&gt;Enable use of bitlocker authentication requiring preboot keyboard inputs&lt;/li&gt;
&lt;li&gt;Allow enhanced PINs for startup
&lt;ul&gt;
&lt;li&gt;this allow us to use alphanumeric long &amp;quot;passphrases&amp;quot; instead of short numeric only PINs&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.smemory.org/img/20190325_01_surface-go-bitlocker_01.jpg&quot; alt=&quot;description&quot;&gt;&lt;br&gt;
&lt;img src=&quot;https://blog.smemory.org/img/20190325_01_surface-go-bitlocker_02.jpg&quot; alt=&quot;description&quot;&gt;&lt;br&gt;
&lt;img src=&quot;https://blog.smemory.org/img/20190325_01_surface-go-bitlocker_03.jpg&quot; alt=&quot;description&quot;&gt;&lt;br&gt;
&lt;img src=&quot;https://blog.smemory.org/img/20190325_01_surface-go-bitlocker_04.jpg&quot; alt=&quot;description&quot;&gt;&lt;/p&gt;
&lt;p&gt;I&#39;ve found out that the &amp;quot;Enable use of bitlocker authentication requiring preboot keyboard inputs&amp;quot; is still needed also if the newer firmwares allos the tablet to show a keyboard when selecting the bitlocker input field with the touchscreen.&lt;/p&gt;
&lt;h2 id=&quot;encrypting-the-drive%3A&quot;&gt;Encrypting the drive: &lt;a class=&quot;direct-link&quot; href=&quot;#encrypting-the-drive%3A&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Then open the bitlocker utility from the control panel and click on &amp;quot;Turn on bitlocker&amp;quot;:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.smemory.org/img/20190325_01_surface-go-bitlocker_05.png&quot; alt=&quot;description&quot;&gt;&lt;/p&gt;
&lt;p&gt;Then you will be able to choose how you want to unlock your boot drive,&lt;br&gt;
choose PIN and enter your pin (sorry, no screenshot)&lt;/p&gt;
&lt;p&gt;The choose how you want to save your recovery key, needed to unlock the drive in case you loose your pin or the encryption has some problems.&lt;/p&gt;
&lt;p&gt;Dualbooting: these problems might arise in case ubuntu isn&#39;t installed correctly with secureboot, as I did one time,&lt;br&gt;
since when Ubuntu upgrades the kernel and it&#39;s boot sequence, Windows detect this as something broken in the secureboot process and asks you for the recovery key.&lt;br&gt;
This article should solve this issue: &lt;a href=&quot;https://blog.smemory.org/posts/20201111_01_surface-go-dual-secureboot/&quot;&gt;Surface Go Dual Boot Secureboot&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.smemory.org/img/20190325_01_surface-go-bitlocker_06.png&quot; alt=&quot;description&quot;&gt;&lt;/p&gt;
&lt;p&gt;then choose to encrypt the entire drive (the screenshot has the wrong selection):&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.smemory.org/img/20190325_01_surface-go-bitlocker_07.png&quot; alt=&quot;description&quot;&gt;&lt;/p&gt;
&lt;p&gt;and choose the newer encryption method:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.smemory.org/img/20190325_01_surface-go-bitlocker_08.png&quot; alt=&quot;description&quot;&gt;&lt;/p&gt;
&lt;p&gt;you will be asked if you want to follow a pre-encryption check to be sure that the newly encrypted drive will work as intended, I choose yes (sorry, no screenshot)&lt;/p&gt;
&lt;p&gt;Your system will reboot,&lt;br&gt;
you will be asked to unlock the drive:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.smemory.org/img/20190325_01_surface-go-bitlocker_09.png&quot; alt=&quot;description&quot;&gt;&lt;/p&gt;
&lt;p&gt;and the system will boot.&lt;br&gt;
At this point the drive will encrypt, you can monitor the status of the process from the tray:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.smemory.org/img/20190325_01_surface-go-bitlocker_10.jpeg&quot; alt=&quot;description&quot;&gt;&lt;/p&gt;
&lt;p&gt;then you are set.&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>FASTBOOT “TOO OLD” AND “ERROR CANNOT GENERATE IMAGE FOR USERDATA”</title>
		<link href="https://blog.smemory.org/posts/20190324_01_fastboot-old/"/>
		<updated>2019-03-24T00:00:00+00:00</updated>
		<id>https://blog.smemory.org/posts/20190324_01_fastboot-old/</id>
		<content type="html">&lt;p&gt;When you try to install a factory image on a newer Android device (in my case a Google Pixel “1”), you might encounter this error which i sude to the android platform tools which are too old.&lt;/p&gt;
&lt;p&gt;Resolution:&lt;br&gt;
download the newer platform-tools from &lt;a href=&quot;https://developer.android.com/studio/releases/platform-tools&quot;&gt;https://developer.android.com/studio/releases/platform-tools&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Decompress them with:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;unzip&lt;/span&gt; platform-tools_r28.0.2-linux.zip&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;a new platform-tools folder will be created&lt;br&gt;
then in your folder where you have unzipped the factory default edit &lt;a href=&quot;http://flash-all.sh/&quot;&gt;flash-all.sh&lt;/a&gt; and add this line on top:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;&lt;span class=&quot;token environment constant&quot;&gt;PATH&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;/home/YOURUSER/Downloads/platform-tools:&lt;span class=&quot;token environment constant&quot;&gt;$PATH&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;in this way the script will search for executables in that folder, using the newer ones.&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>NEXUS 5X LINEAGEOS 15.1 – “VENDOR IMAGE MISMATCH HAS BEEN DETECTED”</title>
		<link href="https://blog.smemory.org/posts/20180715_01_nexus-image-mismatch/"/>
		<updated>2018-07-15T00:00:00+00:00</updated>
		<id>https://blog.smemory.org/posts/20180715_01_nexus-image-mismatch/</id>
		<content type="html">&lt;p&gt;I’ve updated LineageOS on a colleague’s Nexus5x and I followed these steps:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Downloaded the latest  (8.1.0 (OPM6.171019.030.E1, Jul 2018)) stock image for nexus5x from Google repos&lt;/li&gt;
&lt;li&gt;updated the 5x using the &lt;a href=&quot;http://flash-all.sh/&quot;&gt;flash-all.sh&lt;/a&gt; included in the archive&lt;/li&gt;
&lt;li&gt;following lineageos tutorial for N5x   I’ve&lt;br&gt;
⋅⋅* downloaded the latest (lineage-15.1-20180702-nightly-bullhead-signed.zip) image from the repo&lt;br&gt;
⋅⋅* downloaded the latest Open Gapps pico package for ARM64, android 8.1&lt;br&gt;
⋅⋅* downloaded the and installed twrp&lt;br&gt;
⋅⋅* flashed my device with lineageos&lt;br&gt;
⋅⋅* flashed opengapps&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;when I restarted I was greeted with a message stating&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“A vendor image mismatch has been detected. Typically this means your vendor image is out of date. Please ensure your vendor image matches OPM6.171019.030.B1”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;NB: the following image states “OPM6.171019.030.E1” wince is the latest warning I received.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.smemory.org/img/95c1dd6b-18a8-4ffb-9af8-8a33e937323a.jpeg&quot; alt=&quot;description&quot;&gt;&lt;/p&gt;
&lt;p&gt;this was because the LineageOS image I downloaded was the last one available but was built on OPM6.171019.030.B1 which wasn’t the latest google image available.&lt;/p&gt;
&lt;p&gt;you can find this info in the changelogs:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;starting from  lineage-15.1-20180618-nightly-bullhead-signed.zip it was built upon OPM6.171019.030.B1(full changelog, detailed changelog on our issue)&lt;br&gt;
starting  from  lineage-15.1-20180709-nightly-bullhead-signed.zip it was built upon OPM6.171019.030.E1 (full changelog, detailed changelog on our issue)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Solution:&lt;br&gt;
flash the vendor image:&lt;/p&gt;
&lt;p&gt;from the google repos download the package corresponding to the vendor image your N5x wants&lt;br&gt;
extract the archive to a folder, move into that folder then unzip the zipfile relative to your version, mine: “image-bullhead-opm6.171019.030.b1.zip”&lt;br&gt;
you’ll find a file named “vendor.img”&lt;/p&gt;
&lt;p&gt;put the N5x in fastboot and flash said file with:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;fastboot flash vendor vendor.img&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;reboot your N5x&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;fastboot &lt;span class=&quot;token function&quot;&gt;reboot&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;the issue should be solved and you should receive no error when booting.&lt;/p&gt;
&lt;p&gt;I’ve encountered this problem twice, since I installed LineageOS lineage-15.1-20180702 and then updated to lineage-15.1-20180709 and the two images have been built on different vendor image versions.&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>FakeKitten, or how to trick Amazon Prime Photos to store anything</title>
		<link href="https://blog.smemory.org/posts/20180105_01_fakekitten/"/>
		<updated>2018-01-05T00:00:00+00:00</updated>
		<id>https://blog.smemory.org/posts/20180105_01_fakekitten/</id>
		<content type="html">&lt;p&gt;&lt;a href=&quot;https://blog.smemory.org/img/20180105_01_fakekitten_01.jpg&quot;&gt;&lt;img src=&quot;https://blog.smemory.org/img/20180105_01_fakekitten_01.jpg&quot; alt=&quot;description&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&quot;scope%3A&quot;&gt;Scope: &lt;a class=&quot;direct-link&quot; href=&quot;#scope%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Some have an Amazon Prime with Unlimited Photo Storage,&lt;br&gt;
it would be a pity to use it just for photos.&lt;/p&gt;
&lt;h1 id=&quot;how%3A&quot;&gt;How: &lt;a class=&quot;direct-link&quot; href=&quot;#how%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;The script creates a new file and adds the photo of a very cute kitten at the end of it.&lt;/p&gt;
&lt;p&gt;In this way the file gets recognized as a photo and won&#39;t count against your usable space (this is after uploading 3.3GB of &amp;quot;fakekitten-ed&amp;quot; ubuntu iso):&lt;br&gt;
&lt;a href=&quot;https://blog.smemory.org/img/20180105_01_fakekitten_02.jpg&quot;&gt;&lt;img src=&quot;https://blog.smemory.org/img/20180105_01_fakekitten_02.jpg&quot; alt=&quot;description&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;In the encoding phase useful data gets stored in the destination filename,&lt;br&gt;
this data will be used for decoding and checking that the image is consistent and not corrupted.&lt;/p&gt;
&lt;p&gt;Unfortunately the upload will be done manually since the APIs for Amazon Drive are not available anymore [&lt;a href=&quot;https://rclone.org/amazonclouddrive/&quot;&gt;0&lt;/a&gt;] and we won&#39;t be able to use automated tools.&lt;br&gt;
More info on the incident that allegedly kicked off the API removal [&lt;a href=&quot;https://www.vice.com/en/article/a33j5a/a-redditor-archived-nearly-2-million-gigabytes-of-porn-to-test-amazons-unlimited-cloud-storage&quot;&gt;1&lt;/a&gt;]&lt;/p&gt;
&lt;h3 id=&quot;encoding%3A&quot;&gt;Encoding: &lt;a class=&quot;direct-link&quot; href=&quot;#encoding%3A&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;stores imagesize of the kitten image&lt;/li&gt;
&lt;li&gt;creates sha1 checksum of the original file&lt;/li&gt;
&lt;li&gt;creates filename with useful data: &amp;quot;FakeKitten_JpgImgSize_OrigFileName_OrigFileSha_ImageFilename&amp;quot;
&lt;ul&gt;
&lt;li&gt;FakeKitten: fixed text&lt;/li&gt;
&lt;li&gt;JpgImgSize: the filesize of the kitten.jpg image&lt;/li&gt;
&lt;li&gt;OrigFileName: filename of the original file&lt;/li&gt;
&lt;li&gt;OrigFileSha: sha1sum of the original file&lt;/li&gt;
&lt;li&gt;ImageFilename: image filename (kitten.jpg)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;appends the image at the end of the file&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;decoding%3A&quot;&gt;Decoding: &lt;a class=&quot;direct-link&quot; href=&quot;#decoding%3A&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;retrieves the variables from the filename&lt;/li&gt;
&lt;li&gt;creates new file skipping the appended image at the end of the file&lt;/li&gt;
&lt;li&gt;creates sha1 checksum of the downloaded file and checks it against the filename&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;prerequisites%3A&quot;&gt;Prerequisites: &lt;a class=&quot;direct-link&quot; href=&quot;#prerequisites%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;You will need:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;something that runs bash&lt;/li&gt;
&lt;li&gt;kitten image&lt;/li&gt;
&lt;li&gt;the files you want to upload&lt;/li&gt;
&lt;li&gt;obv. an Amazon Prime account to upload the &amp;quot;photos&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;instructions%3A&quot;&gt;Instructions: &lt;a class=&quot;direct-link&quot; href=&quot;#instructions%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;just run the script with the options:&lt;/p&gt;
&lt;p&gt;Encode: ./AmazonPrimeWhatever.sh fileName encode&lt;br&gt;
Decode: ./AmazonPrimeWhatever.sh fileName decode&lt;/p&gt;
&lt;h1 id=&quot;the-script%3A&quot;&gt;The script: &lt;a class=&quot;direct-link&quot; href=&quot;#the-script%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token shebang important&quot;&gt;#!/usr/bin/env bash&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; -z &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$1&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; -z &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$2&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$2&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;encode&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$2&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;decode&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;br&gt;	&lt;span class=&quot;token keyword&quot;&gt;then&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;launch the script with the desired filename and operation&quot;&lt;/span&gt;&lt;br&gt;	&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;./AmazonPrimeWhatever.sh FILENAME OPERATION(encode or decode)&quot;&lt;/span&gt;&lt;br&gt;	&lt;span class=&quot;token builtin class-name&quot;&gt;exit&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token keyword&quot;&gt;fi&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token assign-left variable&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;kitten.jpg&quot;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token assign-left variable&quot;&gt;imagesize&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;du&lt;/span&gt; -b $image &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;cut&lt;/span&gt; -f1&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token assign-left variable&quot;&gt;origsha&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;sha1sum $1 &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;cut&lt;/span&gt; -d &lt;span class=&quot;token string&quot;&gt;&quot; &quot;&lt;/span&gt; -f1&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token assign-left variable&quot;&gt;destimage&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;FakeKitten_&quot;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$imagesize&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;_&quot;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$1&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;_&quot;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$origsha&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;_&quot;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$image&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$2&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;encode&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;br&gt;	&lt;span class=&quot;token keyword&quot;&gt;then&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;cp&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$image&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$destimage&lt;/span&gt;&lt;br&gt;	&lt;span class=&quot;token function&quot;&gt;dd&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$1&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;bs&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;1M &lt;span class=&quot;token operator&quot;&gt;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$destimage&lt;/span&gt;&quot;&lt;/span&gt;&lt;br&gt;	&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;encode completed in &lt;span class=&quot;token variable&quot;&gt;$destimage&lt;/span&gt;&quot;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token keyword&quot;&gt;fi&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$2&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;decode&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;then&lt;/span&gt;&lt;br&gt;	&lt;span class=&quot;token assign-left variable&quot;&gt;imagebs&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; $1 &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;cut&lt;/span&gt; -d &lt;span class=&quot;token string&quot;&gt;&quot;_&quot;&lt;/span&gt; -f2&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br&gt;	&lt;span class=&quot;token assign-left variable&quot;&gt;origname&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; $1 &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;cut&lt;/span&gt; -d &lt;span class=&quot;token string&quot;&gt;&quot;_&quot;&lt;/span&gt; -f3&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br&gt;	&lt;span class=&quot;token assign-left variable&quot;&gt;origsha&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; $1 &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;cut&lt;/span&gt; -d &lt;span class=&quot;token string&quot;&gt;&quot;_&quot;&lt;/span&gt; -f4&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br&gt;	&lt;span class=&quot;token assign-left variable&quot;&gt;origimage&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; $1 &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;cut&lt;/span&gt; -d &lt;span class=&quot;token string&quot;&gt;&quot;_&quot;&lt;/span&gt; -f5&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br&gt;	&lt;span class=&quot;token function&quot;&gt;dd&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$1&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;bs&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;1M &lt;span class=&quot;token assign-left variable&quot;&gt;skip&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$imagebs&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;iflag&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;skip_bytes &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$origname&lt;/span&gt;&quot;&lt;/span&gt;&lt;br&gt;	&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;decode completed in &lt;span class=&quot;token variable&quot;&gt;$origimage&lt;/span&gt;, checking file integrity&quot;&lt;/span&gt;&lt;br&gt;	&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$origsha&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;  &quot;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$origname&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$origname&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;.sha1&quot;&lt;/span&gt;&lt;br&gt;	&lt;span class=&quot;token assign-left variable&quot;&gt;shaoutput&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;sha1sum -c $origname&lt;span class=&quot;token string&quot;&gt;&quot;.sha1&quot;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br&gt;	&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$shaoutput&lt;/span&gt;&lt;br&gt;	&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$shaoutput&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt; *&lt;span class=&quot;token string&quot;&gt;&quot;OK&quot;&lt;/span&gt;* &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;then&lt;/span&gt;&lt;br&gt;		&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;br&gt;		&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;!!! FAILED SHA VERIFICATION!!! EXITING&quot;&lt;/span&gt;&lt;br&gt;		&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;!!! DELETING ALL CREATED FILES !!!&quot;&lt;/span&gt;&lt;br&gt;		&lt;span class=&quot;token function&quot;&gt;rm&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$origname&lt;/span&gt;&lt;br&gt;		&lt;span class=&quot;token function&quot;&gt;rm&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$origname&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;.sha1&quot;&lt;/span&gt;&lt;br&gt;		&lt;span class=&quot;token builtin class-name&quot;&gt;exit&lt;/span&gt;&lt;br&gt;	&lt;span class=&quot;token keyword&quot;&gt;fi&lt;/span&gt;&lt;br&gt;	&lt;span class=&quot;token function&quot;&gt;rm&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$origname&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;.sha1&quot;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token keyword&quot;&gt;fi&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;end of my job&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
</content>
	</entry>
	
	<entry>
		<title>MAKE VMWARE-VIEW work ON LUBUNTU 16.04 32BIT</title>
		<link href="https://blog.smemory.org/posts/20170202_01_vmware-view-lubuntu/"/>
		<updated>2017-02-02T00:00:00+00:00</updated>
		<id>https://blog.smemory.org/posts/20170202_01_vmware-view-lubuntu/</id>
		<content type="html">&lt;p&gt;vMware View scan output:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;VMware Horizon Smart Card
        Success
VMware Horizon Real-Time Audio-Video
        Success
VMware Horizon Client Drive Redirection
        Success
VMware Horizon Multimedia Redirection (MMR)
        Failed          libgstapp-0.10.so.0
        Failed          libgstbase-0.10.so.0
        Failed          libgstreamer-0.10.so.0
VMware Horizon PCoIP
        Success
VMware Horizon USB Redirection
        Success
VMware Horizon Virtual Printing
        Success
VMware Horizon Client
        Success
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;some of the steps:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;apt-get&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; libglibmm-2.4-1v5 libglibmm-2.4-dev libffi-dev libffi6&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token function&quot;&gt;ln&lt;/span&gt; -s /usr/lib/i386-linux-gnu/libffi.so.6 /usr/lib/i386-linux-gnu/libffi.so.5&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;some of the guides followed:&lt;br&gt;
&lt;a href=&quot;https://nchrissos.wordpress.com/2015/05/26/the-odyssey-of-building-a-lightweight-vmware-view-linux-workstation-for-horizon-6/&quot;&gt;https://nchrissos.wordpress.com/2015/05/26/the-odyssey-of-building-a-lightweight-vmware-view-linux-workstation-for-horizon-6/&lt;/a&gt;&lt;br&gt;
&lt;a href=&quot;https://communities.vmware.com/thread/499473&quot;&gt;https://communities.vmware.com/thread/499473&lt;/a&gt;&lt;br&gt;
&lt;a href=&quot;http://askubuntu.com/questions/518644/error-while-loading-shared-libraries-libffi-so-5&quot;&gt;http://askubuntu.com/questions/518644/error-while-loading-shared-libraries-libffi-so-5&lt;/a&gt;&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>Debian 7.11 on Powermac G5</title>
		<link href="https://blog.smemory.org/posts/20170115_01_debian-powermac/"/>
		<updated>2017-01-15T00:00:00+00:00</updated>
		<id>https://blog.smemory.org/posts/20170115_01_debian-powermac/</id>
		<content type="html">&lt;p&gt;Downloaded Debian 7.11 netinstall from here, burnt on a DVD and inserted in the superdrive.&lt;/p&gt;
&lt;p&gt;To open the superdrive witha non-mac keyboard, press F12 at boot.&lt;br&gt;
To boot from the cdrom press “c” at boot.&lt;br&gt;
You’ll be greated by the open firmware, select “c” to boot from cdrom:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.smemory.org/img/IMG_20170115_232038_red.png&quot; alt=&quot;description&quot;&gt;&lt;br&gt;
&lt;img src=&quot;https://blog.smemory.org/img/IMG_20170115_232042_red.png&quot; alt=&quot;description&quot;&gt;&lt;/p&gt;
&lt;p&gt;Then type “install” and press enter to continue with the installation&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.smemory.org/img/IMG_20170115_232053_red-300x241.png&quot; alt=&quot;description&quot;&gt;&lt;/p&gt;
&lt;p&gt;Then proceed with a normal installation.&lt;/p&gt;
&lt;p&gt;Note that the installer has a red background for the whole duration of the installation,&lt;br&gt;
I’ve seen this on x86 when there was an error but that doesn’t seem the case since the installation proceeded and completed fine.&lt;/p&gt;
&lt;p&gt;Normal selecting the right nic:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.smemory.org/img/IMG_20170115_232210_red-768x330.png&quot; alt=&quot;description&quot;&gt;&lt;/p&gt;
&lt;p&gt;Normal partitioning the disks:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.smemory.org/img/IMG_20170115_232313_red-768x433.png&quot; alt=&quot;description&quot;&gt;&lt;br&gt;
&lt;img src=&quot;https://blog.smemory.org/img/IMG_20170115_232315_red-768x442.png&quot; alt=&quot;description&quot;&gt;&lt;br&gt;
&lt;img src=&quot;https://blog.smemory.org/img/IMG_20170115_232318_red-768x435.png&quot; alt=&quot;description&quot;&gt;&lt;br&gt;
&lt;img src=&quot;https://blog.smemory.org/img/IMG_20170115_232323_red-768x428.png&quot; alt=&quot;description&quot;&gt;&lt;br&gt;
&lt;img src=&quot;https://blog.smemory.org/img/IMG_20170115_232331_red-768x440.png&quot; alt=&quot;description&quot;&gt;&lt;/p&gt;
&lt;p&gt;And almost normal selecting a mirror:&lt;br&gt;
when selecting the network mirror for the installation I had to select Germany –&amp;gt; &lt;a href=&quot;http://ftp.de.debian.org/&quot;&gt;ftp.de.debian.org&lt;/a&gt; because the Italian one (&lt;a href=&quot;http://ftp.it.debian.org/&quot;&gt;ftp.it.debian.org&lt;/a&gt;) hadn’t the powerpc architecture available.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.smemory.org/img/IMG_20170115_233417_red-768x438.png&quot; alt=&quot;description&quot;&gt;&lt;/p&gt;
&lt;p&gt;However selecting the german mirror I received this error (that I received also using the UK mirror) and continued:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.smemory.org/img/IMG_20170115_233510_red-768x443.png&quot; alt=&quot;description&quot;&gt;&lt;/p&gt;
&lt;p&gt;Selected  the software:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.smemory.org/img/IMG_20170115_233651_red-768x376.png&quot; alt=&quot;description&quot;&gt;&lt;/p&gt;
&lt;p&gt;Then finished the installation without further problems.&lt;/p&gt;
&lt;p&gt;The system (with a single disk with Debian) boots automatically.&lt;/p&gt;
&lt;p&gt;I incurred in a graphical problem where I couldn’t see about half of the screen, either in graphical or console mode:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.smemory.org/img/IMG_20170116_001202_red.png&quot; alt=&quot;description&quot;&gt;&lt;br&gt;
&lt;img src=&quot;https://blog.smemory.org/img/IMG_20170116_001230_red.png&quot; alt=&quot;description&quot;&gt;&lt;/p&gt;
&lt;p&gt;The issue was due to the fact that I was using a DVI-VGA adapter, once I connected the PowerMac via DVI to the monitor the problem solved:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.smemory.org/img/IMG_20170116_003217_red.png&quot; alt=&quot;description&quot;&gt;&lt;br&gt;
&lt;img src=&quot;https://blog.smemory.org/img/IMG_20170116_003338_red.png&quot; alt=&quot;description&quot;&gt;&lt;/p&gt;
&lt;p&gt;root@DebPowMacG5:~# lscpu&lt;br&gt;
Architecture:          ppc64&lt;br&gt;
Byte Order:            Big Endian&lt;br&gt;
CPU(s):                2&lt;br&gt;
On-line CPU(s) list:   0,1&lt;br&gt;
Thread(s) per core:    1&lt;br&gt;
Core(s) per socket:    1&lt;br&gt;
Socket(s):             2&lt;br&gt;
NUMA node(s):          1&lt;br&gt;
Model:                 PowerMac11,2&lt;br&gt;
L1d cache:             32K&lt;br&gt;
L1i cache:             64K&lt;br&gt;
L2 cache:              1024K&lt;br&gt;
NUMA node0 CPU(s):     0,1&lt;/p&gt;
&lt;p&gt;Useful read: &lt;a href=&quot;http://larryhynes.net/2014/11/installing-debian-on-powermac-g5.html&quot;&gt;http://larryhynes.net/2014/11/installing-debian-on-powermac-g5.html&lt;/a&gt;&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>KERNEL 586 NO HT</title>
		<link href="https://blog.smemory.org/posts/20170113_01_kernel-i586-noht/"/>
		<updated>2017-01-13T00:00:00+00:00</updated>
		<id>https://blog.smemory.org/posts/20170113_01_kernel-i586-noht/</id>
		<content type="html">&lt;p&gt;doing a fresh install with cbpp-1.0-i386-20150428.iso on Atom N270 (single core, HT), had a problem due to the HT that was not being used.&lt;/p&gt;
&lt;p&gt;This was due to the fact that kernel 3.16.0-4-586 does not have SMT built in kernel:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;user@host:~$ &lt;span class=&quot;token function&quot;&gt;cat&lt;/span&gt; /boot/config-3.16.0-4-586  &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;grep&lt;/span&gt; CONFIG_SCHED_SMT&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;receiving no output,&lt;br&gt;
I updated to kernel 3.16.0-4-686-pae and then the HT support was enabled:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;user@host:~$ &lt;span class=&quot;token function&quot;&gt;cat&lt;/span&gt; /boot/config-3.16.0-4-686-pae  &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;grep&lt;/span&gt; CONFIG_SCHED_SMT&lt;br&gt;&lt;span class=&quot;token assign-left variable&quot;&gt;CONFIG_SCHED_SMT&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;y&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;install the kernel with:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;apt-get&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; linux-image-3.16.0-4-686-pae&lt;/code&gt;&lt;/pre&gt;
</content>
	</entry>
	
	<entry>
		<title>Linux user SCP only</title>
		<link href="https://blog.smemory.org/posts/20170108_01_linux-user-scp-only/"/>
		<updated>2017-01-08T00:00:00+00:00</updated>
		<id>https://blog.smemory.org/posts/20170108_01_linux-user-scp-only/</id>
		<content type="html">&lt;p&gt;install rssh:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;apt-get&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; rssh&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;then to add a user:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;useradd&lt;/span&gt; -m -d /home/didi -s /usr/bin/rssh didi&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;edit&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;nano&lt;/span&gt; /etc/rssh.conf&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;and select how much users are locked out:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;allowscp
#allowsftp
#allowcvs
#allowrdist
#allowrsync
#allowsvnserve
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;source: &lt;a href=&quot;https://www.cyberciti.biz/tips/linux-unix-restrict-shell-access-with-rssh.html&quot;&gt;https://www.cyberciti.biz/tips/linux-unix-restrict-shell-access-with-rssh.html&lt;/a&gt;&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>Soluzione [quasi] completamente libera (ed economica) per lo streaming/registrazione live</title>
		<link href="https://blog.smemory.org/posts/20161201_01_video-repeater/"/>
		<updated>2016-12-01T00:00:00+00:00</updated>
		<id>https://blog.smemory.org/posts/20161201_01_video-repeater/</id>
		<content type="html">&lt;h2 id=&quot;il-problema%3A&quot;&gt;Il Problema: &lt;a class=&quot;direct-link&quot; href=&quot;#il-problema%3A&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Dopo 4 anni di riprese ai LinuxDay di ERLUG dove a volte il risultato migliore che si riusciva ad ottenere a livello video era questo:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.smemory.org/img/Screenshot-from-2016-12-01-21-34-02-300x169.png&quot; alt=&quot;description&quot;&gt;&lt;/p&gt;
&lt;p&gt;ho iniziato a cercare una soluzione per acquisire l’output del monitor del relatore in modo che fosse utilizzabile per una successiva consultazione dei video registrati.&lt;/p&gt;
&lt;h2 id=&quot;requisiti%3A&quot;&gt;Requisiti: &lt;a class=&quot;direct-link&quot; href=&quot;#requisiti%3A&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;poter gestire uno o piu’ input video&lt;/li&gt;
&lt;li&gt;essere remotizzabili il piu’ possibile&lt;/li&gt;
&lt;li&gt;essere supportati da sistemi operativi opensource&lt;/li&gt;
&lt;li&gt;essere economici&lt;/li&gt;
&lt;li&gt;essere una soluzione agnostica non invasiva per il relatore permettendoci di prendere il segnale che sarebbe poi andato al proiettore&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;La mia ricerca mi ha portato alle schede di acquisizione USB o Pci ma spesso violavano tutti i punti.&lt;/p&gt;
&lt;h2 id=&quot;la-soluzione%3A&quot;&gt;La Soluzione: &lt;a class=&quot;direct-link&quot; href=&quot;#la-soluzione%3A&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;L’epifania e’ arrivata leggendo questo articolo dove Danman, l’autore, ha preso un extender HDMI che trasporta il segnale via ethernet, ne ha reversato il protocollo e ha creato uno script per poter ricevere lo stream audiovideo con VLC.&lt;/p&gt;
&lt;p&gt;Dato che la coppia di ripetitori (TX e RX) e’ costa circa 70euri su Amazon, il punto 4 e’ perfettamente rispettato.&lt;/p&gt;
&lt;p&gt;I primi test con l’extender si e’ rivelato un fallimento, vedevo lo stream con tcpdump ma non ricevevo niente, il problema era legato al fatto che gli adattatori su cui Danman ha fatto lo script erano v1, i miei v3.&lt;br&gt;
Dopo qualche ricerca capito sull’aggiornamento del blog di Danman, e magia e stupore, gli adattatori sono stati aggiornati al protocollo HDbitT, in sintesi lo stream UDP creato dal trasmettitore e’ nativamente interpretabile da vlc:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;vlc udp://@239.255.42.42:5004&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.smemory.org/img/Dp0yktf-768x432.png&quot; alt=&quot;description&quot;&gt;&lt;/p&gt;
&lt;p&gt;La scritta “Please check the TX input signal” e’ normale dato che non avevo ancora attaccato una sorgente HDMI al tramsettitore, vuol dire che funziona!&lt;/p&gt;
&lt;p&gt;La qualita’ e’ buona, un fattore da considerare e’ che il segnale audiovideo arriva con un ritardo di 1,5secondi circa, va compensato in caso si usino altre fonti audio.&lt;/p&gt;
&lt;p&gt;Uno dei vantaggi del fatto che gli adattatori lavorino su ethernet con uno stream multicast udp e’ quello che il cavo di collegamento  tra l’adattatore e il pc che ne prende lo stream e’ fino a 120mt.&lt;br&gt;
Oppure e’ possibile attaccarlo ad uno switch o ad un bridge wireless.&lt;/p&gt;
&lt;h2 id=&quot;gli-adattatori%3A&quot;&gt;Gli adattatori: &lt;a class=&quot;direct-link&quot; href=&quot;#gli-adattatori%3A&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Gli adattatori che ho provato io sono gli AGPteck LKV373 e gli ESYNiC.&lt;/p&gt;
&lt;p&gt;I secondi sono stati presi alla cieca in quanto di forma nettamente diversa dai primi, che sono stati reversati da Danman,&lt;br&gt;
la cosa da guardare e’ che nella descrizione del prodotto la massima estensione di segnale su cavo CAT5/CAT6 sia di 120/125mt e NON di 60mt, poiche’ nel primo caso si tratta di adattatori ethernet, nel secondo di adattatori che usano il cavo CAT5/CAT6 solo come media di trasmissione ma NON usano il protocollo ethernet.&lt;/p&gt;
&lt;p&gt;in fondo al post ci sono le foto dell’adattatore ESYNiC.&lt;/p&gt;
&lt;p&gt;Come bonus dovrebbe essere possibile usare il ricevitore semplicemente mandandogli uno stream udp come farebbe il trasmettitore.&lt;/p&gt;
&lt;p&gt;Entrambi i modelli si alimentano a 5V in continua.&lt;/p&gt;
&lt;h2 id=&quot;l%E2%80%99evoluzione%3A&quot;&gt;L’evoluzione: &lt;a class=&quot;direct-link&quot; href=&quot;#l%E2%80%99evoluzione%3A&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Lo step successivo e’ stato quello di trovare un software che permettesse di fare regia in tempo reale, streaming e registrazione su disco.&lt;br&gt;
OBS Studio ci ha dato quasi tutto questo, le limitazioni riscontrate con OBS Studio sono:&lt;/p&gt;
&lt;p&gt;nessun monitor del segnale audio sull macchina su cui gira OBS. e’ un qualche bug di cui non sono riuscito a fare il workaround&lt;br&gt;
un solo streaming alla volta&lt;br&gt;
a volte e’ solido come una roccia altre volte crasha perche’ lo hai guardato storto&lt;br&gt;
folta community su windows e mac che lo usa per streamare le videogiocate e miriadi di plugin per windows, pochi per linux (ma c’e’ da dire che hanno unificato OBS per tutte le piattaforme Win/Mac/Lin di recente quindi mi aspetto che la situazione evolva)&lt;br&gt;
non legge nativamente gli stream udp, come quello che sono andato ad utilizzare (pare che alcuni siano riusciti a fargli leggere lo stream, la soluzione che ho trovato e’ stata aprire lo stream con VLC e fatto acquisire ad OBS la finestra di xserver)&lt;br&gt;
il verdetto e’ che OBS e’ stato un ottimo software per fare streaming e registrazione contemporanea, l’interfaccia e’ molto intuitiva:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.smemory.org/img/6OMTUVO-1024x576.png&quot; alt=&quot;description&quot;&gt;&lt;/p&gt;
&lt;p&gt;La topologia dei collegamento che e’ stata utilizzato per il NinuxDay2016 (&lt;a href=&quot;http://wiki.ninux.org/NinuxDay2016&quot;&gt;http://wiki.ninux.org/NinuxDay2016&lt;/a&gt;):&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.smemory.org/img/scenario_v3-2-1024x768.png&quot; alt=&quot;description&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;conclusioni%3A&quot;&gt;Conclusioni: &lt;a class=&quot;direct-link&quot; href=&quot;#conclusioni%3A&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Questa soluzione  a livello di qualita’ audiovideo e’ ampiamente soddisfacente, il delay del video rispetto all’audio e’ facilmente gestibile dal mixer di OBS.&lt;/p&gt;
&lt;p&gt;Il “[quasi] completamente open” del titolo del post e’ relativo al fatto che il firmware degli extender e’ con buone possibilita’ non  open ma riflettendo ilo stesso problema si sarebbe proposto ugualmente con delle schede di acquisizione.&lt;/p&gt;
&lt;p&gt;Una cosa da calcolare bene e’ la banda in upload, meta’ dello streaming e’ stata fatta a 2400kbps (+160 di audio), un’altra meta’ a 1200 (+160), va calcolato che serve una linea buona, non per forza dedicata ma il meno congestionata possibile.&lt;/p&gt;
&lt;h2 id=&quot;todo%3A&quot;&gt;TODO: &lt;a class=&quot;direct-link&quot; href=&quot;#todo%3A&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;verificare la reale necessita’ di potenza di calcolo della GPU&lt;/li&gt;
&lt;li&gt;risolvere il problema del monitor dell’audio su OBS&lt;/li&gt;
&lt;li&gt;far leggere ad OBS direttamente lo streaming udp&lt;/li&gt;
&lt;li&gt;imparare e farsi un server di streaming autonomamente in modo da non appoggiarsi a servizi commerciali&lt;/li&gt;
&lt;li&gt;testare il ricevitore con uno stream udp da pc&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;videi%3A&quot;&gt;Videi: &lt;a class=&quot;direct-link&quot; href=&quot;#videi%3A&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I video registrati al &lt;a href=&quot;http://ninux.org/NinuxDay2016&quot;&gt;NinuxDay2016&lt;/a&gt; con questo sistema sono visibli sul canale youtube di Ninux.&lt;/p&gt;
&lt;p&gt;Foto adattatore ESYNiC&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.smemory.org/img/IMG_20161201_230520-1024x768.jpg&quot; alt=&quot;description&quot;&gt;&lt;br&gt;
&lt;img src=&quot;https://blog.smemory.org/img/IMG_20161201_230532-1024x768.jpg&quot; alt=&quot;description&quot;&gt;&lt;br&gt;
&lt;img src=&quot;https://blog.smemory.org/img/IMG_20161201_230545-1024x768.jpg&quot; alt=&quot;description&quot;&gt;&lt;br&gt;
&lt;img src=&quot;https://blog.smemory.org/img/IMG_20161201_230553-1024x768.jpg&quot; alt=&quot;description&quot;&gt;&lt;br&gt;
&lt;img src=&quot;https://blog.smemory.org/img/IMG_20161201_230808-1024x768.jpg&quot; alt=&quot;description&quot;&gt;&lt;br&gt;
&lt;img src=&quot;https://blog.smemory.org/img/IMG_20161201_230818-1024x768.jpg&quot; alt=&quot;description&quot;&gt;&lt;br&gt;
&lt;img src=&quot;https://blog.smemory.org/img/IMG_20161201_230824-1024x768.jpg&quot; alt=&quot;description&quot;&gt;&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>Loop mounting an encrypted luks full disk image</title>
		<link href="https://blog.smemory.org/posts/20161102_01_loop-mount-luks-img/"/>
		<updated>2016-11-02T00:00:00+00:00</updated>
		<id>https://blog.smemory.org/posts/20161102_01_loop-mount-luks-img/</id>
		<content type="html">&lt;p&gt;Open:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;fdisk&lt;/span&gt; -l -u imagename.img&lt;br&gt;&lt;br&gt;kpartx -a -v imagename.img&lt;br&gt;&lt;br&gt;cryptsetup luksOpen /dev/mapper/loop0pN LUKSNAME&lt;br&gt;&lt;br&gt;vgscan&lt;br&gt;&lt;br&gt;vgchange -a y VGNAME&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token function&quot;&gt;mount&lt;/span&gt; /dev/mapper/VGNAME-LVNAME MOUNTPOINT&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Close:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;umount&lt;/span&gt; MOUNTPOINT&lt;br&gt;&lt;br&gt;vgchange -a n VGNAME&lt;br&gt;&lt;br&gt;cryptsetup luksClose LUKSNAME&lt;br&gt;&lt;br&gt;dmsetup info&lt;br&gt;dmsetup remove /dev/mapper/loop0p1&lt;br&gt;dmsetup remove /dev/mapper/loop0pN…&lt;br&gt;&lt;br&gt;losetup -a&lt;br&gt;losetup -d /dev/loop0&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;source: &lt;a href=&quot;http://www.blaicher.com/2013/01/accessing-an-encrypted-full-disc-image-lukslvm/&quot;&gt;http://www.blaicher.com/2013/01/accessing-an-encrypted-full-disc-image-lukslvm/&lt;/a&gt;&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>UBUNTU 16.04 SINGLE INSTALL ON MACBOOKAIR 2014</title>
		<link href="https://blog.smemory.org/posts/20161101_01_MBA11-2014-ubuntu/"/>
		<updated>2016-11-01T00:00:00+00:00</updated>
		<id>https://blog.smemory.org/posts/20161101_01_MBA11-2014-ubuntu/</id>
		<content type="html">&lt;p&gt;NB: these are notes for my particular installation, YMMV&lt;/p&gt;
&lt;p&gt;Installation:&lt;br&gt;
“burn” the image on the usb stick, I tend to use usb-creator-gtk on ubuntu, some say dd-ing the image on the usb is ok,&lt;br&gt;
insert the usb key on your applething, power on and press opt/alt: screenshot-from-2016-11-02-22-49-46&lt;br&gt;
then select “EFI boot” and go on with the installation&lt;/p&gt;
&lt;p&gt;Keyboard:&lt;br&gt;
this is the holy grail: &lt;a href=&quot;https://github.com/free5lot/hid-apple-patched&quot;&gt;https://github.com/free5lot/hid-apple-patched&lt;/a&gt;&lt;br&gt;
it permits you to finally swap the “fn” and “ctrl” keys.&lt;/p&gt;
&lt;p&gt;install:&lt;/p&gt;
&lt;p&gt;git clone &lt;a href=&quot;https://github.com/free5lot/hid-apple-patched&quot;&gt;https://github.com/free5lot/hid-apple-patched&lt;/a&gt;&lt;br&gt;
cd hid-apple-patched&lt;br&gt;
sudo dkms add .&lt;br&gt;
sudo dkms build hid-apple/1.0&lt;br&gt;
sudo dkms install hid-apple/1.0&lt;/p&gt;
&lt;p&gt;edit the config file:&lt;/p&gt;
&lt;p&gt;sudo nano /etc/modprobe.d/hid_apple.conf&lt;/p&gt;
&lt;p&gt;add:&lt;/p&gt;
&lt;p&gt;options hid_apple fnmode=2&lt;br&gt;
options hid_apple swap_fn_leftctrl=1&lt;br&gt;
options hid_apple swap_opt_cmd=1&lt;/p&gt;
&lt;p&gt;apply and reboot:&lt;/p&gt;
&lt;p&gt;sudo update-initramfs -u&lt;br&gt;
sudo reboot&lt;/p&gt;
&lt;p&gt;alternatively you can follow this guide, without the swapping of “fn” and “ctrl”: &lt;a href=&quot;https://help.ubuntu.com/community/AppleKeyboard&quot;&gt;https://help.ubuntu.com/community/AppleKeyboard&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;INTERRUPTS:&lt;br&gt;
a big performance problem I found was with ACPI interrupts,&lt;br&gt;
find the problematic ones:&lt;/p&gt;
&lt;p&gt;grep . -r /sys/firmware/acpi/interrupts/&lt;/p&gt;
&lt;p&gt;if you an interrupt with thousands of calls, you can try to disable it,&lt;br&gt;
BE AWARE THAT ANYTHING CAN HAPPEN&lt;/p&gt;
&lt;p&gt;sudo echo “disable” &amp;gt; /sys/firmware/acpi/interrupts/gpeXX&lt;/p&gt;
&lt;p&gt;source: &lt;a href=&quot;https://wiki.archlinux.org/index.php/MacBook#kworker_using_high_CPU&quot;&gt;https://wiki.archlinux.org/index.php/MacBook#kworker_using_high_CPU&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;add it as a systemd service:&lt;/p&gt;
&lt;p&gt;nano /etc/systemd/system/suppress-gpeXX.service&lt;/p&gt;
&lt;p&gt;add:&lt;/p&gt;
&lt;p&gt;[Unit]&lt;br&gt;
Description=Disables GPE XX, an interrupt that is going crazy on Macs&lt;/p&gt;
&lt;p&gt;[Service]&lt;br&gt;
ExecStart=/bin/bash -c ‘echo “disable” &amp;gt; /sys/firmware/acpi/interrupts/gpeXX’&lt;/p&gt;
&lt;p&gt;[Install]&lt;br&gt;
WantedBy=multi-user.target&lt;/p&gt;
&lt;p&gt;enable it on boot:&lt;/p&gt;
&lt;p&gt;sudo systemctl enable suppress-gpeXX&lt;/p&gt;
&lt;p&gt;test it:&lt;/p&gt;
&lt;p&gt;sudo systemctl start suppress-gpeXX&lt;/p&gt;
&lt;p&gt;and check it has actually disabled the gpe:&lt;/p&gt;
&lt;p&gt;cat /sys/firmware/acpi/interrupts/gpeXX&lt;/p&gt;
&lt;p&gt;you should now read “disabled”,&lt;br&gt;
it is better to test also a reboot.&lt;/p&gt;
&lt;p&gt;POWER TUNING:&lt;/p&gt;
&lt;p&gt;install powertop and run it:&lt;/p&gt;
&lt;p&gt;sudo apt-get install powertop&lt;br&gt;
sudo powertop –auto-tune&lt;/p&gt;
&lt;p&gt;TODO: add it as a system service on startup&lt;/p&gt;
&lt;p&gt;install TLP:&lt;/p&gt;
&lt;p&gt;sudo apt-get install tlp tlp-rdw&lt;/p&gt;
&lt;p&gt;source: &lt;a href=&quot;http://linrunner.de/en/tlp/docs/tlp-linux-advanced-power-management.html#installation&quot;&gt;http://linrunner.de/en/tlp/docs/tlp-linux-advanced-power-management.html#installation&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;GRUB TUNING:&lt;/p&gt;
&lt;p&gt;follow: &lt;a href=&quot;https://help.ubuntu.com/community/MacBookAir6-2/Trusty#Finetuning_Powersave_functionsTODO:&quot;&gt;https://help.ubuntu.com/community/MacBookAir6-2/Trusty#Finetuning_Powersave_functionsTODO:&lt;/a&gt; add steps&lt;/p&gt;
&lt;p&gt;BACKLIGHT and SUSPEND:&lt;/p&gt;
&lt;p&gt;one issue is that the backlight does not automagically switch on after suspend/hibernate,&lt;br&gt;
follow this guide: &lt;a href=&quot;https://help.ubuntu.com/community/MacBookAir6-2/Trusty#Backlight&quot;&gt;https://help.ubuntu.com/community/MacBookAir6-2/Trusty#Backlight&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;source: &lt;a href=&quot;https://github.com/patjak/mba6x_bl&quot;&gt;https://github.com/patjak/mba6x_bl&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;HIBERNATE:&lt;/p&gt;
&lt;p&gt;sudo nano /etc/polkit-1/localauthority/50-local.d/com.ubuntu.enable-hibernate.pkla&lt;/p&gt;
&lt;p&gt;add:&lt;/p&gt;
&lt;p&gt;[Re-enable hibernate by default in upower]&lt;br&gt;
Identity=unix-user:*&lt;br&gt;
Action=org.freedesktop.upower.hibernate&lt;br&gt;
ResultActive=yes&lt;/p&gt;
&lt;p&gt;[Re-enable hibernate by default in logind]&lt;br&gt;
Identity=unix-user:*&lt;br&gt;
Action=org.freedesktop.login1.hibernate;org.freedesktop.login1.handle-hibernate-key;org.freedesktop.login1;org.freedesktop.login1.hibernate-multiple-sessions;org.freedesktop.login1.hibernate-ignore-inhibit&lt;br&gt;
ResultActive=yes&lt;/p&gt;
&lt;p&gt;source: &lt;a href=&quot;https://help.ubuntu.com/16.04/ubuntu-help/power-hibernate.html&quot;&gt;https://help.ubuntu.com/16.04/ubuntu-help/power-hibernate.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;JAVA:&lt;/p&gt;
&lt;p&gt;sudo apt install icedtea-8-plugin openjdk-8-jre&lt;/p&gt;
&lt;p&gt;Install THUNAR file manager:&lt;/p&gt;
&lt;p&gt;apt-get install thunar&lt;/p&gt;
&lt;p&gt;xdg-mime default Thunar.desktop inode/directory&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>HOT CHANGING DISK IN MDADM RAID ARRAY</title>
		<link href="https://blog.smemory.org/posts/20160430_01_mdadm-hot-changing/"/>
		<updated>2016-04-30T00:00:00+00:00</updated>
		<id>https://blog.smemory.org/posts/20160430_01_mdadm-hot-changing/</id>
		<content type="html">&lt;p&gt;to hot change a disk in an mdadm array, the disk to remove is sdb, the disk to add is sdc:&lt;/p&gt;
&lt;p&gt;HAVE A BACKUP OF YOUR DATA&lt;br&gt;
really,&lt;br&gt;
backup your data&lt;/p&gt;
&lt;p&gt;Verify the configuration of the array:&lt;/p&gt;
&lt;p&gt;#cat /proc/mdstat&lt;/p&gt;
&lt;p&gt;Clone the partition table on the news disk:&lt;br&gt;
using sgdisk (install gdisk if you don’t have it) backup the partition table of the source disk:&lt;/p&gt;
&lt;p&gt;sgdisk -b part.table /dev/sdb&lt;/p&gt;
&lt;p&gt;the restore it on the destination disk, the -G switch is to generate new GUIDS for the partition since sgdisk also clones the GUIDS:&lt;/p&gt;
&lt;p&gt;sgdisk -l part.table -G /dev/sdc&lt;/p&gt;
&lt;p&gt;verify that the partitions are ok.&lt;/p&gt;
&lt;p&gt;Modify the RAID array:&lt;/p&gt;
&lt;p&gt;remove the “old” disk:&lt;/p&gt;
&lt;p&gt;mdadm –manage /dev/md0 –fail /dev/sdb1&lt;br&gt;
mdadm –manage /dev/md0 –remove /dev/sdb1&lt;/p&gt;
&lt;p&gt;add the “new” disk to the array:&lt;/p&gt;
&lt;p&gt;mdadm –manage /dev/md0 –add /dev/sdc1&lt;/p&gt;
&lt;p&gt;Monitor the rebuild of the array:&lt;/p&gt;
&lt;p&gt;#cat /proc/mdstat&lt;br&gt;
[CUT]&lt;br&gt;
[==&amp;gt;………………]  recovery = 14% (nnnn/nnnnnnnn) finish=50.6min speed=57001K/sec&lt;br&gt;
[CUT]&lt;/p&gt;
&lt;p&gt;Wait for the rebuild.&lt;br&gt;
Patiently.&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>Neural Paintings</title>
		<link href="https://blog.smemory.org/posts/20160424_01_neural-paintings/"/>
		<updated>2016-04-24T00:00:00+00:00</updated>
		<id>https://blog.smemory.org/posts/20160424_01_neural-paintings/</id>
		<content type="html">&lt;p&gt;source: &lt;a href=&quot;http://www.makeuseof.com/tag/create-neural-paintings-deepstyle-ubuntu/&quot;&gt;http://www.makeuseof.com/tag/create-neural-paintings-deepstyle-ubuntu/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;sudo apt-get install git lua5.2 luarocks luajit libprotobuf-dev protobuf-compiler&lt;br&gt;
curl -s &lt;a href=&quot;https://raw.githubusercontent.com/torch/ezinstall/master/install-all&quot;&gt;https://raw.githubusercontent.com/torch/ezinstall/master/install-all&lt;/a&gt; | bash&lt;/p&gt;
&lt;p&gt;test torch:&lt;br&gt;
luajit -ltorch&lt;/p&gt;
&lt;p&gt;install loadcaffe:&lt;/p&gt;
&lt;p&gt;sudo luarocks install loadcaffe&lt;/p&gt;
&lt;p&gt;if you have an old version of gcc you have to (source):&lt;/p&gt;
&lt;p&gt;git clone &lt;a href=&quot;https://github.com/szagoruyko/loadcaffe&quot;&gt;https://github.com/szagoruyko/loadcaffe&lt;/a&gt;&lt;br&gt;
cd loadcaffe&lt;br&gt;
nano CMakeLists.txt&lt;br&gt;
change the line: add_definitions(-std=c++11) to: add_definitions(-std=c++0x)&lt;br&gt;
luarocks make&lt;/p&gt;
&lt;p&gt;then:&lt;/p&gt;
&lt;p&gt;sudo luarocks install image&lt;br&gt;
sudo luarocks install nn&lt;/p&gt;
&lt;p&gt;to install cuda support:&lt;/p&gt;
&lt;p&gt;sudo luarocks install cutorch&lt;br&gt;
sudo luarocks install cunn&lt;/p&gt;
&lt;p&gt;but since the max allocable memory is the max memory of your gpu it is best to use cudnn, you have to register here: &lt;a href=&quot;https://developer.nvidia.com/cudnn&quot;&gt;https://developer.nvidia.com/cudnn&lt;/a&gt;, then download the package and install (source):&lt;/p&gt;
&lt;p&gt;tar -xvzf cudnn-7.0-linux-x64-v4.0-prod.tgz&lt;br&gt;
sudo cp lib64/* /usr/local/cuda/lib64/&lt;br&gt;
sudo cp include/cudnn.h /usr/local/cuda/include/&lt;br&gt;
sudo luarocks install cudnn&lt;/p&gt;
&lt;p&gt;and test it by running:&lt;/p&gt;
&lt;p&gt;th neural_style.lua -gpu 0 -backend cudnn&lt;/p&gt;
&lt;p&gt;if you have problems running it and it gives the error (source):&lt;/p&gt;
&lt;p&gt;[CUT] ‘libcudnn (R4) not found in library path.&lt;br&gt;
Please install CuDNN from &lt;a href=&quot;https://developer.nvidia.com/cuDNN&quot;&gt;https://developer.nvidia.com/cuDNN&lt;/a&gt;&lt;br&gt;
Then make sure files named as libcudnn.so.4 or libcudnn.4.dylib are placed in your library load path (for example /usr/local/lib , or manually add a path to LD_LIBRARY_PATH)&lt;/p&gt;
&lt;p&gt;you have to set the library path correctly:&lt;/p&gt;
&lt;p&gt;export LD_LIBRARY_PATH=/usr/local/cuda-7.0/lib64:$LD_LIBRARY_PATH&lt;/p&gt;
&lt;p&gt;now we can create our work folder and clone the git repo of the neuralnetwork,&lt;br&gt;
it’s nice to do that were we a bit of space since it will use about ~600MB:&lt;/p&gt;
&lt;p&gt;sudo git clone &lt;a href=&quot;https://github.com/jcjohnson/neural-style.git&quot;&gt;https://github.com/jcjohnson/neural-style.git&lt;/a&gt;&lt;br&gt;
cd neural-style&lt;/p&gt;
&lt;p&gt;now we can download the model, it will take a bit:&lt;/p&gt;
&lt;p&gt;sudo sh models/download_models.sh&lt;/p&gt;
&lt;p&gt;Images generated with simpler nerual network (nin_imagenet_conv):&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.smemory.org/img/nn_15.png&quot; alt=&quot;description&quot;&gt;&lt;/p&gt;
&lt;p&gt;Images generated with neural-style:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.smemory.org/img/ex_32.png&quot; alt=&quot;description&quot;&gt;&lt;br&gt;
&lt;img src=&quot;https://blog.smemory.org/img/ex_33.png&quot; alt=&quot;description&quot;&gt;&lt;br&gt;
&lt;img src=&quot;https://blog.smemory.org/img/ex_34.png&quot; alt=&quot;description&quot;&gt;&lt;br&gt;
&lt;img src=&quot;https://blog.smemory.org/img/ex_35.png&quot; alt=&quot;description&quot;&gt;&lt;br&gt;
&lt;img src=&quot;https://blog.smemory.org/img/ex_36.png&quot; alt=&quot;description&quot;&gt;&lt;br&gt;
&lt;img src=&quot;https://blog.smemory.org/img/ex_37.png&quot; alt=&quot;description&quot;&gt;&lt;br&gt;
&lt;img src=&quot;https://blog.smemory.org/img/ex_38.png&quot; alt=&quot;description&quot;&gt;&lt;br&gt;
&lt;img src=&quot;https://blog.smemory.org/img/ex_39.png&quot; alt=&quot;description&quot;&gt;&lt;br&gt;
&lt;img src=&quot;https://blog.smemory.org/img/ex_39_opti1.png&quot; alt=&quot;description&quot;&gt;&lt;br&gt;
&lt;img src=&quot;https://blog.smemory.org/img/ex_40_opti2.png&quot; alt=&quot;description&quot;&gt;&lt;br&gt;
&lt;img src=&quot;https://blog.smemory.org/img/ex_42_opti2.png&quot; alt=&quot;description&quot;&gt;&lt;/p&gt;
&lt;p&gt;Notes:&lt;br&gt;
using a smaller network: &lt;a href=&quot;http://liipetti.net/erratic/2016/03/21/using-nin-imagenet-conv-in-neural-style/&quot;&gt;http://liipetti.net/erratic/2016/03/21/using-nin-imagenet-conv-in-neural-style/&lt;/a&gt;&lt;br&gt;
ram discussion: &lt;a href=&quot;https://github.com/jcjohnson/neural-style/issues/150&quot;&gt;https://github.com/jcjohnson/neural-style/issues/150&lt;/a&gt;&lt;br&gt;
main repo: &lt;a href=&quot;https://github.com/jcjohnson/neural-style&quot;&gt;https://github.com/jcjohnson/neural-style&lt;/a&gt;&lt;br&gt;
NIN_network: &lt;a href=&quot;https://drive.google.com/folderview?id=0B0IedYUunOQINEFtUi1QNWVhVVU&amp;amp;usp=drive_web&quot;&gt;https://drive.google.com/folderview?id=0B0IedYUunOQINEFtUi1QNWVhVVU&amp;amp;usp=drive_web&lt;/a&gt;&lt;br&gt;
cudnn: &lt;a href=&quot;https://github.com/soumith/cudnn.torch&quot;&gt;https://github.com/soumith/cudnn.torch&lt;/a&gt;&lt;br&gt;
cunn issues: &lt;a href=&quot;https://github.com/torch/cunn/issues/80&quot;&gt;https://github.com/torch/cunn/issues/80&lt;/a&gt;&lt;br&gt;
other issues: &lt;a href=&quot;https://github.com/hughperkins/clnn/issues/18&quot;&gt;https://github.com/hughperkins/clnn/issues/18&lt;/a&gt;&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>NVIDIA CUDA LINUX HEADLESS</title>
		<link href="https://blog.smemory.org/posts/20160226_01_cuda-headless/"/>
		<updated>2016-02-26T00:00:00+00:00</updated>
		<id>https://blog.smemory.org/posts/20160226_01_cuda-headless/</id>
		<content type="html">&lt;p&gt;Download the latest nvidia drivers for linux from Nvidia’s site and install it:&lt;/p&gt;
&lt;p&gt;./NVIDIA-Linux-x86_64-xxx.xx.run&lt;/p&gt;
&lt;p&gt;(I think I manually installed nvidia-smi)&lt;/p&gt;
&lt;p&gt;To use nvidia-settings to do things like setting the fan speed you have to activate some parts of X, I have to re-document that part but I used infos from [0] and [1].&lt;/p&gt;
&lt;p&gt;my rc.local:&lt;/p&gt;
&lt;p&gt;Xorg :1 &amp;amp;&lt;br&gt;
sleep 5&lt;br&gt;
export DISPLAY=:1&lt;br&gt;
nvidia-settings -a “[gpu:0]/GPUFanControlState=1”&lt;br&gt;
exit 0&lt;/p&gt;
&lt;p&gt;when you want to use nvidia-settings you have to execute in the shell you are using&lt;/p&gt;
&lt;p&gt;export DISPLAY=:1&lt;/p&gt;
&lt;p&gt;set fan speed (if you already set GPUFanControlState=1):&lt;/p&gt;
&lt;p&gt;nvidia-settings -a “[fan:0]/GPUTargetFanSpeed=xx”&lt;/p&gt;
&lt;p&gt;set power cap:&lt;/p&gt;
&lt;p&gt;nvidia-smi –power-limit=xx&lt;/p&gt;
&lt;p&gt;you can set the power capping dinamically, even when you have tasks using the cpu.&lt;/p&gt;
&lt;p&gt;monitor card status:&lt;/p&gt;
&lt;p&gt;nvidia-smi&lt;/p&gt;
&lt;p&gt;[0] &lt;a href=&quot;https://sites.google.com/site/akohlmey/random-hacks/nvidia-gpu-coolness&quot;&gt;https://sites.google.com/site/akohlmey/random-hacks/nvidia-gpu-coolness&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[1] &lt;a href=&quot;https://devtalk.nvidia.com/default/topic/789888/set-fan-speed-without-an-x-server-solved-/&quot;&gt;https://devtalk.nvidia.com/default/topic/789888/set-fan-speed-without-an-x-server-solved-/&lt;/a&gt;&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>RUN AN OLD VERSION OF CUDAHASHCAT</title>
		<link href="https://blog.smemory.org/posts/20160222_01_old-cudahashcat/"/>
		<updated>2016-02-22T00:00:00+00:00</updated>
		<id>https://blog.smemory.org/posts/20160222_01_old-cudahashcat/</id>
		<content type="html">&lt;p&gt;for benchmarking purposes I needed to run an old version cudaHashcat, the 1.31, now version 2.01 is out.&lt;/p&gt;
&lt;p&gt;I got the error:&lt;/p&gt;
&lt;p&gt;“ERROR: This copy of cudaHashcat is outdated. Get a more recent version.”&lt;/p&gt;
&lt;p&gt;The solution is installing libfakedate:&lt;/p&gt;
&lt;p&gt;apt-get install fakedate&lt;/p&gt;
&lt;p&gt;LD_PRELOAD=/usr/lib/x86_64-linux-gnu/faketime/libfaketime.so.1 FAKETIME=”-60d” /root/cudaHashcat-1.31/cudaHashcat64.bin –options-etcetera&lt;/p&gt;
&lt;p&gt;note that the path of the lib should be the correct one for your system, you tune the fake date changing thedays back and forth, for me: “-60d”&lt;/p&gt;
&lt;p&gt;source: &lt;a href=&quot;https://serverfault.com/questions/138325/faking-the-date-for-a-specific-shell-session&quot;&gt;https://serverfault.com/questions/138325/faking-the-date-for-a-specific-shell-session&lt;/a&gt;&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>NEXUS 9 &quot;FAILED (REMOTE DATA LENGTH IS TOO LARGE)&quot;</title>
		<link href="https://blog.smemory.org/posts/20160123_01_nexus9-flashing/"/>
		<updated>2016-01-23T00:00:00+00:00</updated>
		<id>https://blog.smemory.org/posts/20160123_01_nexus9-flashing/</id>
		<content type="html">&lt;p&gt;if the flashing of the factory images from google fails try:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;cd ~/Downloads&lt;/li&gt;
&lt;li&gt;tar zxvf volantis-lmy47x-factory-3efdc8d4.tgz&lt;/li&gt;
&lt;li&gt;cd volantis-lmy47x/&lt;/li&gt;
&lt;li&gt;fastboot flash bootloader bootloader-flounder-xxxxxxxxx.img&lt;/li&gt;
&lt;li&gt;fastboot reboot-bootloader&lt;/li&gt;
&lt;li&gt;unzip image-volantis-lmy47x.zip&lt;/li&gt;
&lt;li&gt;fastboot flash system system.img&lt;/li&gt;
&lt;li&gt;fastboot flash recovery recovery.img&lt;/li&gt;
&lt;li&gt;fastboot flash cache cache.img&lt;/li&gt;
&lt;li&gt;fastboot flash boot boot.img&lt;/li&gt;
&lt;li&gt;fastboot flash vendor vendor.img&lt;/li&gt;
&lt;li&gt;select hboot and then factory reset (this take about 5 mintues).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;source: &lt;a href=&quot;https://www.reddit.com/r/Nexus9/comments/35ole1/anyone_else_having_problems_trying_to_flash_511/&quot;&gt;https://www.reddit.com/r/Nexus9/comments/35ole1/anyone_else_having_problems_trying_to_flash_511/&lt;/a&gt;&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>Tinc switched on Debian 9 &quot;stretch&quot; (and old configs of debian 7)</title>
		<link href="https://blog.smemory.org/posts/20160102_01_tinc-switched/"/>
		<updated>2016-01-02T00:00:00+00:00</updated>
		<id>https://blog.smemory.org/posts/20160102_01_tinc-switched/</id>
		<content type="html">&lt;p&gt;&lt;img src=&quot;https://blog.smemory.org/img/IMG_20160102_233707-449x304.jpg&quot; alt=&quot;description&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;install-tinc%3A&quot;&gt;Install Tinc: &lt;a class=&quot;direct-link&quot; href=&quot;#install-tinc%3A&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;apt-get&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; tinc&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;configuration%3A&quot;&gt;Configuration: &lt;a class=&quot;direct-link&quot; href=&quot;#configuration%3A&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;the tinc configuration is based on some files:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;/etc/tinc/&lt;/li&gt;
&lt;li&gt;nets.boot                             this file contains the vpns that will be activated on boot (automatic creation)&lt;/li&gt;
&lt;li&gt;vpn0/                                   this folder is a vpn and contains all the correlated files (manual creation)&lt;/li&gt;
&lt;li&gt;rsa_key.priv              this file is the private key of the local tinc host (automatic creation)&lt;/li&gt;
&lt;li&gt;tinc.conf                    this file is the configuration of the vpn (manual creation)&lt;/li&gt;
&lt;li&gt;tinc-up                       this file defines the behaviour of the interface on start (manual creation)&lt;/li&gt;
&lt;li&gt;tinc-down                  this file defines the behaviour of the interface on stop (manual creation)&lt;/li&gt;
&lt;li&gt;hosts/                         this folder contains the public keys of the servers participating the vpn (manual creation)
&lt;ul&gt;
&lt;li&gt;host01             this file is the public key of local host host01 (automatic creation)&lt;/li&gt;
&lt;li&gt;host02             this file is the public key of remote host host02 (manual transfer from host02)&lt;/li&gt;
&lt;li&gt;host03             like host02&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;to configure a tinc vpn in which all the hosts are “on the same switch” edit these files on the hosts&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;mkdir /etc/tinc/vpn0                              #create the vpn main directory&lt;/li&gt;
&lt;li&gt;cd /etc/tinc/vpn0                                    #&lt;/li&gt;
&lt;li&gt;mkdir hosts                                            #create the public key folder&lt;/li&gt;
&lt;li&gt;touch tinc.conf tinc-up tinc-down         #touch the files that will be edited later&lt;/li&gt;
&lt;li&gt;chmod +x tinc-up tinc-down                 #make the interface files executable&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;then edit:&lt;br&gt;
tinc.conf:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Name = host01                                      #name of the host, this must be the same as in the folder hosts
AddressFamily = ipv4                          #I live in the past, ipv4 is ok for me
Mode = switch                                      #the mode of the vpn, I choose switch
Device = /dev/net/tun                           #the device, I found that that parameter is ok like that (otherwise it won’t work)
ConnectTo = host01                             #the hosts to connect to on start (or every 15min as I read from the docs)
ConnectTo = host03                             #as above
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;tinc-up:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#!/bin/sh
ifconfig $INTERFACE 192.168.0.1 netmask 255.255.255.0                     #change 192.168.0.1 as the ip of the interface of the host (gor host01 I set 192.168.0.1, for host02 192.168.0.2)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;tinc-down:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#!/bin/sh
ifconfig $INTERFACE down
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;and give these last files execution permissions:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;chmod&lt;/span&gt; +x tinc-*&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;then you can execute the creation of the keys with the command:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;tincd -n vpn0 -K4096&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;which will create the private (/etc/tinc/vpn0/rsa_key.priv) and public key (/etc/tinc/vpn0/rsa_key.pub) for the local host,&lt;br&gt;
this step must be executed on all hosts.&lt;br&gt;
then you have to add your hosts file for your own machine using the content of the public key:&lt;/p&gt;
&lt;p&gt;in /etc/tinc/vpn0/hosts/yourmachinename&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Address=98.263.34.11 655                          #the public ip address or FQDN (this changes for every host, obviously)
Port=655                                          #the port to connect
Compression=0                                     #the compression (I have not used it)
Subnet=192.168.0.1/32                             #your host&#39;s ip on tinc network

—–BEGIN RSA PUBLIC KEY—–
##########################################
—–END RSA PUBLIC KEY—–
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;then you have to copy this host file in the folder /etc/tinc/vpn0/hosts/ of the other hosts,&lt;br&gt;
and viceversa, you have to copy the other hosts you want to connect to to your machines&#39; folder.&lt;/p&gt;
&lt;h2 id=&quot;logging%3A&quot;&gt;Logging: &lt;a class=&quot;direct-link&quot; href=&quot;#logging%3A&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;edit the systemd unit file:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;nano&lt;/span&gt; /lib/systemd/system/tinc@.service&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;and add &amp;quot;--logfile&amp;quot; ad the end of the Exec commands:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ExecStart=/usr/sbin/tincd -n %i -D --logfile
ExecReload=/usr/sbin/tincd -n %i -kHUP --logfile
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;autostart%3A&quot;&gt;Autostart: &lt;a class=&quot;direct-link&quot; href=&quot;#autostart%3A&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;you can start your service using:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;systemctl &lt;span class=&quot;token builtin class-name&quot;&gt;enable&lt;/span&gt; tinc@vpn&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;to start or restart:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;systemctl start/restart tinc@vpn&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;logging-%26-debugging%3A&quot;&gt;LOGGING &amp;amp; DEBUGGING: &lt;a class=&quot;direct-link&quot; href=&quot;#logging-%26-debugging%3A&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;if you start tinc with --logfile as above it will automatically create a file /var/log/tinc.vpn0.log&lt;br&gt;
you can use the killsignals to output some useful stats on your logifle.&lt;br&gt;
to do everything in one line I use:&lt;/p&gt;
&lt;p&gt;vpn0_pid=$(cat /var/run/tinc.vpn0.pid) &amp;amp;&amp;amp; kill -s USR1 $vpn0_pid &amp;amp;&amp;amp; cat /var/log/tinc.vpn0.log&lt;/p&gt;
&lt;h2 id=&quot;iptables%3A&quot;&gt;IPTABLES: &lt;a class=&quot;direct-link&quot; href=&quot;#iptables%3A&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;you have to allow the port 655 in tcp and udp, if yout default is to dropeverything in INPUT, you have to allow the network in input:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;-A INPUT -d PUBLIC_IP -i INTERFACE -p udp -m udp –dport &lt;span class=&quot;token number&quot;&gt;655&lt;/span&gt; -j ACCEPT&lt;br&gt;-A INPUT -d PUBLIC_IP -i INTERFACE -p tcp -m tcp –dport &lt;span class=&quot;token number&quot;&gt;655&lt;/span&gt; -j ACCEPT&lt;br&gt;-A INPUT -i vpn0 -j ACCEPT&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;!!!-this-part-is-only-valid-for-debian-7%3A&quot;&gt;!!! this part is only valid for debian 7: &lt;a class=&quot;direct-link&quot; href=&quot;#!!!-this-part-is-only-valid-for-debian-7%3A&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;then you can start the vpn with

tincd -n vpn0 –logfile

and kill it with:

tincd -n vpn0 -k

to start automatically on boot the vpn add the vpn name in the file

/etc/tinc/nets.boot

if you append –logfile -d at your entry in nets.boot which might become something like:

vpn –logfile -d

you’ll find a neat /var/log/tinc.vpn.log logfile (won’t work in Debian9, see below)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;main sources:&lt;br&gt;
&lt;a href=&quot;http://stacksetup.com/VPN/UsingTinc&quot;&gt;http://stacksetup.com/VPN/UsingTinc&lt;/a&gt;&lt;br&gt;
&lt;a href=&quot;https://silvenga.com/deploy-a-tinc-mesh-vpn-running-tap/&quot;&gt;https://silvenga.com/deploy-a-tinc-mesh-vpn-running-tap/&lt;/a&gt;&lt;br&gt;
other sourced:&lt;br&gt;
&lt;a href=&quot;https://www.digitalocean.com/community/tutorials/how-to-install-tinc-and-set-up-a-basic-vpn-on-ubuntu-14-04&quot;&gt;https://www.digitalocean.com/community/tutorials/how-to-install-tinc-and-set-up-a-basic-vpn-on-ubuntu-14-04&lt;/a&gt;&lt;br&gt;
&lt;a href=&quot;https://wiki.archlinux.org/index.php/Tinc&quot;&gt;https://wiki.archlinux.org/index.php/Tinc&lt;/a&gt;&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>HUBICFUSE DEBIAN WHEEZY</title>
		<link href="https://blog.smemory.org/posts/20151219_01_hubicfuse-debian/"/>
		<updated>2015-12-19T00:00:00+00:00</updated>
		<id>https://blog.smemory.org/posts/20151219_01_hubicfuse-debian/</id>
		<content type="html">&lt;p&gt;source: &lt;a href=&quot;https://github.com/TurboGit/hubicfuse&quot;&gt;https://github.com/TurboGit/hubicfuse&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;in /etc/apt/sources.list add:&lt;/p&gt;
&lt;p&gt;deb &lt;a href=&quot;http://http.debian.net/debian&quot;&gt;http://http.debian.net/debian&lt;/a&gt; wheezy-backports main&lt;/p&gt;
&lt;p&gt;then:&lt;/p&gt;
&lt;p&gt;apt-get update&lt;/p&gt;
&lt;p&gt;apt-get install gcc make curl libfuse-dev pkg-config libcurl4-openssl-dev libxml2-dev libssl-dev libjson-c-dev libmagic-dev&lt;/p&gt;
&lt;p&gt;then:&lt;/p&gt;
&lt;p&gt;cd hubicfuse&lt;br&gt;
./configure&lt;br&gt;
make&lt;br&gt;
make install&lt;/p&gt;
&lt;p&gt;you can safely ignore make errors like:&lt;/p&gt;
&lt;p&gt;cloudfsapi.c:474:7: warning: call to ‘_curl_easy_setopt_err_long’ declared with attribute warning: curl_easy_setopt expects a long argument for this option [enabled by default]&lt;br&gt;
cloudfsapi.c:485:9: warning: call to ‘_curl_easy_setopt_err_long’ declared with attribute warning: curl_easy_setopt expects a long argument for this option [enabled by default]&lt;/p&gt;
&lt;p&gt;to configure the client you have to create a new app in Myaccount –&amp;gt; Developers –&amp;gt; Add application, add a name and a URL (doesn’t need to be real).&lt;br&gt;
Then click on Details of the newly crated app and use the “Client ID” and “Secret Client” for the next step.&lt;br&gt;
In the hubicfuse folder execute the script:&lt;/p&gt;
&lt;p&gt;./hubic_token&lt;/p&gt;
&lt;p&gt;you will need to enter some info and to set the permission, in the end you will get:&lt;/p&gt;
&lt;h1 id=&quot;here-is-what-your-app-needs-to-connect-to-hubic%3A&quot;&gt;Here is what your app needs to connect to hubiC: &lt;a class=&quot;direct-link&quot; href=&quot;#here-is-what-your-app-needs-to-connect-to-hubic%3A&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;client_id=********&lt;br&gt;
client_secret=********&lt;br&gt;
refresh_token=********&lt;/p&gt;
&lt;p&gt;copy this info in your ~/.hubicfuse&lt;/p&gt;
&lt;p&gt;then mount:&lt;/p&gt;
&lt;p&gt;hubicfuse /hubic -o noauto_cache,sync_read,allow_other&lt;/p&gt;
&lt;p&gt;to automate the mount just add the same line you use from the cli to a file executed on startup like rc.local&lt;/p&gt;
&lt;p&gt;WHAT DOES WORK:&lt;/p&gt;
&lt;p&gt;zbackup&lt;/p&gt;
&lt;p&gt;WHAT DOESN’T WORK:&lt;/p&gt;
&lt;p&gt;renaming doesn’t work, moving to another folder works&lt;br&gt;
concurrent use of the same folder from 2 different machines. I won’t recommend that.&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>ZBACKUP – VERY QUICK QUICKSTART</title>
		<link href="https://blog.smemory.org/posts/20151208_02_zbackup-quickstart/"/>
		<updated>2015-12-08T00:00:00+00:00</updated>
		<id>https://blog.smemory.org/posts/20151208_02_zbackup-quickstart/</id>
		<content type="html">&lt;p&gt;source: &lt;a href=&quot;http://zbackup.org/&quot;&gt;http://zbackup.org/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;install on debian:&lt;/p&gt;
&lt;p&gt;apt-get install cmake libssl-dev libprotobuf-dev liblzma-dev liblzo2-dev zlib1g-dev protobuf-compiler protobuf-c-compiler&lt;/p&gt;
&lt;p&gt;clone the repo:&lt;/p&gt;
&lt;p&gt;git clone &lt;a href=&quot;https://github.com/zbackup/zbackup&quot;&gt;https://github.com/zbackup/zbackup&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;build &amp;amp; install:&lt;/p&gt;
&lt;p&gt;cd zbackup&lt;br&gt;
cmake .&lt;br&gt;
make&lt;br&gt;
sudo make install&lt;/p&gt;
&lt;h1 id=&quot;or-just-run-as-.%2Fzbackup&quot;&gt;or just run as ./zbackup &lt;a class=&quot;direct-link&quot; href=&quot;#or-just-run-as-.%2Fzbackup&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;initiate repo:&lt;/p&gt;
&lt;p&gt;zbackup init –non-encrypted /zbackup/repo&lt;/p&gt;
&lt;p&gt;backup something:&lt;/p&gt;
&lt;p&gt;tar c foler_to_backup | zbackup backup –threads 2 –cache-size 1024mb –non-encrypted /zbackup/repo/backups/backup_name_timestamp&lt;/p&gt;
&lt;p&gt;restore something:&lt;/p&gt;
&lt;p&gt;zbackup restore –threads 2 –cache-size 1024mb –non-encrypted /data/zbackup/repo/backups/backup_sh-im01_201512040415 &amp;gt; backup_sh-im01_201512040415.tar&lt;/p&gt;
&lt;p&gt;delete something:&lt;br&gt;
delete the backup file from your /zbackup/repo/backups and run this command on the repo to perform garbage collection and delete unused chunks:&lt;/p&gt;
&lt;p&gt;zbackup gc –non-encrypted /zbackup/repo/&lt;/p&gt;
&lt;p&gt;notes:&lt;br&gt;
adjust –threads and –cache-size as needed&lt;/p&gt;
&lt;p&gt;mirror the repo to another server:&lt;br&gt;
just copy it, I use rsync.&lt;br&gt;
then restore the backup pointing to the backups folder like you would do on the main server.&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>APCUPSD ETHERNET SERVER CLIENT</title>
		<link href="https://blog.smemory.org/posts/20151208_01_apcupsd-eth-srv-client/"/>
		<updated>2015-12-08T00:00:00+00:00</updated>
		<id>https://blog.smemory.org/posts/20151208_01_apcupsd-eth-srv-client/</id>
		<content type="html">&lt;p&gt;on server, /etc/apcupsd/apcupsd.conf:&lt;/p&gt;
&lt;p&gt;UPSCABLE usb&lt;br&gt;
UPSTYPE usb&lt;br&gt;
DEVICE&lt;br&gt;
NETSERVER on&lt;br&gt;
NISIP 0.0.0.0 (or the net you want to serve)&lt;br&gt;
NISPORT 3551&lt;/p&gt;
&lt;p&gt;remember to open the port in iptables:&lt;/p&gt;
&lt;p&gt;-A INPUT -i eth0 -p tcp -m tcp –dport 3551 -m comment –comment apcupsd -j ACCEPT&lt;/p&gt;
&lt;p&gt;on client, /etc/apcupsd/apcupsd.conf:&lt;/p&gt;
&lt;p&gt;UPSCABLE ether&lt;br&gt;
UPSTYPE net&lt;br&gt;
DEVICE x.x.x.x:3551&lt;/p&gt;
&lt;p&gt;restart the service, to test the connection you can just issue:&lt;/p&gt;
&lt;p&gt;#apcaccess&lt;/p&gt;
&lt;p&gt;in the output you should see the lines:&lt;/p&gt;
&lt;p&gt;UPSNAME : the same ups name on the server&lt;br&gt;
CABLE : Ethernet Link&lt;br&gt;
DRIVER : the same model on the server&lt;br&gt;
SERIALNO : xxxxxxxxxxx&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>CACTI APC UPS</title>
		<link href="https://blog.smemory.org/posts/20151207_01_cacti-apcupsd/"/>
		<updated>2015-12-07T00:00:00+00:00</updated>
		<id>https://blog.smemory.org/posts/20151207_01_cacti-apcupsd/</id>
		<content type="html">&lt;p&gt;followed the instructions on this post: &lt;a href=&quot;http://www.evilbox.ro/linux/using-cacti-with-apc-ups-and-ubuntu/&quot;&gt;http://www.evilbox.ro/linux/using-cacti-with-apc-ups-and-ubuntu/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;but I had to modify the script hardcoding the server and port IP because it was not working:&lt;/p&gt;
&lt;p&gt;#!/usr/bin/env bash&lt;br&gt;
/sbin/apcaccess status x.x.x.x 3551 | /usr/share/cacti/site/scripts/apcupsd.pl&lt;/p&gt;
&lt;p&gt;I created my graph template:&lt;br&gt;
cacti_graph_template_apc_ups.xml&lt;/p&gt;
&lt;p&gt;Here is the mirror of the original article in case something goes missing, the mirror of the original files is at the end:&lt;/p&gt;
&lt;p&gt;USING CACTI WITH APC UPS AND UBUNTU&lt;br&gt;
Linux&lt;/p&gt;
&lt;p&gt;by Bogdan&lt;/p&gt;
&lt;p&gt;Tested on :&lt;br&gt;
Ubuntu 10.10 Server x64&lt;br&gt;
Cacti 0.8.7g with NET-SNMP 5.x and RRDTool 1.4.x&lt;br&gt;
APC UPS BR1500I with USB connection and apcupsd (3.14.8-2) package.&lt;br&gt;
The original forum topic is here.&lt;br&gt;
Cacti APC UPS image&lt;br&gt;
You need to have apcupsd package installed, along with cacti.&lt;br&gt;
Cacti can monitor my APC UPS using two scripts that rely on the information provided by apcaccess command.&lt;br&gt;
The two scripts must be located in cacti’s scripts folder (in my case : /usr/share/cacti/site/scripts).&lt;/p&gt;
&lt;p&gt;Changes : my UPS does not have an internal temperature sensor and cannot measure line frequency. So i modified the script to only show valid information (from apcaccess).&lt;br&gt;
Stats monitored :&lt;/p&gt;
&lt;p&gt;Time remaining in minutes&lt;br&gt;
Battery charge level in %&lt;br&gt;
Battery voltage in Volts&lt;br&gt;
Utility line voltage in Volts&lt;br&gt;
UPS load in %&lt;br&gt;
My (customized and zipped) scripts are : &lt;a href=&quot;http://apcupsd.pl/&quot;&gt;apcupsd.pl&lt;/a&gt; and check_ups.sh and they must be executable.&lt;br&gt;
Graph template (with dependencies, zip archive) is : cacti_graph_template_apc_ups_statistics&lt;br&gt;
Data template is : cacti_data_template_apc_ups_statistics (included in graph template).&lt;/p&gt;
&lt;p&gt;One change from the original data template was to increase the maximum value from 220 to 250 to the data source item line_volt, because the output in my case exceeds 220 (usually 230V) and the utility voltage was not shown.&lt;/p&gt;
&lt;p&gt;Troubleshooting :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Be sure that the scripts are executable and the info in check_ups.sh is correct (the path for the check_ups.shscript)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Run check_ups.sh localhost 3551. It should display some statistics like :&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;line_volt:230.0 load_pct:7.0 b_charge:100.0 time_left:115.2 bat_volt:27.3&lt;/p&gt;
&lt;p&gt;If it doesn’t, run the command apcaccess or apcaccess status. If you still get no output with ups stats, check to see if you have apcupsd package installed (see the beginning of the article for a link with install instructions).&lt;/p&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;
&lt;p&gt;Check RRD with command : rrdtool fetch /var/lib/cacti/rra/localhost_b_charge_117.rrd MAX where localhost_b_charge_117.rrd is the the data source file for Localhost – APC UPS Statistics. So look in Console -&amp;gt; Data Sources -&amp;gt; Localhost – APC UPS Statistics for the correct name and path.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Also check the Cacti log file, locate in Utilities -&amp;gt; System Utilites -&amp;gt; View Cacti Log file&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;cacti_data_template_apc_ups_statistics&lt;br&gt;
check_ups&lt;br&gt;
apcupsd&lt;br&gt;
cacti_graph_template_apc_ups_statistics&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>Notes on Ubuntu 14.04 LTS</title>
		<link href="https://blog.smemory.org/posts/20151010_01_notes-ubuntu-14-04/"/>
		<updated>2015-10-10T00:00:00+00:00</updated>
		<id>https://blog.smemory.org/posts/20151010_01_notes-ubuntu-14-04/</id>
		<content type="html">&lt;p&gt;Problem: apt-get update gives “Hash Sum mismatch”&lt;br&gt;
create new list with &lt;a href=&quot;http://repogen.simplylinux.ch/&quot;&gt;http://repogen.simplylinux.ch/&lt;/a&gt;&lt;br&gt;
edit /etc/apt/sources.list with the new list&lt;br&gt;
sudo rm -rf /var/lib/apt/lists/partial/*&lt;br&gt;
sudo rm -rf /var/lib/apt/lists/*&lt;br&gt;
sudo rm /etc/apt/sources.list.save&lt;br&gt;
sudo apt-get update&lt;/p&gt;
&lt;p&gt;Persistent iptables:&lt;br&gt;
sudo apt-get install iptables-persistent&lt;br&gt;
to save the config: sudo invoke-rc.d iptables-persistent save&lt;/p&gt;
&lt;p&gt;Enable hibernation:&lt;br&gt;
&lt;a href=&quot;https://help.ubuntu.com/14.04/ubuntu-help/power-hibernate.html&quot;&gt;https://help.ubuntu.com/14.04/ubuntu-help/power-hibernate.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;won’t shut down:&lt;br&gt;
sudo nano /etc/default/grub&lt;br&gt;
add “acpi=force” to the line “GRUB_CMDLINE_LINUX_DEFAULT=”&lt;br&gt;
it might seem somthing like: GRUB_CMDLINE_LINUX_DEFAULT=”quiet splash acpi=force”&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>INTEL NUC I5 AS VM SERVER</title>
		<link href="https://blog.smemory.org/posts/20140527_01_nuc-vm-server/"/>
		<updated>2014-05-27T00:00:00+00:00</updated>
		<id>https://blog.smemory.org/posts/20140527_01_nuc-vm-server/</id>
		<content type="html">&lt;p&gt;After about a year with the Celeron 847 NUC (DCCP847DYE) with Debian and qemu I decided to upgrade the little one with another little one: the newer NUC i5-4250 (D54250WYK) and Debian 7, some notes:&lt;/p&gt;
&lt;p&gt;it supports ONLY DDR3L, which means only 1.35v sodimms, so you cannot reuse the 1.5v ram you already have..&lt;br&gt;
it has some issues with video outs, I had to disconnect, reboot and reconnect many times in order to obtain a signal on the monitor and after that if I switch the monitor input to another and get back to the NUC’s one I have to reboot to, hopefully, get the signal back..&lt;br&gt;
I read that some “old” netinst of Debian hadn’t the drivers for the Gigabit ethernet interface so you had to boot an unstable to have the driver, I teste with netinst of Debian 7.5 (downloaded today 2014/05/27) and it has the drivers needed&lt;br&gt;
I chose this version of the NUC instead the one with 2.5″ HDD support because this one was ready available and for the moment I could use the mSata disk I already have to boot the os.&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>UBUNTU IBM FLEX CMM AND IMM REMOTE CONTROL PROBLEMS</title>
		<link href="https://blog.smemory.org/posts/20130619_01_ubuntu-ibm-cmm/"/>
		<updated>2013-06-19T00:00:00+00:00</updated>
		<id>https://blog.smemory.org/posts/20130619_01_ubuntu-ibm-cmm/</id>
		<content type="html">&lt;p&gt;On Ubuntu (12.10) there might be some problems using the java app of the remote console,&lt;br&gt;
if so, from apt install libstdc++5.&lt;/p&gt;
&lt;p&gt;i’m using openjdk6/7 with icedtea plugin.&lt;/p&gt;
&lt;p&gt;solution found here: &lt;a href=&quot;https://forums.oracle.com/message/9641538&quot;&gt;https://forums.oracle.com/message/9641538&lt;/a&gt;&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>PROJECT ARMADILLO NODE V0.0.1</title>
		<link href="https://blog.smemory.org/posts/20130403_01_armadillo-node/"/>
		<updated>2013-04-03T00:00:00+00:00</updated>
		<id>https://blog.smemory.org/posts/20130403_01_armadillo-node/</id>
		<content type="html">&lt;p&gt;First release of the code of the Armadillo-Node&lt;/p&gt;
&lt;p&gt;2013/03/04 version 0.0.1&lt;/p&gt;
&lt;p&gt;features&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;read and display temp/hum of a DHT22 (or DHT21 or DHT11)&lt;/li&gt;
&lt;li&gt;read/write some Digital I/O&lt;/li&gt;
&lt;li&gt;read all 6 analog inputs&lt;/li&gt;
&lt;li&gt;read/write 6 variables (2 used for the “no connection” warning)&lt;/li&gt;
&lt;li&gt;“no connection” warning when the server doesn’t contatct the node for about 5 minutes&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;CODE:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/*
* WebServerParsing
* Respond to requests in the URL to change digital and analog output ports
* show the number of ports changed and the value of the analog input pins.
* for example:
* sending http://192.168.1.177/?pinD2=1 turns digital pin 2 on
* sending http://192.168.1.177/?pinD2=0 turns pin 2 off.
* This sketch demonstrates text parsing using the 1.0 Stream class.
*/

#include &amp;lt;SPI.h&amp;gt;
#include &amp;lt;Ethernet.h&amp;gt;
#include &amp;lt;DHT.h&amp;gt;

//*******************************************************************************************************
//DHT22
//*******************************************************************************************************
// Uncomment whatever type you’re using!
//#define DHTTYPE DHT11 // DHT 11
#define DHTTYPE DHT22 // DHT 22 (AM2302)
//#define DHTTYPE DHT21 // DHT 21 (AM2301)
#define DHTPIN 3 // what pin we’re connected to
DHT dht(DHTPIN, DHTTYPE);

//*******************************************************************************************************
//Ethernet Setup
//*******************************************************************************************************
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 172, 24, 33, 7 };
byte gateway[] = {172, 24, 33, 1 };
byte subnet[] = {255, 255, 255, 0 };

EthernetServer server(80);

int a = 0;
int b = 0;
int c = 0;
int d = 0;
long e = 0;
int f = 0;

int warn = 9; //pin for the warning led of no connection with the server
long timeout = 50000; //timeout in &amp;quot;program cycles&amp;quot;, as of 2013/03/15 a cycle lasts about 0,006 secs, and every second about 166 cycles are executed

void setup()
{
Serial.begin(9600);
Ethernet.begin(mac, ip, gateway, subnet);
server.begin();
Serial.println(&amp;quot;server ready&amp;quot;);
dht.begin();
Serial.println(&amp;quot;DHT ready&amp;quot;);
pinMode(warn, OUTPUT);
}

void loop()
{
Serial.println(e);

if (e&amp;gt;0 &amp;amp; e&amp;lt;timeout &amp;amp; f!=1) {
digitalWrite(warn, HIGH);
}
if (e&amp;gt;0 &amp;amp; e&amp;lt;timeout &amp;amp; f==1) {
digitalWrite(warn, LOW);
}

if (e&amp;gt;timeout) {
f=99;
e=0;
}

e = e+1;

EthernetClient client = server.available();
if (client) {
while (client.connected()) {
if (client.available()) {
// counters to show the number of pin change requests
int digitalRequests = 0;
int analogRequests = 0;
if( client.find(&amp;quot;GET /&amp;quot;) ) { // search for ‘GET’
// find tokens starting with &amp;quot;pin&amp;quot; and stop on the first blank line
// search to the end of line for ‘pin’
while(client.findUntil(&amp;quot;pin&amp;quot;, &amp;quot;nr&amp;quot;)){
char type = client.read(); // D or A
// the next ascii integer value in the stream is the pin
int pin = client.parseInt();
int val = client.parseInt(); // the integer after that is the value
if( type == ‘D’ &amp;amp; pin &amp;gt; 6 &amp;amp; pin &amp;lt; 9) {
Serial.print(&amp;quot;Digital pin &amp;quot;);
pinMode(pin, OUTPUT);
digitalWrite(pin, val);
digitalRequests++;
}
else if( type == ‘A’){
Serial.print(&amp;quot;Analog pin &amp;quot;);
analogWrite(pin, val);
analogRequests++;
}
else if( type == ‘V’ &amp;amp; pin &amp;gt; 19 &amp;amp; pin &amp;lt; 26){
Serial.print(&amp;quot;Variable &amp;quot;);
switch (pin) {
case 20 : a = val; break;
case 21 : b = val; break;
case 22 : c = val; break;
case 23 : d = val; break;
case 24 : e = val; break;
case 25 : f = val; break;
}
}
else {
Serial.print(&amp;quot;Unexpected type &amp;quot;);
Serial.print(type);
}
Serial.print(pin);
Serial.print(&amp;quot;=&amp;quot;);
Serial.println(val);
}
}
Serial.println();

// the findUntil has detected the blank line (a lf followed by cr)
// so the http request has ended and we can send a reply
// send a standard http response header
client.println(&amp;quot;HTTP/1.1 200 OK&amp;quot;);
client.println(&amp;quot;Content-Type: text/html&amp;quot;);
client.println();

// output the number of pins handled by the request
// client.print(digitalRequests);
// client.print(&amp;quot; digital pin(s) written&amp;quot;);
// client.println(&amp;quot;&amp;lt;br /&amp;gt;&amp;quot;);
// client.print(analogRequests);
// client.print(&amp;quot; analog pin(s) written&amp;quot;);
// client.println(&amp;quot;&amp;lt;br /&amp;gt;&amp;quot;);
// client.println(&amp;quot;&amp;lt;br /&amp;gt;&amp;quot;);

float t = dht.readTemperature();
if (isnan(t) &amp;amp;&amp;amp; (t) == 0.00) {
client.println(&amp;quot;ERROR reading the sensor &amp;quot;);
}
else {
client.print(&amp;quot;T &amp;quot;);
client.print(&amp;quot; = &amp;quot;);
client.print(t);
client.print(&amp;quot; *C&amp;quot;);
client.println(&amp;quot; &amp;quot;); }

client.println(&amp;quot;&amp;lt;br /&amp;gt;&amp;quot;);

float h = dht.readHumidity();
if (isnan(h)) {
client.println(&amp;quot;ERROR reading the sensor &amp;quot;);
// client.print(&amp;quot;DEBUG content of h &amp;quot;);
// client.print(h);
// client.println(&amp;quot; &amp;quot;);
}
else {
client.print(&amp;quot;H &amp;quot;);
client.print(&amp;quot; = &amp;quot;);
client.print(h);
client.print(&amp;quot; %t&amp;quot;);
client.println(&amp;quot; &amp;quot;); }

client.println(&amp;quot;&amp;lt;br /&amp;gt;&amp;quot;);
// client.println(&amp;quot;&amp;lt;br /&amp;gt;&amp;quot;);

// output the value of each analog input pin
for (int i = 0; i &amp;lt; 6; i++) {
client.print(&amp;quot;A&amp;quot;);
client.print(i);
client.print(&amp;quot; = &amp;quot;);
client.print(analogRead(i));
client.println(&amp;quot;&amp;lt;br /&amp;gt;&amp;quot;);
}

client.println(&amp;quot;&amp;lt;br /&amp;gt;&amp;quot;);

// output the value of digital pin 4 to 9
for (int i = 4; i &amp;lt; 10; i++) {
client.print(&amp;quot;D&amp;quot;);
client.print(i);
client.print(&amp;quot; = &amp;quot;);
client.print(digitalRead(i));
client.println(&amp;quot;&amp;lt;br /&amp;gt;&amp;quot;);
}

client.println(&amp;quot;&amp;lt;br /&amp;gt;&amp;quot;);

client.print(&amp;quot;varA &amp;quot;);
client.print(&amp;quot; = &amp;quot;);
client.print(a);
client.println(&amp;quot;&amp;lt;br /&amp;gt;&amp;quot;);
client.print(&amp;quot;varB &amp;quot;);
client.print(&amp;quot; = &amp;quot;);
client.print(b);
client.println(&amp;quot;&amp;lt;br /&amp;gt;&amp;quot;);
client.print(&amp;quot;varC &amp;quot;);
client.print(&amp;quot; = &amp;quot;);
client.print(c);
client.println(&amp;quot;&amp;lt;br /&amp;gt;&amp;quot;);
client.print(&amp;quot;varD &amp;quot;);
client.print(&amp;quot; = &amp;quot;);
client.print(d);
client.println(&amp;quot;&amp;lt;br /&amp;gt;&amp;quot;);
client.print(&amp;quot;varE &amp;quot;);
client.print(&amp;quot; = &amp;quot;);
client.print(e);
client.println(&amp;quot;&amp;lt;br /&amp;gt;&amp;quot;);
client.print(&amp;quot;varF &amp;quot;);
client.print(&amp;quot; = &amp;quot;);
client.print(f);
client.println(&amp;quot;&amp;lt;br /&amp;gt;&amp;quot;);

break;
}
}
// give the web browser time to receive the data
delay(1);
client.stop();
}
}
&lt;/code&gt;&lt;/pre&gt;
</content>
	</entry>
	
	<entry>
		<title>INTERFACING ARDUINO PRO MINI WITH THE ETHERNET SHIELD (W5100)</title>
		<link href="https://blog.smemory.org/posts/20130314_01_arduino-pro-w5100/"/>
		<updated>2013-03-14T00:00:00+00:00</updated>
		<id>https://blog.smemory.org/posts/20130314_01_arduino-pro-w5100/</id>
		<content type="html">&lt;p&gt;&lt;a href=&quot;http://proto-pic.com/Datasheets/Ethernet_PROMINI/Ethernet_PROMINI.pdf&quot;&gt;http://proto-pic.com/Datasheets/Ethernet_PROMINI/Ethernet_PROMINI.pdf&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;source: &lt;a href=&quot;http://proto-pic.com/&quot;&gt;proto-pic.com&lt;/a&gt;&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>RASPBERRYPI TRANSMISSION HEADLESS</title>
		<link href="https://blog.smemory.org/posts/20130225_01_rpi-transmission-headless/"/>
		<updated>2013-02-25T00:00:00+00:00</updated>
		<id>https://blog.smemory.org/posts/20130225_01_rpi-transmission-headless/</id>
		<content type="html">&lt;p&gt;a nice mini guide: &lt;a href=&quot;http://yetanothercomputingblog.blogspot.it/2013/01/building-headless-torrent-client-using.html&quot;&gt;http://yetanothercomputingblog.blogspot.it/2013/01/building-headless-torrent-client-using.html&lt;/a&gt;&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>MULTIBOOT NEXUS 7 WITH MULTIROM</title>
		<link href="https://blog.smemory.org/posts/20130221_01_nexus7-multirom/"/>
		<updated>2013-02-21T00:00:00+00:00</updated>
		<id>https://blog.smemory.org/posts/20130221_01_nexus7-multirom/</id>
		<content type="html">&lt;p&gt;Here’s a nice guide on how to install multiboot on your nexus 7:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.youtube.com/watch?v=w-FRRzkhFiw&quot;&gt;http://www.youtube.com/watch?v=w-FRRzkhFiw&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Reference XDA thread: &lt;a href=&quot;http://forum.xda-developers.com/showthread.php?t=2011403&quot;&gt;http://forum.xda-developers.com/showthread.php?t=2011403&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;ROMs available: &lt;a href=&quot;http://forum.xda-developers.com/showthread.php?t=2093797&quot;&gt;http://forum.xda-developers.com/showthread.php?t=2093797&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I rooted my Nexus 7 using Nexus 7 Toolkit, you can obtain it here: &lt;a href=&quot;http://forum.xda-developers.com/showthread.php?t=1809195&quot;&gt;http://forum.xda-developers.com/showthread.php?t=1809195&lt;/a&gt;&lt;br&gt;
NB: It is worth to donate and receive the unlock code, it’s a fantastic software and donating gives you the ability to automatically update the program.&lt;/p&gt;
&lt;p&gt;This also gives you the ability to test Palm’s (and then HP’s) WebOS&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>GOOGLE-AUTHENTICATOR ON SSH ON DEBIAN 6 (ON RASPBERRYPI)</title>
		<link href="https://blog.smemory.org/posts/20130201_01_google-auth-ssh/"/>
		<updated>2013-02-01T00:00:00+00:00</updated>
		<id>https://blog.smemory.org/posts/20130201_01_google-auth-ssh/</id>
		<content type="html">&lt;p&gt;implementation of google-authenticator on Debian 6:&lt;/p&gt;
&lt;p&gt;install the following packages:&lt;/p&gt;
&lt;p&gt;sudo apt-get install libpam0g-dev&lt;/p&gt;
&lt;p&gt;sudo apt-get install libreadline5-dev&lt;/p&gt;
&lt;p&gt;and install the google-authenticator package:&lt;/p&gt;
&lt;p&gt;wget &lt;a href=&quot;https://google-authenticator.googlecode.com/files/libpam-google-authenticator-1.0-source.tar.bz2&quot;&gt;https://google-authenticator.googlecode.com/files/libpam-google-authenticator-1.0-source.tar.bz2&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;tar -xjvf libpam-google-authenticator-1.0-source.tar.bz2&lt;/p&gt;
&lt;p&gt;cd libpam-google-authenticator-1.0&lt;/p&gt;
&lt;p&gt;make&lt;/p&gt;
&lt;p&gt;sudo make install&lt;/p&gt;
&lt;p&gt;then add “auth required pam_google_authenticator.so” at the begging of the file “/etc/pam.d/sshd”&lt;br&gt;
sudo nano /etc/pam.d/sshd&lt;/p&gt;
&lt;p&gt;and change the value “ChallengeResponseAuthentication” to “yes” in the file “/etc/ssh/sshd_config”&lt;br&gt;
ChallengeResponseAuthentication yes&lt;/p&gt;
&lt;p&gt;then run google-authenticator&lt;/p&gt;
&lt;p&gt;and restart ssh: sudo service ssh restart&lt;/p&gt;
&lt;p&gt;at your next login you’ll be asked for your Verification code:&lt;/p&gt;
&lt;p&gt;sources:&lt;br&gt;
for the procedure: &lt;a href=&quot;http://www.mnxsolutions.com/security/two-factor-ssh-with-google-authenticator.html&quot;&gt;http://www.mnxsolutions.com/security/two-factor-ssh-with-google-authenticator.html&lt;/a&gt;&lt;br&gt;
for the packages to install: &lt;a href=&quot;https://kb.askmonty.org/en/installing-correct-libraries-for-pam-and-readline/&quot;&gt;https://kb.askmonty.org/en/installing-correct-libraries-for-pam-and-readline/&lt;/a&gt;&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>SLOWMOVIDEO UNDER UBUNTU 12.10</title>
		<link href="https://blog.smemory.org/posts/20130127_01_slowmovideo-ubuntu/"/>
		<updated>2013-01-27T00:00:00+00:00</updated>
		<id>https://blog.smemory.org/posts/20130127_01_slowmovideo-ubuntu/</id>
		<content type="html">&lt;p&gt;slowmoVideo can be found here: &lt;a href=&quot;http://slowmovideo.granjow.net/&quot;&gt;http://slowmovideo.granjow.net/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I downloaded and tried to install the 64bit Ubuntu 12.04 package,&lt;br&gt;
“Ubuntu Software Center” warned me that a dependence could not be met: libglew1.5.&lt;/p&gt;
&lt;p&gt;I had to download and install libglew1.5: &lt;a href=&quot;https://launchpad.net/ubuntu/quantal/amd64/libglew1.5/1.5.7.is.1.5.2-1ubuntu4&quot;&gt;https://launchpad.net/ubuntu/quantal/amd64/libglew1.5/1.5.7.is.1.5.2-1ubuntu4&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Then the install of slowmoVideo went smoothly!&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>ARDUINO TELNET SERVER</title>
		<link href="https://blog.smemory.org/posts/20130115_01_arduino-telnet-server/"/>
		<updated>2013-01-15T00:00:00+00:00</updated>
		<id>https://blog.smemory.org/posts/20130115_01_arduino-telnet-server/</id>
		<content type="html">&lt;p&gt;Found on this arduino forum post: &lt;a href=&quot;http://arduino.cc/forum/index.php/topic,8533.0.html&quot;&gt;http://arduino.cc/forum/index.php/topic,8533.0.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;the modified code to work with the updated Ethernet library:&lt;/p&gt;
&lt;p&gt;[code lang=”arduino”]&lt;br&gt;
/* *&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Arduino Telnet Server *&lt;/li&gt;
&lt;li&gt;7 July 2010 *&lt;/li&gt;
&lt;li&gt;Basic Arduino I/O via *&lt;/li&gt;
&lt;li&gt;a command line interface *&lt;/li&gt;
&lt;li&gt;by Steve Lentz *&lt;/li&gt;
&lt;li&gt;stlentz[at]gmail[dot]com *&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Quick Start Instructions:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Set Ethernet address in code below.&lt;/li&gt;
&lt;li&gt;Compile and upload sketch.&lt;/li&gt;
&lt;li&gt;Connect Arduino to Ethernet.&lt;br&gt;
Make sure link light is on.&lt;/li&gt;
&lt;li&gt;Telnet to Arduino’s IP.&lt;/li&gt;
&lt;li&gt;On some Telnet clients, hit return to wake up connection.&lt;/li&gt;
&lt;li&gt;When connected, type ? &lt;cr&gt; for help.&lt;/cr&gt;&lt;/li&gt;
&lt;li&gt;Try a simple command such as ‘ar’.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Other notes&lt;br&gt;
Tested on Duemilanove with Ethernet Shield.&lt;br&gt;
Should work on compatible boards.&lt;br&gt;
Tested with Win XP, OS X, and Debian Telnet clients.&lt;br&gt;
Compiles to about 9 KB, can be made smaller by removing&lt;br&gt;
unneeded commands, help message, etc.&lt;br&gt;
I am an entirely self-taught C programmer; if you&lt;br&gt;
don’t like my code, too bad ;-). &lt;em&gt;/&lt;br&gt;
// Ethernet parameters&lt;br&gt;
//&lt;/em&gt;******************************************************************************************************&lt;br&gt;
//Libraries&lt;br&gt;
//*******************************************************************************************************&lt;br&gt;
#include &amp;lt;Ethernet.h&amp;gt;&lt;br&gt;
#include &amp;lt;SPI.h&amp;gt;&lt;br&gt;
#include &amp;lt;DHT.h&amp;gt;&lt;/p&gt;
&lt;p&gt;//*******************************************************************************************************&lt;br&gt;
//DHT22&lt;br&gt;
//*******************************************************************************************************&lt;br&gt;
// Uncomment whatever type you’re using!&lt;br&gt;
//#define DHTTYPE DHT11   // DHT 11&lt;br&gt;
#define DHTTYPE DHT22   // DHT 22  (AM2302)&lt;br&gt;
//#define DHTTYPE DHT21   // DHT 21 (AM2301)&lt;/p&gt;
&lt;p&gt;#define DHTPIN 2     // what pin we’re connected to&lt;/p&gt;
&lt;p&gt;DHT dht(DHTPIN, DHTTYPE);&lt;/p&gt;
&lt;p&gt;//*******************************************************************************************************&lt;br&gt;
//Ethernet Setup&lt;br&gt;
//*******************************************************************************************************&lt;br&gt;
byte mac[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };&lt;br&gt;
byte ip[] = {192, 168, 0, 10 };&lt;br&gt;
byte gateway[] = {192, 168, 0, 254 };&lt;br&gt;
byte subnet[] = {255, 255, 255, 0 };&lt;/p&gt;
&lt;p&gt;//*******************************************************************************************************&lt;br&gt;
// Other global variables&lt;br&gt;
//*******************************************************************************************************&lt;br&gt;
#define textBuffSize 9 //length of longest command string plus two spaces for CR + LF&lt;br&gt;
char textBuff[textBuffSize]; //someplace to put received text&lt;br&gt;
int charsReceived = 0;&lt;/p&gt;
&lt;p&gt;boolean connectFlag = 0; //we’ll use a flag separate from client.connected&lt;br&gt;
//so we can recognize when a new connection has been created&lt;br&gt;
unsigned long timeOfLastActivity; //time in milliseconds of last activity&lt;br&gt;
unsigned long allowedConnectTime = 300000; //five minutes&lt;/p&gt;
&lt;p&gt;EthernetServer server(23); // Telnet listens on port 23&lt;br&gt;
EthernetClient client = 0; // Client needs to have global scope so it can be called&lt;br&gt;
// from functions outside of loop, but we don’t know&lt;br&gt;
// what client is yet, so creating an empty object&lt;/p&gt;
&lt;p&gt;void setup()&lt;br&gt;
{&lt;br&gt;
// setting pins 0 to 9 as outputs&lt;br&gt;
// pins 10-13 are used by the Ethernet Shield&lt;br&gt;
for(int i= 0; i &amp;lt; 10; i++) pinMode(i, OUTPUT);&lt;/p&gt;
&lt;p&gt;Ethernet.begin(mac, ip, gateway, subnet);&lt;br&gt;
server.begin();&lt;br&gt;
dht.begin();&lt;br&gt;
}&lt;/p&gt;
&lt;p&gt;void loop()&lt;br&gt;
{&lt;br&gt;
// look to see if a new connection is created,&lt;br&gt;
// print welcome message, set connected flag&lt;br&gt;
if (server.available() &amp;amp;&amp;amp; !connectFlag) {&lt;br&gt;
connectFlag = 1;&lt;br&gt;
client = server.available();&lt;br&gt;
client.println(&amp;quot;nSteve’s Arduino Telnet Server&amp;quot;);&lt;br&gt;
client.println(&amp;quot;? for help&amp;quot;);&lt;br&gt;
printPrompt();&lt;br&gt;
}&lt;/p&gt;
&lt;p&gt;// check to see if text received&lt;br&gt;
if (client.connected() &amp;amp;&amp;amp; client.available()) getReceivedText();&lt;/p&gt;
&lt;p&gt;// check to see if connection has timed out&lt;br&gt;
if(connectFlag) checkConnectionTimeout();&lt;/p&gt;
&lt;p&gt;// code to do other things in loop would go here&lt;/p&gt;
&lt;p&gt;}&lt;br&gt;
void printPrompt()&lt;br&gt;
{&lt;br&gt;
timeOfLastActivity = millis();&lt;br&gt;
client.flush();&lt;br&gt;
charsReceived = 0; //count of characters received&lt;br&gt;
client.print(&amp;quot;n&amp;gt;&amp;quot;);&lt;br&gt;
}&lt;br&gt;
void checkConnectionTimeout()&lt;br&gt;
{&lt;br&gt;
if(millis() – timeOfLastActivity &amp;gt; allowedConnectTime) {&lt;br&gt;
client.println();&lt;br&gt;
client.println(&amp;quot;Timeout disconnect.&amp;quot;);&lt;br&gt;
client.stop();&lt;br&gt;
connectFlag = 0;&lt;br&gt;
}&lt;br&gt;
}&lt;br&gt;
void getReceivedText()&lt;br&gt;
{&lt;br&gt;
char c;&lt;br&gt;
int charsWaiting;&lt;/p&gt;
&lt;p&gt;// copy waiting characters into textBuff&lt;br&gt;
//until textBuff full, CR received, or no more characters&lt;br&gt;
charsWaiting = client.available();&lt;br&gt;
do {&lt;br&gt;
c = client.read();&lt;br&gt;
textBuff[charsReceived] = c;&lt;br&gt;
charsReceived++;&lt;br&gt;
charsWaiting–;&lt;br&gt;
}&lt;br&gt;
while(charsReceived &amp;lt;= textBuffSize &amp;amp;&amp;amp; c != 0x0d &amp;amp;&amp;amp; charsWaiting &amp;gt; 0);&lt;/p&gt;
&lt;p&gt;//if CR found go look at received text and execute command&lt;br&gt;
if(c == 0x0d) {&lt;br&gt;
parseReceivedText();&lt;br&gt;
// after completing command, print a new prompt&lt;br&gt;
printPrompt();&lt;br&gt;
}&lt;/p&gt;
&lt;p&gt;// if textBuff full without reaching a CR, print an error message&lt;br&gt;
if(charsReceived &amp;gt;= textBuffSize) {&lt;br&gt;
client.println();&lt;br&gt;
printErrorMessage();&lt;br&gt;
printPrompt();&lt;br&gt;
}&lt;br&gt;
// if textBuff not full and no CR, do nothing else;&lt;br&gt;
// go back to loop until more characters are received&lt;/p&gt;
&lt;p&gt;}&lt;br&gt;
void parseReceivedText()&lt;br&gt;
{&lt;br&gt;
// look at first character and decide what to do&lt;br&gt;
switch (textBuff[0]) {&lt;br&gt;
case ‘a’ : doAnalogCommand(); break;&lt;br&gt;
case ‘d’ : doDigitalCommand(); break;&lt;br&gt;
case ‘p’ : setPinMode(); break;&lt;br&gt;
case ‘e’ : envCommand(); break;&lt;br&gt;
case ‘c’ : checkCloseConnection(); break;&lt;br&gt;
case ‘?’ : printHelpMessage(); break;&lt;br&gt;
case 0x0d : break; //ignore a carriage return&lt;br&gt;
default: printErrorMessage(); break;&lt;br&gt;
}&lt;br&gt;
}&lt;br&gt;
void doDigitalCommand()&lt;br&gt;
// if we got here, textBuff[0] = ‘d’&lt;br&gt;
{&lt;br&gt;
switch (textBuff[1]) {&lt;br&gt;
case ‘r’ : readDigitalPins(); break;&lt;br&gt;
case ‘w’ : writeDigitalPin(); break;&lt;br&gt;
default: printErrorMessage(); break;&lt;br&gt;
}&lt;br&gt;
}&lt;br&gt;
void readDigitalPins()&lt;br&gt;
// if we got here, textBuff[0] = ‘d’ and textBuff[1] = ‘r’&lt;br&gt;
{&lt;br&gt;
int pin;&lt;br&gt;
if (textBuff[2] == 0x0d) {&lt;br&gt;
// output the valueof each digital pin&lt;br&gt;
for (int i = 0; i &amp;lt; 10; i++) outputPinState(i);&lt;br&gt;
}&lt;br&gt;
else {&lt;br&gt;
pin = parseDigit(textBuff[2]);&lt;br&gt;
if(pin &amp;gt;=0 &amp;amp;&amp;amp; pin &amp;lt;=9) outputPinState(pin);&lt;br&gt;
else printErrorMessage();&lt;br&gt;
}&lt;br&gt;
}&lt;br&gt;
void outputPinState(int pin)&lt;br&gt;
{&lt;br&gt;
client.print(&amp;quot;digital pin &amp;quot;);&lt;br&gt;
client.print(pin);&lt;br&gt;
client.print(&amp;quot; is &amp;quot;);&lt;br&gt;
if (digitalRead(pin)) {&lt;br&gt;
client.println(&amp;quot;HIGH&amp;quot;);&lt;br&gt;
}&lt;br&gt;
else&lt;br&gt;
client.println(&amp;quot;LOW&amp;quot;);&lt;br&gt;
}&lt;br&gt;
void writeDigitalPin()&lt;br&gt;
// if we got here, textBuff[0] = ‘d’ and textBuff[1] = ‘w’&lt;br&gt;
{&lt;br&gt;
int pin = -1;&lt;br&gt;
int pinSetting = -1;&lt;br&gt;
if (textBuff[3] == ‘=’ &amp;amp;&amp;amp; textBuff[6] == 0x0d) {&lt;br&gt;
//if yes, get the pin number, setting, and set the pin&lt;br&gt;
pin = parseDigit(textBuff[2]);&lt;br&gt;
pinSetting = parsePinSetting();&lt;br&gt;
if(pin &amp;gt; -1 &amp;amp;&amp;amp; pinSetting == 0) {&lt;br&gt;
digitalWrite(pin, LOW);&lt;br&gt;
client.println(&amp;quot;OK&amp;quot;);&lt;br&gt;
}&lt;br&gt;
if(pin &amp;gt; -1 &amp;amp;&amp;amp; pinSetting == 1) {&lt;br&gt;
digitalWrite(pin, HIGH);&lt;br&gt;
client.println(&amp;quot;OK&amp;quot;);&lt;br&gt;
}&lt;br&gt;
if(pin &amp;lt; 0 || pinSetting &amp;lt; 0) printErrorMessage();&lt;br&gt;
}&lt;br&gt;
else printErrorMessage();&lt;br&gt;
}&lt;br&gt;
int parsePinSetting()&lt;br&gt;
//look in the text buffer to find the pin setting&lt;br&gt;
//return -1 if not valid&lt;br&gt;
{&lt;br&gt;
int pinSetting = -1;&lt;br&gt;
if(textBuff[4] == ‘l’ &amp;amp;&amp;amp; textBuff[5] == ‘o’) pinSetting = 0;&lt;br&gt;
if(textBuff[4] == ‘h’ &amp;amp;&amp;amp; textBuff[5] == ‘i’) pinSetting = 1;&lt;br&gt;
return pinSetting;&lt;br&gt;
}&lt;br&gt;
void doAnalogCommand()&lt;br&gt;
// if we got here, textBuff[0] = ‘a’&lt;br&gt;
{&lt;br&gt;
switch (textBuff[1]) {&lt;br&gt;
case ‘r’ : readAnalogPins(); break;&lt;br&gt;
case ‘w’ : writeAnalogPin(); break;&lt;br&gt;
default: printErrorMessage(); break;&lt;br&gt;
}&lt;br&gt;
}&lt;br&gt;
void readAnalogPins()&lt;br&gt;
// if we got here, textBuff[0] = ‘a’ and textBuff[1] = ‘r’&lt;br&gt;
// check textBuff[2] is a CR then&lt;br&gt;
// output the value of each analog input pin&lt;br&gt;
{&lt;br&gt;
if(textBuff[2] == 0x0d) {&lt;br&gt;
for (int i = 0; i &amp;lt; 6; i++) {&lt;br&gt;
client.print(&amp;quot;analog input &amp;quot;);&lt;br&gt;
client.print(i);&lt;br&gt;
client.print(&amp;quot; is &amp;quot;);&lt;br&gt;
client.println(analogRead(i));&lt;br&gt;
}&lt;br&gt;
}&lt;br&gt;
else printErrorMessage();&lt;br&gt;
}&lt;br&gt;
void writeAnalogPin()&lt;br&gt;
// if we got here, textBuff[0] = ‘a’ and textBuff[1] = ‘w’&lt;br&gt;
{&lt;br&gt;
int pin = -1;&lt;br&gt;
int pwmSetting = -1;&lt;br&gt;
if (textBuff[3] == ‘=’) {&lt;br&gt;
//if yes, get the pin number, setting, and set the pin&lt;br&gt;
pin = parseDigit(textBuff[2]);&lt;br&gt;
if(pin == 3 || pin == 5 || pin == 6 || pin == 9) {&lt;br&gt;
pwmSetting = parsepwmSetting();&lt;br&gt;
if(pwmSetting &amp;gt;= 0 &amp;amp;&amp;amp; pwmSetting &amp;lt;= 255) {&lt;br&gt;
analogWrite(pin,pwmSetting);&lt;br&gt;
client.println(&amp;quot;OK&amp;quot;);&lt;br&gt;
}&lt;br&gt;
else printErrorMessage();&lt;br&gt;
}&lt;br&gt;
else printErrorMessage();&lt;br&gt;
}&lt;br&gt;
else printErrorMessage();&lt;br&gt;
}&lt;br&gt;
int parsepwmSetting()&lt;br&gt;
{&lt;br&gt;
int pwmSetting = 0;&lt;br&gt;
int textPosition = 4; //start at textBuff[4]&lt;br&gt;
int digit;&lt;br&gt;
do {&lt;br&gt;
digit = parseDigit(textBuff[textPosition]); //look for a digit in textBuff&lt;br&gt;
if (digit &amp;gt;= 0 &amp;amp;&amp;amp; digit &amp;lt;=9) { //if digit found&lt;br&gt;
pwmSetting = pwmSetting * 10 + digit; //shift previous result and add new digit&lt;br&gt;
}&lt;br&gt;
else pwmSetting = -1;&lt;br&gt;
textPosition++; //go to the next position in textBuff&lt;br&gt;
}&lt;br&gt;
//if not at end of textBuff and not found a CR and not had an error, keep going&lt;br&gt;
while(textPosition &amp;lt; 7 &amp;amp;&amp;amp; textBuff[textPosition] != 0x0d &amp;amp;&amp;amp; pwmSetting &amp;gt; -1);&lt;br&gt;
//if value is not followed by a CR, return an error&lt;br&gt;
if(textBuff[textPosition] != 0x0d) pwmSetting = -1;&lt;br&gt;
return pwmSetting;&lt;br&gt;
}&lt;br&gt;
void setPinMode()&lt;br&gt;
// if we got here, textBuff[0] = ‘p’&lt;br&gt;
{&lt;br&gt;
int pin = -1;&lt;br&gt;
int pinModeSetting = -1;&lt;br&gt;
if (textBuff[1] == ‘m’ &amp;amp;&amp;amp; textBuff[3] == ‘=’ &amp;amp;&amp;amp; textBuff[6] == 0x0d) {&lt;br&gt;
//if yes, get the pin number, setting, and set the pin&lt;br&gt;
pin = parseDigit(textBuff[2]);&lt;br&gt;
pinModeSetting = parseModeSetting();&lt;br&gt;
if(pin &amp;gt; -1 &amp;amp;&amp;amp; pinModeSetting == 0) {&lt;br&gt;
pinMode(pin, OUTPUT);&lt;br&gt;
client.println(&amp;quot;OK&amp;quot;);&lt;br&gt;
}&lt;br&gt;
if(pin &amp;gt; -1 &amp;amp;&amp;amp; pinModeSetting == 1) {&lt;br&gt;
pinMode(pin, INPUT);&lt;br&gt;
client.println(&amp;quot;OK&amp;quot;);&lt;br&gt;
}&lt;br&gt;
if(pin &amp;lt; 0 || pinModeSetting &amp;lt; 0) printErrorMessage();&lt;br&gt;
}&lt;br&gt;
else printErrorMessage();&lt;br&gt;
}&lt;br&gt;
int parseModeSetting()&lt;br&gt;
//look in the text buffer to find the pin setting&lt;br&gt;
//return -1 if not valid&lt;br&gt;
{&lt;br&gt;
int pinSetting = -1;&lt;br&gt;
if(textBuff[4] == ‘o’ &amp;amp;&amp;amp; textBuff[5] == ‘u’) pinSetting = 0;&lt;br&gt;
if(textBuff[4] == ‘i’ &amp;amp;&amp;amp; textBuff[5] == ‘n’) pinSetting = 1;&lt;br&gt;
return pinSetting;&lt;br&gt;
}&lt;br&gt;
int parseDigit(char c)&lt;br&gt;
{&lt;br&gt;
int digit = -1;&lt;br&gt;
digit = (int) c – 0x30; // subtracting 0x30 from ASCII code gives value&lt;br&gt;
if(digit &amp;lt; 0 || digit &amp;gt; 9) digit = -1;&lt;br&gt;
return digit;&lt;br&gt;
}&lt;br&gt;
void printErrorMessage()&lt;br&gt;
{&lt;br&gt;
client.println(&amp;quot;Unrecognized command. ? for help.&amp;quot;);&lt;br&gt;
}&lt;br&gt;
void checkCloseConnection()&lt;br&gt;
// if we got here, textBuff[0] = ‘c’, check the next two&lt;br&gt;
// characters to make sure the command is valid&lt;br&gt;
{&lt;br&gt;
if (textBuff[1] == ‘l’ &amp;amp;&amp;amp; textBuff[2] == 0x0d)&lt;br&gt;
closeConnection();&lt;br&gt;
else&lt;br&gt;
printErrorMessage();&lt;br&gt;
}&lt;br&gt;
void closeConnection()&lt;br&gt;
{&lt;br&gt;
client.println(&amp;quot;nBye.n&amp;quot;);&lt;br&gt;
client.stop();&lt;br&gt;
connectFlag = 0;&lt;br&gt;
}&lt;br&gt;
void printHelpMessage()&lt;br&gt;
{&lt;br&gt;
client.println(&amp;quot;nExamples of supported commands:n&amp;quot;);&lt;br&gt;
client.println(&amp;quot; dr -digital read: returns state of digital pins 0 to 9&amp;quot;);&lt;br&gt;
client.println(&amp;quot; dr4 -digital read: returns state of pin 4 only&amp;quot;);&lt;br&gt;
client.println(&amp;quot; ar -analog read: returns all analog inputs&amp;quot;);&lt;br&gt;
client.println(&amp;quot; dw0=hi -digital write: turn pin 0 on valid pins are 0 to 9&amp;quot;);&lt;br&gt;
client.println(&amp;quot; dw0=lo -digital write: turn pin 0 off valid pins are 0 to 9&amp;quot;);&lt;br&gt;
client.println(&amp;quot; aw3=222 -analog write: set digital pin 3 to PWM value 222&amp;quot;);&lt;br&gt;
client.println(&amp;quot; allowed pins are 3,5,6,9&amp;quot;);&lt;br&gt;
client.println(&amp;quot; allowed PWM range 0 to 255&amp;quot;);&lt;br&gt;
client.println(&amp;quot; pm0=in -pin mode: set pin 0 to INPUT valid pins are 0 to 9&amp;quot;);&lt;br&gt;
client.println(&amp;quot; pm0=ou -pin mode: set pin 0 to OUTPUT valid pins are 0 to 9&amp;quot;);&lt;br&gt;
client.println(&amp;quot; et -environmental TEMP read: returns the state of the temp sensor&amp;quot;);&lt;br&gt;
client.println(&amp;quot; eh -environmental HUMidity read: returns the state of the humidity sensor&amp;quot;);&lt;br&gt;
client.println(&amp;quot; cl -close connection&amp;quot;);&lt;br&gt;
client.println(&amp;quot; ? -print this help message&amp;quot;);&lt;br&gt;
}&lt;/p&gt;
&lt;p&gt;void envCommand()&lt;br&gt;
// if we got here, textBuff[0] = ‘e’&lt;br&gt;
{&lt;br&gt;
switch (textBuff[1]) {&lt;br&gt;
case ‘t’ : envTempCommand(); break;&lt;br&gt;
case ‘h’ : envHumCommand(); break;&lt;br&gt;
default: printErrorMessage(); break;&lt;br&gt;
}&lt;br&gt;
}&lt;/p&gt;
&lt;p&gt;void envTempCommand()&lt;br&gt;
// if we got here, textBuff[0] = ‘e’ and textBuff[1] = ‘t’&lt;br&gt;
{&lt;br&gt;
//float h = dht.readHumidity();&lt;br&gt;
float t = dht.readTemperature();&lt;br&gt;
//  if (isnan(t)) {&lt;br&gt;
if (isnan(t) &amp;amp;&amp;amp; (t) == 0.00) {&lt;br&gt;
client.println(&amp;quot;ERROR reading the sensor &amp;quot;);&lt;br&gt;
client.print(&amp;quot;DEBUG content of t &amp;quot;);&lt;br&gt;
client.print(t);&lt;br&gt;
client.println(&amp;quot; &amp;quot;); }&lt;br&gt;
else {&lt;br&gt;
client.print(&amp;quot;Temp: &amp;quot;);&lt;br&gt;
client.print(t);&lt;br&gt;
client.print(&amp;quot; *C&amp;quot;);&lt;br&gt;
client.println(&amp;quot; &amp;quot;); }&lt;br&gt;
}&lt;/p&gt;
&lt;p&gt;void envHumCommand()&lt;br&gt;
// if we got here, textBuff[0] = ‘e’ and textBuff[1] = ‘h’&lt;br&gt;
{&lt;br&gt;
float h = dht.readHumidity();&lt;br&gt;
if (isnan(h)) {&lt;br&gt;
client.println(&amp;quot;ERROR reading the sensor &amp;quot;);&lt;br&gt;
client.print(&amp;quot;DEBUG content of h &amp;quot;);&lt;br&gt;
client.print(h);&lt;br&gt;
client.println(&amp;quot; &amp;quot;); }&lt;br&gt;
else {&lt;br&gt;
client.print(&amp;quot;Hum: &amp;quot;);&lt;br&gt;
client.print(h);&lt;br&gt;
client.print(&amp;quot; %t&amp;quot;);&lt;br&gt;
client.println(&amp;quot; &amp;quot;); }&lt;br&gt;
}&lt;br&gt;
[/code]&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>Powered by Debian stickers</title>
		<link href="https://blog.smemory.org/posts/20121120_01_powered-by-debian/"/>
		<updated>2012-11-20T00:00:00+00:00</updated>
		<id>https://blog.smemory.org/posts/20121120_01_powered-by-debian/</id>
		<content type="html">&lt;p&gt;My Debian stickers finally arrived! I bought from LibreStickers, very fast shipping.&lt;br&gt;
The stickers are very nice and seem pretty resistant and 10 cents per sticker are donated to the project!&lt;/p&gt;
&lt;p&gt;Now my Debian 6 server is much nicer:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.smemory.org/img/IMG_20121120_004844-449x304.jpg&quot; alt=&quot;description&quot;&gt;&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>CISCO IPSEC VPN CLIENT – WIN7 – VODAFONE UMTS KEY – PROBLEMS</title>
		<link href="https://blog.smemory.org/posts/20121115_01_cisco-vpn-vodafone/"/>
		<updated>2012-11-15T00:00:00+00:00</updated>
		<id>https://blog.smemory.org/posts/20121115_01_cisco-vpn-vodafone/</id>
		<content type="html">&lt;p&gt;solved following this tutorial: &lt;a href=&quot;http://www.martinoroberto.it/en/problemi-tra-cisco-vpn-e-windows-7-64-bit-con-vodafone-key/&quot;&gt;http://www.martinoroberto.it/en/problemi-tra-cisco-vpn-e-windows-7-64-bit-con-vodafone-key/&lt;/a&gt;&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>HP Smartarray P212 and Debian 6</title>
		<link href="https://blog.smemory.org/posts/20121114_02_p212-and-debian/"/>
		<updated>2012-11-14T00:00:00+00:00</updated>
		<id>https://blog.smemory.org/posts/20121114_02_p212-and-debian/</id>
		<content type="html">&lt;p&gt;How to manage your fantastic RAID controller under Debian?&lt;/p&gt;
&lt;p&gt;I was interested mainly in having the volumes and disks status to avoid data loss, you can use 2 tools:&lt;/p&gt;
&lt;p&gt;cciss_vol_status&lt;/p&gt;
&lt;p&gt;to install it under Debian simply do:&lt;/p&gt;
&lt;p&gt;apt-get install cciss-vol-status&lt;/p&gt;
&lt;p&gt;the tool monitors the status of the controller, like:&lt;/p&gt;
&lt;p&gt;user@debian:~$ sudo cciss_vol_status /dev/cciss/c*d0&lt;br&gt;
/dev/cciss/c0d0: (Smart Array P212) RAID 5 Volume 0 status: OK.&lt;/p&gt;
&lt;p&gt;which is quite useful to see the status, possible statuses are:&lt;/p&gt;
&lt;blockquote&gt;
&lt;pre&gt;&lt;code&gt;  &amp;quot;OK.&amp;quot; (0) - The logical drive is in good working order.

  &amp;quot;FAILED.&amp;quot; (1) - The logical drive has failed,  and  no  i/o  to	it  is
  poosible.
    Additionally, failed drives will be identified by connector, box
    and bay, as well as vendor, model, serial number,  and  firmware
    revision.

  &amp;quot;Using interim recovery mode.&amp;quot; (3) - One or more drives has failed,
    but  not	so  many that the logical drive can no longer operate.
    The failed drives should be replaced as soon as possible.

  &amp;quot;Ready for recovery operation.&amp;quot; (4) -  Failed drive(s) have been
    replaced, and the controller is about to begin rebuilding redun
    dant parity data.

  &amp;quot;Currently recovering.&amp;quot; (5) - Failed drive(s) have been replaced,
    and  the	controller  is	currently  rebuilding redundant parity
    information.
&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;p&gt;you can find the al the statutes and everything on the command here: &lt;a href=&quot;http://cciss.sourceforge.net/cciss_vol_status.8.html&quot;&gt;http://cciss.sourceforge.net/cciss_vol_status.8.html&lt;/a&gt;&lt;br&gt;
where I found all these useful informations? on this site: &lt;a href=&quot;http://hwraid.le-vert.net/wiki/SmartArray&quot;&gt;http://hwraid.le-vert.net/wiki/SmartArray&lt;/a&gt;&lt;br&gt;
HP AcuCli&lt;br&gt;
the other method is using HP’ ACU CLI for Debian (Array Controller Utility Command Line Interface),&lt;br&gt;
you can find the last version fo ACUCLI for Debian on this HP’s FTP mirror: &lt;a href=&quot;http://downloads.linux.hp.com/SDR/downloads/ProLiantSupportPack/debian/pool/non-free/&quot;&gt;http://downloads.linux.hp.com/SDR/downloads/ProLiantSupportPack/debian/pool/non-free/&lt;/a&gt;&lt;br&gt;
the last 64bit one is:  hpacucli_8.70-8.0.2-2_amd64.deb, so you can download it to your server using wget:&lt;br&gt;
wget &lt;a href=&quot;http://downloads.linux.hp.com/SDR/repo/mcp/Debian/pool/non-free/hpacucli_9.40.1-1._amd64.deb&quot;&gt;http://downloads.linux.hp.com/SDR/repo/mcp/Debian/pool/non-free/hpacucli_9.40.1-1._amd64.deb&lt;/a&gt;&lt;br&gt;
you can install the package following these steps (info found on this SITE), install dependencies:&lt;br&gt;
#apt-get install lib32gcc1 lib32stdc++6&lt;br&gt;
install your acucli .deb package&lt;br&gt;
#dpkg -i hpacucli_8.70-8.0.2-2_amd64.deb&lt;br&gt;
well done, now you can use the acucli to retrieve the system status or even configure and manage the controller,&lt;br&gt;
to display the volumes and it’s status on the controller:&lt;br&gt;
user@debian:~$ sudo hpacucli ctrl slot=1 logicaldrive all show status&lt;br&gt;
logicaldrive 1 (5.5 TB, RAID 5): OK&lt;/p&gt;
&lt;p&gt;to display the status of the disks:&lt;/p&gt;
&lt;p&gt;user@debian:~$ sudo hpacucli ctrl slot=1 pd all show status&lt;/p&gt;
&lt;p&gt;physicaldrive 1I:0:1 (port 1I:box 0:bay 1, 2 TB): OK&lt;br&gt;
physicaldrive 1I:0:2 (port 1I:box 0:bay 2, 2 TB): OK&lt;br&gt;
physicaldrive 1I:0:3 (port 1I:box 0:bay 3, 2 TB): OK&lt;br&gt;
physicaldrive 1I:0:4 (port 1I:box 0:bay 4, 2 TB): OK&lt;/p&gt;
&lt;p&gt;Where I found all these useful informations?&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://hwraid.le-vert.net/wiki/SmartArray&quot;&gt;http://hwraid.le-vert.net/wiki/SmartArray&lt;/a&gt;&lt;br&gt;
&lt;a href=&quot;http://www.ganesh.me/337-install-hpacucli-on-ubuntu-debian.html&quot;&gt;http://www.ganesh.me/337-install-hpacucli-on-ubuntu-debian.html&lt;/a&gt;&lt;br&gt;
&lt;a href=&quot;http://www.datadisk.co.uk/html_docs/redhat/hpacucli.htm&quot;&gt;http://www.datadisk.co.uk/html_docs/redhat/hpacucli.htm&lt;/a&gt;&lt;br&gt;
HP REPOSITORY FOR LINUX: &lt;a href=&quot;http://downloads.linux.hp.com/SDR/repo/mcp/Debian/pool/non-free/&quot;&gt;http://downloads.linux.hp.com/SDR/repo/mcp/Debian/pool/non-free/&lt;/a&gt;&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>Building Microserver Nas with Debian 6 - part1</title>
		<link href="https://blog.smemory.org/posts/20121114_01_debian-nas-pt1/"/>
		<updated>2012-11-14T00:00:00+00:00</updated>
		<id>https://blog.smemory.org/posts/20121114_01_debian-nas-pt1/</id>
		<content type="html">&lt;p&gt;After my Microserver with FreeNAS 8 crashed without chance of recovery I decided to build a Debian server and fileserver from scratch.&lt;/p&gt;
&lt;p&gt;The hardware specs are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Hp Microserver N36L with 8GB Ram (Corsair XMS3) [will use both the ram slots on the motherboard]&lt;/li&gt;
&lt;li&gt;Boot from USB pen (Kingston Data Traveller G3 8GB) [will use the one and only internal USB port]&lt;/li&gt;
&lt;li&gt;HP Smart Array P212/ZM, I added 256MB of cache but I don’t have the battery for the cache (BBWC) [will use one Pci-E 8x slot]&lt;/li&gt;
&lt;li&gt;4x 2TB Drives (2x Hitachi + 2x Seagate) [will use all the 4 drive slots in your microserver]&lt;/li&gt;
&lt;li&gt;optional second NIC connected, I used an HP NC110T [will use 1 Pci-E 1x]&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Step 1 – Installing Debian&lt;/p&gt;
&lt;p&gt;I simply used the Debian 6 netinstall CD that have both the 32bit and the 64bit installer downloadable HERE&lt;br&gt;
I installed it on the USB pen without problems, keep in mind that having more than 1 drive in your machine force you to select the correct device to install the bootloader (grub), you can read the device from the partitioning tool where you select where to install Debian (in my case /dev/sdb).&lt;br&gt;
I selected the packages “File Server”, “SSH Server” and something like “Common System Tools”.&lt;/p&gt;
&lt;p&gt;Step 2 – Create the volume on the RAID Controller&lt;/p&gt;
&lt;p&gt;Talking hardware: the HDD cage of your Microserver N36L and N40L will connect nicely to you P212 controller with the provided cable that was connected to the motherboard, I recommend to reroute the SAS cable like I did and suggested in this post: &lt;a href=&quot;https://blog.smemory.org/posts/20120327_01_P212-Microserver/&quot;&gt;Fitting HP Smartarray P212 in Microserver&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;When your server boots, in the POST screen, you should see the Raid controller BIOS output, when asked press F8 to enter the controller configuration utility, then create your volume.&lt;br&gt;
I created a RAID 5 volume with 4x 2TB drives.&lt;br&gt;
NB: with the HP Smart Array P212 you’ll need some cache memory (minimum 256MB) to create a RAID 5 array, otherwise you’ll be forced to have only RAID 0,1,or 10 volumes and a maximum of 2 volumes.&lt;br&gt;
WARNING: to improve drastically your performances you have to Enable the Cache, which is done automatically by the controller if you have the battery (BBWC) connected. Since I didn’t have a BBWC i decided to  override this setting:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Reboot the server.&lt;/li&gt;
&lt;li&gt;During POST, press the F8 key.&lt;/li&gt;
&lt;li&gt;Select Cache Settings and press the Enter key.&lt;/li&gt;
&lt;li&gt;Select Enable Write-Cache Battery Override and press the Enter key.&lt;/li&gt;
&lt;li&gt;Press the F8 key, followed by the Enter key to continue.&lt;/li&gt;
&lt;li&gt;Press the Esc key to exit.&lt;/li&gt;
&lt;li&gt;Be warned that this is a very dangerous setting since in case of power loss you might corrupt the volumes managed by the controller.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I will follow this post with the Part 2 as soon as it’s ready!&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>Ubuntu on Google Nexus 7</title>
		<link href="https://blog.smemory.org/posts/20121228_01_ubuntu-nexus7/"/>
		<updated>2012-10-28T00:00:00+00:00</updated>
		<id>https://blog.smemory.org/posts/20121228_01_ubuntu-nexus7/</id>
		<content type="html">&lt;p&gt;Followed this guide: &lt;a href=&quot;https://wiki.ubuntu.com/Nexus7/Installation&quot;&gt;https://wiki.ubuntu.com/Nexus7/Installation&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Since I previously rooted the device using Google Nexus 7 ToolKit v3.2.0 I had to Re-Lock the device to make it pleasant to the Ubuntu installer.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.smemory.org/img/Screenshot_2012-10-28-12-23-22-1024x576.png&quot; alt=&quot;description&quot;&gt;&lt;/p&gt;
&lt;p&gt;I configured Gnome as my default desktop since I find unity laggy&lt;br&gt;
My external keyboard with touchpad (Logitech K400) works perfectly atteched to the OTG cable&lt;br&gt;
I still have to test many things&lt;br&gt;
Sometimes the virtual keyboard doesn’t show up&lt;/p&gt;
&lt;p&gt;but it’s quite funny,&lt;br&gt;
recommended.&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>CISCO ASA 5505 8.2 HUB AND PIX 501 6.3 SPOKE EZVPN L2L VIA ASDM 6.4</title>
		<link href="https://blog.smemory.org/posts/20121218_01_asa-pix-hub-spoke/"/>
		<updated>2012-10-18T00:00:00+00:00</updated>
		<id>https://blog.smemory.org/posts/20121218_01_asa-pix-hub-spoke/</id>
		<content type="html">&lt;p&gt;On the ASA, trough the ASDM,&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;select “Wizards”&lt;/li&gt;
&lt;li&gt;then “IPsec VPN Wizard”&lt;/li&gt;
&lt;li&gt;then select “Remote Access” mantaining “Enable inbound IPsec sessions etcetera..”, NEXT&lt;/li&gt;
&lt;li&gt;first selection “Cisco VPN CLient….”, NEXT&lt;/li&gt;
&lt;li&gt;select “Preshared Key” and write it, also te tunnel group name, in our example: preshared key: banana and group: grpBANANA, NEXT&lt;/li&gt;
&lt;li&gt;use the local user DB, NEXT&lt;/li&gt;
&lt;li&gt;if needed add the user (in our example: userBANANA), NEXT&lt;/li&gt;
&lt;li&gt;select a pool from where it will take the IPs or create one, NEXT&lt;/li&gt;
&lt;li&gt;select the DNS and the other stuff, NEXT&lt;/li&gt;
&lt;li&gt;select interface “inside” and add in the exempt, I added the whole lan /24, if you want to tunnel ONLY the resources on the remote lan select “enable split tunneling…”, I HIGLY RECOMMEND TO SELECT SPLIT TUNNELING, NEXT&lt;/li&gt;
&lt;li&gt;review your selections and then FINISH&lt;br&gt;
NB: we’d like to use NEM (Network Extension Mode) so we’ll have to add a line manually to the config:&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;connect via ssh or serial to your magnificient ASA&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;locate you group policy lines (so you’ll look for the lines referring to “grpBANANA”&lt;/li&gt;
&lt;li&gt;add “nem enable” to the configuration&lt;/li&gt;
&lt;li&gt;yout config will look like this:&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;group-policy grpBANANA attributes&lt;br&gt;
dns-server value IP_DNS_1 IP_DNS_2&lt;br&gt;
vpn-tunnel-protocol IPSec&lt;br&gt;
vsplit-tunnel-policy tunnelspecified&lt;br&gt;
vsplit-tunnel-network-list value grpBANANA_splitTunnelAcl&lt;br&gt;
vdefault-domain value banana.local&lt;br&gt;
vnem enable&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;With the ASA config you should be good to go&lt;/p&gt;
&lt;p&gt;PIX configuration:&lt;/p&gt;
&lt;p&gt;I HIGHLY recommend to start with a clear pix configuration (use the command “configure factory-default” then remember to recreate the rsa keys: “hostname yourhosname”, “domain-name yourdomain”, “ca zeroize rsa”, “ca generate rsa key 1024”, “ca save all”, wr mem”)&lt;/p&gt;
&lt;p&gt;command line via SSH or SERIAL, the final config will be like this:&lt;/p&gt;
&lt;p&gt;PIX Version 6.3(5)&lt;br&gt;
interface ethernet0 auto&lt;br&gt;
interface ethernet1 100full&lt;br&gt;
nameif ethernet0 outside security0&lt;br&gt;
nameif ethernet1 inside security100&lt;br&gt;
enable password xxxxxxxxxxxxxxxxxxxxxxxx encrypted&lt;br&gt;
passwd xxxxxxxxxxxxxxxxxxxxxx encrypted&lt;br&gt;
hostname bananaPIX&lt;br&gt;
domain-name banana.local&lt;br&gt;
fixup protocol dns maximum-length 512&lt;br&gt;
fixup protocol ftp 21&lt;br&gt;
fixup protocol h323 h225 1720&lt;br&gt;
fixup protocol h323 ras 1718-1719&lt;br&gt;
fixup protocol http 80&lt;br&gt;
fixup protocol rsh 514&lt;br&gt;
fixup protocol rtsp 554&lt;br&gt;
fixup protocol sip 5060&lt;br&gt;
fixup protocol sip udp 5060&lt;br&gt;
fixup protocol skinny 2000&lt;br&gt;
fixup protocol smtp 25&lt;br&gt;
fixup protocol sqlnet 1521&lt;br&gt;
fixup protocol tftp 69&lt;br&gt;
names&lt;br&gt;
pager lines 24&lt;br&gt;
mtu outside 1500&lt;br&gt;
mtu inside 1500&lt;br&gt;
ip address outside dhcp setroute&lt;br&gt;
ip address inside 192.168.0.0 255.255.255.0&lt;br&gt;
ip audit info action alarm&lt;br&gt;
ip audit attack action alarm&lt;br&gt;
pdm logging informational 100&lt;br&gt;
pdm history enable&lt;br&gt;
arp timeout 14400&lt;br&gt;
global (outside) 1 interface&lt;br&gt;
nat (inside) 1 192.168.0.0 255.255.255.0 0 0&lt;br&gt;
timeout xlate 0:05:00&lt;br&gt;
timeout conn 1:00:00 half-closed 0:10:00 udp 0:02:00 rpc 0:10:00 h225 1:00:00&lt;br&gt;
timeout h323 0:05:00 mgcp 0:05:00 sip 0:30:00 sip_media 0:02:00&lt;br&gt;
timeout sip-disconnect 0:02:00 sip-invite 0:03:00&lt;br&gt;
timeout uauth 0:05:00 absolute&lt;br&gt;
aaa-server TACACS+ protocol tacacs+&lt;br&gt;
aaa-server TACACS+ max-failed-attempts 3&lt;br&gt;
aaa-server TACACS+ deadtime 10&lt;br&gt;
aaa-server RADIUS protocol radius&lt;br&gt;
aaa-server RADIUS max-failed-attempts 3&lt;br&gt;
aaa-server RADIUS deadtime 10&lt;br&gt;
aaa-server LOCAL protocol local&lt;br&gt;
no snmp-server location&lt;br&gt;
no snmp-server contact&lt;br&gt;
snmp-server community public&lt;br&gt;
no snmp-server enable traps&lt;br&gt;
floodguard enable&lt;br&gt;
telnet timeout 5&lt;br&gt;
ssh 0.0.0.0 0.0.0.0 outside&lt;br&gt;
ssh 0.0.0.0 0.0.0.0 inside&lt;br&gt;
ssh timeout 5&lt;br&gt;
console timeout 0&lt;br&gt;
dhcpd address 192.168.0.1-192.168.0.50 inside&lt;br&gt;
dhcpd lease 3600&lt;br&gt;
dhcpd ping_timeout 750&lt;br&gt;
dhcpd auto_config outside&lt;br&gt;
dhcpd enable inside&lt;br&gt;
vpnclient server PUBLIC_IP_ADDRESS_OF_ASA&lt;br&gt;
vpnclient mode network-extension-mode&lt;br&gt;
vpnclient vpngroup grpBANANA password ********&lt;br&gt;
vpnclient username userBANANA password ********&lt;br&gt;
vpnclient enable&lt;/p&gt;
&lt;p&gt;this configuration is set to have the pix to search for DHCP on the outside interface so you can wire it to almost any network and be connected to your ASA&lt;br&gt;
the really important part is this:&lt;/p&gt;
&lt;p&gt;vpnclient server PUBLIC_IP_ADDRESS_OF_ASA&lt;br&gt;
vpnclient mode network-extension-mode&lt;br&gt;
vpnclient vpngroup grpBANANA password ********&lt;br&gt;
vpnclient username userBANANA password ********&lt;br&gt;
vpnclient enable&lt;/p&gt;
&lt;p&gt;then you should be ready to go, remember to always try before needing something like this in a working state&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>Restore Dead Cisco ASA</title>
		<link href="https://blog.smemory.org/posts/20120926_01_restore-dead-cisco-asa/"/>
		<updated>2012-09-26T00:00:00+00:00</updated>
		<id>https://blog.smemory.org/posts/20120926_01_restore-dead-cisco-asa/</id>
		<content type="html">&lt;p&gt;recover config &lt;a href=&quot;http://www.gomjabbar.com/2011/05/16/removing-the-flash-memory-from-a-cisco-asa-5505/&quot;&gt;http://www.gomjabbar.com/2011/05/16/removing-the-flash-memory-from-a-cisco-asa-5505/&lt;/a&gt;&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>Iomega Storcenter IX2-200 White light flashing - blinking light problem</title>
		<link href="https://blog.smemory.org/posts/20120424_01_ix2-blinking-light/"/>
		<updated>2012-04-24T00:00:00+00:00</updated>
		<id>https://blog.smemory.org/posts/20120424_01_ix2-blinking-light/</id>
		<content type="html">&lt;p&gt;I had the problem of the ix2-200 Cloud Edition with the white light flashing continuosly like in this video (that is not one of my videos) &lt;a href=&quot;http://www.youtube.com/watch?v=WS5PojOIznI&quot;&gt;http://www.youtube.com/watch?v=WS5PojOIznI&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The steps I took:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Powered off&lt;/li&gt;
&lt;li&gt;Disconnected 2nd drive&lt;/li&gt;
&lt;li&gt;Powered on&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;white led blinking&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;powered off&lt;/li&gt;
&lt;li&gt;Put in 2nd drive and disconnected 1st drive&lt;/li&gt;
&lt;li&gt;powered on&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;white led blinking&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;off&lt;/li&gt;
&lt;li&gt;disconnected both drives&lt;/li&gt;
&lt;li&gt;on&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;white led blinking&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;off&lt;/li&gt;
&lt;li&gt;pushed 15sec the power button&lt;/li&gt;
&lt;li&gt;on&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;white led blinking&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;powered on&lt;/li&gt;
&lt;li&gt;followed the procedure to factory default the device (pressing 15sec the reset button on the back)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;waited, hurray!!!&lt;/p&gt;
&lt;p&gt;after the blue light (disks) flashed and I heard some sounds of the disks spinning the white light became steady and the ix2 responded again!&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>Fitting HP Smartarray P212 in Microserver</title>
		<link href="https://blog.smemory.org/posts/20120327_01_P212-Microserver/"/>
		<updated>2012-03-27T00:00:00+00:00</updated>
		<id>https://blog.smemory.org/posts/20120327_01_P212-Microserver/</id>
		<content type="html">&lt;p&gt;I managed to fit a spare HP P212 in the microserver,&lt;br&gt;
to do so I had to cut some zip ties and re-route the SAS connector cable coming from the HDD cage:&lt;/p&gt;
&lt;p&gt;pic of the re-routed sas cable descending near the fan:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.smemory.org/img/p212_01-449x304.jpg&quot; alt=&quot;description&quot;&gt;&lt;/p&gt;
&lt;p&gt;pic of the cable connecting to the P212:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.smemory.org/img/p212_02.jpg&quot; alt=&quot;description&quot;&gt;&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>HP Microserver</title>
		<link href="https://blog.smemory.org/posts/20110227_01_HP-Microserver/"/>
		<updated>2011-02-27T00:00:00+00:00</updated>
		<id>https://blog.smemory.org/posts/20110227_01_HP-Microserver/</id>
		<content type="html">&lt;p&gt;This is my Microserver N36L – E01&lt;br&gt;
&lt;img src=&quot;https://blog.smemory.org/img/IMG_20121120_004913-449x304.jpg&quot; alt=&quot;description&quot;&gt;&lt;br&gt;
The HP Microserver N36L is a nifty piece of hardware, it’s very small and very well built and enginered .&lt;/p&gt;
&lt;p&gt;It has 4 HDD slots and provides the rails to ease the access and substitution of the HDDs, the motherboard can slip of off the case when you unscrew the two thumb screws and disconnect some cables, so the 2 ram slots and the PCIe slots are easily serviceable.&lt;/p&gt;
&lt;p&gt;The Microserver can be filled with a maximum of 8gb of ram making it perfect for building a ESX based home lab.&lt;br&gt;
It supports perfectly ESXi 4.1 and 5, all the hardware is recognized and works without problems.&lt;/p&gt;
&lt;p&gt;It’s form factor is pretty small and it’s very silent, it’s power consumption is much lower than a traditional server.&lt;/p&gt;
&lt;p&gt;Pros:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;small&lt;/li&gt;
&lt;li&gt;silent&lt;/li&gt;
&lt;li&gt;HDDs easily accessible&lt;/li&gt;
&lt;li&gt;motherboard easily accessible&lt;/li&gt;
&lt;li&gt;low power consumption&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Cons:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;limit of 8gb of ram&lt;/li&gt;
&lt;li&gt;comes without cd reader&lt;/li&gt;
&lt;li&gt;very small inside&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Wrap up:&lt;br&gt;
it’s perfect for the home lab, home server or if you want to build a NAS.&lt;/p&gt;
</content>
	</entry>
</feed>
