git: нормализация lrlf

Если вы решили переконвертировать ваш репозиторий, убрав из файлов символы переноса каретки, то можно использовать https://rtyley.github.io/bfg-repo-cleaner/. Он работает намного быстрее, чем обычный filter-branch.

Итак, склонируем наш репозиторий с параметром —mirror

git clone —mirror https://github.com/voiplab/mysuperrepo
echo «regex:\r(\n)==>$1» > replacements.txt
java -jar bfg-1.13.0.jar —no-blob-protection —replace-text replacements.txt mysuperrepo.git

Запускаем провреку репозитория

Меняем origin если хотим запушить в новое место

git push origin -all

Статистика по обращениям к nginx в realtime

Иногда бывает полезно увидеть TOP IP адресов с которых идут обращения к вашему backend. Если у вас настроено логивание в nginx access.log, то с помощью такого нехитрого скрипта можно получить самые «активные» IP

tail -f access-api.log | awk {'print $1 ;fflush();'} | logtop

Примеры по tcpdump и ssldump

Снимаем дамп трафика SSL/HTTPS и получаем заголовки

tcpdump -i eth0 -vvv -s 0 -w /tmp/ssl_dump.cap host IP.ADD.RE.SS and port 443
ssldump -A -d -k PATH_TO_SSL_PRIVATE.KEY -nr /tmp/ssl_dump.cap > /tmp/out.txt

Получить POST заголовки

tcpdump -i eth0 -s 0 -A 'tcp dst port 8080 and (tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x504f5354)'

 

Внедряем email-аутентификацию DKIM в Postfix за 5 минут

Работал у нас почтовый сервер для рассылки корреспонденции клиентам. И все бы ничего, но стал люд жаловаться, что не доходят письма или  в спам попадают. И хотя spf был настроен, все говорило о том, что пора нам к нашему Postfix прикрутить DKIM. Как гласит цитата откуда-то с хабра:

DKIM-подпись — это цифровая подпись, которая добавляется к заголовкам письма сервером отправителя, по которой сервер получателя может удостовериться, что отправитель письма соответствует полю From в заголовках письма. Если сервер получателя проверяет эту подпись, то по результатам проверки сервер может принять решение о том, как поступать с письмом: принять, отправлять в папку «Спам», отправить на дополнительную проверку или вовсе отказаться от приёма. Подписи DKIM проверяют и используют сами все ведущие почтовые службы, включая Яндекс и Mail.ru.

Для начала установим необходимый софт командой

aptitude install opendkim opendkim-tools

После установки необходимо отредактировать файл /etc/opendkim.conf, добавив в него строки

Canonicalization relaxed/relaxed
SyslogSuccess yes
KeyTable file:/etc/opendkim/keytable
SigningTable file:/etc/opendkim/signingtable
SoftwareHeader yes
LogWhy yes
ExternalIgnoreList file:/etc/opendkim/trusted
InternalHosts file:/etc/opendkim/trusted

Теперь создадим рабочий каталог,а в нем новый приватный и открытый ключ. Открытый ключ мы потом пропишем на нашем DNS-сервере.

mkdir /etc/opendkim/
opendkim-genkey -s mail -d example.com

В каталоге /etc/opendkim у вас должно появиться 2 новых файла. mail.private — это наш приватный ключ, которым мы будем подписывать письма. А mail.txt содержит публичный ключ. Список имеющихся ключей укажем в файле /etc/opendkim/keytable в формате «название домен:селектор:/путь/до/ключа». В нашем случае содержимое файла будет таким:

mail._domainkey.example.com example.com:mail:/etc/opendkim/keys/example.com/mail.private

Теперь объясним OpenDKIM почту каких доменов какими ключами подписывать в файле /etc/opendkim/signingtable в формате «домен название-ключа».

example.com mail._domainkey.example.com

В файле /etc/opendkim/trusted необходимо прописать ваши доверенные узлы:

127.0.0.1
localhost
192.168.1.0/24

Зададим необходимые права, добавим пользователя postfix в группу opendkim. Это нужно чтобы postfix смог отправлять письма на подпись через сокет OpenDKIM. После чего перезапустим службу. Я рекомендую заглянуть в системный лог и убедиться, что нет ошибок при запуске службы.

chown opendkim /etc/opendkim -R
gpasswd -a postfix opendkim
service opendkim restart

Вторым этапом настроим postfix, чтобы он мог подписывать нашу почту. В main.cf необходимо добавить:

milter_default_action=accept
milter_protocol=2
smtpd_milters=unix:/var/run/opendkim/opendkim.sock
non_smtpd_milters=unix:/var/run/opendkim/opendkim.sock

Ну и опять рестарт/релоад

service postfix restart

Третьим и последним этапом мы настроим наш DNS сервер добавив в него TXT запись. Выведите содержимое файла mail.txt и используйте следующую пару ключ-значение для добавления новой записи в DNS.

Name: mail._domainkey.example.com.
Text: "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC5N3lnvvrYgPCRSoqn+awTpE+iGYcKBPpo8HHbcFfCIIV10Hwo4PhCoGZSaKVHOjDm4yefKXhQjM7iKzEPuBatE7O47hAx1CJpNuIdLxhILSbEmbMxJrJAG0HZVn8z6EAoOHZNaPHmK2h4UUrjOG8zA5BHfzJf7tGwI+K619fFUwIDAQAB"

Для применения изменений в DNS может пройти несколько часов. Проверить DKIM-подпись вы можете отправив пиьсмо через свой сервер на ящик [email protected] Ответное письмо вы получите в виде отчета. Например:

=========================================================
Summary of Results
==========================================================
SPF check: pass
DomainKeys check: neutral
DKIM check: pass
Sender-ID check: pass
SpamAssassin check: ham

Полезные ссылки:

Экстракт на все времена

tar-gzНазвание конечно шуточное, но намекающее на то, о чем хочу написать. А написать я хотел на тему распаковывания файлов разных форматов. В очередной раз пытаясь сначала вспомнить параметры для распаковки файла, а потом и прочтения help, я понял, что меня это достало. И надо что-то с этим делать.

Итак, создадим shell-скрипт и назовем его extract. В качестве аргумента он будет получать файл и в зависимости от формата выполнять распаковку.  Сам скрипт имеет вид:

#!/bin/sh
if [ -f $1 ] ; then
 case $1 in
  *.tar.bz2) tar xf $1 ;;
  *.tar.gz) tar xf $1 ;;
  *.bz2) bunzip2 $1 ;;
  *.rar) rar x $1 ;;
  *.gz) gunzip $1 ;;
  *.tar) tar xf $1 ;;
  *.tbz2) tar xf $1 ;;
  *.tgz) tar xf $1 ;;
  *.zip) unzip $1 ;;
  *.Z) uncompress $1 ;;
  *) echo "'$1' cannot be extracted via extract()" ;;
 esac
else
 echo "'$1' is not a valid file"
fi

Поместим его в /usr/bin и сделаем исполняемым для всех пользователей.

Блокируем клавиатуру в Linux

Изначально может показаться, что это очень странная задача, ведь можно просто заблокировать экран. Но если у вас в доме появился маленький ребенок, который то и дело норовит что то нажать, то поговорить, например, по Skype становится нереально. Итак, нужно максимально быстро заблокировать/разблокировать клавиатуру, чтобы маленький человечек не мог нажать/закрыть/удалить что-то во время общения по Skype с родственниками.

baby

Сначала Гугл меня навел меня на мысль использовать для этих целей xinput, но по какой то неведомомй причине моя клавиатура упорно не блокировалась. Дальнейшие поиски решения привели проекту Lock Keyboard for Baby. Проект не развивается уже с 2008, но у меня все заработало «с пол пинка». Итак, скачиваем скрипт и кладем его в папочку /usr/bin:

