[ Content | View menu ]

Boot: от Мюнхгаузена до PDP/11

14.10.2014

MunchhausenВ FreeBSD Handbook в разделе про загрузку системы рассматривается известная проблема, когда только что включенный компьютер еще не в состоянии выполнять какие-либо программы, но загрузить ОС ему все же нужно. Авторы руководства проводят параллели с классической историей про барона Мюнхгаузена, когда он вытягивает себя из болота за «bootstraps», и вспоминают известную идиому «to pull oneself up by one’s bootstraps».
read more…

linux - 0 комментариев

Moscow.Pm @2013-07-04

03.07.2013

Напомню, что 4 июля в 19:30 в офисе Mail.ru Group на Ленинградском проспекте (станция метро «Аэропорт») состоится очередная встреча московских perl-разработчиков Moscow.pm. Познакомиться с программой докладов и зарегистрироваться можно по адресу corp.mail.ru/Moscow.pm. Трансляция будет на этой же странице.

linux - 0 комментариев

Отключаемый she-bang в Linux-3.10

02.07.2013

В списке новшеств свежевышедшего Linux 3.10 меня заинтересовала строчка:

Функциональность запуска скриптов, содержащих путь к интерпретатору в заголовке «#!», теперь может быть собрана в виде модуля ядра, что позволяет легко запретить выполнение скриптов как программ.

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

С момента вынесения функциональности по парсингу she-bang из fs/exec.c в отдельный модуль fs/binfmt_script.c в linux-1.3.71 в fs/Makefile вплоть до недавнего времени было написано следующее:

# binfmt_script is always there
BINFMTS += binfmt_script.o

Было это в 1996 году.

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

И никаких sysctl’ов.

linux - 0 комментариев

Небольшая проблема с null filehandle в perl

26.06.2013

Рассмотрим удобную и потому частоиспользуемую конструкцию <> (null filehandle), имитирующую аналогичную фичу из sed и awk, когда один и тот же код может использоваться для чтения из STDIN или из файлов, чьи имена переданы в аргументах командной строки. Такая же конструкция используется в однострочниках с опцией -n:

while(<>){
# do something with line
    chomp;
    print "got line: [$line]"\n;
}

Проблема в том, что для открытия файлов perl использует встроенный оператор open в форме с двумя аргументами (например, open FH, "$file" где имя файла содержит и режим доступа к нему). Если название файла содержит идентификатор режима доступа, интерпретируемый функцией open ("| cmd", "cmd |" или "> /path/to/file"), то вместо чтения файла выполнится соответствующая команда или файл перезапишется. Так что если приведенный чуть выше код записать в файл под названием getline.pl и выполнить с аргументом "| rm -rf /", то произойдет сами понимаете что.

Выстрелить себе в ногу легко, еще проще этого избежать:
– использовать ключ -T, запрещающий использовать непроверенные данные;
– использовать ключ -i .backup, интерпретирующий все переданные аргументы как файлы;
– преобразовывать @ARGV перед обработкой файлов, как это сделано в ARGV::readonly;
– не использовать конструкцию while(<>) в критичных скриптах;
– иногда перечитывать perlsec.

Такие дела.

linux - 0 комментариев

Исключение UnicodeEncodeError при записи юникода в файл в Python

04.06.2013

Если при попытке записи юникодной строки в файл:

with open('/tmp/fail','w') as f:
   f.write(u'привет!')

вываливается исключение:

UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-6: ordinal not in range(128)

можно не перечитывать судорожно Python Unicode HOWTO, а открывать файл с помощью функции codecs.open, обеспечивающей прозрачное перекодирование из внутреннего формата python в нужную кодировку:

import codecs
with codecs.open('/tmp/success','w','utf-8') as f:
   f.write(u'привет!')

linux - 1 комментарий

Вышел mitmproxy 0.9

16.05.2013

