Windows/Linux википедия http://sysadm.pp.ua Статьи по настройке и администрированию Windows/Linux систем Tue, 16 Oct 2018 08:28:51 +0000 ru-RU hourly 1 https://wordpress.org/?v=4.5.2 Вывод денег из upwork на карту ПриватБанк http://sysadm.pp.ua/interestnoe/upwork-to-privatbank-swift.html http://sysadm.pp.ua/interestnoe/upwork-to-privatbank-swift.html#respond Tue, 16 Oct 2018 08:26:01 +0000 http://sysadm.pp.ua/?p=1444 upworkВ этой короткой статье пойдет речь о том, как вывести заработанные деньги на сайте фриланса upwork на свой карточный счет. Данная статья буде полезной только для граждан Украины у которых открыт счет в ПриватБанк банке.
Хочу заметить, что данная статья актуальна на момент ее написания. Если вы открыли эту статью и видите, что с момента ее написания прошло уже полгода или больше, то будьте готовы, что данный способ может не работать, так как у нас в стране (и вообще) все любит меняться.

Способ получения

Вывод денег из Upwork методом Wire Transfer (USD) на валютную карту ПриватБанк.

Счет в банке

Для того, чтобы вывести деньги из Upwork на долларовую карту ПриватБанк нужно сначала ею обзавестись.

Способ 1

Можно создать виртуальную карточку через сервис Приват24. Как это сделать можно посмотреть на официально сайте. На данный момент — это вкладка «Усі послуги» меню: «КАРТКИЗамолення картокЗамовити картку«. И далее следуйте вопросам помощника. Единственное что: карта должна быть валютной (ДОЛ).

Способ 2

Приходите в отделение ПриватБанк и заказывает валютную карту. И консультант все тоже сделает за вас.

Информация о SWIFT

Для получения денег через Wire Transfer (USD) нам нужные наши SWIFT реквизиты. Идем в наш личный кабинет в Прива24. Переходим на вкладку «Усі послуги» меню: «ІНФОМої реквізити«. Далее выбираем «Спосіб поповнення Вашої картки: SWIFT-платежем«, выбираем нашу валютную карточку из списка «Картка/Рахунок» и выбираем «Завантажити PDF«. В результате получаем файл со следующими реквизитами.

uwork01

Аккаунт в upwork

Очевидно, что вам нужно иметь аканту на сайте upwork и даже заработать немного денег доступных на личном счете.
Идем в настройки и проверяем сколько у нас есть заработанных денег. Кликаем на иконку вашего аккаунта и переходим в меню «Settings«. Вводим пароль и попадаем на страничку «Contact Info«. Откуда едем на вкладку «Get Paid«. Здесь видно сколько денег на балансе и методы их вывода.

Добавляем метод вывода

В поле «Payment Methods» жмем на кнопку «Add Method«. В появившийся меню жмем на «Wire Transfer (USD)«. Далее нужно очень внимательно заполнить все поля исходя из реквизитов скачанного в предыдущем пункте PDF документа.

ВАЖНО: Нужно привести upwork «Contact Info» к тому же виду, что вы видите в поле «BENEFICIARY» PDF документе. Имя, Фамилия и адрес должны совпадать иначе вывод средств данным методом будет не возможным.
В результате должно получиться что-то типа этого.

uwork02

Информация по банку может немного отличаться, а именно поля Address и City and State (у меня был Днепропетровск после ввода Bank SWIFT Code – это нормально, можно так и оставить, главное чтобы банк был PRIVATBANK).
Так же нужно ввести как часто выводит средства и т.п. (это я пропускаю).
Теперь нужно подождать 3 дня для всяких upwork верификацый.

Вывод средств

После 3х дней идем в ту же вкладку «Get Paid» в upwork и жмем на кнопку «Get Paid Now«. Подтверждаем, что все ок и ждем.

Мне деньги пришли на следующий день. На балансе в upwork было 336$ в итоге пришло на карту 304$ с копейками.

uwork03

Данный тип перевода хорош, когда накопили 1500$ или больше, так как за каждый перевод снимается фиксированная пеня в 30$. Пробуйте.

]]>
http://sysadm.pp.ua/interestnoe/upwork-to-privatbank-swift.html/feed 0
Mikrotik. Базовая установка и настройка роутера http://sysadm.pp.ua/internet/mikrotik-basic-install.html http://sysadm.pp.ua/internet/mikrotik-basic-install.html#comments Wed, 21 Feb 2018 07:24:26 +0000 http://sysadm.pp.ua/?p=1402 Компания, в которой я работаю начала немного разрастаться и нам пришлось арендовать отдельное помещение, где всю сетевую инфраструктуру нужно было подымать и настраивать с нуля. После долгого планирования кабельщики провели сеть, питание и у нас сформировалось маленькое подобие серверной комнатки. Туда, недолго думая, был поставлен UPS и заведен первый провайдер интернета. Изначально был поставлен слабенький, перешедший из прежнего офиса, роутер от которого не хватало много нужного функционала. Нужно было выбирать что ставить на вход: сервер или роутер. С серверами я и до того много работал, а вот с так хваленым mikrotik не приходилось, вот я и решил заказать фирме роутер, в котором есть весь, нужный на данный момент, функционал – и мне хорошо (skills improvement) и фирма не против.
Был приобретён mikrotik RB951G-2HnD (Рис 1).

2
Рисунок 1 – Внешний вид роутера RB951G-2HnD

Mikrotik наименования

Чтобы дать более точную информацию по модели – расшифруем её наименование (Рис 2).

1
Рисунок 2 – Пример наименования mikrotik роутера

Как видим, наименование нашего роутера состоит из четырех разделов. Распишем значения каждой группы.

RB Стандартное сокращение RouterBoard
9 Серия
5 Количество проводных интерфейсов
1 Количество беспроводных интерфейсов
G Гигабитная и может включать:

·         “U“ – USB

·         “А“ – больше памяти

·         “Н“ – более мощный CPU

Только, если не идет в сочетании с “L“ — light edition.

В моем случаи с “U”.

2 Радиомодуль частотой 2.4 Ghz
H Повышенной мощности:

·         23-24dBm на 6Mbps 802.11a

·         24-27dBm на 6Mbps 802.11g

n Поддержка 802.11n протокола
D “Dual chain”, т.е. MIMO (Multiple In Multiple Out), т.е. многопотоковая передача данных

Чтобы расшифровать наименования вашего устройства – можете использовать официальную документацию . Исходя из вышеизложенной информации — у нас WiFi роутер с 5-ю Гигабитными Ethernet портами и USB.

Первый запуск роутера

Чтобы сразу не положить офисную сеть, подключаем роутер на прямую к персональному компьютеру через сетевой кабель (Рис 3).

3
Рисунок 3 – Вид подключения роутера к ноутбуку

Следующим шагом нужно скачать последний winbox. Это софт, который позволяет подключаться и настраивать RouterOS. На момент написания статье это версия 3.11.

Запускаем winbox -> переходим на вкладку Neighbors, выделяем запись с нашим роутером и нажимаем Connect (Рис 4). По умолчанию: пользователь admin и пустой пароль.

4
Рисунок 4 – Вид окна подключения к роутеру через WinBox

Первое, что мы увидим – это настройки роутера по умолчанию, что нам не интересно, так как мы хотим сами все настроить с нуля. Поэтому выбираем пункт – Удалить конфигурацию (Рис 5).

5
Рисунок 5 – Вид окна первого подключения к роутеру

Теперь роутер подумает над своим поведением, перезагрузиться и нужно будет опять к нему подключиться тем же способом (Рис 6).

6
Рисунок 6 – Вид окна подключения к роутеру через WinBox после удаления конфигурации

Если случайно нажали ОК вместо Reset Configuration, то можете сбить настройки роутера используя меню (Рис 7).

7
Рисунок 7 – Вид окна сброса настроек роутера mikrotik

Или же через кнопку RES, которую видно на рисунке 1:

  • Отключите питание роутера;
  • Нажмите и держите кнопку RES;
  • Включите питание роутера;
  • Дождитесь, пока замигает индикатор ACT, и отпустите кнопку RES.

ВАЖНО: Если не отпустите кнопку RES и дождетесь, когда индикатор ACT перестанет мигать, то устройство перейдет в режим Netinstall для переустановки операционной системы RouterOS.

Базовая настройка

Обновляем пакеты

Первым делом советую обновиться до последней версии всех пакетов, чтобы идти в ногу с баг фиксингом и безопасностью. Переходим в System -> Packages и жмем на кнопку Check For Updates (Рис 8).

8
Рисунок  8 – Вид окна Packages

Видим, что у нас версия немного застарелая. Можно почитать, что было добавлено/исправлено в новых версиях я нажимаем Download->Install (Рис 9).

9
Рисунок  9 – Вид окна проверки на обновления

Роутер скачает все что нужно, перезагрузиться и мы должны увидеть что-то типа этого (Рис 10).

10
Рисунок  10 – Вид окна Packages  после обновления

Теперь мы на последней версии софта.

Настройка сетевых интерфейсов

Первым делом нужно поиздеваться над сетевыми интерфейсами. Если это домашняя сеть или просто одна линка провайдера, то можно просто переименовать сетевые интерфейсы, чтобы было понятно, что за что отвечает. Когда добавляется уже два провайдера на один роутер, тогда предпочтение идет просто в группировании интерфейсов как они есть. В данном случаи мы переименуем все сетевые интерфейсы. Переходи в Interfaces -> Вкладка Interface (Рис 11).

11
Рисунок 11 – Вид вкладки Interfaces

Далее один за одним кликаем на интерфейс дважды и называем как нам нужно. Первый интерфейс у меня будет называться WAN (Рис 12).

12
Рисунок 12 – Вид окна настроек первого интерфейса: WAN

Все остальные порты должны быть объединены в один сегмент локальной сети. Mikrotik RouteOS позволяет это делать двумя способами: Bridging и Master port. На официальном форуме mikrotik не раз задавался вопрос, что лучше выбрать, и ответ всегда был: это зависит о конфигурации, которая вам нужна. Ответ от представителя mikrotik:

Bridge is software switching, master port is hardware switching. Use master ports to switch multiple physical interfaces where you want full wire speed. Use bridges to connect those master ports together, possibly with wlan ports as well.
With hardware switching alone there is no way to place a wired Ethernet segment on the same broadcast domain as a wireless segment, or interconnect different switch chips. For that, you need to use software switching (bridge functionality).
In a WISP situation, I usually do not bother with master/slave ports because it is rare, given the limitations of wireless PtMP radio equipment, that you will ever be in a situation where you are switching gigabit traffic; in such situations, where you are usually switching <100Mbps, hardware switching introduces additional complexity of configuration while decreasing CPU load only minimally. The difference is much greater when dealing with traffic nearing gigabit speeds; any switching at this rate that you can remove from the router CPU and offload to the switch CPU makes it worth setting up master/slave, even though it makes the configuration a little more complicated.

Ми идем по пути уменьшения нагрузки на CPU, и поэтому в нашей номинации побеждает Master/Slave конфигурация. Следующим у нас будет порт с названием eth0, который будет мастером для всех остальных (Рис 13).

13
Рисунок 13 – Вид окна настроек второго интерфейса: LAN Master

Все остальные интерфейсы переименуем и поставим для них как мастер порт eth0 (Рис 14).

14
Рисунок 14 – Вид окна настроек второго интерфейса: LAN Slave

Те же действия проделаем с остальными проводными интерфейсами. И на закуску переименуем беспроводной интерфейс (Рис 15).

15
Рисунок 15 – Вид окна настроек беспроводного интерфейса: LAN WiFi

Смотрим, что у нас получилось и также включаем WiFi (Рис 16).

16
Рисунок 16 – Вид окна списка интерфейсов

Настройка Интернет доступа

Чтобы у нас был доступ в Интернет – нужно настроить WAN интерфейс. В нашем случаи провайдер дает динамический IP адрес, поэтому нам нужно настроить DHCP клиент. Переходим в IP -> DHCP client вкладка DHCP Client жмем “+”, на вкладке DHCP выбираем Interface: WAN и жмем ОК (Рис. 17).

17
Рисунок 17 – Вид окна настроек DHCP client

И мы должны получить что-то типа этого (Рис 18).

18
Рисунок 18 – Вид окна полученных WAN настроек

Настройка WiFi доступа

Для WiFi доступа нам нужно подправить настройки интерфейса и профайл безопасности. Идем в Wireless вкладка Interfaces и там кликаем на wifi. В появившимся окне на вкладке Wireless выбираем Mode: ap bridge, Band: 2GHz-B/G/N, вписываем название SSID (в моем случаи OFFICE) и жмем ОК (Рис 19).

19
Рисунок 19 – Вид окна настроек Wifi Interface

Теперь нужно отредактировать профайл безопасности. Идем во вкладку Security Profiles кликаем на default, во вкладке General выставляем

  • Mode: dynamic keys
  • Authentication Types: WPA2 PSK
  • Unicast Ciphers: aes ccm, tkip
  • Group Ciphers: aes ccm, tkip
  • WPA2 Pre-Shared Key: <свой_пароль>

И нажимаем ОК (Рис 20).

20
Рисунок 20 – Вид окна настроек WiFi Security Profiles

Теперь у нас есть рабочий WiFi который можно уже использовать (Рис 21).

21
Рисунок 21 – Вид окна настроек WiFi Interfaces после редактирования

Настройка сетевых мостов

С интерфейсами закончили. Теперь переходим к настройке bridge. Это нужно для того, чтобы все интерфейсы были в одном сегменте сети. Нажимаем на меню Bridge, на вкладке Bridge нажимаем символ “+”, в появившимся окне на вкладке General вписываем имя моста (Рис 22). В нашем случаи – LAN, который буде объединять все беспроводные и проводные интерфейсы, т.е. наш Wifi и Master port eth0.

22
Рисунок 22 – Вид окна настроек сетевого моста LAN

Теперь добавляем к нашему бриджу сетевые интерфейсы. Первым пойдет Мастер порт проводных интерфейсов. Переходим в вкладку Ports, нажимаем на значок “+”. В Interface выбираем eth0 и в Bridge ставим LAN (Рис 23).

23
Рисунок 23 – Вид окна настроек проводных портов для LAN bridge

Тоже делаем с беспроводным интерфейсом (Рис 24).

24
Рисунок 24 – Вид окна настроек беспроводного порта для LAN bridge

Настройка IP стека

Переходим к настройке IP адресов. Как так, что наш роутер до сих пор не имеет IP адреса – нужно это исправить.  Нажимаем IP -> Addresses, далее на “+” и вводим IP, по которому буде доступен наш роутер (в моем случаи это 10.222.222.254/24) и в поле Interface ставим наш LAN bridge (Рис 25).

25
Рисунок 25 – Вид окна IP настроек роутера

У роутера теперь есть IP адрес, но раздавать IP адреса из этой сети он не еще не может. Нужно ему в этом деле помочь. Переходим в меню IP -> DHCP Server. На вкладке DHCP нажимаем на кнопочку DHCP Setup и идем по гайду (Рис 26).

26
Рисунок 26 – Вид окна настроек DHCP server

