Mikrotik RouterOS WireGuard dynamic DNS endpoint refresh

MikroTik RouterOS doesn’t yet support DNS names for peer entpoints (v7.1.1). As a workaround, you can set the endpoint address using the CLI, but RouterOS will not re-resolve the DNS name. If the IP addresses behind the DNS name change at some point, for example if you use DDNS, the WireGuard tunnel will eventually stop working. As a solution, you can use a script that checks if the peer endpoint address still matches the dns name and if not, updates to the latest ip address of the DNS name.

Script:

Add under System > Scheduler a new script and choose a useful interval.

:local wgPeerComment
:local wgPeerDns

:set wgPeerComment "Peer #1 Comment"
:set wgPeerDns "dns.example.com"

:if ([interface wireguard peers get number=[find comment="$wgPeerComment"] value-name=endpoint-address] != [resolve $wgPeerDns]) do={
  interface wireguard peers set number=[find comment="$wgPeerComment"] endpoint-address=[/resolve $wgPeerDns]
}
Example:

C/C++/Arduino Datatypes

Type Byte Bit Typical Range
boolean 1 8 true/false
char 1 8 -128 to 127
signed char 1 8 -128 to 127
unsigned char 1 8 0 to 255
byte 1 8 0 to 255
uint8_t 1 8 0 to 255
int 2 16 -32,768 to 32,767
short 2 16 -32,768 to 32,767
signed int 2 16 -32,768 to 32,767
unsigned int 2 16 0 to 65,535
word 2 16 0 to 65,535
uint16_t 2 16 0 to 65,535
long 4 32 -2,147,483,648 to 2,147,483,647
float 4 32 -3.4028235E+38 to 3.4028235E+38
unsigned long 4 32 0 to 4,294,967,295
uint32_t 4 32 0 to 4,294,967,295
uint64_t 8 64 0 to 18,446,744,073,709,551,615

Useful ffmpeg commands

Trim/Cut/Splitt Video

ffmpeg -i input.mp4 -c copy -ss 00:05:00 -to 00:10:00 output.mp4
-c copy Copy all streams
-ss Start time offset
-to Transcode stop time

(re)encode Video with h.254 and AAC

ffmpeg -i input.mp4 -vcodec h264 -acodec aac output.mp4
-vcodec h264 Encodes video to h264
-acodec aac Encodes audio to aac

Resize Video to 1280×720 with high quality settings

ffmpeg -i input.mp4 -vf scale=1280:720 -preset slow -crf 18 output.mp4
-vf scale=1280:720 Set video filter to resize to 1280×720
-crf 18 Constant Rate Factor. A lower value means higher quality

Convert only Audio. EAC3 to AC3 for Example

ffmpeg -i "input.mkv" -map 0 -c:s copy -c:v copy -c:a ac3 output.mkv
-map 0 Selects all streams. Otherwise only one stream per stream type will be selected.
-c:s copy Copy all subtitles.
-c:v copy Copy all video.
-c:a ac3 Encodes all audio to AC-3.

Sporadic freezing/loss of WiFi connection on a Raspberry Pi 3B+

I have two identical Raspberry Pi 3B+ (RPi3B+) running OctoPrint to control my two 3D printers and provide a livestream of the connected webcams when needed. A few months ago I noticed that the “newer” of the two RPIs sporadically lost the WiFi connection after a few minutes or hours. To check if its a a hardware problem I swapped the SD cards between both PIs, but the problem moves with the SD Card, which means its a software problem. First attempts:

  • Update system (dist-upgrade)
  • Changes the location of the Pi to ensure that the WiFi signal is better.
  • A WiFi reconnect script i used before with a Raspberry Zero W.
  • Disabled Power Management with ´sudo iwconfig wlan0 power off´

I have connected a LAN cable, waited until the connection was interrupted and tried various commands to restore the connection. Unfortunately nothing helped. I found some errors in the syslog like mailbox indicates firmware halted and some GitHub issues from RaspberryPi, but no final solution:

wlan freezes in raspberry pi 3B+
PI 3B+ wifi crash, firmware halt and hangs in dongle
brcmfmac: brcmf_sdio_hostmail: mailbox indicates firmware halted

Then I continued to search for differences between the two PIs and found out that the “working Pi” had older drivers 7.45.154 that the “problem Pi”, who had 7.45.229. I downgraded the firmware to 7.45.154 (/lib/firmware/brcm – my older Pi had these files) and disabled power management. Now, after some weeks of 8h printing each and enabled webcam no problems. With 7.45.229 and also disabled power management it freezes. The firmware files were the only thing I changed.

Working WiFi Firmware/Driver:

dmesg | grep brcmfmac
Firmware: BCM4345/6 wl0: Feb 27 2018 03:15:32 version 7.45.154 (r684107 CY) FWID 01-4fbe0b04

Final solution (tl;dr):

  1. Disabled Power Management with ´sudo iwconfig wlan0 power off´
  2. Downgrade drivers/firmware (brcm_7.45.154.tar to /lib/firmware/brcm)