Пока я писал обзор интерактивного прокси-сервера mitmproxy, основываясь на старой версии 0.8.1, был анонсирован выход нового мажорного релиза 0.9 с множеством улучшений интерфейса и программной части:

  • включен по умолчанию режим upstream certs (когда mitmproxy получает детали сертификата у родительского сервера);
  • добавлен специальный WSGI-контейнер для размещения веб-приложений прямо внутри прокси;
  • поддержка полностью прозрачного проксирования для Linux и OSX;
  • часть кода вынесена в общую для mitmproxy и веб-сервера pathod библиотеку netlib;
  • полная поддержка SNI — расширения протокола TLS, в котором клиент имеет возможность указать, имя хоста, к которому он подключается;
  • цветовые схемы оформления для светлых и тёмных терминалов;
  • запись потоков в файл по мере поступления (кнопка «W»);
  • в язык фильтров добавлены операторы ~d (поиск по домену) и ~a (по содержимому: js, css, изображения);
  • режим следования («F»), для слежения за потоками по мере их поступления а-ля tail -f;
  • опция –dummy-certs для указания и сохранения каталога dummy-сертификатов;
  • воспроизведение потока сервера из текущего буфера;
  • множество улучшений в просмотрщике контента, теперь есть вьюеры для AMF, HTML, JSON, Javascript, изображений, XML, URL-encoded форм, а также шестнадцатеричный режим и режим «сырого» просмотра;
  • возможность установки дополнительных заголовков, которые добавляются к запросам и ответам при соответствии шаблонам;
  • графический редактор компонентов пути;
  • набор стандартных строк User-Agent, которые можно использовать в редакторе заголовков;
  • аутентификация для ограничения доступа к прокси;

Также анонсирован выход HTTP-сервера Pathod 0.9.

linux - 0 комментариев

mitmproxy — консольный firebug

Firebug — отличная штука, когда дело касается анализа запросов в конкретном браузере, но часто приходится отлаживать не связанные ни с каким браузером клиент-серверные приложения, общающиеся с сервером по протоколу HTTP. Я пишу тесты HTTP API на python, и часто ощущается необходимость удобного просмотра трафика от меня к серверу. Для админов и веб-разработчиков может быть актуальным мониторинг трафика от nginx к HTTP-бэкенду.

Общепринятые инструменты, прослушивающие трафик (tcpdump, ngrep, tshark), либо не поддерживают http в полной мере (хочется, как минимум, нормальное отображение заголовков по одному на строке и отображение сжатого gzip или deflate контента), либо в силу своей универсальности слишком сложны в настройке и использовании в контексте конкретной задачи (wireshark). Да и не всегда есть возможность перевести интерфейс в состояние promisc, чтобы получать трафик, хотя бы по причине недостатка прав.

Установка nginx, squid, 3proxy или любого другого известного прокси-сервера также связана с многими трудностями, да и не везде можно нормально настроить полное журналирование заголовков запросов и ответов.

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

После недолгих поисков нашел инструмент, идеально соответствующий таким требованиям: mitmproxy — прокси-сервер, написанный на Python, умеющий перехватывать HTTP и HTTPS, менять трафик на лету, воспроизводить записанный трафик, декодировать и отображать основные типы документов. Под катом — подробный обзор.
read more…

linux - 1 комментарий

История команды ping

14.02.2013

Не могу не сохранить здесь ссылку на перевод истории команды ping, написанной ее автором Mike Muuss. Кстати, согласно википедии, он же предложил концепцию default gateway, что вроде бы увековечено в RFC898 «Gateway special interest group meeting notes».

Также заслуживает внимания его персональная страница, содержащая некоторое количество интересных материалов об истории computer science, в частности, воспоминания участников разработки и эксплуатации первого компьютера общего назначения ENIAC. Кстати, впервые ENIAC был представлен публике ровно 67 лет назад, 14 февраля 1946 года.

linux - 1 комментарий

Раскладка клавиатуры Russian Typewriter

12.02.2013

DEC Decwriter-II LA36
клавиатура Decwriter-II LA36

Однажды, на моей позапрошлой работе (2008 год), к нам приезжал клиент из Франции, которому мы установили демо-версию нашего продукта, работавшего исключительно под RedHat 9. Продукт был русский, локаль для всех иностранных клиентов была en_US, и выяснилось, что региональные настройки не соответствовали французскому языку и, в частности, французской раскладке AZERTY. Я тогда битый час, сидя за этим ноутом, разбирался в редхатовских скриптах loadkeys, setsysfont, setfont, consolechars, вызывавших друг друга по очереди, параллельно пытаясь привыкнуть к непривычному расположению клавиш a, z, q и m, а также необходимости нажимать Shift для ввода цифр и не нажимать его для ввода двоеточия и вертикальной палки «|». Правда, удобство ввода двоеточия «:» в vim меня очень впечатлило и я даже начал что-то подозревать о причинах использования именно его для перехода в командный режим. Короче говоря, локаль поменял, раскладку настроил и клиент уехал довольный тестировать результаты наших усилий.