Выбираем наш локальный LAN bridge, вводим пул адресов, IP адрес шлюза (что есть наш адрес роутера), диапазон адресов для раздачи, список DNS серверов и время резервирования адресов за клиентами (Рис 27).

27
Рисунок 27 – Вид окон мастера настроек DHCP server

Теперь мы получим IP при подключении к роутеру.

Настройка NAT

Теперь настроим правила для Firewall-а. Если этого не сделать, то наши пакеты смогут ходить только по локальной сети без надежды попасть во внешний мир. Идем в IP -> Firewall. Вкладка NAT и жмем “+”. Во вкладке General выбираем Chain: srcnat и ставим для нее Out. Interface: WAN  (Рис 28).

28
Рисунок 28 – Вид окна настроек Firewall NAT

Переходим во вкладку Action, выбираем masquerade и жмем ОК (Рис 29).

29
Рисунок 29 – Вид окна настроек Firewall NAT Actions

Настройка времени

Чтобы время событий совпадало с нашей реальностью, нужно настроить часики на роутере. Переходим в System -> Clock, вкладка Time и выставляем нужные значения (Рис 30).

30
Рисунок 30 – Вид окна настроек времени

Смена пароля по умолчанию

Изначально мы подключались на систему без ввода пароля пользователем admin. Так делать нельзя – нужно поставить нормальный пароль.  Идем в System -> Users. На вкладке Users кликаем на пользователя admin. В открывшимся окне нажимаем на кнопку Password. В следующем окне вводим пароль и жмем ОК (Рис 31).

31
Рисунок 31 – Вид окна смены пароля для пользователя admin

На этом этапе моя базовая настройка роутера закончилась.

]]>
http://sysadm.pp.ua/internet/mikrotik-basic-install.html/feed 3
FTP (часть 3). Настройка и использование proftpd mod_exec http://sysadm.pp.ua/linux/proftpd-mod-exec-ubuntu-16-04.html http://sysadm.pp.ua/linux/proftpd-mod-exec-ubuntu-16-04.html#comments Sun, 26 Nov 2017 06:15:54 +0000 http://sysadm.pp.ua/?p=1396 proftpd_mod_execВ предыдущей статье был рассмотрен proftpd модуль Controls, который позволяет на лету добавлять и удалять модули и работать с ними без каких либо конфигурационных файлов и перезагрузок сервера. Сегодня же поговорим о самом, на мой взгляд, полезном модуле proftpd – mod_exec.
Он позволяет выполнять скрипты до и после любых FTP действий, по началу и окончанию FTP сессии, при ошибках и т.п.
Примеры случаев использования mod_exec:

  • Добавление информации о залитых файлах в БД
  • Проверка файлов на сигнатуры вирусов
  • Проверка медиафайлов на разные метаданные
  • Группирование файлов по разным признакам
  • Индивидуальная обработка файлов per ftp user
  • И многое другое в зависимости от нужд

К сожалению, даже создатель данного модуля не рекомендует его использовать по ряду причин (детали в разделе Материалы по модулю), но есть способ устранить эти причины, о чем сейчас и пойдет речь.

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

root@u16:~# mkdir -v /etc/proftpd/scripts
mkdir: created directory '/etc/proftpd/scripts'

Далее, добавляем парочку скриптов

root@u16:/etc/proftpd# ls -1 scripts/
before_command.sh
on_command.sh
on_connect.sh
on_error.sh

root@u16:/etc/proftpd# chmod +x scripts/*

root@u16:/etc/proftpd# cat scripts/on_connect.sh 
#!/bin/bash
echo "Script argument 1  FTP_USER_PASS=$1.       Script environment variable FTP_USER_PASS=$FTP_USER_PASS"
echo "Script argument 2  FTP_USER_IP=$2.         Script environment variable FTP_USER_IP=$FTP_USER_IP"
echo "Script argument 3  FTP_USER_NAME_LOCAL=$3. Script environment variable FTP_USER_NAME_LOCAL=$FTP_USER_NAME_LOCAL"
echo "Script argument 4  FTP_USER_NAME_ORIG=$4.  Script environment variable FTP_USER_NAME_ORIG=$FTP_USER_NAME_ORIG"
echo "Script argument 5  FTP_USER_GROUP=$5.      Script environment variable FTP_USER_GROUP=$FTP_USER_GROUP"
echo "Script argument 6  FTP_USER_DNS_NAME=$6.   Script environment variable FTP_USER_DNS_NAME=$FTP_USER_DNS_NAME"
echo "Script argument 7  FTP_WORKING_DIR=$7.     Script environment variable FTP_WORKING_DIR=$FTP_WORKING_DIR"
echo "Script argument 8  FTP_CONN_CLASS=$8.      Script environment variable FTP_CONN_CLASS=$FTP_CONN_CLASS"
echo "Script argument 9  FTP_FILE=$9.            Script environment variable FTP_FILE=$FTP_FILE"
echo "Script argument 10 FTP_FILE_PATH=$10.      Script environment variable FTP_FILE_PATH=$FTP_FILE_PATH"
echo "Script argument 11 FTP_COMMAND=$11.        Script environment variable FTP_COMMAND=$FTP_COMMAND"
echo "Script argument 12 FTP_SERVER_NAME=$12.    Script environment variable FTP_SERVER_NAME=$FTP_SERVER_NAME"
echo "Script argument 13 FTP_RNFR_NAME=$13.      Script environment variable FTP_RNFR_NAME=$FTP_RNFR_NAME"

Для примера, было создано 4 полностью одинаковых скрипта, которые делают одни и те же действия – выводят значения всех mod_exec FTP переменных в stdout.

Теперь добавляем настройки модуля mod_exec и правила, когда этим скриптам запускаться.

root@u16:/etc/proftpd# cat conf.d/mod_exec.conf 
<IfModule mod_exec.c>
    # Включить модуль
    ExecEngine on
    # Логировать stderr i stdout скриптов в ExecLog
    ExecOptions logStderr logStdout
    # Логи модуля
    ExecLog /var/log/proftpd/mod_exec.log
    # Timeout выполнения скриптов
    ExecTimeout 180

    # Перечень всех переменных и их значения
    ExecEnviron FTP_USER_PASS %A
    ExecEnviron FTP_USER_IP %a
    ExecEnviron FTP_USER_NAME_LOCAL %u
    ExecEnviron FTP_USER_NAME_ORIG %U
    ExecEnviron FTP_USER_GROUP %g
    ExecEnviron FTP_USER_DNS_NAME %h
    ExecEnviron FTP_WORKING_DIR %C
    ExecEnviron FTP_CONN_CLASS %c
    ExecEnviron FTP_FILE %F
    ExecEnviron FTP_FILE_PATH %f
    ExecEnviron FTP_COMMAND %m
    ExecEnviron FTP_SERVER_NAME %v
    ExecEnviron FTP_RNFR_NAME %w

    # Выполнить скрипт при подключении к FTP серверу
    ExecOnConnect /etc/proftpd/scripts/on_connect.sh %A %a %u %U %g %h %C %c %F %f %m %v %w
    # Выполнить скрипт перед FTP командой STOR
    ExecBeforeCommand STOR /etc/proftpd/scripts/before_command.sh %A %a %u %U %g %h %C %c %F %f %m %v %w
    # Выполнить скрипт после FTP команды STOR
    ExecOnCommand STOR /etc/proftpd/scripts/on_command.sh %A %a %u %U %g %h %C %c %F %f %m %v %w
    # Выполнить скрипт при возникновении какой-либо ошибки
    ExecOnError ALL /etc/proftpd/scripts/on_error.sh %A %a %u %U %g %h %C %c %F %f %m %v %w
</IfModule>

Комментарии ко всем настройкам были добавлены, теперь можно делать рестарт и проверять работу модуля.

root@u16:/etc/proftpd# service proftpd restart

В предыдущей статье было создано FTP пользователя, используя которого мы будем заливать файлы.
Используя FileZilla подключаемся на FTP сервер и параллельно смотрим что пишется в лог.

root@u16:~# tail -f /var/log/proftpd/mod_exec.log 
2017-11-18 06:09:18,925 mod_exec/0.9.12[1495]: preparing to execute '/etc/proftpd/scripts/on_connect.sh' with uid 113 (euid 113), gid 3000 (egid 3000)
2017-11-18 06:09:18,925 mod_exec/0.9.12[1495]:  + '/etc/proftpd/scripts/on_connect.sh': argv[1] = UNKNOWN
2017-11-18 06:09:18,925 mod_exec/0.9.12[1495]:  + '/etc/proftpd/scripts/on_connect.sh': argv[2] = 80.77.41.195
2017-11-18 06:09:18,925 mod_exec/0.9.12[1495]:  + '/etc/proftpd/scripts/on_connect.sh': argv[3] = 
2017-11-18 06:09:18,925 mod_exec/0.9.12[1495]:  + '/etc/proftpd/scripts/on_connect.sh': argv[4] = 
2017-11-18 06:09:18,925 mod_exec/0.9.12[1495]:  + '/etc/proftpd/scripts/on_connect.sh': argv[5] = 
2017-11-18 06:09:18,925 mod_exec/0.9.12[1495]:  + '/etc/proftpd/scripts/on_connect.sh': argv[6] = 80.77.41.195
2017-11-18 06:09:18,925 mod_exec/0.9.12[1495]:  + '/etc/proftpd/scripts/on_connect.sh': argv[7] = 
2017-11-18 06:09:18,925 mod_exec/0.9.12[1495]:  + '/etc/proftpd/scripts/on_connect.sh': argv[8] = 
2017-11-18 06:09:18,925 mod_exec/0.9.12[1495]:  + '/etc/proftpd/scripts/on_connect.sh': argv[9] = 
2017-11-18 06:09:18,925 mod_exec/0.9.12[1495]:  + '/etc/proftpd/scripts/on_connect.sh': argv[10] = 
2017-11-18 06:09:18,925 mod_exec/0.9.12[1495]:  + '/etc/proftpd/scripts/on_connect.sh': argv[11] = 
2017-11-18 06:09:18,925 mod_exec/0.9.12[1495]:  + '/etc/proftpd/scripts/on_connect.sh': argv[12] = 
2017-11-18 06:09:18,925 mod_exec/0.9.12[1495]:  + '/etc/proftpd/scripts/on_connect.sh': argv[13] = -
2017-11-18 06:09:18,929 mod_exec/0.9.12[1494]: stdout from '/etc/proftpd/scripts/on_connect.sh': 'Script argument 1  FTP_USER_PASS=UNKNOWN.       Script environment variable FTP_USER_PASS=UNKNOWN'
2017-11-18 06:09:18,929 mod_exec/0.9.12[1494]: stdout from '/etc/proftpd/scripts/on_connect.sh': 'Script argument 2  FTP_USER_IP=80.77.41.195.         Script environment variable FTP_USER_IP=80.77.41.195'
2017-11-18 06:09:18,929 mod_exec/0.9.12[1494]: stdout from '/etc/proftpd/scripts/on_connect.sh': 'Script argument 3  FTP_USER_NAME_LOCAL=. Script environment variable FTP_USER_NAME_LOCAL='
2017-11-18 06:09:18,929 mod_exec/0.9.12[1494]: stdout from '/etc/proftpd/scripts/on_connect.sh': 'Script argument 4  FTP_USER_NAME_ORIG=.  Script environment variable FTP_USER_NAME_ORIG='
2017-11-18 06:09:18,929 mod_exec/0.9.12[1494]: stdout from '/etc/proftpd/scripts/on_connect.sh': 'Script argument 5  FTP_USER_GROUP=.      Script environment variable FTP_USER_GROUP='
2017-11-18 06:09:18,929 mod_exec/0.9.12[1494]: stdout from '/etc/proftpd/scripts/on_connect.sh': 'Script argument 6  FTP_USER_DNS_NAME=80.77.41.195.   Script environment variable FTP_USER_DNS_NAME=80.77.41.195'
2017-11-18 06:09:18,930 mod_exec/0.9.12[1494]: stdout from '/etc/proftpd/scripts/on_connect.sh': 'Script argument 7  FTP_WORKING_DIR=.     Script environment variable FTP_WORKING_DIR='
2017-11-18 06:09:18,930 mod_exec/0.9.12[1494]: stdout from '/etc/proftpd/scripts/on_connect.sh': 'Script argument 8  FTP_CONN_CLASS=.      Script environment variable FTP_CONN_CLASS='
2017-11-18 06:09:18,930 mod_exec/0.9.12[1494]: stdout from '/etc/proftpd/scripts/on_connect.sh': 'Script argument 9  FTP_FILE=.            Script environment variable FTP_FILE='
2017-11-18 06:09:18,930 mod_exec/0.9.12[1494]: stdout from '/etc/proftpd/scripts/on_connect.sh': 'Script argument 10 FTP_FILE_PATH=UNKNOWN0.      Script environment variable FTP_FILE_PATH='
2017-11-18 06:09:18,930 mod_exec/0.9.12[1494]: stdout from '/etc/proftpd/scripts/on_connect.sh': 'Script argument 11 FTP_COMMAND=UNKNOWN1.        Script environment variable FTP_COMMAND='
2017-11-18 06:09:18,930 mod_exec/0.9.12[1494]: stdout from '/etc/proftpd/scripts/on_connect.sh': 'Script argument 12 FTP_SERVER_NAME=UNKNOWN2.    Script environment variable FTP_SERVER_NAME='
2017-11-18 06:09:18,930 mod_exec/0.9.12[1494]: stdout from '/etc/proftpd/scripts/on_connect.sh': 'Script argument 13 FTP_RNFR_NAME=UNKNOWN3.      Script environment variable FTP_RNFR_NAME=-'
2017-11-18 06:09:18,937 mod_exec/0.9.12[1494]: '/etc/proftpd/scripts/on_connect.sh' terminated normally, with exit status 0
2017-11-18 06:09:18,937 mod_exec/0.9.12[1494]: ExecOnConnect '/etc/proftpd/scripts/on_connect.sh' succeeded

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

