Меню

Администратору

MySQL аналог htmlspecialchars

Вот-так прогнал таблицу через html экранирование уже постфактум.

UPDATE messages SET message = REPLACE(REPLACE(REPLACE(message,'&','&amp;'),'<', '&lt;'), '>', '&gt;')

Суть асимметричного шифрования

Я использую TLS очень часто, как пользователь (Госуслуги, Диадок и т.д.) где зоопарк из всяких рутокенов, криптопрох и т.п., как администратор (доступ по SSH, установка сертификатов для Nginx), и как программист, когда например самописному SMTP серверу нужно добавить поддержку STARTLS или заглушить ругань PHP отключая проверку хоста:

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);

Вот не втыкал я как оно работает, тупо следовал инструкциям и примерам, понимая только в общих чертах. А сегодня прочитал этот абзац в статье про SSL/TLS и всё встало на свои места: весь опыт и теория.

tls wiki

Суть асимметричного шифрования заключается в том, что используется пара ключей. Один из них используется в качестве открытого (как правило, он публикуется в самом сертификате владельца), второй ключ называется секретным — он держится в тайне и никогда никому не открывается. Оба ключа работают в паре: один используется для запуска противоположных функций другого ключа. Если открытый ключ используется для того, чтобы зашифровать данные, то расшифровать их можно только секретным ключом и наоборот. Такая взаимосвязь позволяет делать две важные вещи.

Любой пользователь может получить открытый ключ и использовать его для шифрования данных, расшифровать которые может только пользователь, владеющий секретным ключом. (RSA)

Если кто-то шифрует данные, используя свой секретный ключ, каждый может расшифровать эти данные, используя соответствующий открытый ключ. Именно это является основой для цифровых подписей. (DSA)

RSA — самый распространенный алгоритм шифрования с использованием асимметричных ключей.

mysql segmentation fault (core dumped)

Отвалился mysql клиент с такой ошибкой.

$ mysql -u root
Segmentation fault (core dumped)

Оказалось клиент конфликтует с библиотекой libmysqlclientиз пакета Percona-Server-shared-51.
Поэтому сносим percona-server-shared и ставим обычные mysq-libs:

rpm -e --nodeps Percona-Server-shared-51
yum install mysql-libs

ОСТОРОЖНО! В процессе удаления percona-server-shared оригинальный my.cnf переименовался в my.cnf.rpmsave, поэтому:

yes | cp /etc/my.cnf.rpmsave /etc/my.cnf

Добавление индекса на мастер MySQL без блокировки

Решение подсмотрел в статье на хайлоаде

pt-online-schema-change

Инструмент pt-online-schema-change решает проблему блокировок таким образом:

  1. Создает таблицу с такой же структурой, как и у рабочей.
  2. Создает индексы на новой таблице (а она пустая, значит все быстро).
  3. Копирует данные из рабочей таблицы в новую (это долго, однако никаких блокировок).
  4. Создает триггеры для синхронизации данных между рабочей и новой таблицами.
  5. Заменяет рабочую таблицу на новую и удаляет старую.

Установить репозиторий Percona и percona-tools

yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm -y
yum install percona-tools -y

Сначала запустить тест

pt-online-schema-change --alter "add index some_idx (some_field)" D=test_db,t=test_tbl,h=127.0.0.1 --user root --password pwd

ОСТОРОЖНО *ЛЯ! ДЕЛАЙ БЭКАПЫ!

А теперь стартуем по-настоящему:

pt-online-schema-change --alter "add index some_idx (some_field)" D=test_db,t=test_tbl,h=127.0.0.1 --user root --password pwd --execute

Я не трогал slave на время шаманства с мастером, но если критично отставание то есть опция --max-lag, которая заставляет присматривать за slave-ом чтобы он сильно не отстал.

1> Cannot connect to h=5.123.456.78,p=...,u=root
No slaves found.  See --recursion-method if host mydb.ru has slaves.
Not checking slave lag because no slaves were found and --check-slave-lag was not specified.
Operation, tries, wait:
  analyze_table, 10, 1
  copy_rows, 10, 0.25
  create_triggers, 10, 1
  drop_triggers, 10, 1
  swap_tables, 10, 1
  update_foreign_keys, 10, 1
