Показаны сообщения с ярлыком будни сисадмина. Показать все сообщения
Показаны сообщения с ярлыком будни сисадмина. Показать все сообщения

Отслеживание HTTP-взаимодействия с помощью tcpdump

Иногда нужно в консоли посмотреть, что происходит с запросами на веб-сервер, правильные ли приходят запросы, нормальные ли уходят ответы, если вообще уходят. Для таких целей есть утилита tcpdump, но она больше для работы с уровнем TCP/IP,  а для получения данных о запросах HTTP,- приходится применять определённые ключи и фильтры. Я делаю вот так:

tcpdump -i eth0 -nA -s 0 '(((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)' and port 80

PlantUML: ifdef и JQuery

Для отрисовки диаграмм последовательности ( ака call flow ) постоянно пользуюсь утилитой plantuml. Пользуюсь и пользуюсь, на сайт не заглядываю, тем более что в офисе оно встроено в корпоративную wiki Atlassian Confluence. Так вот, забыл я какую-то особенность синтаксиса, полез на сайт, подсмотреть, а там... Оказалось, что с момента моего последнего посещения библиотека обросла множеством замечательных возможностей:


Следите за границей

Несколько дней не мог найти блуждающую багу в программе на python: файл базы pdb (Pilot Database) при определённых условиях сохранялся неправильно. Везде, где только можно, вставил отладочные сообщений и assert'ы,- вроде всё правильно,- но не работает. Пришлось вооружаться HEX-редактором:

Все RFC про SIP в одном месте!

Одно время меня активно интересовал SIP и разные его инкарнации в виде МультиФона, всевозможных SIP-телефонов и программных клиентов. Потом в силу определённых обстоятельств окружающей действительности, интересы немного изменились, но пятно на карме осталось. Чтобы подытожить накопленный опыт и вообще попытаться спрыгнуть с собственной тени, -  привёл в порядок старый пост про список спецификаций SIP. Пост был небольшой и неказистый,- немного кривое форматирование, да и RFC не все. В самом начале казалось, что список документов должен быть не очень большим, ссылок 20 или 30... Но реальность, как обычно, оказалась намного интереснее,- как выяснилось, с 2001 по 2014 год,  рабочие группы IETF опубликовали почти 200 спецификаций, информационных документов, размышлений о будущем протокола и сборников сигнального обмена на все случаи жизни. В эмпирическую оценку вкралась небольшая десятикратная погрешость :-).  И это ещё я не включал RFC, в названии которых нет аббревиатуры SIP, например, в список не попали стандарты, касающиеся форматов SDP.  Но зато, в процессе изучения аннотаций и вводных глав вспомнилось многое из того, что уже казалось забытым, ну и, конечно, новые какие-то вещи тоже попались. Вообщем, получился полный список SIP RFC с краткими русскими названиями.

Namei: Почему в nginx permission denied?

Почему в Nginx error.log появляются записи вида open() ... failed (13: Permission denied)? Вообще, речь конечно не про Nginx как таковой. Ситуация, когда в *nix-системе доступ запрещён по непонятной причине, хотя у файла или папки "всевсевсе" права rwxrwxrwx (777 в числовом выражении), бывает с любым процессом. В таком случае нужно не биться головой о стену, а вспомнить, что у любого процесса для доступа к любому файлу, помимо прав на чтение (или запись), должны быть права на переход в каждую папку начиная от корня. 

Mac OS X: примонтировать диск dmg в терминале

Задался вопросом,- возможно ли примонтировать образ диска dmg в командной строке Mac OS X? Это может быть нужно, например, в случае удалённого подключения по ssh. Короткий ответ: возможно :-).

В этом поможет команда hdiutil. С параметром attach просим подключить диск, система проверяет образ и сообщает путь монтирования вида /Volumes/<имя диска>


$ hdiutil attach <полный путь к файлу образа>
expected   CRC32 $6FBC93B9
/dev/disk2                                         /Volumes/<имя диска>

Отключить (размонтировать) можно той-же командой и параметром detach, только вместо пути к образу диска указываем уже путь монтирования, который нам вернул hdiutil attach:

$ hdiutil detach Volumes/<имя диска>

Установка nginx с помощью yum (RHEL/CentOS)