2017-11-18 06:14:37,095 mod_exec/0.9.12[1521]: preparing to execute '/etc/proftpd/scripts/on_command.sh' with uid 113 (euid 113), gid 3000 (egid 3000)
2017-11-18 06:14:37,095 mod_exec/0.9.12[1521]:  + '/etc/proftpd/scripts/on_command.sh': argv[1] = UNKNOWN
2017-11-18 06:14:37,095 mod_exec/0.9.12[1521]:  + '/etc/proftpd/scripts/on_command.sh': argv[2] = 80.77.41.195
2017-11-18 06:14:37,095 mod_exec/0.9.12[1521]:  + '/etc/proftpd/scripts/on_command.sh': argv[3] = frodo
2017-11-18 06:14:37,095 mod_exec/0.9.12[1521]:  + '/etc/proftpd/scripts/on_command.sh': argv[4] = frodo
2017-11-18 06:14:37,095 mod_exec/0.9.12[1521]:  + '/etc/proftpd/scripts/on_command.sh': argv[5] = proftpd
2017-11-18 06:14:37,095 mod_exec/0.9.12[1521]:  + '/etc/proftpd/scripts/on_command.sh': argv[6] = 80.77.41.195
2017-11-18 06:14:37,095 mod_exec/0.9.12[1521]:  + '/etc/proftpd/scripts/on_command.sh': argv[7] = /var/www/frodo
2017-11-18 06:14:37,095 mod_exec/0.9.12[1521]:  + '/etc/proftpd/scripts/on_command.sh': argv[8] = 
2017-11-18 06:14:37,095 mod_exec/0.9.12[1521]:  + '/etc/proftpd/scripts/on_command.sh': argv[9] = /var/www/frodo/P61223-222401.jpg
2017-11-18 06:14:37,095 mod_exec/0.9.12[1521]:  + '/etc/proftpd/scripts/on_command.sh': argv[10] = /var/www/frodo/P61223-222401.jpg
2017-11-18 06:14:37,095 mod_exec/0.9.12[1521]:  + '/etc/proftpd/scripts/on_command.sh': argv[11] = STOR
2017-11-18 06:14:37,095 mod_exec/0.9.12[1521]:  + '/etc/proftpd/scripts/on_command.sh': argv[12] = MyFTP
2017-11-18 06:14:37,095 mod_exec/0.9.12[1521]:  + '/etc/proftpd/scripts/on_command.sh': argv[13] = -
2017-11-18 06:14:37,097 mod_exec/0.9.12[1517]: error: unable to open /dev/null for stdin: No such file or directory
2017-11-18 06:14:37,097 mod_exec/0.9.12[1517]: '/etc/proftpd/scripts/on_command.sh' terminated normally, with exit status 2
2017-11-18 06:14:37,097 mod_exec/0.9.12[1517]: STOR ExecOnCommand '/etc/proftpd/scripts/on_command.sh' failed: No such file or directory

Как видим, у нас вылезла проблема, о которой писал автор модуля: “модуль может работать не корректно с Анонимной заливкой и при использовании директивы DefaultRoot”. Другими словами, если мы джейлим пользователя в домашней папке, то у нас нету доступа к системным библиотекам, файлах, стандартных потоков (stdin, stdout, stderr), переменных окружения и каких-либо бинарниках. Чтобы исправить эту проблему, нужно установить и подключить модуль vroot.
Устанавливаем модуль vroot.

apt-get install proftpd-mod-vroot

Теперь подключаем к proftpd. В конфигурации он уже есть, только нужно включить.

root@u16:/etc/proftpd# cat proftpd.conf | grep virtuals
Include /etc/proftpd/virtuals.conf

root@u16:/etc/proftpd# cat virtuals.conf    
<IfModule mod_vroot.c>
    VRootEngine on
    VRootServerRoot /
    VRootOptions allowSymlinks
</IfModule>

Рестартуем сервер.

root@u16:/etc/proftpd# service proftpd restart

Проверяем заливку.

2017-11-18 06:36:12,421 mod_exec/0.9.12[1790]: preparing to execute '/etc/proftpd/scripts/before_command.sh' with uid 113 (euid 113), gid 3000 (egid 3000)
2017-11-18 06:36:12,421 mod_exec/0.9.12[1790]:  + '/etc/proftpd/scripts/before_command.sh': argv[1] = UNKNOWN
2017-11-18 06:36:12,421 mod_exec/0.9.12[1790]:  + '/etc/proftpd/scripts/before_command.sh': argv[2] = 80.77.41.195
2017-11-18 06:36:12,421 mod_exec/0.9.12[1790]:  + '/etc/proftpd/scripts/before_command.sh': argv[3] = frodo
2017-11-18 06:36:12,421 mod_exec/0.9.12[1790]:  + '/etc/proftpd/scripts/before_command.sh': argv[4] = frodo
2017-11-18 06:36:12,421 mod_exec/0.9.12[1790]:  + '/etc/proftpd/scripts/before_command.sh': argv[5] = proftpd
2017-11-18 06:36:12,421 mod_exec/0.9.12[1790]:  + '/etc/proftpd/scripts/before_command.sh': argv[6] = 80.77.41.195
2017-11-18 06:36:12,421 mod_exec/0.9.12[1790]:  + '/etc/proftpd/scripts/before_command.sh': argv[7] = /var/www/frodo
2017-11-18 06:36:12,421 mod_exec/0.9.12[1790]:  + '/etc/proftpd/scripts/before_command.sh': argv[8] = 
2017-11-18 06:36:12,421 mod_exec/0.9.12[1790]:  + '/etc/proftpd/scripts/before_command.sh': argv[9] = /var/www/frodo/P61223-222423.jpg
2017-11-18 06:36:12,421 mod_exec/0.9.12[1790]:  + '/etc/proftpd/scripts/before_command.sh': argv[10] = /var/www/frodo/P61223-222423.jpg
2017-11-18 06:36:12,421 mod_exec/0.9.12[1790]:  + '/etc/proftpd/scripts/before_command.sh': argv[11] = STOR
2017-11-18 06:36:12,421 mod_exec/0.9.12[1790]:  + '/etc/proftpd/scripts/before_command.sh': argv[12] = MyFTP
2017-11-18 06:36:12,421 mod_exec/0.9.12[1790]:  + '/etc/proftpd/scripts/before_command.sh': argv[13] = -
2017-11-18 06:36:12,423 mod_exec/0.9.12[1787]: stdout from '/etc/proftpd/scripts/before_command.sh': 'Script argument 1  FTP_USER_PASS=UNKNOWN.       Script environment variable FTP_USER_PASS=UNKNOWN'
2017-11-18 06:36:12,423 mod_exec/0.9.12[1787]: stdout from '/etc/proftpd/scripts/before_command.sh': 'Script argument 2  FTP_USER_IP=80.77.41.195.         Script environment variable FTP_USER_IP=80.77.41.195'
2017-11-18 06:36:12,423 mod_exec/0.9.12[1787]: stdout from '/etc/proftpd/scripts/before_command.sh': 'Script argument 3  FTP_USER_NAME_LOCAL=frodo. Script environment variable FTP_USER_NAME_LOCAL=frodo'
2017-11-18 06:36:12,423 mod_exec/0.9.12[1787]: stdout from '/etc/proftpd/scripts/before_command.sh': 'Script argument 4  FTP_USER_NAME_ORIG=frodo.  Script environment variable FTP_USER_NAME_ORIG=frodo'
2017-11-18 06:36:12,423 mod_exec/0.9.12[1787]: stdout from '/etc/proftpd/scripts/before_command.sh': 'Script argument 5  FTP_USER_GROUP=proftpd.      Script environment variable FTP_USER_GROUP=proftpd'
2017-11-18 06:36:12,423 mod_exec/0.9.12[1787]: stdout from '/etc/proftpd/scripts/before_command.sh': 'Script argument 6  FTP_USER_DNS_NAME=80.77.41.195.   Script environment variable FTP_USER_DNS_NAME=80.77.41.195'
2017-11-18 06:36:12,423 mod_exec/0.9.12[1787]: stdout from '/etc/proftpd/scripts/before_command.sh': 'Script argument 7  FTP_WORKING_DIR=/var/www/frodo.     Script environment variable FTP_WORKING_DIR=/var/www/frodo'
2017-11-18 06:36:12,423 mod_exec/0.9.12[1787]: stdout from '/etc/proftpd/scripts/before_command.sh': 'Script argument 8  FTP_CONN_CLASS=.      Script environment variable FTP_CONN_CLASS='
2017-11-18 06:36:12,423 mod_exec/0.9.12[1787]: stdout from '/etc/proftpd/scripts/before_command.sh': 'Script argument 9  FTP_FILE=/var/www/frodo/P61223-222423.jpg.            Script environment variable FTP_FILE=/var/www/frodo/P61223-222423.jpg'
2017-11-18 06:36:12,424 mod_exec/0.9.12[1787]: stdout from '/etc/proftpd/scripts/before_command.sh': 'Script argument 10 FTP_FILE_PATH=UNKNOWN0.      Script environment variable FTP_FILE_PATH=/var/www/frodo/P61223-222423.jpg'
2017-11-18 06:36:12,424 mod_exec/0.9.12[1787]: stdout from '/etc/proftpd/scripts/before_command.sh': 'Script argument 11 FTP_COMMAND=UNKNOWN1.        Script environment variable FTP_COMMAND=STOR'
2017-11-18 06:36:12,424 mod_exec/0.9.12[1787]: stdout from '/etc/proftpd/scripts/before_command.sh': 'Script argument 12 FTP_SERVER_NAME=UNKNOWN2.    Script environment variable FTP_SERVER_NAME=MyFTP'
2017-11-18 06:36:12,424 mod_exec/0.9.12[1787]: stdout from '/etc/proftpd/scripts/before_command.sh': 'Script argument 13 FTP_RNFR_NAME=UNKNOWN3.      Script environment variable FTP_RNFR_NAME=-'
2017-11-18 06:36:12,429 mod_exec/0.9.12[1787]: '/etc/proftpd/scripts/before_command.sh' terminated normally, with exit status 0
2017-11-18 06:36:12,429 mod_exec/0.9.12[1787]: STOR ExecBeforeCommand '/etc/proftpd/scripts/before_command.sh' succeeded
2017-11-18 06:36:15,018 mod_exec/0.9.12[1791]: preparing to execute '/etc/proftpd/scripts/on_command.sh' with uid 113 (euid 113), gid 3000 (egid 3000)
2017-11-18 06:36:15,018 mod_exec/0.9.12[1791]:  + '/etc/proftpd/scripts/on_command.sh': argv[1] = UNKNOWN
2017-11-18 06:36:15,018 mod_exec/0.9.12[1791]:  + '/etc/proftpd/scripts/on_command.sh': argv[2] = 80.77.41.195
2017-11-18 06:36:15,018 mod_exec/0.9.12[1791]:  + '/etc/proftpd/scripts/on_command.sh': argv[3] = frodo
2017-11-18 06:36:15,018 mod_exec/0.9.12[1791]:  + '/etc/proftpd/scripts/on_command.sh': argv[4] = frodo
2017-11-18 06:36:15,018 mod_exec/0.9.12[1791]:  + '/etc/proftpd/scripts/on_command.sh': argv[5] = proftpd
2017-11-18 06:36:15,018 mod_exec/0.9.12[1791]:  + '/etc/proftpd/scripts/on_command.sh': argv[6] = 80.77.41.195
2017-11-18 06:36:15,018 mod_exec/0.9.12[1791]:  + '/etc/proftpd/scripts/on_command.sh': argv[7] = /var/www/frodo
2017-11-18 06:36:15,018 mod_exec/0.9.12[1791]:  + '/etc/proftpd/scripts/on_command.sh': argv[8] = 
2017-11-18 06:36:15,018 mod_exec/0.9.12[1791]:  + '/etc/proftpd/scripts/on_command.sh': argv[9] = /var/www/frodo/P61223-222423.jpg
2017-11-18 06:36:15,018 mod_exec/0.9.12[1791]:  + '/etc/proftpd/scripts/on_command.sh': argv[10] = /var/www/frodo/P61223-222423.jpg
2017-11-18 06:36:15,018 mod_exec/0.9.12[1791]:  + '/etc/proftpd/scripts/on_command.sh': argv[11] = STOR
2017-11-18 06:36:15,018 mod_exec/0.9.12[1791]:  + '/etc/proftpd/scripts/on_command.sh': argv[12] = MyFTP
2017-11-18 06:36:15,018 mod_exec/0.9.12[1791]:  + '/etc/proftpd/scripts/on_command.sh': argv[13] = -
2017-11-18 06:36:15,020 mod_exec/0.9.12[1787]: stdout from '/etc/proftpd/scripts/on_command.sh': 'Script argument 1  FTP_USER_PASS=UNKNOWN.       Script environment variable FTP_USER_PASS=UNKNOWN'
2017-11-18 06:36:15,020 mod_exec/0.9.12[1787]: stdout from '/etc/proftpd/scripts/on_command.sh': 'Script argument 2  FTP_USER_IP=80.77.41.195.         Script environment variable FTP_USER_IP=80.77.41.195'
2017-11-18 06:36:15,020 mod_exec/0.9.12[1787]: stdout from '/etc/proftpd/scripts/on_command.sh': 'Script argument 3  FTP_USER_NAME_LOCAL=frodo. Script environment variable FTP_USER_NAME_LOCAL=frodo'
2017-11-18 06:36:15,020 mod_exec/0.9.12[1787]: stdout from '/etc/proftpd/scripts/on_command.sh': 'Script argument 4  FTP_USER_NAME_ORIG=frodo.  Script environment variable FTP_USER_NAME_ORIG=frodo'
2017-11-18 06:36:15,020 mod_exec/0.9.12[1787]: stdout from '/etc/proftpd/scripts/on_command.sh': 'Script argument 5  FTP_USER_GROUP=proftpd.      Script environment variable FTP_USER_GROUP=proftpd'
2017-11-18 06:36:15,020 mod_exec/0.9.12[1787]: stdout from '/etc/proftpd/scripts/on_command.sh': 'Script argument 6  FTP_USER_DNS_NAME=80.77.41.195.   Script environment variable FTP_USER_DNS_NAME=80.77.41.195'
2017-11-18 06:36:15,020 mod_exec/0.9.12[1787]: stdout from '/etc/proftpd/scripts/on_command.sh': 'Script argument 7  FTP_WORKING_DIR=/var/www/frodo.     Script environment variable FTP_WORKING_DIR=/var/www/frodo'
2017-11-18 06:36:15,020 mod_exec/0.9.12[1787]: stdout from '/etc/proftpd/scripts/on_command.sh': 'Script argument 8  FTP_CONN_CLASS=.      Script environment variable FTP_CONN_CLASS='
2017-11-18 06:36:15,020 mod_exec/0.9.12[1787]: stdout from '/etc/proftpd/scripts/on_command.sh': 'Script argument 9  FTP_FILE=/var/www/frodo/P61223-222423.jpg.            Script environment variable FTP_FILE=/var/www/frodo/P61223-222423.jpg'
2017-11-18 06:36:15,020 mod_exec/0.9.12[1787]: stdout from '/etc/proftpd/scripts/on_command.sh': 'Script argument 10 FTP_FILE_PATH=UNKNOWN0.      Script environment variable FTP_FILE_PATH=/var/www/frodo/P61223-222423.jpg'
2017-11-18 06:36:15,020 mod_exec/0.9.12[1787]: stdout from '/etc/proftpd/scripts/on_command.sh': 'Script argument 11 FTP_COMMAND=UNKNOWN1.        Script environment variable FTP_COMMAND=STOR'
2017-11-18 06:36:15,020 mod_exec/0.9.12[1787]: stdout from '/etc/proftpd/scripts/on_command.sh': 'Script argument 12 FTP_SERVER_NAME=UNKNOWN2.    Script environment variable FTP_SERVER_NAME=MyFTP'
2017-11-18 06:36:15,020 mod_exec/0.9.12[1787]: stdout from '/etc/proftpd/scripts/on_command.sh': 'Script argument 13 FTP_RNFR_NAME=UNKNOWN3.      Script environment variable FTP_RNFR_NAME=-'
2017-11-18 06:36:15,025 mod_exec/0.9.12[1787]: '/etc/proftpd/scripts/on_command.sh' terminated normally, with exit status 0
2017-11-18 06:36:15,025 mod_exec/0.9.12[1787]: STOR ExecOnCommand '/etc/proftpd/scripts/on_command.sh' succeeded 

