Rose debug info
---------------

Блог об администрировании Linux, BSD и не только.

Связаться со мной:
Позднее Ctrl + ↑

DynDns через Telegram

Т.к яндекс сломал api для своих DNS, то для получения ip будем пользоваться телеграмом.
Через BotFather создаем бота. Даем ему команду

/newbot

Затем вводим имя нашего нового бота. Потом вводим username бота, оно должно оканчиваться на bot.
После этого BotFather пришлет нам api токен.
Теперь нам нужно получить chat id. Для этого отправляем нашему боту какое-нибудь сообщение и затем делаем запрос

https://api.telegram.org/bot<api токен>/getUpdates

В ответе находим

..."id":123456789...

Копируем id.
Если ваш провайдер блокирует телеграм, то нужно обзавестись прокси для отправки уведомлений. Теперь у нас есть все чтобы наш бот мог отправлять нам уведомления.
Отправить сообщение из консоли можно запросом вида

curl -x $proxy "https://api.telegram.org/bot${api}/sendMessage?chat_id=${id}&text=${buf}"

Берем наш скрипт из статьи про ЯндексДНС и немного его переделываем. Получаем что-то типа такого.

#!/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin; export PATH
api="сюда вписываем токен"
id="сюда вписываем chat id"
proxy="socks5://login:pass@proxy.ip:port/"

while true; do
ip=`curl -s http://ip.anikin.pw/`
if [ $ip != $buf ]
then
buf=`echo $ip`
curl -x $proxy "https://api.telegram.org/bot${api}/sendMessage?chat_id=${id}&text=${buf}"
fi
sleep 1800; done;

Скрипт смотрит на изменение ip. И если ip изменяется, то отправляет новый ip в телеграм.

Прозрачный nat нескольких сетей FreeBSD

Этот способ устарел. Лучше делать вот так

В первую очередь нужно поднять OpenVPN клиента через который мы будем пускать адреса в обход. В конфиге клиента следует закомментировать диррективу redirect-gateway, чтобы основной траффик у нас шел через провайдера.
Создаем скрипт который загрузит заблокированные ip в таблицу ipfw

#!/bin/sh

rm /root/bin/reestr.txt
/usr/local/bin/wget -O - https://api.reserve-rbl.ru/api/v2/ips/json|tr ',' '\n'|tr -d '"'|tr -d ']'|tr -d '['  > /root/bin/reestr.txt
file="/root/bin/reestr.txt"

ipfw table 1 flush
while read line
do
ipfw table 1 add $line
done < $file

file="/root/bin/useriplist" # В этот файл можно вписать свои ip которые тоже нужно пустить через VPN
while read line
do
ipfw table 1 add $line
done < $file

Запустим natd на порту 8673

/sbin/natd -a 10.8.1.6 -p 8673

Зарулим все ip из таблицы 1 в VPN

lan="192.168.0.0/24" #локалка
vpnip="10.8.1.6" #ip vpn интерфейса
vpngw="10.8.1.7" #vpn шлюз
ipfw add divert 8673  ip from ${lan},${vpnip} to table\(1\)
ipfw add fwd ${vpngw}  ip from ${vpnip} to table\(1\)
ipfw add divert 8673  ip from table\(1\) to ${vpnip}

Почему не работает USB на гребенке 13 pin OrangePi R1 и возможно на OrangePi Zero(Но это не точно)

Разработчики armbian считают что если разъем не представлен на плате, а представлен на гребенке, то по умолчанию он должен быть отключен. И если вы подключите устройство USB к соответствующим документации пинам или подключите плату типа этой

то вы можете с удивлением обнаружить, что USB не работает. Разберемся как его включить.
Чтобы сконфигурировать оборудование при загрузке ОС в armbian используются файлы DTB начиная с ядра 4.9.
OrangePi R1 сейчас использует файл sun8i-h2-plus-orangepi-zero.dtb
На данный момент этот файл находится в /boot/dtb/
Разработчики armbian не исключают что путь и имя файла может изменится, так что если что пробуем другие файлы dtb.
Идем в каталог /boot/dtb и бекапим файл на всякий случай.

cd /boot/dtb
cp sun8i-h2-plus-orangepi-zero.dtb sun8i-h2-plus-orangepi-zero.dtb.bak

Устанавливаем device-tree-compiler и переводим dtb в удобный для редактирования формат

apt install device-tree-compiler
dtc -b 0 -O dts -I dtb -o sun8i-h2-plus-orangepi-zero.dts sun8i-h2-plus-orangepi-zero.dtb

Теперь нужно открыть sun8i-h2-plus-orangepi-zero.dts любым текстовым редактором и найти там все usb порты и usb шины и изменить у них

status = "disabled";

