Статистика запросов на основе логов Bind

На работе руководство захотело посмотреть статистику DNS-запросов за сутки. Скачал логи к себе, да бы лишний раз не тревожить сервер. Коллега попытался запихнуть их в Excel, но каждый из двадцати пяти лог-файлов имеет размер в 1 (один) гигабайт (это логи работы bind'а чуть меньше, чем за полдня). Excel что-то показал и молча скончался. Первое, что пришло в голову, так это написать небольшой скрипт, который переработает эти 25 гигабайт информации и выдаст вполне себе удобный для просмотра файла.

В принципе, ничего сложного в этом shell-скрипте нет, буквально пишется на «коленке» за пять минут. Изначально написал однострочник, с помощью которого и получил итоговый файл. В итоге, чуть расширил возможности этого однострочника и получил такой вот скрипт.

В самом начале задаём пару переменных: путь хранения логов, каталог temp и количество строк в результирующем файле.

#!/bin/bash
# Каталог, где лежат логи
LOG_DIR=~/tmp/bind_log

# Промежуточные варианты будет складывать в каталог temp
TEMP_DIR=~/tmp/temp
# Количество строк в результирующем файле
COUNT_LINES=1000

Проверим, существует ли каталог temp по указанному пути. Если не существует, то создадим его.

if ! [ -d $TEMP_DIR/ ]; then
    mkdir $TEMP_DIR
fi

В логах необходимая нам информация находится в восьмом поле (разделитель пробел). Извлекаем домены из всех лог-файлов и помещаем в один.

for file in $LOG_DIR/*; do
    awk '{print $8}' $file >> $TEMP_DIR/domains.txt
done

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

sort -n $TEMP_DIR/domains.txt | uniq -cd | sort -nrk 1 | head -n $COUNT_LINES > $TEMP_DIR/domains_result.txt

В конце скрипта произведём небольшую чистку.

if [ -f $TEMP_DIR/domains.txt ]; then
    rm $TEMP_DIR/domains.txt
fi

Итоговый файл, который и был отправлен руководству.

14748927 dns.msftncsi.com
10333977 a.root-servers.net
7906481 www.google.com
3328788 ya.ru
2535493 mail.ru
2441392 google.com
2299573 graph.facebook.com
2039593 e6858.dsce9.akamaiedge.net
1777954 mc.yandex.ru
1766014 play.googleapis.com
1725436 rosenberg.appmetrica.yandex.net
1677673 googleads.g.doubleclick.net
1647791 www.youtube.com
1606237 yandex.ru
1527312 www.googleapis.com
1371390 google.ru
1317138 vk.com
1280393 time.nist.gov
1265357 graph.instagram.com
…

Собственно, как я и писал в начале этой статьи ничего сложного нет, и наверняка у многих подобные скрипты имеются на серверах.

При желании полученный итоговый файл можно засунуть в тот же Excel и получить красивые диаграммы, если кому-то простые цифры покажутся не очень наглядными.

Сменил хостинг

Блог переехал на новый хостинг от компании NetAngels.ru. На прежнем хостинге цены что-то перестали радовать, да и иной раз блог еле работал. Не исключаю, что иногда медленная работа связана с самим WordPress'ом, поэтому смотрю, читаю, думаю на что можно перейти. Ибо с каждой новой версией админка становится всё менее удобнее для меня. Пока очень понравился Jekyll. Просто и удобно, но надо думать.

Установка Oracle Database 12.х в Sun Solaris 11 в текстовом режиме

Данную заметку я написал больше для себя, чтобы в будущем было проще найти информацию и избежать уже сейчас очевидных ошибок. На работе выделили сервер Sparc T7-2 и поставили задачу: установить OS Solaris, разобраться с контейнерами и LDoms (Logical Domains), а также установить база данных Oracle Database. С серверами Sparc и OS Solaris столкнулся впервые, поэтому читал и «курил» кучу документации, статей и форумов. Со всеми поставленными задачами разобрался успешно, но больше всего времени потратил на установку базы данных Oracle. Везде, даже официальная документация предполагает установку в графическом режиме. Но это не наш метод. Графику на никсовых серверах не приемлю и не понимаю, зачем тратить ресурсы на «рюшечки»?

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

С сайта oracle скачиваем zip-архив с файлами установки базы данных, не забывая правильно выбрать платформу установки. На момент установки была доступна версия 12c Release 2.

Устанавливаем следующие пакеты, если они ещё не были установлены.

# pkg install SUNWxwplt SUNWmfrun

Во время установки у меня появилось сообщение следующего содержания:

pkg install: 'SUNWxwplt' matches multiple packages
pkg://solaris/compatibility/packages/SUNWxwplt
pkg://solaris/SUNWxwplt
Please provide one of the package FMRIs listed above to the install command.

Изменим строку установки на предложенную.

# pkg install pkg://solaris/SUNWxwplt SUNWmfrun

Добавим необходимые группы и пользователя oracle:

# groupadd oinstall
# groupadd dba
# groupadd oper
# groupadd asmadmin
# groupadd asmdba
# groupadd asmoper
# useradd -g oinstall -G dba,oper,asmadmin,asmdba,asmoper -m oracle

В конец файла /export/home/oracle/.profile необходимо добавить следующие строки:

ORACLE_SID=orcl; export ORACLE_SID
ORACLE_UNQNAME=$ORACLE_SID; export ORACLE_UNQNAME
ORACLE_TERM=xterm; export ORACLE_TERM
ORACLE_HOSTNAME=solaris.local; export ORACLE_HOSTNAME
ORACLE_BASE=/u01/oracle; export ORACLE_BASE
ORACLE_HOME=$ORACLE_BASE/product/12.2/db_1; export ORACLE_HOME
PATH=/usr/sbin:$PATH; export PATH
PATH=$ORACLE_HOME/bin:$PATH; export PATH
LD_LIBRARY_PATH=$ORACLE_HOME/lib; export LD_LIBRARY_PATH
CLASSPATH=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib; export CLASSPATH

Соответственно, в параметре ORACLE_HOSTNAME указываете своё название хоста, а в параметре ORACLE_BASE указываете, где у вас будут лежать базы. Следующим шагом будет создание необходимого каталога

# mkdir /u01

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

# unzip -d /u01 /home/soft/solarissparc64_12201_database.zip
# chown -R oracle:oinstall /u01
# chmod -R 755 /u01

Как следует из документации Oracle, установку базы данных следует осуществлять из под пользователя oracle.

# su - oracle

Запускаем процесс установки:

$ /u01/database/runInstaller -silent -showProgress -responseFile /u01/database/response/db_install.rsp

У меня установка прервалась с сообщением на нехватку места в каталоге tmp, хотя на диске места было предостаточно. Выход простой, создать где-нибудь, например в /opt, каталог tmp и прописать соответствующий путь у пользователя oracle в .profile.

set TMP=/opt/tmp
set TMPDIR=/opt/tmp

Выставим необходимые права доступа к каталогу /opt/tmp

# chown -R oracle:oinstall /opt/tmp

Дальнейшая установка снова прерывалась с ошибкой. Вот тут пришлось немного попотеть и поискать ответ в интернете. На официальном сайте я так ничего толком не нашёл. В итоге необходимую мне информацию нашёл в личном блоге то ли поляка, то ли чеха (сейчас уже не вспомню, а ссылку у себя не сохранил). Как оказалось, необходимо заполнить файл /u01/v12/database/response/db_install.rsp, да не абы как, а правильным образом. Файл db_install.rsp на самом деле довольно большой с кучей комментариев, поэтому ниже я указал только те параметры, которые были изменены.

$ vi /u01/v12/database/response/db_install.rsp
oracle.install.option=INSTALL_DB_SWONLY
UNIX_GROUP_NAME=oinstall
ORACLE_HOME=/u01/app/12c/product/12.2.0.1/dbhome_1
ORACLE_BASE=/u01/app/12c
oracle.install.db.InstallEdition=EE
oracle.install.db.OSDBA_GROUP=dba
oracle.install.db.OSBACKUPDBA_GROUP=dba
oracle.install.db.OSDGDBA_GROUP=dba
oracle.install.db.OSKMDBA_GROUP=dba
oracle.install.db.OSRACDBA_GROUP=dba
oracle.install.db.isRACOneInstall=false
oracle.install.db.rac.serverpoolCardinality=0
oracle.install.db.config.starterdb.type=GENERAL_PURPOSE
oracle.install.db.ConfigureAsContainerDB=false
oracle.install.db.config.starterdb.characterSet=AL32UTF8
oracle.install.db.config.starterdb.memoryOption=false
oracle.install.db.config.starterdb.installExampleSchemas=false
oracle.install.db.config.starterdb.managementOption=DEFAULT
oracle.install.db.config.starterdb.omsPort=0
oracle.install.db.config.starterdb.storageType=FILE_SYSTEM_STORAGE
oracle.install.db.config.starterdb.fileSystemStorage.dataLocation=/u01/app/12с/oradata
oracle.install.db.config.starterdb.fileSystemStorage.recoveryLocation=/u01/app/12с/orabackup

Сохраняем файл и снова запускаем установку… Опять вылетает с ошибкой, но уже с другой.

[FATAL] [INS-13013] Target environment does not meet some mandatory requirements.
CAUSE: Some of the mandatory prerequisites are not met. See logs for details. /opt/tmp/OraInstall2018-05-28_07-01-31PM/installActions2018-05-28_07-01-31PM.log

Поиск в интернете подсказал, что в этом случае установку базы необходимо запустить с ключом -ignorePrereq.

$ /u01/v12/database/runInstaller -silent -ignorePrereq -showProgress -responseFile /u01/v12/database/response/db_install.rsp
Prepare in progress.
.................................................. 8% Done.
Prepare successful.
Copy files in progress.
.................................................. 20% Done.
.................................................. 25% Done.
.................................................. 30% Done.
.................................................. 37% Done.
.................................................. 42% Done.
.................................................. 47% Done.
.................................................. 56% Done.
.................................................. 61% Done.
.................................................. 66% Done.
.................................................. 71% Done.
.................................................. 76% Done.
.................................................. 81% Done.
Copy files successful.
Link binaries in progress.
Link binaries successful.
Setup files in progress.
..............................
Setup files successful.
Setup Inventory in progress.
Setup Inventory successful.
Finish Setup successful.
The installation of Oracle Database 12c was successful.
Please check '/u01/app/12c/oraInventory/logs/silentInstall2018-05-28_07-04-02PM.log' for more details.
Setup Oracle Base in progress.
Setup Oracle Base successful.
.................................................. 95% Done.
As a root user, execute the following script(s):
1. /u01/app/12c/oraInventory/orainstRoot.sh
2. /u01/app/12c/product/12.2.0.1/dbhome_1/root.sh
..................................................   100% Done.
Successfully Setup Software.

Далее, как советует установщик, из под пользователя root выполнить пару скриптов.

# /u01/app/12c/oraInventory/orainstRoot.sh
Changing permissions of /u01/app/12c/oraInventory.
Adding read,write permissions for group.
Removing read,write,execute permissions for world.

Changing groupname of /u01/app/12c/oraInventory to oinstall.
The execution of the script is complete
# /u01/app/12c/product/12.2.0.1/dbhome_1/root.sh
Check /u01/app/12c/product/12.2.0.1/dbhome_1/install/root_solaris_2018-05-28_19-23-30-157853780.log for the output of root script

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

Несколько ссылок, которые мне помогли найти решение:

Домашний минипарник с подсветкой

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

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

Светодиодные ленты в бабинах
Светодиодные ленты в бабинах

Т.к. минипарничок в начале весны ставить на балкон слишком рано — холодно там ещё, да и место на балконе не резиновое, то следующей проблемой стало освещение. Для её решения в новогодние каникулы мы с женой прочитали множество ресурсов, где описывались те или иные средства по освещению. В общем, идея понятна: нужна «фитолампа» с определёнными спектральными характеристиками. Пока читали форумы поняли, что имеющиеся в продаже фитолампы нам не подходят, т.к. они слишком большие и громоздкие для нашего минипарника и их спектр больше подходит для цветов, т.е. для цветущих растений. После пары дней изучения тематических форумов и статей, пришли к выводу, что под наш минипарничок необходимо собрать систему освещения самостоятельно из двух светодиодных лент разного спектра: получиться хорошо, не получится — будем работать над ошибками.

Алюминиевые полосы
Алюминиевые полосы

Алюминиевые полосы со светодиодными лентами
Алюминиевые полосы со светодиодными лентами

Алюминиевые полосы со светодиодными лентами
Алюминиевые полосы со светодиодными лентами

Значит для создания нормального освещения рассады в нашем минипарничке необходимо купить: светодиодную ленту красного цвета — P309 5630-60LED-1M-RED, 12V, IP33, 72W; светодиодную ленту синего цвета — P319, 5630-60LED-1M-BLUE, 12V, IP33, 72W; блок питания и алюминиевые полосы, которые служат не только в качестве радиатора охлаждения для светодиодов, но и в нашем случае крепёжным элементом. Метровые алюминиевые полосы толщиной 2мм и шириной 30мм, купленные в ближайшем магазине Оби, были распилены под размер полки с таким расчётом, чтобы их можно было расположить как вдоль, так и поперёк (собственно, последний вариант у нас и используется). Первоначально на каждую полку мы решили использовать по пять полос: три полосы с синими светодиодами и две полосы с красными светодиодами, естественно с чередованием. За светодиодными лентами и блоком питания пришлось ехать на Митинский радиорынок, т.к. по цене выходило приемлемо и был самовывоз в выходной день. Для коммутации светодиодных лент с блоком питания были закуплены кабель ШВВП 2×0.5 и три выключателя, чтобы иметь возможность в любой момент времени отключить или включить не все полки сразу, а только необходимые. Ценны на блоки питания сильно зависят от количества ватт — чем мощнее блок питания, тем дороже. Что же касается цен на светодиодные ленты, то тут сильно зависят от жадности продавца. И ещё, чаще всего минимальная длина такой ленты — это 5 метров, т.е. одна бабина.

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

Минипарничок с подсветкой
Минипарничок с подсветкой

Минипарничок с подсветкой
Минипарничок с подсветкой

К выбору блока питания стоит отнестись со всей серьёзностью и тщательностью. В интернете полно ресурсов по расчёту мощности блоков питания, так что тут я ничего конкретного не посоветую, разве что — берите блок питания с запасом по мощности. На выходе блок питания имеет три линии для подключения светодиодных лент. В блоке питания, который я купил вместе со светодиодными лентами, имеется вентилятор охлаждения, который работает постоянно. Его скорость очень сильно зависит от количества включённых полок. Чем больше полок включено, тем выше обороты вентилятора и как следствие — сильней начинает шуметь. Но уровень вполне переносимый, днём, на общем фоне звуковой зашумлённости, его практически не замечаешь. Т.к. минипарничок стоит в соседней комнате, то шум спать нам не мешает. Что же касается ночной засветки, то мы просто накидываем сверху плотное покрывало, чтобы свет не мешал отдыху и сну. Когда же растения немного подрастут, то их надо будет переводить в нормальный режим: день-ночь.

Модернизированный вариант
Модернизированный вариант

На данный момент времени мы довольны минипарником и самодельной подсветкой. Рассада надёжно закрыта от посягательств четвероногих хвостатых питомцев и получает нормальное освещение. А вот какой получится из всего этого урожай, будет понятно только ближе к осени.

Новая сцепка

Осенью прошлого года, когда я перепахивал своё картофельное «поле» (для понимания участок 10×70 м), порвалось крепление сцепки. Расстроился я тогда здорово, т.к. оставалось перепахать какие-то 1,5 метра «поля», да ещё оставался огород. Тем, кто далёк от огородно-полевого хозяйства, поясняю — с помощью сцепки к мотоблоку можно навешивать навесное оборудование: плуг,
окучник, картофелевыкапыватель и т.д. Выглядела сцепка так:

Сцепка СВ1/1
Сцепка СВ1/1

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

Сначала отпилил болгаркой погнутый болт. Болты достаточно толстые (не помню я размера), поэтому донором крепежа послужила рама на два окучника. При осмотре П-образного профиля ничего криминального на нём выявлено не было, поэтому взялся за оставшуюся часть сцепки. Для начала выпрямил пластину, которая прилегает к П-образному профилю. Соединил порванное ухо. Дальше место разрыва хорошо проварил электросваркой. Дальнейший осмотр показал, что в некоторых места заводская сварка лопнула (усиливающие косынки под болтами). После зачистки всех криминальных мест, прошёлся сваркой. Для усиления мест крепления болтов (где был разрыв металла), приварил ещё несколько кусков арматуры 6-ки. Затем всё подровнял болгаркой.

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

СЦЕПКА МОБИЛ К СВ-2
СЦЕПКА МОБИЛ К СВ-2

Что же, сцепка куплена, но только весной я смогу испытать данную сцепку на своём мотоблоке, когда начну готовить картофельное «поле» и огород к посевной.

UPD: Как показали полевые испытания, при сильной нагрузке сцепку начинает выкручивать в бок. Решение простое, усилить конструкцию поперечными вставками, что даст необходимую жёсткость. Этим займусь уже весной.

Сумки-органайзеры

Все владельцы Шеви-нивы знают, насколько в их машинах «большой» багажник. Кто-то собирает из фанеры органайзер, кто просто покупает сумки-органайзеры и устанавливает их в багажнике в ниши. Вот и я решил пойти по второму пути. Как раз вчера к оф.дилеру пришли сумки-органайзеры для машины. Сходил, забрал. За не имением тёплого гража, монтировать их буду, когда немного потеплеет на улице. К тому же, у меня в багажнике лежит Хай-Джек, и есть подозрение, что он будет немного мешаться этим сумкам.

Сумки в упаковке и с инструкцией
Сумки в упаковке и с инструкцией

Сумки-органайзеры
Распакованные сумки органазйеры

UPD: Установил сумки. Теперь багажник выглядит так:

Сумки в Шниву, левая сторона
Левая сторона

Сумки в Шниву, правая сторона
Правая сторона

Сломался «Терминатор»… косилка

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

Косилка. Механизм регулировки зазора

Делать нечего, разбираем всю конструкцию.

Косилка. Место крепления «ушей»

Сразу отломал «уши» от трубы, чтобы зачистить места сварки.

Косилка. «Уши» регулировки зазора.

Пока занимаюсь сварными работами, все гаечки и винтики кинул отмокать в WD-40.

Косилка. Гайки и болты в отмочке.

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

Косилка. Приварен узел регулировки.

Косилка. Узел регултровки, обратная сторона.

После того, как вся сваренная конструкция остыла, прошёлся 800-ой шкуркой, обезжирил, загрунтовал и покрасил чёрной матовой краской.

Косилка. Обезжирено, прогрунтовано и покрашено.

Итог, собранная косилка готова к бою.

Косилка. Агрегат собран.

Косилка. Агрегат собран и готов к работе

UPD: Как показали прошедшие выходные сварка держится. Половину воскресенья косил траву в саду.