Теперь, можно экспериментировать.
Подсказу я дал, можете адаптировать модуль под свои задачи.

Материалы по mod_exec

Proftpd: mod_exec
Proftpd: mod_vroot
Proftpd: поддерживаемые FTP команды

]]>
http://sysadm.pp.ua/linux/proftpd-mod-exec-ubuntu-16-04.html/feed 2
FTP (часть 2). Настройка и использование proftpd mod_ctrls http://sysadm.pp.ua/linux/proftpd-mod-ctrls-ubuntu-16-04.html http://sysadm.pp.ua/linux/proftpd-mod-ctrls-ubuntu-16-04.html#respond Sat, 18 Nov 2017 07:59:39 +0000 http://sysadm.pp.ua/?p=1393 proftpd_mod_ctrls
В предыдущей статье шла речь о установке и базовой настройке proftpd. Сегодня же начнем знакомиться с proftpd модулями. Использовать будем proftpd сервер под операционной системой Ubuntu 16.04 на Google Cloud Platform (GCP). И первым модулем будет mod_ctrls (Controls). Вкратце опишу что и как.

Модуль Controls или mod_ctrls

Данный модуль позволяет управлять proftpd сервером, его модулями и т.п. на лету в реальном времени без каких-либо рестартов и обновлений файлов конфигурации. Звучит заманчиво, где и как применить узнаем далее.
Чтобы использовать данный модуль, proftpd сервер должен быть запущен в standalone режиме и только. При установке proftpd из xenial репозитория, этот модуль включен по умолчанию, поэтому остается только его настроить (иначе, вам нужно перекомпилировать proftpd с опцией ‘—enable-ctrls‘). Удалим настройку из общего файла конфигурации и вынесем в отдельный.

root@u16:~# vim /etc/proftpd/proftpd.conf
…
# Найди и удали линии, связанные с mod_ctrls и mod_ctrls_admin
…

Полная настройка выглядит следующим образом:

rgb000@u16:~$ cat /etc/proftpd/conf.d/mod_ctrls.conf 
<IfModule mod_ctrls.c>
    # Включить Controls
    ControlsEngine        on
    # Разрешить юзерам, у которых gid=proftpdadm и юзеру rgb000 выполнять все команды mod_ctrls модуля
    ControlsACLs          all allow user rgb000
    ControlsACLs          all allow group proftpdadm
    # Максимальное количество пользователей для работы с mod_ctrls
    ControlsMaxClients    1
    # Логи
    ControlsLog           /var/log/proftpd/mod_ctrls.log
    # Интервал проверки новых клиентов. Т.е. если запустили команду ftpdctl, то ответ может быть с задержкой в <ControlsInterval> секунд
    ControlsInterval      2
    # Путь к сокету обмена командами между сервером и клиентами
    ControlsSocket        /run/proftpd.sock
    # Овнер и группа сокет файла
    ControlsSocketOwner   proftpd proftpd
    # Разрешить юзерам, у которых gid=proftpdadm,rgb000 работать с сокетом
    ControlsSocketACL     allow group proftpdadm,rgb000
  <IfModule mod_ctrls_admin.c>
    # Включить Admin controls
    AdminControlsEngine on
    # Разрешить юзерам, у которых gid=proftpdadm,rgb000 запускать Admin controls команды
    AdminControlsACLs all allow user proftpdadm,rgb000
  </IfModule>
</IfModule> 

Все поля я описал, могу только добавить, что директива ControlsSocketACL может быть указана несколько раз, но примениться только последняя (на что я наткнулся, когда добавлял сначала юзера, а с новой строки группу, и в итоге работала только группа).
Создадим дополнительную группу и пользователя proftpdadm в системе (не в альтернативном файле с proftpd пользователями и группами) для работы с Controls.

root@u16:~# groupadd -g 3001 proftpdadm
root@u16:~# useradd -m -g 3001 -u 3001 proftpdadm

Перезагружаем proftpd.

root@u16:~# service proftpd restart

Для работы с proftpd демоном на лету используется утилита ftpdctl. Проверяем работоспособность.

rgb000@u16:~$ ftpdctl help   
ftpdctl: ban: ban a class, host, or user from using the daemon
ftpdctl: debug: set debugging level
ftpdctl: delay: tune mod_delay settings
ftpdctl: dns: set UseReverseDNS configuration
ftpdctl: down: disable an individual virtual server
ftpdctl: dynmasq: mod_dynmasq controls
ftpdctl: get: list configuration data
ftpdctl: help: describe all registered controls
ftpdctl: insctrl: enable a disabled control
ftpdctl: insmod: load modules
ftpdctl: kick: disconnect a class, host, or user
ftpdctl: lsctrl: list all registered controls
ftpdctl: lsmod: list modules
ftpdctl: permit: allow a banned class, host or user to use the daemon
ftpdctl: restart: restart the daemon (similar to using HUP)
ftpdctl: rmctrl: disable a registered control
ftpdctl: rmmod: unload modules
ftpdctl: scoreboard: clean the ScoreboardFile
ftpdctl: shaper: tune mod_shaper settings
ftpdctl: shutdown: shutdown the daemon
ftpdctl: status: display status of servers
ftpdctl: tls: query/tune mod_tls settings
ftpdctl: trace: set trace levels
ftpdctl: up: enable a downed virtual server

rgb000@u16:~$ ftpdctl lsmod
ftpdctl: Loaded Modules:
ftpdctl:   mod_core.c
ftpdctl:   mod_xfer.c
ftpdctl:   mod_rlimit.c
ftpdctl:   mod_auth_unix.c
ftpdctl:   mod_auth_file.c
ftpdctl:   mod_auth.c
ftpdctl:   mod_ls.c
ftpdctl:   mod_log.c
ftpdctl:   mod_site.c
ftpdctl:   mod_delay.c
…

rgb000@u16:~$ ftpdctl rmctrl tls
ftpdctl: 'tls' control disabled

rgb000@u16:~$ ftpdctl insctrl tls
ftpdctl: 'tls' control enabled

Как видим, пользователь rgb000 может смотреть список всех доступных действий и работать с ними.
Список возможных действий мы расширили, добавив административные Controls(действия) используя модуль mod_ctrls_admin. Проверим одно из них.

proftpdadm@u16:~$ ftpdctl status all 
ftpdctl: status: 10.138.0.2#21 UP 

Данная команда показывает статус сервера (заметьте, что команда была запущена специально созданным юзером, для теста).
В следующей статье пойдет речь о модуле mod_exec.

Материалы по mod_ctrls

Proftpd: howto Controls
Proftpd: mod_ctrls_admin
Proftpd: mod_ctrls

]]>
http://sysadm.pp.ua/linux/proftpd-mod-ctrls-ubuntu-16-04.html/feed 0
FTP (часть 1). Установка proftpd под Ubuntu 16.04 http://sysadm.pp.ua/linux/proftpd-ubuntu-16-04.html http://sysadm.pp.ua/linux/proftpd-ubuntu-16-04.html#comments Sat, 04 Nov 2017 08:29:28 +0000 http://sysadm.pp.ua/?p=1390 proftpd
В данной статье пойдет речь об установке и базовой настройке FTP под операционной системой Ubuntu 16.04. В роли FTP сервера будем использовать proftpd, для заливки файлов будем использовать FileZilla клиент.

Установка proftpd сервера

На данный момент Google дает 300$ на триальное использование GCP (Google Cloud Platform), чем мы и воспользуемся для поднятия виртуальной машины Ubuntu 16.04. Сначала находим наиболее близкий к нам регион используя сайт — gcping.com. Как только вы перейдете по данной ссылке, браузер “начнет пинговать” gcp регионы и создаст ваш собственный ТОП по задержке. Выбираете самую низкую.

proftpd_1_1

Далее идем в console.cloud.google.com и создаем виртуальную машину в выбранном регионе. Самый мелкий инстанс (g1-small) мне обошелся 13$ в месяц.

rgb000@deep-bivouac-184505:~$ gcloud compute instances list
NAME  ZONE        MACHINE_TYPE  PREEMPTIBLE  INTERNAL_IP  EXTERNAL_IP     STATUS
u16   europe-west3-a  g1-small                   10.138.0.2   35.185.210.109  RUNNING

ОС у нас есть, теперь можно установить нужные пакеты.

root@u16:~# apt update -y && apt upgrade -y && apt install proftpd-basic

При установке выбираем standalone режим работы. На этом этапе установка завершена.

Настройка proftpd сервера

FTP сервер нужно настраивать исходя из нужд и специфики вашей системы. Мой подход – это создание и хранение пользователей и групп в отдельных файлах, нежели добавление их в систему через /etc/passwd, /etc/group. Также, все залитые файлы будут иметь один и тот же UID и GID, но каждый пользователь будет привязан только ко своей домашней папке.
Для начала добавляем новую системную группу для FTP и привязываем к proftpd пользователю:

root@u16:~# groupadd -g 3000 proftpd
root@u16:~# usermod -g proftpd proftpd
root@u16:~# id proftpd 
uid=113(proftpd) gid=3000(proftpd) groups=3000(proftpd)

Как видим, созданный при установке, proftpd пользователь теперь имеет UID=113 и GID=3000.
Теперь можно создать первого FTP пользователя в альтернативном файле ftp.passwd используя утилиту ftpasswd. Можно использовать маленький скрипт.

root@u16:~# cat ftp_add_user.sh
#!/bin/bash
FTP_USER="frodo" 
FTP_HOME_DIR="/var/www/frodo" 
FTP_PASSWORD="TpOeBFPDzCQYK5nRd"
FTP_USER_ID="113"
FTP_GROUP_ID="3000"

mkdir -pv "$FTP_HOME_DIR"
chown -v proftpd:proftpd "$FTP_HOME_DIR"
echo "$FTP_PASSWORD" | ftpasswd --passwd --file /etc/proftpd/ftpd.passwd --name "$FTP_USER" --home "$FTP_HOME_DIR" --shell /bin/false --uid "$FTP_USER_ID" --gid "$FTP_GROUP_ID" --stdin

Запускаем скрип.

root@u16:~# bash ftp_add_user.sh 
mkdir: created directory '/var/www/frodo'
changed ownership of '/var/www/frodo' from root:root to proftpd:proftpd
ftpasswd: using alternate file: /etc/proftpd/ftpd.passwd
ftpasswd: creating passwd entry for user frodo
ftpasswd: entry created

Теперь добавляем конфигурацию для proftpd сервера.

root@u16:~# cat /etc/proftpd/conf.d/security.conf 
# Привязать пользователя к домашней папке
DefaultRoot             ~
# Выключаем вывод информации о сервере при логине
ServerIdent             off
# Альтернативный файл с пользователями
AuthUserFile            /etc/proftpd/ftpd.passwd
# Если сервер за NAT: маскарадинг внешнего ІР или домена (можно и без него)
MasqueradeAddress       35.185.210.109
# Если сервер за NAT: для добавления в Firewall при пассивном режиме передачи. 
PassivePorts            60000 65535

Делаем рестарт и заканчиваем с базовой настройкой.

root@u16:~# service proftpd restart

Так как я использую google cloud, нужно разрешить весь исходящий трафик и входящий для указанного диапазона портов и самого proftpd сервера, а именно:

  • TCP 20, 60000:65535 – для передачи данных
  • TCP 21 – для передачи команд

proftpd_1_2
proftpd_1_3

Теперь можно заливать файлы.

Настройка FTP клиента

Долго не думаю устанавливаем FileZilla клиент под Windows, запускаем и добавляем наш FTP сервер.

proftpd_1_4

Далее жмем Соединиться и заливаем тестовый файлик.

proftpd_1_5

Как видим, тестовый файлик успешно залился.
Переходим на сервер и проверяем права на файлик.

root@u16:~# ls -l /var/www/frodo/
total 3784
-rw-r--r-- 1 proftpd proftpd 3873197 Nov  4 06:40 P61223-222401.jpg

Как раз то, чего мы добивались.
В итоге мы подняли рабочий FTP сервер за 15 мин с минимальной конфигурацией.
Здесь я не описывал детали и нюансы, связанные с Активной и Пассивной передачей данных, об этом можете почитать в статье из дополнительной литературы, приведенной ниже. Вкратце, при Активной передаче клиентская машина открывает локальный порт для передачи команд (> 1023) и порт для передачи данных (> 1023), подключается к 21 порту FTP сервера и отправляет ему номер порта данных. Далее, сервер говорит ОК и инициирует подключение к этому клиентскому порту. Если на обоих сторонах нет NAT/Firewall (или нормально настроено под FTP передачу), то все будет ок. Во всех остальных случаях, попытка сервера подключиться на прямую к порту данных клиента будет заблокирована (firewall, antivirus, etc).
В связи с этим придумали Пассивную передачу данных. В этом случаи клиент открывает локальный порт для передачи команд (> 1023), порт для передачи данных (> 1023), но передает только сигнал PASV, что говорит серверу, чтобы тот сам открыл у себя порт для передачи данных и сообщил о нем клиенту. Сервер, получив сигнал, открывает у себя порт для передачи данных (из заданного нами диапазона) и отправляет его клиенту. Ну и клиент, соответственно, уже сам подключается к северу к нужному порту данных.
В следующей статье пойдет речь о модуле mod_ctrls, который позволяет управлять поведением proftpd в реальном времени.

Материалы

Proftpd: Использование AuthUserFiles
Proftpd: Список всех директив
Proftpd: За NAT-ом
FTP: Активная vs Пассивная передача

]]>
http://sysadm.pp.ua/linux/proftpd-ubuntu-16-04.html/feed 2
Поиск по истории skype http://sysadm.pp.ua/interestnoe/skype-history-search.html http://sysadm.pp.ua/interestnoe/skype-history-search.html#comments Mon, 19 Dec 2016 19:13:43 +0000 http://sysadm.pp.ua/?p=1356 skypeЭтот короткий пост посвящен людям, которые интенсивно используют skype в роли messenger-а. А именно проблеме с поиском нужной информации в истории скайпа. Сначала в скайпе историю можно было пролистать в плоть до первого сообщения, написанного пару лет назад. Потом в историю переписки добавили что-то, типа, диапазона дат, на который нужно кликнуть, чтобы развернуть, и т.п. И к этим неудобствам еще добавляется неопределенность и потерянность в десятках чатов с подобным названием (если вообще имеется). Ты сидишь и вспоминаешь, куда или кому ты писал или скидывал полезную ссылки или инструкцию, или доступ и т.п.
Кто с таким сталкивался, тот меня поймет, и ему поможет данный способ поиска нужной информации по всей базе skype, по всем чатам и индивидуальным перепискам.

Так как skype использует SQLite БД, нам остается только скачать подходящий браузер для доступа к базе данных и написать запрос.
Качаем DB Browser for SQLite с официального сайта и устанавливаем.
Установка по умолчанию (все время жмем Далее), по завершению запускаем программу. После чего нам нужно открыть базу skype. Так как я использую Windows 10, мне нужен файл main.db, который можно найти по следующему пути.

C:\Users\<your_username>\AppData\Roaming\Skype\<your_skype_account>\main.db

Открываем базу.

