Фильтр анонсируемых адресов

Продолжаю делать записи для себя. На этот раз потребовалось отфильтровать роуты, отдаваемые другим. OSPF для этого не подходит: стандарт такого попросту не предусматривает. Значит, переключаемся на BGP. Минимальный конфиг для FRR

!
router bgp 65000
 bgp router-id 10.0.0.2
 no bgp ebgp-requires-policy
 neighbor 10.0.0.3 remote-as 65000
 !
 address-family ipv4 unicast
  redistribute connected
  redistribute static
  neighbor 10.0.0.3 next-hop-self
 exit-address-family
exit
!

На другой стороне есть адрес 6.7.8.9, котрый не должен попасть на этот роутер.

!
ip route 6.7.8.9/32 10.1.0.254
!
router bgp 65000
 bgp router-id 10.0.0.3
 no bgp ebgp-requires-policy
 neighbor 10.0.0.2 remote-as 65000
 !
 address-family ipv4 unicast
  redistribute connected
  redistribute static
  neighbor 10.0.0.2 next-hop-self
  neighbor 10.0.0.2 prefix-list nobad-out out
 exit-address-family
exit
!
ip prefix-list nobad-out seq 5 deny 6.7.8.9/32 le 32
ip prefix-list nobad-out seq 10 permit 10.1.0.0/24 le 32
!

Проверяем

router2# show ip route bgp
Codes: K - kernel route, C - connected, S - static, R - RIP,
       O - OSPF, I - IS-IS, B - BGP, E - EIGRP, N - NHRP,
       T - Table, v - VNC, V - VNC-Direct, A - Babel, F - PBR,
       f - OpenFabric,
       > - selected route, * - FIB route, q - queued, r - rejected, b - backup
       t - trapped, o - offload failure

B>* 10.1.0.0/24 [200/0] via 10.0.0.3, ens19, weight 1, 00:16:06

ВНИМАНИЕ: правка “на живую” permit-list не приведет к перечитыванию правил на другой стороне. Надо вручную в router bgp прицепить-отцепить их. Почему так – хз.

Вариант лечения: не важно где сказать clear ip bgp 10.0.0.3 (ессно, на передатчике адрес приемника и наоборот), это сбросит сессию bgp и заставит перечитать роуты.

Даешь звук в vmware

Я как-то привык к заикающемуся и запинающемуся звуку внутри виртуалки. Ну сколько не пробовал разных рецептов, помогали … не очень. А тут внезапно выдался свободный часик и я решил немного погуглить. Оказывается, проблема известная, только не все знают про ее решение.

Скопировал файлик, заменил значения … и вуаля! Звук снова в наличии.

Привожу медиатеку к единому стилю

В предидущем посте я прошелся по библиотеке и расставил везде теги и обложки. Но теперь надо решить другую проблему: у меня есть mp3, m4a и flac файлы. Причем я точно знаю, что некоторые flac и m4a получены из mp3. Да, источники музыки были не всегда адекватными …

Поэтому шаг номер раз: приводим всю библиотеку в mp3 формат. То, что из m4a и flac перезапишутся mp3 – пофиг

find . -type f -name "*.m4a" | parallel 'ffmpeg -y -i {}  -map_metadata 0 -codec:a libmp3lame -qscale:a 1 {.}.mp3'

find . -type f -name "*.flac" | parallel 'ffmpeg -y -i {}  -map_metadata 0 -codec:a libmp3lame -qscale:a 1 {.}.mp3'

Теперь можно грохнуть “оригиналы”. И совсем маленький шаг: необходимо избавиться от дубликатов. Так как источников было много, то и для некоторых популярных песен было аж до 5 вариантов. Пишу маленький скрипт, который удаляет все дубликаты меньшего размера (да, буду считать, что бОльший размер означает лучшее качество).

#!/bin/bash

IFS=$(echo -en "\n\b")