на

status = "okay";

После редактирования собираем файл обратно в dtb

dtc -b 0 -O dtb -I dts -o sun8i-h2-plus-orangepi-zero.dtb sun8i-h2-plus-orangepi-zero.dts

Теперь перезагружаемся, смотрим lsusb и пробуем подключать устройства к usb.

Проблема с wifi карточками MT7601U в Debian 9.

NetworkManager сети видит, но не может к ним подключиться. Пишет что соединение разорвано.
Карточка выглядит примерно так:

148f:7601 Ralink Technology, Corp. MT7601U Wireless Adapter

А чтобы все заработало достаточно выполнить:

ln -s /dev/null /etc/systemd/network/99-default.link

Восстановление поврежденных innodb таблиц

При повреждении innodb таблиц мускуль не стартует, что создает определенные сложности для ремонта таблиц.
Чтобы запустить мускуль нужно вписать в my.cnf

innodb_force_recovery = 1
innodb_purge_threads = 0

Затем стартуем mysql. Он запустится в режиме в котором таблицы можно читать, но нельзя редактировать. И делаем дамп всех баз

mysqldump -u root -p --all-databases > dump.sql

Теперь идем в каталог /var/lib/mysql и удаляем там все каталоги кроме mysql и performance_schema, файлы ib_logfile* и ibdata* тоже сносим.
Теперь убираем из my.cnf

innodb_force_recovery = 1
innodb_purge_threads = 0

И рестартуем mysql в нормальном режиме.
Теперь вернем все базы обратно

cat dump.sql | mysql -u root -p

Скрипт установки virtualbox с веб-интерфейсом на сервер

Здесь есть роли ansible для установки virtualbox с веб-интерфейсом.

Скрипт устанавливает и настраивает virtualbox + phpvirtualbox. После работы скрипта можно сразу приступать к разворачиванию виртуалок. Скрипт выполняет все что описано в этой статье до пункта «Установка виртуальной машины». Также генерирует новый самоподписанный сертификат, работа с phpvirtualbox происходит по протоколу https.
Скрипт работает на:
ubuntu 14.04, 16.04
debian 8, 9
Устанавливать нужно на чистую систему.

wget https://raw.githubusercontent.com/petranikin/vbinst/master/vbinst
bash vbinst

Скрипт начнет установку сразу после запуска. По окончанию работы он сообщит url, логин и пароль для доступа в phpvirtualbox, сохраните их.

Автоматическое добавление новых доменов на slaveDNS(bind9)

Скрипт смотрит в конфиг named.conf на мастере на наличие новых доменов. И при появлении новых доменов добавляет их в named.conf на slave сервере. Написан на питоне.
На мастер сервере нужно создать пользователя и добавить его в группу bind, чтобы у него были права на чтение named.conf. Также на master нужно разрешить трансфер зон.

allow-transfer { ip-slave_сервера; };

На slave сервере нужно настроить ssh авторизацию по ключам с master сервером для этого юзера.
Затем получаем сам скрипт и перенесем его в /usr/bin

git clone https://github.com/shmulya/zonefetch
mv zonefetch/fetch.py /usr/bin/fetch.py

Правим там переменные:
MASTERIP — ip master сервера(можно указать несколько серверов в формате [’ip1’,’ip2’])
REMOTE_USERNAME — юзер master сервера у которого есть права на чтение named.conf
PATH_TO_MASTER_ZONEFILE — файл с зонами на master
PATH_TO_SLAVE_ZONEFILE — каталог для файлов с зонами на slave

Скрипт пишет зоны в файлы вида /etc/bind/ip.conf, например для master с ip — 192.168.0.1 это будет /etc/bind/192.168.0.1.conf.
Эти файлы нужно создать предварительно и добавить соответствующие инклуды в /etc/named.conf, например:

include "/etc/bind/192.168.0.1.conf";

В конце добавим скрипт в крон примерно так

*/5 * * * * /usr/bin/python /usr/bin/fetch.py >> /var/log/zonefetch.log 2>&1

Стандартное ядро в OVH

В OVH по умолчанию ставится модифицированное датацентром ядро, в котором нет многих нужных модулей. И некоторое ПО не работает. Например virtualbox не запускается с ошибкой типа:

ERROR ../libkmod/libkmod-module.c:1638 kmod_module_new_from_loaded: could not open /proc/modules: No such file or directory

К тому же ядро в образах ДЦ зачастую уже «протухшее».

Чтобы все заработало как надо, нужно поставить стандартное ядро из реп.
Смотрим какие ядра есть у нас в репозиториях

# apt search linux-image

Выбираем стандартное ядро stable и устанавливаем.

# apt install linux-image-3.16.0-4-amd64 linux-headers-3.16.0-4-amd64