skype_1

У вас подтянется вся структура таблиц. Если интересно, можете по ней пройтись. Далее нам осталось создать запрос, который будет искать ключевое слово по всем существующим чатам скайпа. У меня он выглядит следующим образом.

SELECT m.from_dispname,
       c.displayname as conversation_display_name,
       m.body_xml,
       datetime(m.timestamp, 'unixepoch') AS date
  FROM Messages m,
       Conversations c
 WHERE c.id = m.convo_id AND 
       body_xml LIKE "%Amazon%"
 ORDER BY timestamp DESC;
 

К примеру, поищем все упоминания слова Amazon во всех чатах сайпа.

skype_2

Как видим, мы получили список со всеми чатами где упоминалось слово, сортированный по релевантности. Хочу заметить, что эти лишь один из многих способов поиска информации по базе данных скайпа, в Интернете можно найти довольно большое количество готовых решений по данной проблеме. Спасибо.

]]>
http://sysadm.pp.ua/interestnoe/skype-history-search.html/feed 5
Оптимизация NFS http://sysadm.pp.ua/linux/nfs-optimization.html http://sysadm.pp.ua/linux/nfs-optimization.html#respond Mon, 21 Nov 2016 20:25:57 +0000 http://sysadm.pp.ua/?p=1350 NFS_LinuxВ предыдущей статье шла речь о установке, настройке и монтировании NFS шары с параметрами по умолчанию. Сейчас можно немного улучшить производительность как со стороны сервера, так и клиентской части. Но хочу заметить, что в зависимости от конфигурации и оборудования те же параметры могут и ухудшить производительность NFS.

Конфигурация сервера:

  • CPU: 16 cores (32 threads)
  • RAM: 64GB
  • Network: 4 x 1 Gbit

Улучшать будем в три этапа:

  1. Общее для клиента и сервера
  2. Серверная часть
  3. Клиентская часть

1 Общее для клиента и сервера

1.1 Параметры ядра

Первым делом подправим настройки ядра для улучшения производительности как с клиентской, так и с серверной стороны. Есть такая штука как буфер сокета. Такой буфер есть на входящие и исходящие запроси. Так как RPC запросов на запись и считывание может быть много, и если CPU или диск не успевает все обработать, то мы храним все запросы в маленькой очереди сокета, чтобы не потерялись. Из документации по ядру:

  • rmem_default (The default setting of the socket receive buffer in bytes)
  • rmem_max (The maximum receive socket buffer size in bytes)
  • wmem_default (The default setting (in bytes) of the socket send buffer)
  • wmem_max (The maximum send socket buffer size in bytes)

Размер буфера будем выставлять в соотношении 1 MiB на каждый 1 GB оперативной памяти. Нужные параметры выставляются следующим образом.

root@nfs:~# sysctl -w net.core.rmem_default=67108864
или
root@nfs:~# echo 67108864 > /proc/sys/net/core/rmem_default

root@nfs:~# sysctl -w net.core.rmem_max=67108864
или
root@nfs:~# echo 67108864 > /proc/sys/net/core/rmem_max

root@nfs:~# sysctl -w net.core.wmem_default=67108864
или
root@nfs:~# echo 67108864 > /proc/sys/net/core/wmem_default

root@nfs:~# sysctl -w net.core.wmem_max=67108864
или
root@nfs:~# echo 67108864 > /proc/sys/net/core/wmem_max 

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

root@nfs:~# cat /etc/sysctl.conf
…
net.core.wmem_max = 67108864
net.core.rmem_max = 67108864
net.core.wmem_default = 67108864
net.core.rmem_default = 67108864
…

Также нужно увеличить общую очередь всех входящих пакетов, UDP и TCP буфер для всех сокетов. Из документации ядра:

  • udp_mem

Vector of 3 INTEGERs: min, pressure, max (in pages). Number of pages allowed for queueing by all UDP sockets.
min: Below this number of pages UDP is not bothered about its memory appetite. When amount of memory allocated by UDP exceeds this number, UDP starts to moderate memory usage.
pressure: This value was introduced to follow format of tcp_mem.
max: Number of pages allowed for queueing by all UDP sockets.
Defaults are calculated at boot time from amount of available memory.

  • tcp_mem

Vector of 3 INTEGERs: min, pressure, max (in pages).
min: below this number of pages TCP is not bothered about its memory appetite.
pressure: when amount of memory allocated by TCP exceeds this number of pages, TCP moderates its memory consumption and enters memory pressure mode, which is exited when memory consumption falls under «min».
max: number of pages allowed for queueing by all TCP sockets.
Defaults are calculated at boot time from amount of available memory.

  • netdev_max_backlog

Maximum number of packets, queued on the INPUT side, when the interface receives packets faster than kernel can process them.

tcp_mem и udp_mem измеряется в страницах памяти. Размер одной страницы – 4096 байт. По умолчанию, он большой, но можно увеличить на 10-20%, а netdev_max_backlog можно увеличить в 3 раза.

root@nfs:~# sysctl -w net.ipv4.udp_mem="1549836 2066449 3099672"
или
root@nfs:~# echo “1549836 2066449 3099672” > /proc/sys/net/ipv4/udp_mem

root@nfs:~# sysctl -w net.ipv4.tcp_mem="1549836 2066449 3099672"
или
root@nfs:~# echo “1549836 2066449 3099672” > /proc/sys/net/ipv4/tcp_mem

root@nfs:~# sysctl -w net.core.netdev_max_backlog=3000
или
root@nfs:~# echo 3000 > /proc/sys/net/core/netdev_max_backlog

Т.е. min = 1549836 pages = 1549836 x 4096 byte = 6348128256 byte = ~5.9 GB.
После, нужно добавить все в автозагрузку. После чего, мы должны получить следующею картину.

root@nfs:~# cat /etc/sysctl.conf
…
net.core.wmem_max = 67108864
net.core.rmem_max = 67108864
net.core.wmem_default = 67108864
net.core.rmem_default = 67108864
net.ipv4.udp_mem = "1549836 2066449 3099672"
net.ipv4.tcp_mem = "1549836 2066449 3099672"
net.core.netdev_max_backlog = 3000
…

1.2 Сетевой стек

1.2.1 Ring buffer (Driver queue)

Рассмотрим схему сетевого стека, которую мы будем улучшать (рис. 1), чтобы понять, как вообще происходить передача данных через сетевую карту. Между IP стеком (IP stack) и контроллером сетевой карты располагается “очередь драйвера” (Driver queue). Что также называют FIFO ring buffer. В этой очереди хранятся указатели на упомянутые выше буферы сокетов ядра (SKB), которые в свою очередь уже хранят сами пакетные данные. В IP стеке в свою очередь храниться очередь IP пакетов. Аппаратный драйвер опустошает очередь IP стека и по шине данных отправляет информацию через NIC дальше. Driver queue – это простая first-in, first-out очередь где все запросы идут и обрабатываются последовательно (в принципе, что и должна делать сетевая карта быстро и просто). Но между IP стеком и этой очередью есть еще специальный слой для управления трафиком (Queueing discipline – Qdisc), а именно:

  • классификация
  • приоритетность
  • рейт

Здесь как раз выставляются биты TOS. Тюнить его мы не будем, но это тоже возможно.

NFS_tune

Рисунок 1 — Схема сетевого стека

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

root@nfs:~# ethtool -g eth0
Ring parameters for eth0:
Pre-set maximums:
RX:             4096
RX Mini:        0
RX Jumbo:       0
TX:             4096
Current hardware settings:
RX:             256
RX Mini:        0
RX Jumbo:       0
TX:             256

Это означает, что драйвер этой сетевой карты может держать в очереди не больше 4096 SKB-дескрипторов. Этот параметр нужно улучшать, если NIC драйвер не поддерживает BQL(Byte Queue Limits). BQL появился начиная с ядра 3.3 для автоматического вычисления размера очереди драйвера. BQL тюнить не надо, его максимальный лимит можно узнать следующим образом.

root@nfs:~# find /sys/ -name 'byte_queue_limits'
root@nfs:~# cat cat /sys/devices/pci0000:00/0000:00:1c.0/0000:06:00.0/net/eth0/queues/tx-0/byte_queue_limits/limit_max
1879048192

Как видно, это 1.8GB (этот параметр измеряется уже в байтах).
Для случаев, когда нет поддержки BQL, очередь драйвера улучшается следующим способом.

root@nfs:~# ethtool -G eth0 tx 4096
root@nfs:~# ethtool -G eth1 tx 4096
root@nfs:~# ethtool -G eth2 tx 4096
root@nfs:~# ethtool -G eth4 tx 4096 
root@nfs:~# ethtool -G eth0 rx 4096
root@nfs:~# ethtool -G eth1 rx 4096
root@nfs:~# ethtool -G eth2 rx 4096
root@nfs:~# ethtool -G eth4 rx 4096

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

1.2.2 MTU

Как мы знаем, у сетевых карт есть максимальный размер передаваемого блока данных (MTU). По умолчанию он становит 1500 байт. Если на уровни приложений какой-то апликейшн отправляет пакет размером 5КB в буфер сокета, то ІР стеку этот пакет нужно будет разбить на 4 IP пакета и передать на сетевую карту через очередь драйвера (т.е. 1500 х 4 = 6КВ и 1КВ лишних данных). Чтобы избежать данного overhead-a в линуксе имплементировано:

  • TCP segmentation offload (TSO)
  • UDP fragmentation offload (UFO)
  • Generic segmentation offload (GSO)

Посмотреть значение этих параметров можно так:

root@nfs:~# ethtool -k eth0 | grep -E 'tcp-segmentation-offload|udp-fragmentation-offload|generic-segmentation-offload'
tcp-segmentation-offload: on
udp-fragmentation-offload: off [fixed]
generic-segmentation-offload: on

Все это позволяет ІР стеку создавать пакеты размер которых превышает MTU (IPv4 maximum = 65536 байт) и добавить их в очередь драйвера, где уже самой NIC карте предоставляется роль разбиения пакетов на нужный размер. И в этом случаи мы можем ей помочь, увеличив размер MTU используя Jumbo Frames до 9КВ.

root@nfs:~# ifconfig eth0 mtu 9000
root@nfs:~# ifconfig eth1 mtu 9000
root@nfs:~# ifconfig eth2 mtu 9000
root@nfs:~# ifconfig eth3 mtu 9000

Данные команды увеличат размер MTU до 9000. Теперь проверяем новый размер MTU и также добавляем изменения в настройку интерфейсов.

root@nfs:~# netstat -i | awk '{print $1,$2}'
Kernel Interface
Iface MTU
eth0 9000
eth1 9000
eth2 9000
eth4 9000

root@nfs:~# vim /etc/network/interfaces
...
iface xxx inet static
   ...
   mtu 9000
   ...
...

Но хочу заметить, что если сервер соединен с клиентом через сетевой свитч/роутер, то Jambo frames должен также быть включен на сетевом оборудовании, иначе возникнут проблемы с сетью.

2 Серверная часть

Чисто серверная часть заключается в улучшении NFSd плис предыдущие все настройки ядра и сети. Исходя из Solaris NFS Server Performance and Tuning Guide for Sun Hardware количество nfsd демонов (потоков) должно быть равным:

  • 2 на каждый активный клиентский процесс
  • 16-32 на каждый серверный CPU
  • 16 на 10 Мбит-ную или 160 на 100 Мбит-ную сеть

Добавить nfsd демонов можно следующими способами (20 nfsd/CPU).

root@sto:~# rpc.nfsd 640     
root@sto:~# echo 640 > /proc/fs/nfsd/threads
root@sto:~# vim /etc/default/nfs-kernel-server
…
RPCNFSDCOUNT=640
…

Первые две команды добавят nfsd процессов на лету (в реальном времени) без перезагрузки nfsd демона. Последняя команда добавить конфигурацию для автостарта nfsd, чтобы применить эту настройку, нужно перезагрузить nfsd демон.

3 Клиентская часть

На клиентской стороне можно проводить манипуляцию с опциями монтирования плюс все настройки ядра и сети из пункта 1 этой статьи.
В предыдущей статье мы уже проводили монтирование NFS шары с описанием опций. В данном случаи мы добавим только те опции, которые помогут улучшить производительность.

root@client:~# mount -o rw,soft,nfsvers=3,intr,bg,timeo=100,retrans=8,rsize=1048576,wsize=1048576 sto:/data01 /mnt/sto

Все эти флаги описаны в предыдущей статье. Если коротко, здесь мы монтируем NFS v3 шару в режиме soft с интервалом таймаута запросов в 10 секунд с 8-ю попытками подключения до сервера. Максимальный размер для NFS запросов на считывания и записи становит 1048576 (1MiB).
Если используется Jambo Frames, то rsize и wsize можно поставить 9000 байт, и тогда каждый клиентский NFS запрос будет передаваться по сети без фрагментации.
Хочу заметить, что даже если вы указали в опциях монтирования самый большой размер для запросов, то при монтировании, ядро само обрежет до максимального, который оно может поддерживать.

root@client:~# cat /proc/mounts | grep sto
sto:/data01 /mnt/sto nfs rw,relatime,vers=3,rsize=65536,wsize=65536,namlen=255,soft,proto=tcp,timeo=100,retrans=8,sec=sys,mountaddr=sto,mountvers=3,mountport=47879,mountproto=udp,local_lock=none,addr=x.x.x.x 0 0
или
root@client:~# nfsstat -m

Манипуляции с timeo и retrains (увеличивать значения) нужно проводить если вы получаете ошибки вида:

kernel: nfs: server < system name > not responding, timed out 

Или видите, что retrans счетчик начал стремительно расти:

root@client:~# nfsstat -rc
Client rpc stats:
calls      retrans    authrefrsh
281447039   12930      281455555

На этом все. В следующей статье пойдет речь о мониторинги и логировании в NFS.

]]>
http://sysadm.pp.ua/linux/nfs-optimization.html/feed 0
Создание и редактирование deb пакетов http://sysadm.pp.ua/linux/deb-creation-edit.html http://sysadm.pp.ua/linux/deb-creation-edit.html#respond Sun, 30 Oct 2016 14:17:42 +0000 http://sysadm.pp.ua/?p=1344 x-debian-packageХотел бы навести маленькую статью заметку о том, как можно редактировать (вносить изменения) deb пакеты. Рано или поздно каждый администратор сталкивается с нуждой сборки или редактирования установочных пакетов. К примеру, мы используем pound в роли фронт-енда для https. По умолчанию, он пишет все логи в syslog.log, и для того, чтобы он писал в свой собственный файл, нужно внести изменения не только в pound, но и в syslog конфигурацию. Плюс нужно добавить ротейт логов. Чтобы каждый раз не проделывать все изменения после установки, мы можем добавить все нужные файлы конфигураций и папки в deb-пакет pound-а, и уже устанавливать его вместо репозиторного.
Будем редактировать pound под дистрибутивом Ubuntu 16.04.

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

root@dpkg:~# apt download pound

После этого, у нас в рабочей директории появиться пакет pound.

root@dpkg:~# ls -l pound_2.6-6.1_amd64.deb 
-rw-r--r-- 1 root root 92604 May  7  2015 pound_2.6-6.1_amd64.deb