function traverse() { 
    # lets find copies in directory and i dont want use .m?? in search
    for file in $(ls -1 ${1} |grep -e \(1\).mp3 -e \(2\).mp3 -e \(3\).mp3 -e \(4\).mp3 -e \(5\).mp3) 
    do
        l="${1}/${file%????????}*" # cut (X).mp3 from file name
        # delete all files except first and biggest
        ls -1S ${l} | tail -n +2 | xargs -d '\n' rm -f
        # Now rename file. Leave mv alone for errors "the file is same" - its working indicator for me :)
        ffin="${l%?}.mp3"
        mv  $l $ffin        
    done
    # now lets find another directory to deep in
    for file in $(ls "$1")
    do
        if [[ -d ${1}/${file} ]]; then
            traverse "${1}/${file}"
        fi
    done
}

function main() {
    traverse "$1"
}

main "$1"

И натравливаем его на библиотеку. Я специально не стал обрамлять вокруг mv, что бы хоть что-то выводило во время работы, поэтому сообщения типа mv: '/mnt/swamp/Reloaded//松居慶子/Dream Walk/04 Fire in the Desert.mp3' and '/mnt/swamp/Reloaded//松居慶子/Dream Walk/04 Fire in the Desert.mp3' are the same file стали для меня индикатором, что скрипт работает.

В результате у меня теперь есть библиотека музыки, где все разложено по полочкам (иногда полупустым), протегано и с обложками. Но (ох уж это но) есть куча песен с битрейтом 96 и 128 кбит/с. Но как к этому подобраться автоматически – я пока не представляю.

Навожу порядок в музыке

Довольно долго я таскаю с собой архив музыки. Первые треки в нем датируются аж 1995 годом. Естественно, что за все это время внутри образовалась каша. Я много раз пытался подойти к этой свалке, что бы разгрести ее содержимое и разложить все по полочкам. Однако регулярно обламывался из-за банальной лени: все-таки раскидать почти 100 тысяч файлов нужно адское терпение.

Ситуацию усложняло то, что куча файлов имело очень говорящие названия типа 3.mp3. Естественно, каких-либо тегов тоже ожидать не приходилось. Ну вот просто как-то понравилась мне песенка, я ее и забросил в архив …

Наконец в очередной раз я подошел к этой свалке. Тыкался, тыкался, смотрел на всякие редакторы тегов и горестно вздыхал. Пока не решил погуглить, как можно для всего этого поиспользовать всякие шазамы и прочие новомодные (почти) штучки. И вуаля!

https://picard.musicbrainz.org/

Оставлю эту ссылку отдельной строкой. Жрет mp3, ищет по аудиотпечатку что же это за трек и заполняет теги, добавляет обложку и раскладывает получившееся красиво. Я в совершеннейшем восторге. На тестовой выборке в 7 тыщ файлов не нашла соответствие только для 3. Но их никто не знает, ни яндекс, ни яблоки. Мелочь …

Bitwarden -> KeePassXC

Внезапно пришла уведомлялка: дескать, дорогой товарищ, ваше время истекло, заплатите еще 10 баксов за следующий год.

Не то, что бы мне жалко денег, но заводить какой-то странный bitcoin кошелек на не менее странных биржах мне стремно. А оплата карточкой через paypal не доступна, ибо они поддерживают нацистов и типа санкции.

Сначала я подумал поднять свой сервер для него, благо есть аж два варианта. Но реально, как-то стало очень лень. Решил попробовать KeePassXC. Нашел репу https://github.com/davidnemec/bitwarden-to-keepass, сделал три шага по мануалу и вуаля – оно все заработало и заработало подозрительно легко. И даже клиент не такой вырвиглазный, каким я его помню …

OS X странный   login item

Пробегал мимо настроек, решил на всякий случай заглянуть в то, что у меня пускается автоматом.  Settings-General-Login Items, а там такое

Что за ln? При нажатии на значок информации честно перекидывает на /bin/ln. Троян?

$ codesign -dvvv /bin/ln
Executable=/bin/ln
Identifier=com.apple.ln
Format=Mach-O universal (x86_64 arm64e)
CodeDirectory v=20400 size=453 flags=0x0(none) hashes=9+2 location=embedded
Platform identifier=14
Hash type=sha256 size=32
CandidateCDHash sha256=da717c2e8dc49817f70f208029b3533b4c9cdb2c
CandidateCDHashFull sha256=da717c2e8dc49817f70f208029b3533b4c9cdb2ceacfa90a43b19009331880fb
Hash choices=sha256
CMSDigest=da717c2e8dc49817f70f208029b3533b4c9cdb2ceacfa90a43b19009331880fb
CMSDigestType=2
Launch Constraints:
	None