Чтобы установить nginx на RHEL/CentOS с помощью yum, надо сделать несколько простых шагов:

Переезд-2.02

Так и не удалось до конца разобраться с индексированием сайта. В индексе Яндекс,- 6 страниц, в индексе google вообще всего 3. Не индексируется блог, хоть ты тресни.  На главной странице из шаблона доступны ссылки на весь архив, только вот ссылки открываются с помощью javascript, похоже ни Яндекс, ни гугл клиентские сенарии не очень-то отрабатывают. Robots.txt тоже проверял, ничего и никому не запрещено. Осталась одна версия для проверки,- надо чаще добавлять посты, после каждого обновления сайта наблюдается небольшой всплеск активности роботов (имеются ввиду поисковые роботы, конечно). Будем посмотреть.

CJK: китайские и японские иероглифы в Unicode

Дословно в википедии:

В китайском, японском и корейском языках приняты несколько отличающиеся начертания многих иероглифов, обозначающих одно и то же понятие. Однако, поскольку Юникод представляет символы, а не начертания, соответствующие иероглифы в нём объединены. Правильное начертание выбирается за счёт использования соответствующего шрифта. Браузеры могут это осуществлять автоматически, если текст на веб-странице помечен как относящийся к тому или иному языку с помощью тега lang.
Википедия: Китайское письмо

То есть читать не учим, учим иероглифы, так получается?

Console Colors: Сделать цветную консоль за 3 шага

Пример раскраски вывода ls
в 
online-конфигураторе
Очень часто делаю что-то в консоли, и в десктопном маке и на удалённых серверах. Использую bash. И, очень часто, выводит из себя отсутствие раскрашивания, как минимум в выводе листинга директорий. Сел разбираться,- оказывается, чтобы сделать консоль цветной, нужно сделать 3 простых шага:

Во-первых, надо удостовериться, что в переменных окружения стоит правильная консоль xterm (xterm-color или даже xterm-256color). Смотрим на вывод команды env:


    $ env
    SHELL=/usr/local/bin/bash
    TERM=xterm-256color
    PAGER=more
    BLOCKSIZE=K
    EDITOR=vi
    ...
Если тип консоли указан неправильно,- надо исправить (и добавить соответствующую строку в ~/.profile):

    $ TERM="xterm"; export TERM

Во-вторых, надо разрешить консоли использовать цвета:
    $ CLICOLOR="YES"; export CLICOLOR
И, наконец, настроить цветовую схему для вывода ls. Цветовая схема для ls задаётся переменной окружения LSCOLORS (или LS_COLORS, зависит от системы). Формат описания цветовой схемы тоже зависит от системы, чтобы не искать документацию, можно воспользоваться простеньким online-конфигуратором (позволяет задать только базовые 8 цветов). Набросал для примера вот такую схему, и добавил описание в env:
    LSCOLORS="ExGxFxdxCxDxDxhbadExEx"; export LSCOLORS

Уровни DEBUG

Надоело уже путаться какие уровни дебага какие типы сообщений пропускают. Проверил на Python 2.x с использованием стандартного модуля logging, получается такая таблица:

Уровень сообщения в логе
Уровень лога  DEBUG   INFO   WARNING   ERROR   CRITICAL 
DEBUG
V
V
V
V
V
INFO
V
V
V
V
WARNING
V
V
V
ERROR
V
V
CRITICAL
V

Получается, что если хочется самый чистый лог,- ставим уровень в CRITICAL и видим только критичные события в логе. Надо чуть подробнее,- ставим ERROR, видим сообщения типа ERROR и CRITICAL, и так далее. Самый подробный уровень DEBUG показывает все типы сообщений от самых низкоуровневых DEBUG до CRITICAL. Почему-то у меня никак не уложится в голове, что INFO идёт сразу за DEBUG

Qt4: декомпиляция файла ресурсов rcc

Некоторое время ковырял файл ресурсов, получаемого с помощью компилятора ресурсов rcc (Qt4). При помощи исходников компилятора удалось восстановил для себя структуру файла, может быть кому-то понадобится.

PortableApps и все-все-все

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

Схема соединения автономных систем