Посмотрим из каких файлов состоит этот пакет.

root@dpkg:~# dpkg -c pound_2.6-6.1_amd64.deb 
drwxr-xr-x root/root         0 2015-05-07 00:26 ./
drwxr-xr-x root/root         0 2015-05-07 00:26 ./usr/
drwxr-xr-x root/root         0 2015-05-07 00:26 ./usr/sbin/
-rwxr-xr-x root/root     14560 2015-05-07 00:26 ./usr/sbin/poundctl
-rwxr-xr-x root/root    103456 2015-05-07 00:26 ./usr/sbin/pound
drwxr-xr-x root/root         0 2015-05-07 00:26 ./usr/share/
drwxr-xr-x root/root         0 2015-05-07 00:26 ./usr/share/doc/
drwxr-xr-x root/root         0 2015-05-07 00:26 ./usr/share/doc/pound/
-rw-r--r-- root/root      1272 2015-05-07 00:26 ./usr/share/doc/pound/changelog.Debian.gz
-rw-r--r-- root/root      5782 2011-12-28 15:57 ./usr/share/doc/pound/FAQ.gz
-rw-r--r-- root/root       681 2014-10-20 00:11 ./usr/share/doc/pound/copyright
-rw-r--r-- root/root     12826 2011-12-28 15:57 ./usr/share/doc/pound/README.gz
drwxr-xr-x root/root         0 2015-05-07 00:26 ./usr/share/doc/pound/examples/
-rw-r--r-- root/root      7068 2011-12-28 15:57 ./usr/share/doc/pound/examples/z2_2_5_1.py.gz
-rw-r--r-- root/root      9166 2011-12-28 15:57 ./usr/share/doc/pound/examples/z2_2_6_1.py.gz
drwxr-xr-x root/root         0 2015-05-07 00:26 ./usr/share/man/
drwxr-xr-x root/root         0 2015-05-07 00:26 ./usr/share/man/man8/
-rw-r--r-- root/root     11133 2015-05-07 00:26 ./usr/share/man/man8/pound.8.gz
-rw-r--r-- root/root      1024 2015-05-07 00:26 ./usr/share/man/man8/poundctl.8.gz
drwxr-xr-x root/root         0 2015-05-07 00:26 ./etc/
drwxr-xr-x root/root         0 2015-05-07 00:26 ./etc/init.d/
-rwxr-xr-x root/root      2061 2014-10-20 00:20 ./etc/init.d/pound
drwxr-xr-x root/root         0 2015-05-07 00:26 ./etc/pound/
-rw-r--r-- root/root       927 2015-05-07 00:26 ./etc/pound/pound.cfg

Мы хотим, чтобы pound писал логи в папку /var/log/pound. Также нужно сразу добавить logrotate для этой папки, чтобы лог-файлы не росли до заоблачных размеров.
Следовательно, нам нужно добавить в deb пакет папку с логфайлом, конфигурацию для logrotat-а и конфигурацию для syslog.
Распакуем deb пакет.

root@dpkg:~# dpkg-deb -x pound_2.6-6.1_amd64.deb pound_folder/
root@dpkg:~# ls pound_folder/
etc  usr

Теперь переходим в новосозданную папку и добавляем все нужных папки и конфигурации.
Для начала добавляем папку для логов

root@dpkg:~# cd pound_folder/

root@dpkg:~/pound_folder# mkdir -pv var/log/pound
mkdir: created directory 'var'
mkdir: created directory 'var/log'
mkdir: created directory 'var/log/pound'

root@dpkg:~/pound_folder# touch var/log/pound/pound.log

Далее добавляем конфигурацию для logrotate.

root@dpkg:~/pound_folder# mkdir -pv etc/logrotate.d
mkdir: created directory 'etc/logrotate.d'

root@dpkg:~/pound_folder# vim etc/logrotate.d/pound
…
/var/log/pound/pound.log {
    daily
    dateext
    dateformat .%Y-%m-%d
    rotate 30
    notifempty
    missingok
    compress
    create 0644 syslog adm
    copytruncate
…

Теперь добавим конфигурацию для syslog (чтобы pound писал в свой файлик).

root@dpkg:~/pound_folder# mkdir -pv etc/rsyslog.d
mkdir: created directory 'etc/rsyslog.d'

root@dpkg:~/pound_folder# vim etc/rsyslog.d/pound.conf 
…
local0.*                        -/var/log/pound/pound.log
…

Осталось только подправить конфигурация самого pound-а.

root@dpkg:~/pound_folder#  vim etc/pound/pound.cfg
…
LogFacility local0
…

На этом приготовления завершены. Теперь нужно добавить описание для нашего пакета (control-information есть обязательным для всех deb пакетов). Его можно извлечь из скаченного пакета и обязательно поместить в нашу с именем DEBIAN.

root@dpkg:~/pound_folder# dpkg-deb -e ../pound_2.6-6.1_amd64.deb ./DEBIAN

root@dpkg:~/pound_folder# tree DEBIAN/
DEBIAN/
├── conffiles
├── control
├── md5sums
├── postinst
├── postrm
└── prerm

Также, извлечь информацию о пакете и дерево файлов можно было одной командой:

root@dpkg:~# dpkg-deb -R pound_2.6-6.1_amd64.deb pound_folder/

Теперь редактируем DEBIAN/control файл.

root@dpkg:~/pound_folder# vim DEBIAN/control 
…
Package: my-pound
Version: 2.6-6.1
Architecture: amd64
Maintainer: alex
Original-Maintainer: Brett Parker <iDunno@sommitrealweird.co.uk>
Installed-Size: 232
Depends: libc6 (>= 2.14), libpcre3, libssl1.0.0 (>= 1.0.0)
Section: net
Priority: extra
Homepage: http://www.apsis.ch/pound/
Description: reverse proxy, load balancer and HTTPS front-end for Web servers
 Pound was developed to enable distributing the load among several Web-servers
 and to allow for a convenient SSL wrapper for those Web servers that do not
 offer it natively.
…

Также добавим m5sum каждого добавленного файла.

root@dpkg:~/pound_folder# md5sum etc/logrotate.d/pound >> DEBIAN/md5sums 
root@dpkg:~/pound_folder# md5sum etc/rsyslog.d/pound.conf >> DEBIAN/md5sums 
root@dpkg:~/pound_folder# md5sum var/log/pound/pound.log >> DEBIAN/md5sums 

root@dpkg:~/pound_folder# tail -5 DEBIAN/md5sums 
aabd8125f84d54348ecacb3db49b8e7c  usr/share/man/man8/pound.8.gz
3f28a8e93815524fd805c8be51aaa29c  usr/share/man/man8/poundctl.8.gz
a5412406ce20f98671b4b8876da6aa29  etc/logrotate.d/pound
a326a3e96bfdb8921e48e1b13ca57477  etc/rsyslog.d/pound.conf
d41d8cd98f00b204e9800998ecf8427e  var/log/pound/pound.log

Теперь осталось собрать новый пакет (название пакета я изменил просто для примера).

root@dpkg:~/pound_folder# dpkg-deb -b ../pound_folder ../my-pound_2.6-6.1_amd64.deb
dpkg-deb: building package 'my-pound' in '../my-pound_2.6-6.1_amd64.deb'

Посмотрим какие файлы в нашем новом пакете.

root@dpkg:~# dpkg -c my-pound_2.6-6.1_amd64.deb 
drwxr-xr-x root/root         0 2016-10-30 15:35 ./
drwxr-xr-x root/root         0 2016-10-30 15:14 ./etc/
drwxr-xr-x root/root         0 2015-05-07 00:26 ./etc/init.d/
-rwxr-xr-x root/root      2061 2014-10-20 00:20 ./etc/init.d/pound
drwxr-xr-x root/root         0 2016-10-30 15:11 ./etc/logrotate.d/
-rw-r--r-- root/root       174 2016-10-30 15:11 ./etc/logrotate.d/pound
drwxr-xr-x root/root         0 2016-10-30 15:16 ./etc/pound/
-rw-r--r-- root/root       946 2016-10-30 15:16 ./etc/pound/pound.cfg
drwxr-xr-x root/root         0 2016-10-30 15:18 ./etc/rsyslog.d/
-rw-r--r-- root/root        58 2016-10-30 15:18 ./etc/rsyslog.d/pound.conf
drwxr-xr-x root/root         0 2015-05-07 00:26 ./usr/
drwxr-xr-x root/root         0 2015-05-07 00:26 ./usr/sbin/
-rwxr-xr-x root/root     14560 2015-05-07 00:26 ./usr/sbin/poundctl
-rwxr-xr-x root/root    103456 2015-05-07 00:26 ./usr/sbin/pound
drwxr-xr-x root/root         0 2015-05-07 00:26 ./usr/share/
drwxr-xr-x root/root         0 2015-05-07 00:26 ./usr/share/doc/
drwxr-xr-x root/root         0 2015-05-07 00:26 ./usr/share/doc/pound/
drwxr-xr-x root/root         0 2015-05-07 00:26 ./usr/share/doc/pound/examples/
-rw-r--r-- root/root      7068 2011-12-28 15:57 ./usr/share/doc/pound/examples/z2_2_5_1.py.gz
-rw-r--r-- root/root      9166 2011-12-28 15:57 ./usr/share/doc/pound/examples/z2_2_6_1.py.gz
-rw-r--r-- root/root     12826 2011-12-28 15:57 ./usr/share/doc/pound/README.gz
-rw-r--r-- root/root       681 2014-10-20 00:11 ./usr/share/doc/pound/copyright
-rw-r--r-- root/root      5782 2011-12-28 15:57 ./usr/share/doc/pound/FAQ.gz
-rw-r--r-- root/root      1272 2015-05-07 00:26 ./usr/share/doc/pound/changelog.Debian.gz
drwxr-xr-x root/root         0 2015-05-07 00:26 ./usr/share/man/
drwxr-xr-x root/root         0 2015-05-07 00:26 ./usr/share/man/man8/
-rw-r--r-- root/root      1024 2015-05-07 00:26 ./usr/share/man/man8/poundctl.8.gz
-rw-r--r-- root/root     11133 2015-05-07 00:26 ./usr/share/man/man8/pound.8.gz
drwxr-xr-x root/root         0 2016-10-30 14:55 ./var/
drwxr-xr-x root/root         0 2016-10-30 14:55 ./var/log/
drwxr-xr-x root/root         0 2016-10-30 15:08 ./var/log/pound/
-rw-r--r-- root/root         0 2016-10-30 15:08 ./var/log/pound/pound.log

Как видим, все наши файлы есть в сборке.
Теперь можно установить новый пакет.

root@dpkg:~# dpkg -i my-pound_2.6-6.1_amd64.deb 
Selecting previously unselected package my-pound.
(Reading database ... 92007 files and directories currently installed.)
Preparing to unpack my-pound_2.6-6.1_amd64.deb ...
Unpacking my-pound (2.6-6.1) ...
Setting up my-pound (2.6-6.1) ...
Processing triggers for systemd (229-4ubuntu11) ...
Processing triggers for ureadahead (0.100.0-19) ...
Processing triggers for man-db (2.7.5-1) ...

root@dpkg:~# dpkg -l | grep pound
ii  my-pound                           2.6-6.1                           amd64        reverse proxy, load balancer and HTTPS front-end for Web servers

Теперь внесем пару изменений и стартуем pound

root@dpkg:~# vim /etc/default/pound
…
startup=1
…

root@dpkg:~# chown syslog:adm /var/log/pound/pound.log
root@dpkg:~# /etc/init.d/rsyslog restart
root@dpkg:~# /etc/init.d/pound start

Проверяем 443 порт.

root@dpkg:~# curl https://localhost   
curl: (35) gnutls_handshake() failed: An unexpected TLS packet was received.

root@dpkg:~# ls -l /var/log/pound/  
total 4
-rw-r--r-- 1 syslog adm 198 Oct 30 16:00 pound.log 

Как видим, pound не настроен, поэтому выдал ошибку и залогировал ее в свой лог файл.
Осталось проверить logrotate.

root@dpkg:~# logrotate -v -f /etc/logrotate.d/pound 
reading config file /etc/logrotate.d/pound
Handling 1 logs
rotating pattern: /var/log/pound/pound.log  forced from command line (30 rotations)
empty log files are not rotated, old logs are removed
considering log /var/log/pound/pound.log
  log needs rotating
rotating log /var/log/pound/pound.log, log->rotateCount is 30
Converted ' .%Y-%m-%d' -> '.%Y-%m-%d'
dateext suffix '.2016-10-30'
glob pattern '.[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]'
glob finding old rotated logs failed
copying /var/log/pound/pound.log to /var/log/pound/pound.log.2016-10-30
truncating /var/log/pound/pound.log
compressing log with: /bin/gzip

root@dpkg:~# ls -l /var/log/pound/
total 4
-rw-r--r-- 1 syslog adm   0 Oct 30 16:02 pound.log
-rw-r--r-- 1 syslog adm 136 Oct 30 16:00 pound.log.2016-10-30.gz

root@dpkg:~# curl https://localhost                 
curl: (35) gnutls_handshake() failed: An unexpected TLS packet was received.

root@dpkg:~# ls -l /var/log/pound/ 
total 8
-rw-r--r-- 1 syslog adm  78 Oct 30 16:02 pound.log
-rw-r--r-- 1 syslog adm 136 Oct 30 16:00 pound.log.2016-10-30.gz

Все отлично, лог заротейтился, потом мы проверили или пишется лог в новый файл – все ок.
На этом все. Как создавать пакет с новым названием для поддержки мультиверсионности можно почитать здесь

]]>
http://sysadm.pp.ua/linux/deb-creation-edit.html/feed 0
Vagrant. Настройка версионности боксов http://sysadm.pp.ua/linux/vagrant-versioning.html http://sysadm.pp.ua/linux/vagrant-versioning.html#comments Tue, 11 Oct 2016 11:13:28 +0000 http://sysadm.pp.ua/?p=1332 vagrant_versioningВ предыдущих статьях мы немного познакомились с Vagrantfile и боксами, теперь поговорим о такой штуке, как версионность. Также, как системы управления версиями (к примеру, git, svn), vagrant имеет версионность создаваемых боксов. Vagrant имеет целое облачное хранилище боксов — atlas.hashicorp.com где храниться уйма боксов с различными ОС (при создании ВМ vagrant сначала проверить есть ли нужный бокс локально, а потом полезет искать на atlas сайт, если не найдет). К примеру, мы создали свой Ubuntu 14.04 бокс. Прошло 2 месяца, и мы видим, что много пакетов и заплаток безопасности нужно обновить. Чтобы не делать эти обновления каждый раз, когда создается новая ВМ из этого бокса, мы обновляемся и создаем новый бокс. Теперь новый бокс нужно добавить в систему, но в данном случаи нам придется менять название, так как уже есть старый с таким же именем. Проблема. Теперь нужно удалять старый, либо называть новый по-другому.
Чтобы избежать данной проблемы – нужно использовать версионность. Свои боксы можно заливать на atlas, то я предпочитаю сделать свой маленький хостинг custom-ных боксов. Принцип следующий: подымается отдельный сервер, на котором будут доступны все созданные боксы всех версий. Сервере виртуальных машин будет использовать в роли репозитория боксов уже не atlas.hashicorp.com, а наш URL, прописанный в Vagrantfile.
Не знаю, как это все прозвучало для читателя, но после примера все станет на свои места.