CDHash=da717c2e8dc49817f70f208029b3533b4c9cdb2c
Signature size=4442
Authority=Software Signing
Authority=Apple Code Signing Certification Authority
Authority=Apple Root CA
Signed Time=5 Nov 2022, 04:23:08
Info.plist=not bound
TeamIdentifier=not set
Sealed Resources=none
Internal requirements count=1 size=60

Нет, не троян. Уже лучше. Значит ищем в {~}/Library/LaunchAgents то, что под это маскируется. Оказывается, это Docker Desktop такой херней развлекается

$ cat com.docker.socket.plist 
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0"><dict><key>KeepAlive</key><false/><key>Label</key><string>com.docker.socket</string><key>ProcessType</key><string>Background</string><key>Program</key><string>/bin/ln</string><key>ProgramArguments</key><array><string>/bin/ln</string><string>-s</string><string>-f</string><string>/Users/kiltum/.docker/run/docker.sock</string><string>/var/run/docker.sock</string></array><key>RunAtLoad</key><true/></dict></plist>

Что делать? Да ничего. При запуске Docker Desktop он просто сругается и предложит сделать эту ссылку заново. Ну или оставьте “сервис ln” включенным

Обходим DNS hi-jack

Не так давно некоторые (я не буду показывать пальцем) провайдеры начали заниматься херней. А именно блокировать или подменять DNS ответы. И ладно бы блочили какой-нибудь абстрактный facebook.com, так они ломают к примеру резолвинг обратных записей, что например для почтовых серверов больно и печально. Если обратиться к техподдержку, то там начинают лепетать про защиту от угроз и предлагают пользоваться серверами провайдера, ведь они защищены и вообще лучше всех.

В общем, на данный момент это все лечится очень просто. Берем любой клиент DNS over HTTPS (DoH), ставим его и направляем весь днс трафик через него. Для ubuntu рецепт следующий:

apt install dnscrypt-proxy
systemctl enable dnscrypt-proxy
systemctl start dnscrypt-proxy

В результате на 127.0.2.1:53 появляется DNS сервер, который кладет всевозможные причиндалы на провайдерские потуги. Ну а дальше во всех клиентах просто указываем этот сервер. Лично я просто добавил одну строчку на главном домашнем кеширующем bind

cat /etc/bind/named.conf.options | grep fo
        forwarders { 127.0.2.1 ; };

Ну и попутно подобным шагом вы провайдеру статистику “куда вы ходите” поломаете. Ибо “кто с чем к нам, тот тем и получит”

PS Да, это все лечится VPN, но кто даст гарантию, что и провайдер VPN не займется тем же самым?

Zimbra lets encrypt

Давным-давно выкладывал скрипт для обновления SSL у зимбры. С тех пор прошло много времени, поэтому капельку обновил