Под впечатлением от французской чудо-клавиатуры, вспомнив заодно известную статью Артемия Лебедева «трагедия запятой», поменял обычную русскую раскладку на «русская печатная машинка». Процесс привыкания к новым кнопкам занял неделю: спинной мозг боролся с необычным расположением спецсимволов, зато через полтора месяца эксперимента выяснилось, что набирать русские нетехнические тексты стало намного удобнее: для ввода знаков препинания, использующихся в русском языке чаще, чем в английском, не требуется нажимать Alt, Shift или что-нибудь ещё, и расположение буквы «Ё» гораздо лучше (слева от правого шифта). С тех пор и использую эту раскладку.

Кстати, в вышеупомянутом параграфе Лебедев грешит против истины в отступлении «Существует раскладка, имитирующая русскую пишущую машинку. Ее отличие в том, что знаки препинания находятся в верхнем ряду клавиш, но не в нижнем регистре. Это еще хуже, потому что в этом случае и точку надо набирать с подъемом каретки (shift).» Наоборот, в этой раскладке спецсимволы доступны как раз в нижнем регистре.

P.S. на самом деле двоеточие для перехода в командный режим vim пришло из vi, автор которого, Билл Джой, тестировал его на PDP 11/40, PDP 11/45, PDP 11/70 (см. William N. Joy, Ex reference manual, November, 1977, стр. 29­-30), для доступа к которым использовался терминал, соответствующий требованиям стандарта ANSI X4.14-1971, регламентирующего раскладки клавиатуры, например, выпущенный в 1972 году Decwriter-II LA36. На фотографии в начале поста отчетливо видно, что двоеточие находится там же, где и сейчас, и доступно в верхнем регистре, т.е. требует нажатия Shift. Аналогичную раскладку использовал и легендарный терминал DEC VT100. Поэтому домыслы о выборе двоеточия из-за его доступности в нижнем регистре подтверждения не нашли.

linux - 1 комментарий

Если в Ubuntu 12.10 не собираются модули dkms после обновления

19.11.2012

Решил посмотреть, насколько сильно Ubuntu изменилась с тех пор, как я ее в последний раз использовал, поставил на Eee PC 1215n 12.10 и тут же столкнулся с преотвратной багой. Для wireless-адаптера Broadcom Corporation BCM4313 при установке системы был установлен и собран с помощью dkms проприетарный драйвер bcmwl (пакет bcmwl-kernel-source), но при первом же обновлении ядра до 3.5.0-18 сеть перестала работать, т.к. dkms не смог собрать этот драйвер в отсутствие Module.symvers и других файлов, генерируемых при сборке ядра. В ходе экспериментов с dkms слетел также и модуль для предыдущего ядра 3.5.0-17, так что данный экземпляр ОС остался без сети (не считая загрузки в альтернативную систему, livecd и еще одного домашнего компьютера).

Помогла установка пакета linux-headers-generic, содержащего все необходимые файлы для сборки модулей ядра. Баги на launchpad: bugs.launchpad.net/ubuntu/+source/nvidia-graphics-drivers-updates/+bug/1068341, bugs.launchpad.net/ubuntu/+source/ubiquity/+bug/1068488 и далее по ссылкам.

linux - 4 комментария

Нижний Новгород в погодном апплете Gnome

06.02.2012

Для того, чтобы наблюдать погоду в верхней панели, всю жизнь тщательно вбивал координаты нашего нижегородского аэропорта (ICAO: UWGG) в /usr/share/libgweather/locations.xml, т.к. в списке городов Нижнего Новгорода нет и не было, а при вводе «nizh» показывался только Nizhnevartovsk. На прошлой неделе решил окончательно разобраться с этим вопросом и обнаружил, что вместо Нижнего Новгорода нужно искать Стригино — поселок в черте города, поделившийся названием с аэропортом.

linux - 1 комментарий

Политическая позиция

02.12.2011

Пойду 4 декабря голосовать против партии «Единая Россия» по следующим причинам:

1. Государственная дума — место для политических дискуссий;
2. Партия, которая:
— имеет своей целью обеспечение беспрепятственного прохождения абсолютно любых законопроектов в государственной думе;
— монополизировала и фактически подменила собой власть;
— законодательно обеспечила большинство в последующих думах при отсутствии фактической поддержки среди населения;
— без стеснения использует административный ресурс для обеспечения своей поддержки на выборах, явно нарушая законодательство, и ей сходит это с рук;
— указывает в своих заслугах то, что она, являясь властью, и так должна делать;
— грозит лишением федеральных денег целых регионов за то, что часть их населения не поддерживает;
— в начале своих федеральных и региональных списков указывает людей, которые заведомо не будут и не могут быть депутатами, а иногда даже и не являются членами этой партии —