Будем настраивать следующею схему (рис. 1).

vagrant4
Рисунок 1 – Схема сети

В данном примере будет использоваться локальный Windows 10 сервер в роли сервера виртуальных машин (VMs server) и удаленный Ubuntu в роли Веб-сервера с Vagrant боксами.

1 Создание первоначального бокса

У меня уже есть виртуальная машина «Ubuntu 16.04 Template» (рис. 2) подготовленная к созданию бокса (как подготовить, можно посмотреть в этой статье http://sysadm.pp.ua/linux/sistemy-virtualizacii/vagrant-box-creation.html).

vagrant4_0
Рисунок 2 – Вид Virtualbox UI

Создаем новый контейнер.

PS D:\Work\Vagrant\custom_boxes> vagrant package --base 'Ubuntu 16.04 Template' --output Ubuntu16.04_1.0.0.box
==> Ubuntu 16.04 Template: Exporting VM...
==> Ubuntu 16.04 Template: Compressing package to: D:/Work/Vagrant/custom_boxes/Ubuntu16.04_1.0.0.box

Теперь у нас есть образ первоначального бокса Ubuntu 16.04 версии 1.0.0.
Добавляем созданный бокс в список доступных.

PS D:\Work\Vagrant\custom_boxes> vagrant box add .\Ubuntu16.04_1.0.0.box --name "Ubuntu 16.04"
==> box: Box file was not detected as metadata. Adding it directly...
==> box: Adding box 'Ubuntu 16.04' (v0) for provider:
    box: Unpacking necessary files from: file://D:/Work/Vagrant/custom_boxes/Ubuntu16.04_1.0.0.box
    box: Progress: 100% (Rate: 37.2M/s, Estimated time remaining: --:--:--)
==> box: Successfully added box 'Ubuntu 16.04' (v0) for 'virtualbox'!

PS D:\Work\Vagrant\custom_boxes> vagrant box list
Ubuntu 16.04 (virtualbox, 0)

Как видим, у нас есть бокс ‘Ubuntu 16.04’. Теперь создаем виртуальную машину на его основе.

PS D:\Work\Vagrant\custom_boxes> cd ..\ubuntu16_04\
PS D:\Work\Vagrant\ubuntu16_04> vagrant init
PS D:\Work\Vagrant\ubuntu16_04> cat Vagrantfile
…
Vagrant.configure("2") do |config|
  config.vm.box = "Ubuntu 16.04"
end
…
PS D:\Work\Vagrant\ubuntu16_04> vagrant up

После этого, у нас запуститься образ Ubuntu 16.04.
Это стандартный способ создания виртуальной машины с бокса. На данном этапе, можно удалить ВМ с боксом (так как нам нужен только запакованный контейнер) и перейти к настройке репозитория.

PS D:\Work\Vagrant\ubuntu16_04> vagrant destroy
PS D:\Work\Vagrant\ubuntu16_04> vagrant box remove 'Ubuntu 16.04'
Removing box 'Ubuntu 16.04' (v0) with provider 'virtualbox'...

2 Настройка Vagrant box репозитория

Теперь можно настроить Веб-сервер, на котором будут хостится vagrant боксы. Переходим на ‘Vagrant boxes server’, устанавливаем веб-сервер apache и настраиваем виртуальный хост.

root@vghost:~# apt-get install apache2 -y
root@vghost:~# cat /etc/apache2/sites-enabled/000-default.conf 
…
&lt;VirtualHost *:80>
        ServerName my-vagrant-repo.home.ua
        ServerAdmin webmaster@localhost
        DocumentRoot /var/www/html/vagrant_boxes
        ErrorLog ${APACHE_LOG_DIR}/my-vagrant-repo.home.ua_error.log
        CustomLog ${APACHE_LOG_DIR}/my-vagrant-repo.home.ua_access.log combined
&lt;/VirtualHost>
…
root@vghost:~# service apache2 restart

Теперь добавляем каталог. Каталог являет собой JSON файлик в котором прописаны все версии определенного бокса в специфичном формате. Первым у нас будет ранее созданный Ubuntu 16.04. Заливаем образ на сервер и берем md5 сумму.

root@vghost:~# md5sum /var/www/html/vagrant_boxes/ubuntu_16.04/Ubuntu16.04_1.0.0.box 
72f0b69b12bdac1307efee3537ea31aa  vagrant_boxes/ubuntu_16.04/Ubuntu16.04_1.0.0.box

Теперь создаем json файлик и описываем наш первый бокс.

root@vghost:~# cat /var/www/html/vagrant_boxes/ubuntu_16.04/ubuntu_16.04.json    
{
    "name": "Ubuntu 16.04",
    "description": "Ubuntu 16.04 LTS 64-bit box",
    "versions": [{
        "_comment": "Initial Ubuntu 16.04 box",
        "version": "1.0.0",
        "providers": [{
                "name": "virtualbox",
                "url": "http://my-vagrant-repo.home.ua/ubuntu_16.04/Ubuntu16.04_1.0.0.box",
                "checksum_type": "md5",
                "checksum": "72f0b69b12bdac1307efee3537ea31aa"
        }]
    }]
}

Как видим, здесь описано имя бокса, его версия и информация о провайдере (в данном случае это virtualbox) с прямой ссылкой на образ скомплектованного бокса. Ссылка также может быть в виде пути к файлу.

…
                "url": "file:///var/www/html/vagrant_boxes/ubuntu_16.04/Ubuntu16.04_1.0.0.box"
…

Теперь каталог готов и состоит из одной версии Ubuntu 16.04.

3 Тестирование Vagrant репозитория

Теперь нам нужно скачать и добавить новый бокс. Это будет седлано автоматически, при создании новой виртуальной машины, только нужно прописать URL нашей репы. Домен я придумал, так что нужно прописать в hosts нужный резолв или добавить в DNS.

PS D:\Work\Vagrant\ubuntu16_04> cat C:\Windows\System32\drivers\etc\hosts
192.168.5.50 my-vagrant-repo.home.ua

Обновляем Vagrantfile.

PS D:\Work\Vagrant\ubuntu16_04> cat Vagrantfile
Vagrant.configure("2") do |config|
  config.vm.box = "Ubuntu 16.04"
  config.vm.box_url = "http://my-vagrant-repo.home.ua/ubuntu_16.04/ubuntu_16.04.json"
  config.vm.provider "virtualbox" do |vb|
      vb.name = 'My Ubuntu 16.04'
  end
end

Имя новой виртуалки будет «My Ubuntu 16.04».
Запускаем ВМ.

PS D:\Work\Vagrant\ubuntu16_04> vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Box 'Ubuntu 16.04' could not be found. Attempting to find and install...
    default: Box Provider: virtualbox
    default: Box Version: >= 0
==> default: Loading metadata for box 'http://my-vagrant-repo.home.ua/ubuntu_16.04/ubuntu_16.04.json'
    default: URL: http://my-vagrant-repo.home.ua/ubuntu_16.04/ubuntu_16.04.json
==> default: Adding box 'Ubuntu 16.04' (v1.0.0) for provider: virtualbox
    default: Downloading: http://my-vagrant-repo.home.ua/ubuntu_16.04/Ubuntu16.04_1.0.0.box
    default: Progress: 100% (Rate: 15.5M/s, Estimated time remaining: --:--:--)
    default: Calculating and comparing box checksum...
==> default: Successfully added box 'Ubuntu 16.04' (v1.0.0) for 'virtualbox'!
==> default: Importing base box 'Ubuntu 16.04'...
==> default: Matching MAC address for NAT networking...
==> default: Checking if box 'Ubuntu 16.04' is up to date...
==> default: Setting the name of the VM: My Ubuntu 16.04
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
==> default: Forwarding ports...
    default: 22 (guest) => 2222 (host) (adapter 1)
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
    default: SSH address: 127.0.0.1:2222
    default: SSH username: vagrant
    …

Как видим, система не нашла бокса с заданным именем локально и решила скачать его по заданному URL. Бокс скачался и добавился в список.

PS D:\Work\Vagrant\ubuntu16_04> vagrant box list
Ubuntu 16.04 (virtualbox, 1.0.0)

Видим, что у нас теперь есть версия бокса 1.0.0. Теперь можно создать новую версию.
Логинимся на поднятую ВМ (рис. 3)

vagrant4_1
Рисунок 3 – Вид новосозданной ОС при логине (mofd)

Как видим, мы можем обновить 3 пакета. Обновляем пакеты и информацию по версии бокса.

root@ubuntu16:~# apt-get upgrade
root@ubuntu16:~# echo '1.0.1' > /etc/box-version

Теперь у нас есть подготовленная к новой версии бокса ВМ.

4 Обновление версии Vagrant бокса

Теперь пакуем новый бокс из обновленной ОС и заливаем на сервер.

PS D:\Work\Vagrant\ubuntu16_04> cd ..\custom_boxes\
PS D:\Work\Vagrant\custom_boxes> vagrant package --base 'My Ubuntu 16.04' --output Ubuntu16.04_1.0.1.box
==> My Ubuntu 16.04: Attempting graceful shutdown of VM...
    My Ubuntu 16.04: Guest communication could not be established! This is usually because
    My Ubuntu 16.04: SSH is not running, the authentication information was changed,
    My Ubuntu 16.04: or some other networking issue. Vagrant will force halt, if
    My Ubuntu 16.04: capable.
==> My Ubuntu 16.04: Forcing shutdown of VM...
==> My Ubuntu 16.04: Clearing any previously set forwarded ports...
==> My Ubuntu 16.04: Exporting VM...
==> My Ubuntu 16.04: Compressing package to: D:/Work/Vagrant/custom_boxes/Ubuntu16.04_1.0.1.box

Бокс я залил в ту же папку, что и первый. Теперь нужно взять md5 сумму и поправить json.

root@vghost:~# md5sum /var/www/html/vagrant_boxes/ubuntu_16.04/Ubuntu16.04_1.0.1.box 
44c24bc062dc5d07ca16d245ae6dce73  Ubuntu16.04_1.0.1.box

root@vghost:~# cat /var/www/html/vagrant_boxes/ubuntu_16.04/ubuntu_16.04.json    
{
    "name": "Ubuntu 16.04",
    "description": "Ubuntu 16.04 LTS 64-bit box",
    "versions": [{
        "_comment": "Initial Ubuntu 16.04 box",
        "version": "1.0.0",
        "providers": [{
                "name": "virtualbox",
                "url": "http://my-vagrant-repo.home.ua/ubuntu_16.04/Ubuntu16.04_1.0.0.box",
                "checksum_type": "md5",
                "checksum": "72f0b69b12bdac1307efee3537ea31aa"
        }]
    }, {
        "_comment": "Latest package updated Ubuntu 16.04 box",
        "version": "1.0.1",
        "providers": [{
                "name": "virtualbox",
                "url": "http://my-vagrant-repo.home.ua/ubuntu_16.04/Ubuntu16.04_1.0.1.box",
                "checksum_type": "md5",
                "checksum": "44c24bc062dc5d07ca16d245ae6dce73"
        }]
    }]
}

Теперь идем обратно к ранее созданной ВМ и проверяем появилась ли новая версия.

PS D:\Work\Vagrant\ubuntu16_04> vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Checking if box 'Ubuntu 16.04' is up to date...
==> default: A newer version of the box 'Ubuntu 16.04' is available! You currently
==> default: have version '1.0.0'. The latest is version '1.0.1'. Run
==> default: `vagrant box update` to update.
…

Как видим, у нас есть новая версия бокса, кто бы мог подумать, давайте обновим его.

PS D:\Work\Vagrant\ubuntu16_04> vagrant box update
==> default: Checking for updates to 'Ubuntu 16.04'
    default: Latest installed version: 1.0.0
    default: Version constraints:
    default: Provider: virtualbox
==> default: Updating 'Ubuntu 16.04' with provider 'virtualbox' from version
==> default: '1.0.0' to '1.0.1'...
==> default: Loading metadata for box 'http://my-vagrant-repo.home.ua/ubuntu_16.04/ubuntu_16.04.json'
==> default: Adding box 'Ubuntu 16.04' (v1.0.1) for provider: virtualbox
    default: Downloading: http://my-vagrant-repo.home.ua/ubuntu_16.04/Ubuntu16.04_1.0.1.box
    default: Progress: 100% (Rate: 14.3M/s, Estimated time remaining: --:--:--)
    default: Calculating and comparing box checksum...
==> default: Successfully added box 'Ubuntu 16.04' (v1.0.1) for 'virtualbox'!

Проверяем какие у нас есть теперь версии.

PS D:\Work\Vagrant\ubuntu16_04> vagrant box list
Ubuntu 16.04 (virtualbox, 1.0.0)
Ubuntu 16.04 (virtualbox, 1.0.1)

Теперь, если мы удалим ранее созданную ВМ и подымим ее заново, то ничего не поменяется, Vagrant заюзает старый бокс, так как он не в курсе, чего именно вы ожидаете. Чтобы использовать новый, нам нужно либо удалить старый, либо добавить нужную версию в конфигурационный файл. Давайте поправим Vagrantfile и запустим новую ВМ.

PS D:\Work\Vagrant\ubuntu16_04> vagrant destroy
    default: Are you sure you want to destroy the 'default' VM? [y/N] y
==> default: Forcing shutdown of VM...
==> default: Destroying VM and associated drives...

PS D:\Work\Vagrant\ubuntu16_04> cat Vagrantfile
Vagrant.configure("2") do |config|
  config.vm.box = "Ubuntu 16.04"
  config.vm.box_url = "http://my-vagrant-repo.home.ua/ubuntu_16.04/ubuntu_16.04.json"
  config.vm.box_version = "1.0.1"
  config.vm.provider "virtualbox" do |vb|
      vb.name = 'My Ubuntu 16.04'
  end
end

PS D:\Work\Vagrant\ubuntu16_04> vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Importing base box 'Ubuntu 16.04'...
==> default: Matching MAC address for NAT networking...
==> default: Checking if box 'Ubuntu 16.04' is up to date...
==> default: Setting the name of the VM: My Ubuntu 16.04
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
==> default: Forwarding ports...
    default: 22 (guest) => 2222 (host) (adapter 1)
==> default: Booting VM...

Логинимся в новую ВМ (рис. 4)

vagrant4_2
Рисунок 4 – Вид логин скрина новой ВМ

Как видите, у нас теперь есть версионность. Если старые сборки боксов точно не нужны, просто удалите их.

PS D:\Work\Vagrant\ubuntu16_04> vagrant box remove 'Ubuntu 16.04' --box-version '1.0.0'
Removing box 'Ubuntu 16.04' (v1.0.0) with provider 'virtualbox'...

PS D:\Work\Vagrant\ubuntu16_04> vagrant box list
Ubuntu 16.04 (virtualbox, 1.0.1)

Если у вас будет несколько репозиториев, рано или поздно, нужно будет узнать откуда данный Vagrant box был скачан/добавлен. Раньше это можно было посмотреть используя опцию «-i» при запросе списка боксов, но теперь она не работает, так что нужно смотреть самим вручную в папке «~/.vagrant.d/boxes». Вот пример.

# Windows
PS C:\Users\Asus> cat '.\.vagrant.d\boxes\Ubuntu 16.04\metadata_url'
...
http://my-vagrant-repo.home.ua/ubuntu_16.04/ubuntu_16.04.json
...

# Linux
user@Hypervisor:~$ cat .vagrant.d/boxes/Ubuntu\ 16.04/metadata_url 
...
http://my-vagrant-repo.home.ua/ubuntu_16.04/ubuntu_16.04.json
...

Базу и основной принцип версионности Vagrant был описан, так что удачи в экспериментах.

]]>
http://sysadm.pp.ua/linux/vagrant-versioning.html/feed 1
Видео и аудио транскодинг. Мульти-версионность ffmpeg http://sysadm.pp.ua/linux/video-streaming/multiple-ffmpeg.html http://sysadm.pp.ua/linux/video-streaming/multiple-ffmpeg.html#respond Sat, 30 Jul 2016 13:59:53 +0000 http://sysadm.pp.ua/?p=1325 ffmpegВ предыдущей статье шла речь о сборке ffmpeg-а с поддержкой различных видео и аудио форматов. Так как транскодингом наша компания занимается уже долгое время, а прогресс не стоит на месте – возникает потребность в обновлении программного обеспечения. Эти обновления не всегда проходят гладко при переходе с одной версии продукта на более новую. Когда я пришел работать на данный проект, у нас использовался ffmpeg-0.10-1. Все устраивало до тех пор, пока не пришел таск на конкатенацию видео файлов (concat). Данный demuxer появился в ffmpeg версии 1.1. После недолгих размышлений было принято решение собирать последний ffmpeg с поддержкой мульти-версионности, т.е. на одном сервере должны работать несколько версий ffmpeg-a. Это было связано с тем, что последний ffmpeg (на данный момент — это версия 3.1.1) поменял названия и синтаксис многих опций и переписывать все возможные варианты команд было накладно. Вот решил поделиться опытом по решению такой задачи.