Altering `mydb`.`user`...
Creating new table...
Created new table mydb._user_new OK.
Altering new table...
Altered `mydb`.`_user_new` OK.
2019-01-12T16:32:51 Creating triggers...
2019-01-12T16:32:51 Created triggers OK.
2019-01-12T16:32:51 Copying approximately 3648600 rows...
Copying `mydb`.`user`:   4% 10:29 remain
Copying `mydb`.`user`:  10% 08:35 remain
Copying `mydb`.`user`:  15% 08:23 remain
...
Copying `mydb`.`user`:  90% 01:21 remain
Copying `mydb`.`user`:  93% 00:59 remain
Copying `mydb`.`user`:  95% 00:35 remain
Copying `mydb`.`user`:  98% 00:13 remain
2019-01-12T16:49:27 Copied rows OK.
2019-01-12T16:49:28 Swapping tables...
2019-01-12T16:50:09 Swapped original and new tables OK.
2019-01-12T16:50:09 Dropping old table...
2019-01-12T16:50:14 Dropped old table `mydb`.`_user_old` OK.
2019-01-12T16:50:15 Dropping triggers...
2019-01-12T16:50:15 Dropped triggers OK.
Successfully altered `mydb`.`user`.

PS: Тулза руганулась что innodb_lock_wait_timeout только для чтения

Error setting innodb_lock_wait_timeout: DBD::mysql::db do failed: Variable 'innodb_lock_wait_timeout' is a read only variable [for Statement "SET SESSION innodb_lock_wait_timeout=1"].  The current value for innodb_lock_wait_timeout is 50.  If the variable is read only (not dynamic), specify --set-vars innodb_lock_wait_timeout=50 to avoid this warning, else manually set the variable and restart MySQL.

Добавил в параметры вызова —set-vars innodb_lock_wait_timeout=50 и всё поехало.

postfix send only | centos настройка почты только на отправку

Не нужны мне многочисленные получатели, ящики и вся эта почтовая лапша.  Из коробки postfix как-то работал, но приходилось прописывать правила обработки на почтовых ящиках. И просто терялись отладочные системные письма, адресованные root и другим локальным пользователям. Пришлось разобраться и выяснить с какими минимальными настройками будет работать отправка всей почты наружу, без релея и поддержки входящей почты, поехали:

Ставим posfix если ещё нет
yum install postfix -y

Переименуем оригинальный файл настроек (вдруг там что-то важное прописал установочный скрипт)
mv /etc/postfix/main.cf /etc/postfix/main.cf.bak

Создаём пустой файл конфигурации
mcedit /etc/postfix/main.cf

Копируем настройки

# путь к демону и к докам в centos лежат в необычных местах
daemon_directory = /usr/libexec/postfix
manpage_directory = /usr/share/man

# отключаем внешние соединения, отправлять могут только наши приложения
inet_interfaces = localhost
inet_protocols = ipv4

# таблица полных адресов 
canonical_maps = hash:/etc/postfix/canonical

# обеспечиваем совместимость с sendmail
sendmail_path = /usr/sbin/sendmail.postfix
newaliases_path = /usr/bin/newaliases.postfix
mailq_path = /usr/bin/mailq.postfix

#реальное имя этого сервера
myhostname = ***ЗДЕСЬ ВСТАВЛЯЕМ ИМЯ СВОЕГО ХОСТА***

#оставим лазейку для локальной почты, нужно явно указать root@localhost
#чтобы такая почта не уходила наружу и её можно было посмотреть только логах или программой mail
mydestination = localhost

#отключаем ящики
mailbox_size_limit = 0
mailbox_command = /usr/bin/procmail
recipient_delimiter = +

#отключаем relay (проксирование)
relay_domains =
local_recipient_maps =

Сохранили, осталось только забить полные адреса для системных пользователей
mv /etc/postfix/canonical /etc/postfix/canonical.bak
mcedit /etc/postfix/canonical

root sergey@shuchkin.ru -- как пример
shuchkin sergey@shuchkin.ru -- тоже замените на свой

Сохраним и принудительно конвертируем в двоичный формат
postmap /etc/postfix/canonical

Перезагружаем postfix
service postfix restart

Проверяем  отправку
df -h | mail -s DiskUsage root
tail /var/log/maillog

Диадок не работает в новых версиях FireFox

Случайно апнулся до 60-й версии, перестал работать банк клиент и Диадок. В новом FireFox нет Java, плагин Контур.Плагин глючит, подпись не работает.

  1. Сносим все версии FireFox и клонов
  2. Ставим старую ESR версию я нашел 52.9.0esr на FTP сайте Mozilla
  3. Меню — Настройки — Дополнительные —  Никогда не проверять наличие обновлений