sudo mv lock-keyboard-for-baby-20080706.pl /usr/bin/lock
sudo chmod +x /usr/bin/lock

Откройте скрипт в любом удобном редакторе в первой строке поменяйте путь до вашего интерпретатора perl. Подсмотеть где он располагается можно используя команду

which perl

Далее в 7 строке (параметр defaultpassword) задайте пароль для разблокировки. После чего сохраните изменения и попробуйте его запустить. Если клавиатура заблокировалась, то все в порядке и блокировку можно вызывать по комбинации клавишь Alf+F2 и введя команду lock.

Под катом итоговый скрипт. Спасибо за внимание.

(далее…)

Обзор PAC Manager под Linux

В который раз я убеждаюсь в «силе» OpenSource. Не в той силе, что OpenSource-программы на много круче закрытых аналогов, а той, что позволяет при определенных знаниях и навыках закрыть баг самостоятельно. Помимо того , что вы получаете бесценный опыт в анализе чужого кода, вы еще и получаете моральное удовлетворение от проделанной работе. Главное не забывайте отправить багфикс автору. В конце заметки мы с вами самостоятельно исправим маленький баг в программе о которой пойдет речь.

В этот раз мне на глаза попался лучший, из всех что я видел, менеджер соединений под Linux. Для тех админов и программистов,у которых их больше трех, без удобного менеджера никуда. Для меня идеалом оказался PAC Manager. Я с легкостью настроил синхронизацию всех серверов через DropBox, да еще и подключил хранитель паролей KeePassX Manager.

По сути это просто продвинутая оболочка к таким типам подключений как:

  • SSH
  • RDP
  • MOSH
  • FTP
  • SFTP
  • SERIAL
  • VNC
  • WEBDAV

На столько продвинутая, что вы можете сами написать скрипты которые будут выполняться, например, перед подключением к серверу(например поднятие VPN-сессии).
pac

(далее…)

Установка корневых сертификатов в Linux Mint / Ubuntu / Debian

Для того чтобы добавить корневые сертификаты необходимо выполнить 3 простых шага.

1. Создаем каталог для CA сертификатов /usr/share/ca-certificates

sudo mkdir /usr/share/ca-certificates/extra

2. Копируем ‘.crt’ файл в созданный ранее каталог

sudo cp foo.crt /usr/share/ca-certificates/extra/foo.crt

3.  Переконфигурируем пакет ca-certificates

sudo dpkg-reconfigure ca-certificates

Выделяем нужные сертификаты и жмем ОК.

Speedtest из командной строки Linux

Часто бывает необходимо проверить скорость интернет соединения на серверах Linux. И самый лучший, на мой взгляд, сервис для этого speedtest.net. Но, во-первых нам нужен будет браузер с поддержкой Flash(а его на серверах *nix обычно не стоит). Поэтому можно воспользоваться замечательным проектом speedtest-cli.

Итак, произведем установку утилиты speedtest-cli в полуавтоматическом режиме. Открываем терминал и пишим следующие команды:

wget http://voip-lab.ru/speedtest
chmod +x ./speedtest
speedtest

При установке понадобятся права root. После того как установка будет произведена, а это обычно занимает несколько секунд, можно запускать speedtest-cli. Вот, например, мой результат в одном из офисов на локальной машине с Linux Mint 17 на борту

speedtest-cli_example.png

Читаем core dump файлы

Недавно у одного из клиентов было нужно понять почему периодический заваливался asterisk. Для диагностики использовался отличный отладчик gdb, а также core-файлы, которые создавались в папке /tmp при крахе приложения. Просто приведу пример использования:

gdb /usr/sbin/asterisk /tmp/core.pbx.local-2014-03-31T04\:02\:41+0400

После анализа gdb выведет функцию или модуль в котором произошла ошибка.

В моем случае это была ошибка при выходе из функции конвертирования mp3.