Сборка ffmpeg-3.1.1

В предыдущей статье мы компилили ffmpeg-2.4.1 и с тех пор мало какие библиотеки обновились, почти все остались на прежних версиях. Будем считать, что вы скачали все нужные либы. Приступаем к сборке. Сборка ffmpeg-3.1.1 будет проводиться под дистрибутивом Ubuntu 16.04.
Устанавливаем нужные для сборки пакеты.

root@16:~# apt-get install build-essential checkinstall libogg-dev unzip yasm libx11-dev libxext-dev libxfixes-dev --no-install-recommends

Будим считать, что все распакованные библиотеки лежат в папке sources, а собранные deb-пакеты будут лежать в папке sources/deb.

root@16:~# ls -1 sources/
deb
faac-1.28
faad2-2.7
ffmpeg-3.1.1
lame-3.99.5
libtheora-1.1.1
libvorbis-1.3.5
libvpx-master
opencore-amr-0.1.3
x264-snapshot-20160517-2245
xvidcore-1.3.3
yasm-1.3.0

У меня компиляция каждой библиотеки, кроме faac, прошла успешно. Фикс faac заключается в удалении строки “strcasestr(const char*, const char*)”:

root@16:~# sed -i -e '126d;' sources/faac-1.28/common/mp4v2/mpeg4ip.h

Мульти-версионности я добился путем добавления префикса ко всем собранным пакетам. Список команд выглядит следующим образом.

BUILD_DIR="/home/alex/sources"
PACKAGE_INSTALL_PREFIX="/opt/ffmpeg-3.1.1"
PACKAGE_MAINTAINER="oleksandr@sysadm.pp.ua"
PACKAGE_DOC_DIR="${PACKAGE_INSTALL_PREFIX}_doc"
PACKAGE_COMPILED_DIR="${BUILD_DIR}/deb/"
FFMPEG_VERSION="ff311"

mkdir -vp /opt/ffmpeg-3.1.1{,_doc}

cd ${BUILD_DIR}/yasm-1.3.0/
make clean
./configure --prefix=${PACKAGE_INSTALL_PREFIX}
make
checkinstall --pkgname="yasm-${FFMPEG_VERSION}" --pkgversion=1.3.0 --deldoc="yes" --type="debian" --install="no" --default --pakdir="${PACKAGE_COMPILED_DIR}" --maintainer="${PACKAGE_MAINTAINER}" --docdir="${PACKAGE_DOC_DIR}"

sleep 10

cd ${BUILD_DIR}/faad2-2.7/
make clean
./configure --prefix=${PACKAGE_INSTALL_PREFIX} --with-mp4v2
make
checkinstall --pkgname="faad-${FFMPEG_VERSION}" --pkgversion=2.7 --deldoc="yes" --type="debian" --install="no" --default --pakdir="${PACKAGE_COMPILED_DIR}" --maintainer="${PACKAGE_MAINTAINER}" --docdir="${PACKAGE_DOC_DIR}"

sleep 10

cd ${BUILD_DIR}/faac-1.28/
make clean
./configure --prefix=${PACKAGE_INSTALL_PREFIX} --with-mp4v2
make
checkinstall --pkgname="faac-${FFMPEG_VERSION}" --pkgversion=1.28 --deldoc="yes" --type="debian" --install="no" --default --pakdir="${PACKAGE_COMPILED_DIR}" --maintainer="${PACKAGE_MAINTAINER}" --docdir="${PACKAGE_DOC_DIR}"

sleep 10

cd ${BUILD_DIR}/lame-3.99.5/
make clean
./configure --prefix=${PACKAGE_INSTALL_PREFIX}
make
checkinstall --pkgname="lame-${FFMPEG_VERSION}" --pkgversion=3.99.5 --deldoc="yes" --type="debian" --install="no" --default --pakdir="${PACKAGE_COMPILED_DIR}" --maintainer="${PACKAGE_MAINTAINER}" --docdir="${PACKAGE_DOC_DIR}"

sleep 10

cd ${BUILD_DIR}/libvorbis-1.3.5/
make clean
./configure --prefix=${PACKAGE_INSTALL_PREFIX}
make
checkinstall --pkgname="libvorbis-${FFMPEG_VERSION}" --pkgversion=1.3.5 --deldoc="yes" --type="debian" --install="no" --default --pakdir="${PACKAGE_COMPILED_DIR}" --maintainer="${PACKAGE_MAINTAINER}" --docdir="${PACKAGE_DOC_DIR}"

sleep 10

cd ${BUILD_DIR}/libtheora-1.1.1/
make clean
./configure --prefix=${PACKAGE_INSTALL_PREFIX}
make
checkinstall --pkgname="libtheora-${FFMPEG_VERSION}" --pkgversion=1.1.1 --deldoc="yes" --type="debian" --install="no" --default --pakdir="${PACKAGE_COMPILED_DIR}" --maintainer="${PACKAGE_MAINTAINER}" --docdir="${PACKAGE_DOC_DIR}"

sleep 10

cd ${BUILD_DIR}/libvpx-master/
make clean
./configure --prefix=${PACKAGE_INSTALL_PREFIX} --enable-pic --enable-vp8 --enable-shared
make
checkinstall --pkgname="libvpx-${FFMPEG_VERSION}" --pkgversion=1.5.0 --deldoc="yes" --type="debian" --install="no" --default --pakdir="${PACKAGE_COMPILED_DIR}" --maintainer="${PACKAGE_MAINTAINER}" --docdir="${PACKAGE_DOC_DIR}"

sleep 10

cd ${BUILD_DIR}/x264-snapshot-20160517-2245/
make clean
./configure --prefix=${PACKAGE_INSTALL_PREFIX} --enable-shared --enable-static --disable-asm
make
checkinstall --pkgname="x264-${FFMPEG_VERSION}" --pkgversion=0.148 --deldoc="yes" --type="debian" --install="no" --default --pakdir="${PACKAGE_COMPILED_DIR}" --maintainer="${PACKAGE_MAINTAINER}" --docdir="${PACKAGE_DOC_DIR}"

sleep 10

cd ${BUILD_DIR}/opencore-amr-0.1.3/
make clean
./configure --prefix=${PACKAGE_INSTALL_PREFIX} 
make
checkinstall --pkgname="opencore-amr-${FFMPEG_VERSION}" --pkgversion=0.1.3 --deldoc="yes" --type="debian" --install="no" --default --pakdir="${PACKAGE_COMPILED_DIR}" --maintainer="${PACKAGE_MAINTAINER}" --docdir="${PACKAGE_DOC_DIR}"

sleep 10

cd ${BUILD_DIR}/xvidcore-1.3.3/build/generic/
make clean
./configure --prefix=${PACKAGE_INSTALL_PREFIX} 
make
checkinstall --pkgname="xvidcore-${FFMPEG_VERSION}" --pkgversion=1.3.3 --deldoc="yes" --type="debian" --install="no" --default --pakdir="${PACKAGE_COMPILED_DIR}" --maintainer="${PACKAGE_MAINTAINER}" --docdir="${PACKAGE_DOC_DIR}"

sleep 10

export LD_LIBRARY_PATH=${PACKAGE_INSTALL_PREFIX}:$LD_LIBRARY_PATH
export LDFLAGS="-L${PACKAGE_INSTALL_PREFIX}/lib"
export CFLAGS="-I${PACKAGE_INSTALL_PREFIX}/include"
cd ${BUILD_DIR}/ffmpeg-3.1.1
make clean
./configure --prefix=${PACKAGE_INSTALL_PREFIX} --enable-gpl --enable-version3 --enable-nonfree --enable-postproc --enable-libfaac --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libtheora --enable-libvorbis --enable-libx264 --enable-libvpx --enable-libxvid --enable-x11grab
make
checkinstall --pkgname="ffmpeg-${FFMPEG_VERSION}" --pkgversion=3.1.1 --deldoc="yes" --type="debian" --install="no" --default --pakdir="${PACKAGE_COMPILED_DIR}" --maintainer="${PACKAGE_MAINTAINER}" --docdir="${PACKAGE_DOC_DIR}"

В итоге у нас будет такой набор пакетов.

root@16:~# ls -1 sources/deb/                            
faac-ff311_1.28-1_amd64.deb
faad-ff311_2.7-1_amd64.deb
ffmpeg-ff311_3.1.1-1_amd64.deb
lame-ff311_3.99.5-1_amd64.deb
libtheora-ff311_1.1.1-1_amd64.deb
libvorbis-ff311_1.3.5-1_amd64.deb
libvpx-ff311_1.5.0-1_amd64.deb
opencore-amr-ff311_0.1.3-1_amd64.deb
x264-ff311_0.148-1_amd64.deb
xvidcore-ff311_1.3.3-1_amd64.deb
yasm-ff311_1.3.0-1_amd64.deb

Установка ffmpeg-3.1.1

Пакетики у нас есть, теперь можно перейти на другой сервер и установить новый ffmpeg-3.1.1.
Сначала установим дополнительные пакеты.

root@ffmpeg-server:~# apt-get install libogg-dev yasm libx11-dev libxext-dev libxfixes-dev --no-install-recommends

Теперь устанавливаем либы и сам ffmpeg

root@ffmpeg-server:~/deb# ls -1 | grep -v ffmpeg | xargs -i dpkg -i {}
root@ffmpeg-server:~/deb# dpkg -i ffmpeg-ff311_3.1.1-1_amd64.deb

В папке opt у нас должен появиться новый ffmpeg-3.1.1 и соответствующая документация.

root@ffmpeg-server:~/deb# ls -1 /opt/
ffmpeg-2.4.1  
ffmpeg-2.4.1_doc
ffmpeg-3.1.1  
ffmpeg-3.1.1_doc

Теперь проверяем работает ли новый ffmpeg

root@ffmpeg-server:~/deb# /opt/ffmpeg-3.1.1/bin/ffmpeg -h
/opt/ffmpeg-3.1.1/bin/ffmpeg: error while loading shared libraries: libxvidcore.so.4: cannot open shared object file: No such file or directory

Как видим, ffmpeg не может найти нужные библиотеки, ему нужно помочь с этим делом.

root@ffmpeg-server:~/deb# export LD_LIBRARY_PATH=/opt/ffmpeg-3.1.1/lib
root@ffmpeg-server:~/deb# /opt/ffmpeg-3.1.1/bin/ffmpeg -version 
ffmpeg version 3.1.1 Copyright (c) 2000-2016 the FFmpeg developers
built with gcc 5.4.0 (Ubuntu 5.4.0-6ubuntu1~16.04.1) 20160609
configuration: --prefix=/opt/ffmpeg-3.1.1 --enable-gpl --enable-version3 --enable-nonfree --enable-postproc --enable-libfaac --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libtheora --enable-libvorbis --enable-libx264 --enable-libvpx --enable-libxvid --enable-x11grab
libavutil      55. 28.100 / 55. 28.100
libavcodec     57. 48.101 / 57. 48.101
libavformat    57. 41.100 / 57. 41.100
libavdevice    57.  0.101 / 57.  0.101
libavfilter     6. 47.100 /  6. 47.100
libswscale      4.  1.100 /  4.  1.100
libswresample   2.  1.100 /  2.  1.100
libpostproc    54.  0.100 / 54.  0.100

Теперь все работает.
Как Вы могли заметить, в opt папке также лежит ffmpeg-2.4.1, у которого свой набор библиотек и другое название deb-пакета. Чтобы ним пользоваться нужно просто сменить путь LD_LIBRARY_PATH.

root@ffmpeg-server:~/deb# export LD_LIBRARY_PATH=/opt/ffmpeg-2.4.1/lib
root@ffmpeg-server:~/deb# /opt/ffmpeg-2.4.1/bin/ffmpeg -version 
ffmpeg version 2.4.1 Copyright (c) 2000-2016 the FFmpeg developers
built with gcc 4.6 (Ubuntu/Linaro 4.6.3-1ubuntu5)
configuration: --prefix=/opt/vimmi_packages/ffmpeg --enable-gpl --enable-version3 --enable-nonfree --enable-postproc --enable-libfaac --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libtheora --enable-libvorbis --enable-libx264 --enable-libvpx --enable-libxvid --enable-x11grab
libavutil      55. 17.103 / 55. 17.103
libavcodec     57. 24.102 / 57. 24.102
libavformat    57. 25.100 / 57. 25.100
libavdevice    57.  0.101 / 57.  0.101
libavfilter     6. 31.100 /  6. 31.100
libswscale      4.  0.100 /  4.  0.100
libswresample   2.  0.101 /  2.  0.101
libpostproc    54.  0.100 / 54.  0.100

Еще покажу список установленных ffmpeg пакетов.

root@ffmpeg-server:~/deb# dpkg -l | grep ffmpeg
ii  ffmpeg-ff311                       3.1.1-1                         amd64        Package created with checkinstall 1.6.2
ii  ffmpeg-ff241                       2.4.1-1                         amd64        Package created with checkinstall 1.6.2

Если бы пакеты имели одинаковое название при установке старая версия перетиралась бы новой.
Вот и все.

]]>
http://sysadm.pp.ua/linux/video-streaming/multiple-ffmpeg.html/feed 0