BGP route views Проект Route Views изначально разрабатывался как утилита, позволяющая в реальном времени получать информацию о системе маршрутизации (BGP) с точки зрения различных автономных систем (AS). BGPlay,- это приложение, написанное на Java, отображающее анимированные графы маршрутизации для определённых префиксов в определённое время. Графическое отображение позволяет легко понять, каким образом обновления BGP влияют на маршрутизацию определённых префиксов.

Перенос\копирование правил для сообщений в Thunderbird

thunderbird logo Понадобилось перенести правила в Thunderbird из одного аккаунта в другой. Специальной кнопки для копирования\перемещения правил между почтовыми аккаунтами не нашёл, полез разбираться:

В базе знаний Thunderbird нашлось, что настройки фильтров хранятся для каждого аккаунта отдельно в файле с именем msgFilterRules.dat. В файле сначала указывается версия и настройки записи результатов фильтрации в лог:

E1 RJ45 Pin-outs

Понадобилось по работе тут подключить E1 на разъём RJ-45. Быстро найти распиновку (да ещё и на русском) не удалось,- выкладываю, чтобы не забылось: На джеке контакты считаются по порядку слева направо, держа разъём контактными площадками к себе, кабель подводится снизу (как на рисунке). В табличном виде:
pinназначение
1Rx RING
2Rx TIP
3-
4Tx RING
5Tx TIP
6-
7-
8-
Подключенное устройство принимает (Rx) на 1-2 контактах (оранжевая пара). Передача (Tx) ведётся по паре на 4-5 контакте (синяя пара), Остальные контакты не используются. Понятия TIP и RING здесь условные, обычно современное оборудование умеет определять полярность на парах и корректно использовать. Но, на всякий случай,- почитайте документацию (или проконсультируйтесь с технической поддержкой) перед подключением.

утилиты GNU для Windows

GnuWin32 Почему-то в русском интернете мало используется весьма полезный пакет для Windows под названием GnuWin32. Проект GnuWin32 предоставляет набор популярных unix утилит, портированных на платформу Win32. Все утилиты предоставляются с лицензией GNU (или с аналогичными лицензиями open source) . Эти программы собраны с использованием стандартных 32-битных библиотек MS-Windows, таким образом они не зависят от каких-либо сторонних библиотек совместимости, например CygWin или Msys.

Компилируемый LISP для Win32

newLISP-icon-92Попросили найти реализацию LISP, которая позволяет компилировать программу в исполняемый .exe для Windows. После некоторых изысканий обнаружился NewLISP .

PyScripter: Редактор для питоновода


Понадобился качественный редактор для питона,- с подсветкой кода, автоматическим дополнением и прочими удобствами. Вообщем, не редактор, а полноценная IDE. Причём, для изначально враждебного окружения, т.е. под винду. Гугл выдал несколько ссылок на полезные форумы, где и нашлась ссылка на PyScripter. Программа не "без чудес",- сразу натолкнулся на проблему с поиском python25.dll,- но после прописания всех необходимых путей программа запустилась (надо признать, что версия Python 2.6 пока не поддерживается). На вид,- нормальная среда разработки, с окнами Output, CallStack, Watches, Breackpoints и т.д. Подсветка кода настраивается, настройки переносятся в ini-файле вместе с программой, например, на USB-флешке. Посмотрим, каково оно будет в работе.

Менеджер: перезагрузка

Долго искал блуждающую багу в приложении на django: в какой-то момент функция get_object_or_404 начала выдавать ошибку AttributeError: 'list' object has no attribute 'model'. В принципе понятно, что где-то вместо модели вылезает список (list), но где и почему,- непонятно. Гугление результатов не дало,- конкретно такой ошибки, похоже, ни у кого не возникало, поэтому пришлось копаться до тех пор, пока не снизошло озарение. Оказалось всё просто: get_object_or_404() неявно вызывает метод all() стандартного менеджера моделей models.Manager. А у меня хватило ума переопределить этот метод в свойм кастомном менеджере, и не просто переопределить,- у меня он выполнял совсем другие задачи. Переименование метода в get_all() вернуло всё на своё место.

Полный список методов, которые не надо случайно переопределять, можно посмотреть в онлайн-трекере Django, начиная со строки class Manager(object):