не должна иметь большинство в Думе.

3. Коррупция, fail’ы космической программы, провалы конкурсов на поставки военной техники союзникам, провал совместных тихоокеанских учений с Индией, слабость внешней политики, сомнительная олимпиада — всё это тоже заслуги Единой России.

Сходите на выборы и явно выразите свое мнение, иначе неявно ваш голос отойдет этой партии.

linux - 3 комментария

Пересборка ruby gem на примере hiredis в FreeBSD

06.11.2011

Для тех админов, кому лень некогда копаться во внутренностях ruby и гуглить невнятные ошибки, но надо срочно поставить ruby gem, отсутствующий в портах. В моем случае — hiredis (ruby обвязка для одноименной библиотеки доступа к БД redis). Установка методом

gem install hiredis

не работает, т.к. где-то внутри жестко зашито название утилиты make, а FreeBSD-версия /usr/bin/make серьезно отличается по синтаксису от GNU Make, который все привыкли использовать, поэтому в STDERR сыпятся ошибки:

# gem install hiredis
Fetching: hiredis-0.4.1.gem (100%)
Building native extensions.  This could take a while...
ERROR:  Error installing hiredis:
	ERROR: Failed to build gem native extension.

        /usr/local/bin/ruby18 extconf.rb
"Makefile", line 11: Missing dependency operator
"Makefile", line 21: Need an operator
"Makefile", line 22: Missing dependency operator
"Makefile", line 33: Need an operator
"Makefile", line 43: Need an operator
"Makefile", line 44: Need an operator
"Makefile", line 82: Need an operator
"Makefile", line 86: Need an operator
"Makefile", line 88: warning: duplicate script for target "hiredis-example-ae" ignored
"Makefile", line 89: Need an operator
make: fatal errors encountered -- cannot continue
creating Makefile

make
cc -I. -I/usr/local/lib/ruby/1.8/amd64-freebsd8 -I/usr/local/lib/ruby/1.8/amd64-freebsd8 -I. -I/usr/include -fPIC -I/usr/include -O2 -pipe -fno-strict-aliasing -fPIC -I/usr/local/lib/ruby/gems/1.8/gems/hiredis-0.4.1/vendor/hiredis -c connection.c
cc -I. -I/usr/local/lib/ruby/1.8/amd64-freebsd8 -I/usr/local/lib/ruby/1.8/amd64-freebsd8 -I. -I/usr/include -fPIC -I/usr/include -O2 -pipe -fno-strict-aliasing  -fPIC  -I/usr/local/lib/ruby/gems/1.8/gems/hiredis-0.4.1/vendor/hiredis -c hiredis_ext.c
cc -I. -I/usr/local/lib/ruby/1.8/amd64-freebsd8 -I/usr/local/lib/ruby/1.8/amd64-freebsd8 -I. -I/usr/include    -fPIC -I/usr/include -O2 -pipe -fno-strict-aliasing -fPIC  -I/usr/local/lib/ruby/gems/1.8/gems/hiredis-0.4.1/vendor/hiredis -c reader.c
cc -shared -o hiredis_ext.so connection.o hiredis_ext.o reader.o -L. -L/usr/local/lib -Wl,-R/usr/local/lib -L. -L/usr/lib  -rpath=/usr/lib:/usr/local/lib -pthread -rdynamic /usr/local/lib/ruby/gems/1.8/gems/hiredis-0.4.1/vendor/hiredis/libhiredis.a -Wl,-soname,hiredis_ext.so   -Wl,-R -Wl,/usr/local/lib -L/usr/local/lib -lruby18  -lcrypt -lm -L/usr/lib  -rpath=/usr/lib:/usr/local/lib -pthread
cc: /usr/local/lib/ruby/gems/1.8/gems/hiredis-0.4.1/vendor/hiredis/libhiredis.a: No such file or directory
*** Error code 1

Stop in /usr/local/lib/ruby/gems/1.8/gems/hiredis-0.4.1/ext/hiredis_ext.

Gem files will remain installed in /usr/local/lib/ruby/gems/1.8/gems/hiredis-0.4.1 for inspection.
Results logged to /usr/local/lib/ruby/gems/1.8/gems/hiredis-0.4.1/ext/hiredis_ext/gem_make.out