Затем в /etc/default/grub правим диррективу GRUB_DEFAULT чтобы сервер грузился с нашего ядра.
Делаем

update-grub

и ребутимся

Если все работает правильно, ядро OVH можно вообще удалить.

Менеджер версий php для Debian/Ubuntu.

Скрипт мультиверсионности мной более не поддерживается, т.к в новых версиях дебиан все сложнее автоматизировать установку старых версий php. Поэтому php 5 собирайте руками. Либо проходите по ссылке.

Выкладываю мой скрипт который поможет установить несколько версий php из исходных кодов на ваш сервер. Скрипт делался в первую очередь для Debian и проверялся на Debian 8 x64. Но работает и на Ubuntu. Удобно с помощью скрипта поддерживать актуальные версии php на сервере с вестой, т.к скрипт умеет автоматически обновлять шаблоны весты при сборке.
На debian 7/8 с моими флагами установки без проблем собираются php 5.2 и выше.
На ubuntu 14.04/16.04 по умолчанию собираются php 5.3 и выше. 5.2 при компиляции валится с ошибкой. Поэтому если нужен 5.2 юзайте дебиан.
Что делает скрипт:

  1. При запуске спрашивает какие версии php требуется собрать(версию нужно вводить полностью. Например 7.1.2, а не 7.1. Можно ввести несколько версий через пробел), создавать ли на бинарник php-cgi симлинк в /usr/bin для быстрого доступа. Проверяет наличие на сервере панели vestacp. Если находит её, то спрашивает создавать ли шаблон web для каждой версии.
  2. При первом запуске спрашивает, нужно ли ставить зависимости. Если вы откажетесь от установки зависимостей, то вам нужно их установить самостоятельно. Иначе при сборке вы получите ошибки. При последующих запусках этот шаг пропускается. Нужно понимать что скрипт старается поставить все возможные зависимости, но в разных дистрибутивах могут использоваться разные пакеты или при использовании кастомных флагов компиляции может потребоваться что-то доустановить.
  3. Парсит http://php.net/downloads.php и http://php.net/releases/ на наличие bz2 архива с исходниками указанной юзером версии php. Если находит, скачивает и распаковывает исходники в /opt/php/src.


    Также можно положить архивы с иходниками в /opt/php/src/bzips, тогда скрипт не будет их скачивать.
  4. Конфигурит, по умолчанию с моими параметрами компиляции(подойдут для большинства пользователей). Собирает.

    Тем кто хочет использовать свои параметры компиляции обязательно кликнуть сюда
    Можно свои параметры конфигурирования положить в файл /opt/php/options. Если скрипт находит этот файл, то он использует его для конфигурирования. Свой файл можно сделать на основе моего. Скрипт заменяет version в файле конфигурирования на текущую собираемую версию. Это сделано для того чтобы скрипт автоматом создавал свой каталог для каждой версии. Если вы собираете например версию 5.3.29 и в вашем файле конфигурирования указано prefix=/opt/php/php-version, то это по сути равно prefix=/opt/php/php-5.3.29. При сборке нескольких версий одновременно эту фичу нужно использовать чтобы не собирать все версии в один каталог.
  5. При необходимости создает симлинк и шаблон для весты. Если создает темплейты для весты, то проверяет включен ли модуль cgi в апаче. Если модуль не включен, то включает его.

Запустить скрипт очень просто

# git clone https://github.com/petranikin/mgrvphp.git
# cd mgrvphp
# bash mgrvphp

Немного скриншотов

Перемещение окон между мониторами в xfce4 сочетанием клавиш

Xfce почему-то из коробки не умеет перемещать хоткеями окна между мониторами. Не между рабочими столами, а именно физическими мониторами. Это очень не удобно, особенно если вторым монитором используется телевизор. И если окно открылась на телике, то приходится его включать и тащить окно мышью. Кошмар в общем. Исправить этот досадный недостаток пришлось с помощью утилиты xdotool.
Устанавливаем её.

$ sudo apt install xdotool

С помощью неё можно перетащить активное окно на определенную координату
Для перемещения окна на первый монитор я использовал

xdotool getactivewindow windowmove --sync 100 100

Для перемещения окна на второй монитор

xdotool getactivewindow windowmove --sync 2000 100

Надеюсь всем понятно что в первой команде коодрдинаты 100 100, а во второй 2000 100 по оси X и оси Y соответственно.
Нужно на эти команды повесить хоткеи. Для этого надо зайти в Настройки — Клавиатура, вкладка «Комбинации клавиш». Я поставил Ctrl-1 для перемещения окна на 1 монитор, и Ctrl-2 для перемещения окна на второй монитор.

Ранее Ctrl + ↓