#!/bin/bash
cp -f /etc/letsencrypt/live/mail.ka12.co/* /opt/zimbra/ssl/letsencrypt/
wget -O /tmp/ISRG-X1.pem https://letsencrypt.org/certs/isrgrootx1.pem.txt
cat /tmp/ISRG-X1.pem > /opt/zimbra/ssl/letsencrypt/fullchain.pem 
cat /etc/letsencrypt/live/mail.ka12.co/fullchain.pem >> /opt/zimbra/ssl/letsencrypt/fullchain.pem 

chown zimbra:zimbra /opt/zimbra/ssl/letsencrypt/*
runuser -u zimbra /opt/zimbra/bin/zmcertmgr verifycrt comm /opt/zimbra/ssl/letsencrypt/privkey.pem /opt/zimbra/ssl/letsencrypt/cert.pem /opt/zimbra/ssl/letsencrypt/fullchain.pem
runuser -l zimbra -c 'zmcontrol stop'
cp -a /opt/zimbra/ssl/zimbra /opt/zimbra/ssl/zimbra.`date "+%Y%m%d"`

runuser -u zimbra cp /opt/zimbra/ssl/letsencrypt/privkey.pem /opt/zimbra/ssl/zimbra/commercial/commercial.key
runuser -u zimbra /opt/zimbra/bin/zmcertmgr deploycrt comm /opt/zimbra/ssl/letsencrypt/cert.pem /opt/zimbra/ssl/letsencrypt/fullchain.pem
runuser -l zimbra -c '/opt/zimbra/bin/zmcertmgr deploycrt comm /opt/zimbra/ssl/letsencrypt/cert.pem /opt/zimbra/ssl/letsencrypt/fullchain.pem'
runuser -l zimbra -c 'zmcontrol start'

mail.ka12.co замените на свой домен. Принцип простой – сначала любым привычным способом получаете сертификат через LE, а потом запуская скрипт выше засовываете сертификат в zimbra

k8s namespace stuck in terminating stage

При тестировании всяких штук очень часто получается так, что при удалении неймспейсов они замерзают в Terminating. Могут на 5 минут, могут на сутки. Нашел рецепт

for ns in $(kubectl get ns --field-selector status.phase=Terminating -o jsonpath='{.items[*].metadata.name}')
do
  kubectl get ns $ns -ojson | jq '.spec.finalizers = []' | kubectl replace --raw "/api/v1/namespaces/$ns/finalize" -f -
done

for ns in $(kubectl get ns --field-selector status.phase=Terminating -o jsonpath='{.items[*].metadata.name}')
do
  kubectl get ns $ns -ojson | jq '.metadata.finalizers = []' | kubectl replace --raw "/api/v1/namespaces/$ns/finalize" -f -
done

Нашел тут https://stackoverflow.com/questions/65667846/namespace-stuck-as-terminating

Работает

Windows 11 – альтернативная смена раскладки

Внезапно оказалось, что в Windows 11 (подозреваю, что и в windows 10) поддерживается два варианта смены раскладок. Первый и основной – это Win+Space комбинация. Корявая, но тем не менее.

Но нечаянно тут нажал и оказалось, что “старая” комбинация по умолчанию Alt+Shift тоже работает. Причем без дебильного всплывающего окна.

Что бы сменить на более каноничное (для меня) Ctlr+Shift надо сходить Settings – Time & language – Typing – Advanced keyboard settings – Input language hot keys. Откроется привычное по старым windows окно

Пока не понятно зачем это, но прикольно.

gitlab-runner lookup docker no such host

Жила-была репа в gitlab. Был в ней CI, был в ней и CD. Пользовалась репа шаренными раннерами от gitlab и успешно тратила кучу минут на сборку. Все было хорошо, пока число этих минут не стало расти угрожающими темпами. В общем, надо поднимать свой раннер и не один

Поначалу ничего этакого, все идет по инструкции

docker run --rm -it -v /srv/gitlab-runner/config:/etc/gitlab-runner gitlab/gitlab-runner register

docker run -d --name gitlab-runner --restart always -v /srv/gitlab-runner/config:/etc/gitlab-runner      -v /var/run/docker.sock:/var/run/docker.sock      gitlab/gitlab-runner:latest

Все пошло хорошо, пока не возникла ошибка

error during connect: Post http://docker:2375/v1.40/auth: dial tcp: lookup docker on x.x.x.x:53: no such host

Первым, что выдают рецепты из интернета, так это запустить докер в привелигированном режиме. Другие советы типа “пробрось docker.sock” уже учтены в инструкции гитлаба. Но даже будучи включенными – не помогают. Все равно докер ломится по tcp, полностью игнорируя сокет.

Погуглив еще немного, обнаружил, что если стоит переменная DOCKER_HOST, то все остальное игнорируется. Ок, значит надо сказать unset DOCKER_HOST перед выполнением. И вуаля! Вот пример рабочего config.toml. Значимые изменения от дефолтного я выделил

concurrent = 2
check_interval = 0

[session_server]
  session_timeout = 1800

[[runners]]
  name = "gitlab-runner-docker"
  url = "https://gitlab.com/"
  token = "TOKEN"
  executor = "docker"
  pre_build_script = "unset DOCKER_HOST"
  [runners.custom_build_dir]
  [runners.cache]
    [runners.cache.s3]
    [runners.cache.gcs]
    [runners.cache.azure]
  [runners.docker]
    tls_verify = false
    image = "docker:latest"
    privileged = true
    disable_entrypoint_overwrite = false
    oom_kill_disable = false
    disable_cache = false
    volumes = ["/cache", "/var/run/docker.sock:/var/run/docker.sock"]
    shm_size = 0

Как убрать лишние раскладки в Windows

Для установки Windows я использую International версию isoшки. С одной стороны привык, что все на английском, а с другой стороны если взять русскую, то потом замумукаешься русский выковыривать отовсюду. И с какой-то версии эта “интернациональная” версия по умолчанию ставит все от United Kingdom. В результате получается так

Лечится это двумя способами: либо в региональных настройках добавляем language pack от United Kingdom, в нем добавляем клавиатуры и потом их удаляем. Либо запуском regedt32 и открытием следующей ветки реестра

Computer\HKEY_CURRENT_USER\Keyboard Layout\Preload

Там видно такое

Последовательность записей совпадает с тем, что показывается при переключении языка. В моем случае грохаем последние две и перелогиниваемся. Результат

Windows 10 ssh key

Как-то задалбывает под WSL2 постоянно вводить пароль к ssh ключам. Рецепт для ubuntu простой:

sudo apt-get install keychain
cat >> .bash_profile
/usr/bin/keychain -q --nogui $HOME/.ssh/id_rsa
source $HOME/.keychain/$HOSTNAME-sh

Для работы из-под винды надо скопировать ключи в виндовый домашний каталог и сказать следующую магию

Get-Service -Name ssh-agent | Set-Service -StartupType Automatic
Start-Service ssh-agent
ssh-add ~\.ssh\id_ed25519
ssh-add ~\.ssh\id_rsa

Windows 10 ssh key auth

Потребовалось тут сходить на windows 10 по ssh. Казалось бы, идешь в настройки, приложения, добавляешь “фичу” в виде OpenSSH server и вуаля! А в реальности оказалось фиг там.

Во-первых, почему-то по умолчанию ssh сервер не запущен и не запускается автоматически. Но это лечится запуском консоли powershell и скармливанием туда следующих команд

Start-Service sshd
Set-Service -Name sshd -StartupType 'Automatic'

После этого надо узнать свой логин для ssh. Это чуть проще – просто открываем окно терминала и смотрим.

C:\Users\multi>

Почему-то логин у меня multi, хотя везде я multik. Куда делась последняя буква – я не знаю.

Следующим шагом я довольно долго пытался сделать авторизацию по ключу. Фигу. Сервер упорно сопротивлялся. Оказалось, что микрософт зачем-то только для администраторов вынес ключи не туда, где им положено быть, а в C:\ProgramData\ssh\administrators_authorized_keys . Повторюсь, только для админов.

Вылечить это можно поправив sshd_config в каталоге выше и закомментировав две последние строки. Ну либо забить и в этот файлик любым способом сложить ключи. После этого надо вернуть эту файлу права (куда они делись – хз). Для этого надо скормить в консоль повершелла следующее

$acl = Get-Acl C:\ProgramData\ssh\administrators_authorized_keys     
$acl.SetAccessRuleProtection($true, $false)     
$administratorsRule = New-Object system.security.accesscontrol.filesystemaccessrule("Administrators","FullControl","Allow")     
$systemRule = New-Object system.security.accesscontrol.filesystemaccessrule("SYSTEM","FullControl","Allow")     
$acl.SetAccessRule($administratorsRule)     
$acl.SetAccessRule($systemRule)     
$acl | Set-Acl

Все. После этого у меня заработал вход на винду по ключам.

Копируем firewall из редхатов

Если взять и поставить любую Ubuntu, то по умолчанию в ней отсутствуют какие-либо правила фаирволла. Ну или мне так везет. Между тем, в centos и прочих fedora’х по умолчанию стоит правило “всех выпускаем, никого не впускаем, только ssh”

В принципе, все оказалось довольно просто. Надо вот эти вот строчки скормить из-под root’a.

ufw disable
echo y | ufw reset
ufw default deny incoming
ufw default allow outgoing
ufw allow ssh
echo y | ufw enable

Загоняем маки спать

Попал в стандартную ситуацию: закрываешь вечером ноутбук, а утром он отказывается включаться и требует зарядку. Маки нынче пошли не те … На самом деле в самоизоляции у меня куча терминалов, всяких ремотных десктопов и прочих штук, про которые мак знает и помогает им оставаться на связи.

Решение очень простое:

  1. Спрашиваем у мака, сколько раз и когда он просыпается: pmset -g log|grep due
  2. Увидев, что он просыпается практически каждую минуту, запрещаем ему поддерживать соединения: sudo pmset -b tcpkeepalive 0

Плюс: мак теперь переживает ночь, теряя 1-2% заряда батареи

Минус: теперь после открытия все соединения разорваны и надо с минуту, пока все вернется в привычное русло.

Возвращаем четкость маку

Начал на хабре читать перевод статьи про шрифты, антиалиасинг и прочие графические штучки. Ну вот как-то интересна мне эта магия превращения кучки пикселей в красоту на экране.

Если кратко, то в Apple победили менеджеры, которым надо “красиво”, а не “правильно”. В этом оплоте графики и накосячили! Хорошо, что вернуть назад все легко.

Settings-General-Снять галочку с Use font smoothing when available

и в Displays перещелкнуть радиокнопку Resolution на Scaled и выбрать пункт левее от Default. В общем, как на скриншотах выше.

Всё. Эффект офигительный: как будто у тебя снова тот самый первый мак с ретиновским дисплеем, где об засечку у букв можно порезаться!

CentOS 7 и MariaDB 10

Внезапно потребовалось обновить на старой центоси mariadb до свежих версий. Оказалось довольно просто:

Удаляем старое, добавляет новое, обновляем.

# cat > /etc/yum.repos.d/MariaDB10.repo
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.3/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1
# systemctl stop mariadb
# yum remove mariadb-server mariadb mariadb-libs
# yum clean all
# yum -y install MariaDB-server MariaDB-client
# systemctl enable mysql
# systemctl start mysql
# mysql_upgrade -p
......
cj64070_base.b_xml_tree                            OK
information_schema
performance_schema
Phase 7/7: Running 'FLUSH PRIVILEGES'
OK

И всё.

PS 10.4 почему-то встает криво, лень разбираться

Свой gitlab на centos 7

Получив очередной счет от gitlab и github одновременно, я как-то задумался: а нафига я им плачу, когда я все это могу поднять на своем сервере? “Все это” – это кучку приватных git и простую ci/cd систему. Поставил и решил написать напоминалку, что бы в следующий раз не гуглить.

Процесс установки не вильно отличается от описанного на сайте, но есть несколько НО:

Во-первых, в centos7 nginx идет без поддержки passenger. Поэтому обновляем на версию из “пассажирской” репы.

curl --fail -sSLo /etc/yum.repos.d/passenger.repo https://oss-binaries.phusionpassenger.com/yum/definitions/el-passenger.repo
yum-config-manager --enable cr
yum install -y passenger
rpm -e nginx-mod-http-perl --nodeps
yum update nginx

Во-вторых, нигде в мануале не указано, что gitlab требует nodejs для работы

yum install nodejs

И наконец, нигде не указано, что gitlab не работает без unicorn. Во всех мануалах написано, что если у вас внешний nginx, отрубите встроенный и unicorn. Так вот, этого делать нельзя, иначе получите неработающий gitlab-workhouse

Из других неочевидных тюнингов стал вынос порта unicorn с 8080 и изменение размера буферов у постгреса. Иначе на моем загруженном сервере он отказывался запускаться.

unicorn['port'] = 8088
postgresql['shared_buffers'] = "100MB"

В остальном единственной засадой было изменение прав на сокеты, но это только из-за моей конфигурации, где куча всяких пользователей лезут в в один каталог. Так как сервер “домашний”, проще стало дать всем права на запись.

Больше никаких отступлений от официального руководства.