Configure local Systemd-resolved DNS Resolver for Company Domains behind VPN

To send queries for the company internal (sub)-domains to the company DNS resolvers behind the VPN, the resolver can be configured with the following commands:

# Configure internal corporate domain name resolvers:
resolvectl dns tun0 192.0.2.53 192.0.2.54

# Only use the internal corporate resolvers for domain names under these:
resolvectl domain tun0 "~example.com"

# Not super nice, but might be needed:
resolvectl dnssec tun0 off

Calculate series resistor for 0805 SMD LEDs with different colors

When I plan SMD LEDs for one of my PCB designs, I always ask myself which series resistors I need. At AliExpress dealer CHANZON Official Store I found the following nice overview. The series resistor can then be calculated with hte LED Resistor Calculator.

Workaround for Raspberry Pi automatic WiFi/WLAN reconnect

My old Raspberry Pi Zero W sometimes had problems restoring the WiFi connection when the AP was rebooted or reprovisioned. I don’t know why Rasbian can’t do this, but this workaround is my solution: I created a script that continuously tests the connection to the local gateway. If the gateway cannot be reached, the WiFi interface is restarted.

  • Add the following line to /etc/crontab:
*/1    *    * * *    root    /usr/local/bin/wifi_reconnect.sh
#
  • Create bash script /usr/local/bin/wifi_reconnect.sh with this content:
!/bin/bash

#echo "Script runned @ $(date)" >>/var/log/wifi_reconnect 

# The IP for the server you wish to ping (get default getway)
SERVER=$(/sbin/ip route | awk '/default/ { print $3 }')

#echo "> Server: ${SERVER}" >>/var/log/wifi_reconnect 

# Specify wlan interface
WLANINTERFACE=wlan0

#echo "> WLAN Interface: ${WLANINTERFACE}" >>/var/log/wifi_reconnect

# Only send two pings, sending output to /dev/null
ping -I ${WLANINTERFACE} -c2 ${SERVER} >/dev/null 

# If the return code from ping ($?) is not 0 (meaning there was an error)
if [ $? != 0 ]
then
echo "> WiFi doenst work. Restart!" >>/var/log/wifi_reconnect 
# Restart the wireless interface
ip link set wlan0 down
ip link set wlan0 up
#else
#echo "> WiFi works. No restart" >>/var/log/wifi_reconnect
fi 

I added some “echo to file” lines. Remove the # to log what the script does.

Grafana/Telegraf show 0 bytes memory usage for docker containers

Today i searched for a problem with a docker container. Since there was a problem with the memory usage of the container, I wanted to check it in my Grafana. But unfortunately, the Telegraf plugin showed 0 bytes for each container since months. I founded the solution the the Telegraf GitHub issues. You need to enable memory control groups on Raspberry Pi. To do that, add the following to your /boot/cmdline.txt to enable this metic:

cgroup_enable=memory cgroup_memory=1

And after reboot, it works:

Create a bar code/QR-Code/EAN in Word without VBA/Plugin

With Microsoft Office Word 2013 and newer its possible to create nativly the following bar codes:

  • QR (2D QR Code)
  • CODE128 (Code 128 linear bar code)
  • CODE39 (Code 39 linear bar code)
  • JPPOST (Japanese Postal Service Customer barcode)
  • EAN8 or EAN13 (EAN – International Article Number worldwide bar code)
  • JAN8 or JAN13 (Japanese barcode for product ID’s)
  • UPCA|UPCE (US barcode for product ID’s)
  • ITF14 (ITF-14 item-tracking barcode for shipping)
  • NW7 (NW-7 (CODABAR) serial number bar code )
  • CASE ( barcode for tracking USPS mail)

Steps

  1. Create Word 2013 or newer document
  2. Create empty merge field with [CTRL]+[F9]
  3. You should see two curly brackets at this point. If not, toggle display merge fields with [ALT]+[F9]. Adding the brackets manually does not work, because Word does not recognize it as a function!
  4. Insert the DISPLAYBARCODE-function and the right switches into the merge field (into the two curly brackets):
    DISPLAYBARCODE field-argument-1 field-argument-2 [ switches ]

    • field-argument-1 is a quoted string containing the data (barcode-data) used to generate the barcode symbol
    • field-argument-2 is a text string containing the type of barcode (barcode-type) that will be generated. Valid are in the list above (case-insensitive).

Example:

DISPLAYBARCODE "My n!ce QR code" QR \s 50 \q 3
* DISPLAYBARCODE = barcode function
* "My n!ce QR code" = barcode data
* QR = barcode type
* \s 50 = scaling factor in percent. Valid values from 10 to 1000.
* \q 3 = error correction level. Valid values (case insensitive) are [L|M|Q|H]

More information, also for the switches, you could find in the Microsoft Docs: [MS-OI29500]: DISPLAYBARCODE.