GNU-версия make в freebsd называется gmake. Чтобы исправить вызов make в gem’е, пришлось его пересобрать. Вот полная версия установки пакета:

$ mkdir ~/hiredis && cd ~/hiredis
$ gem fetch hiredis  # в текущем каталоге появляется файл hiredis-0.4.1.gem
Downloaded hiredis-0.4.1
$ gem unpack hiredis-0.4.1.gem
Unpacked gem: '/home/bvk/hiredis/hiredis-0.4.1'
$ gem spec  hiredis-0.4.1.gem > hiredis.spec # извлекли спецификацию gem'а, по которой будем собирать пакет
$ cd hiredis-0.4.1
# тут в ext/hiredis_ext/extconf.rb нужно поменять "make static" на "gmake static",
# а в Rakefile "make clean" на "gmake clean"
# собираем пакет
$ gem build ../hiredis.spec
WARNING:  description and summary are identical
  Successfully built RubyGem
  Name: hiredis
  Version: 0.4.1
  File: hiredis-0.4.1.gem
# устанавливаем
$ sudo gem install hiredis-0.4.1.gem
Building native extensions.  This could take a while...
Successfully installed hiredis-0.4.1
1 gem installed
Installing ri documentation for hiredis-0.4.1...
Installing RDoc documentation for hiredis-0.4.1...

Теперь внимательно читаем porters handbook, делаем порт и далее действуем по правилам.

linux - 0 комментариев

Как я однажды тупил два дня на ровном месте

18.10.2011

В преддверии первой годовщины последнего осеннего перевода часов в России вспомнился один факап трехлетней давности (начало 2008 года). Я тогда занимался починкой статистики посещаемости на одном региональном сайтике, который я поддерживал по дружбе.

У них было два сервера, один в интернете показывал контент посетителям, а второй располагался в офисе и содержал интерфейс администрирования сайта. Все хозяйство работало под FreeBSD 6.1 на очень стареньких машинах, на основном сервере был Pentium 3 и 384 мегабайта памяти (однако много лет назад о такой конфигурации можно было лишь помечтать). Apache 2.2.2 вёл лог посещений в режиме «combined», а по ночам всё накопленное за последние сутки обрабатывалось штатной программкой logresolve (преобразовывает IP-адреса посетителей в имена хостов) и копировалось в отдельный файл resolved.log. Затем офисный сервер забирал получившийся файл по HTTP (в целях безопасности все «альтернативные» способы обмена файлами решили не использовать) и парсил его awstats’ом. Такая вот нехитрая схемка. Но проработала она ровно два месяца до середины декабря 2006 года и перестала.
read more…

linux - 0 комментариев

Комфортная работа в Midnight Commander

08.09.2011

Многие мои коллеги принципиально игнорируют Midnight Commander, предпочитая работать в командной строке. Мотивируют это целым рядом причин, начиная с «нортон коммандер устарел еще в 1995 году» и заканчивая «я юниксоид с 1970 года и без всяких mc прекрасно управляюсь в консоли». Конечно же, это дело вкуса, и можно (и нужно!) настроить консоль под себя так, чтобы она летала со скоростью мысли: на помощь приходят команда alias, сочетание Ctrl+R, описание команды shopt в builtins(1), пакет bash_completion или его аналоги, ряд мелких хаков, наподобие такого, или альтернатива в виде zsh, в конце концов.

Однако визуалам типа меня удобнее постоянно иметь перед глазами списки файлов и папок, а не помнить, какой файл где находится и что здесь есть еще. Кроме того, пользуясь исключительно командами cd и ls --color, можно легко проглядеть что-нибудь ненужное, типа оставшихся от vim бэкапов в текущем каталоге (если бэкапы нужны, см :help backupdir) или папок с именем из пробела.

Конечно, сначала mc производит немного гнетущее впечатление, но если разобраться и привыкнуть, то может оказаться, что даже с конфигурацией из коробки он очень облегчает жизнь разработчика и системного администратора. Поделюсь собственными хитростями, используемыми каждый день. За кадром осталось еще множество интересных фич, типа кастомной раскраски файлов в панели, смены цветовой схемы на черно-зеленую, сниппетов в редакторе mcedit, настраиваемых VFS, но поскольку я ими не пользуюсь, то ничего про них не скажу. Примеры их настроек и использования можно посмотреть в /etc/mc и в /usr/share/mc.

Сначала полезные мелочи, для многих очевидные.
read more…

linux - 3 комментария