Grub recovery after Windows update

Yesterday I updated Windows 10, BIOS and some drivers of my Dell and couldn’t run Grub, just Windows Boot Manager. I re-installed Grub from Debian recovery without succes, Windows started directly after reboot.

First fix was copy /boot/efi/EFI/debian/grubx64.efi to /boot/efi/EFI/Microsoft/Boot/bootmgrfw.efi (with backup of original file, of course) and then Grub started. But why BIOS didn’t read /boot/efi/debian/grubx64.efi?

In BIOS (Boot Sequence menu) I had 1. option “debian” and File System List was “HD(1,GPT,D6E…)” what was wrong. I deleted this option and add new one with File System List “PciRoot(0x0)/Pci(0x17,0x0)/Sata(0x2,0x0)/HD(1,GPT,D6E…)” and correct File Name “\EFI\debian\grubx64.efi” and then Grub started work.

Then I reverted back “first fix”, rename back /boot/efi/EFI/Microsoft/Boot/bootmgrfw.efi.backup to /boot/efi/EFI/Microsoft/Boot/bootmgrfw.efi and Grub starts after reboot again.

NetworkManager changes WiFi MAC address

If your WiFi is managed by NetworkManager and it has random MAC address after reboot, you can disable it in /etc/NetworkManager/NetworkManager.conf:

[device]
wifi.scan-rand-mac-address=no

[connection]
# ethernet.cloned-mac-address=permanent
wifi.cloned-mac-address=permanent

[connection] section shouldn’t be necessary nor ethernet line (it is commented).

imapfilter

Tool to filtering e-mail. Can be installed via:

sudo apt install imapfilter

Example configuration in ~/.imapfilter/configu.lua:

local posvic_eu = IMAP {
server = 'mail.posvic.eu',
username = 'my@posvic.eu',
password = '',
ssl = 'ssl3',
}

local test = IMAP {
server = 'test.email.com',
username = 'my@email.com',
password = '',
ssl = 'ssl3',
}

function print_subjects(o)
for _, msg in ipairs(filter) do
mbox, uid = table.unpack(msg)
text = mbox[uid]:fetch_message()
print(string.match(text, 'Subject:[^\n]*'))
end
end

posvic_eu.INBOX:check_status()
posvic_eu.INBOX
:contain_from('beacon-monitor@post.cz')
:contain_subject('Beacon Monitor Disk')
:move_messages(posvic_eu['Trash'])

test.INBOX:check_status()
test.INBOX
:contain_from('support@2n.cz')
:contain_subject('Ticket#')
:move_messages(test['INBOX/Automat'])
test.INBOX
:contain_from('apps@crashlytics.com')
:contain_subject('Meeting Room')
:move_messages(test['INBOX/Automat'])

Custom key for SSH

$ ssh-keygen
Enter file in which to save the key (/home/petr/.ssh/id_rsa): /home/petr/my.key
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/petr/my.key.
Your public key has been saved in /home/petr/my.key.pub.
The key fingerprint is:
SHA256:t7oRcfThgNf5w8kXl+pg6Xgso/BJtBDt4T42vFUpZ7U petr@pc
The key's randomart image is:
+---[RSA 2048]----+
|      .  .o...  .|
|     . o...+oo o.|
|      + o.. *+o.o|
|     . + + O E* .|
|      = S @ o  o |
|     . O B = .   |
|      = O =      |
|       = o       |
|        o.       |
+----[SHA256]-----+

To use this key you have 2 choices: run command

ssh -i ~/my.key posvic.eu

or edit SSH config file and specify IndetityFile for host. Then is no need to use parameter -i.

# ~/.ssh/config
Host posvic.eu
    IdentityFile ~/my.key
ssh posvic.eu

Bash cheatsheet

files=(Screen*.png)
if [ $files = "Screen*.png" ]; then
  echo "No match"
else
  # Override or append
  files[2]="test1"

  # Remove
  files=("${files[@]:0:1}" "${files[@]:3:4}")

  # Length
  echo ${#files[@]}

  for file in "${files[@]}"; do
    echo "$i"
  done

  for ((i = 0; i < ${#files[@]}; i++)); do
    echo "${files[i]}"
  done
fi
case "$a" in
"a")
  echo "a"
  ;;
"b")
  echo "b"
  ;;
*)
  echo "else"
  ;;
esac
path="/var/www/html"
echo ${path##*/} # Last directory
# # from beginning, shortest match
# ## from beginning, longest match
# % from end, shortest match
# %% from end, longest match