ПРОТРАХАЛСЯ ТОЛЬКО, ОН СЦУКО ВСЁ РАВНО НОВУЮ ВЕРСИЮ НАКАТЫВАЕТ — В ИТОГЕ ПЕРЕШЕЛ НА Internet Explorer

Свой SMTP сервер для функции Email2SMS на ReactPHP

Дописал наконец-то сервер транслятор SMTP в HTTP API для smspilot.ru. ReactPHP очень крутой инструмент, с идеальным Promise API, но сцуко слишком бедный в плане качественных пакетов.

99% веб приложений нужно: слой работы с БД, http-клиент и отправка почты — SMTP-клиент. Так вот эти нужные пакеты для reactphp сделаны через жопу. Пришлось написать свои:

  1. smtp-сервер с авторизацией (LOGIN PLAIN CRAM-MD5)
  2. простой smtp-клиент, асинхронный аналог функции mail
  3. нормальный mysqli pool на MYSQL_ASYNC (есть такая штука в mysqlnd, там свой event-loop внутри)
  4. простой http-клиент c chunked и SSL (во всех проверенных либо не понравился интерфейс, либо что-то не работало)

Если будет интересно, то опубликую на github-е

Есть у меня один могиль… IP-шничек

Нашелся таки не заблокированный IP на DigitalOcean только на другой стороне земли.
Сайты поттупливают, т.к. пинг >250, но жить можно, а вот в Putty, ssh, mc скорости отклика явно маловато.

Как отправить email в linux

mail стандартная утилита для отправки эл. почты в Linux. На вход даём тело письма, указываем тему и получателя:
echo "Hello World" | mail -s "test subject" sergey@shuchkin.ru
Hello World! — текст для отправки
test subject — тема сообщения
sergey@shuchkin.ru — эл. почта получателя

df -h | mail -s "disk usage" sergey@shuchkin.ru
Отчет по эл. почте о свободном месте на дисках

df -h > m.log && free -m >> m.log && cat m.log | mail -s "disk and mem usage" sergey@shuchkin.ru
Отчет по эл. почте о свободном месте на дисках и текущем состоянии оперативной памяти

head -30 /var/log/messages | mail -s "last 30 lines of ssystem messages" sergey@shuchkin.ru
Последние 30 строк системного журнала

Подключаемся к GitHub по ключу вместо пароля SSH

На основе инструкции
https://confluence.atlassian.com/bitbucket/set-up-ssh-for-git-728138079.html

Качаем/устанавливаем Git Windows (64 бит)
https://git-scm.com/download/win
* Разрешаем консоль MinGW, пункты контекстного меню Проводника.

/ Корневой каталог консоли соответствует
c:\Program Files\Git\

~ Домашняя папка пользователя соответствует папке пользователя Windows
c:\Users\Serg\

Правой по любой папке «Git Bash Here»

$ ssh
$ ls ~/.ssh
gihub_rsa github_rsa.pub

Нужные мне файлы уже есть, поэтому пропускаю пункт с генерацией ключа.

Создаем файл конфигурации
$ vim ~/.ssh/config
или как я в Блокноте c:\Users\Serg\.ssh\config

Host github.com
IdentityFile ~/.ssh/github_rsa

Собственно сам скрипт автостарта агента ssh вместе с консолью:

$ vim ~/.bashrc
или в Блокноте c:\Users\Serg\.bashrc

SSH_ENV=$HOME/.ssh/environment

# start the ssh-agent
function start_agent {
echo "Initializing new SSH agent..."
# spawn ssh-agent
/usr/bin/ssh-agent | sed 's/^echo/#echo/' > "${SSH_ENV}"
echo succeeded
chmod 600 "${SSH_ENV}"
. "${SSH_ENV}" > /dev/null
/usr/bin/ssh-add ~/.github_rsa
}

if [ -f "${SSH_ENV}" ]; then
. "${SSH_ENV}" > /dev/null
ps -ef | grep ${SSH_AGENT_PID} | grep ssh-agent$ > /dev/null || {
start_agent;
}
else
start_agent;
fi

Обычно файл ~/.bash_profile (c:\Users\Serg\.bash_profile) создается автоматом после рестарта консоли, если что у меня он такой:
if [ -f ~/.bashrc ]; then . ~/.bashrc; fi

Скопировать содержимое ~/.ssh/github_rsa.pub в настройки GitHub:
https://github.com/settings/ssh

Переключить доступ к удаленному репозиторию по git ссылке:
$ git remote set-url origin git@github.com:shuchkin/PhpStormFG.git

Перезапускаем консоль, проверяем git push
$ git push origin master