Переход на OpenSuSe 11.4

Убил выходные на то, чтобы 3 компьютера проапгрейдить со старых ОС на OpenSuSe 11.4.

Хуже всего проходил upgrade с 11.0 на 11.4 на ноутбуке. Вроде и система установилась нормально, перегружаю ноутбук, и при попытке залогиниться получаю отбивку – “Неизвестный модуль” (или для англоязычной версии “Module is unknown”).

Выяснилось, что в 11.4 для авторизации используются модули PAM (которые не были установлены на ноутбуке в версии 11.0 и при апгрейде система их “забыла” поставить). Так что есть два варианта решения проблемы – либо доставить модули руками (что проблематично, т.к. так просто залогиниться не получится), либо отключить использование PAM при логине – я так и сделал.

Процедура следующая. При загрузке системы в меню Grub надо выбрать соответствующий вариант загрузки и руками в опцию загрузки написать single. В однопользовательском режиме надо поправить файл /etc/pam.d/login, и закомментировать строчку:

#session required pam_resmgr.so

После перезагрузки ноутбука в обычном режиме в систему уже можно было залогиниться, но запустить X с помощью startx мог только root (остальным пользователям не хватало прав). Проблема не наблюдалась в runlevel 5 (т.к. там иксы стартуют от рута), но у меня все работает в runlevel 3 и иксы запускаются только при необходимости. Это лечится добавлением прав на запуск:

# chmod a+s /usr/bin/Xorg

Как свалить с платформы Google App Engine

Логотип Google App Engine

Примерно с 17 февраля 2011 года гугл без предупреждения стал блокировать доступ к сайтам на платформе GAE. Причем блокировались IP адреса из Германии, Канады, США и многих других “правильных” стран. Прошло 3 месяца, а воз и ныне там, что-либо менять они не собираются.

При таком раскладе можно только распрощаться с этой говноплатформой, но сделать это не так-то просто. Очень жаль потраченного времени на написание CMS под GAE, разработку шаблонов, да и времени на миграцию остается не так много. Но тем не менее, если вам дороги постоянные клиенты, Google не оставляет другого выбора.

К счастью, для работы с приложениями на платформе GAE предусмотрен так называемый remote api. Он то и позволяет забрать или залить данные без использования веб интерфейса. В моем приложении этот интерфейс был реализован, и забрать данные для меня не составило особого труда.

Забрать дамп базы можно так:

./bulkloader.py –dump –app_id=your-app-id –url=http://your-app-id .appspot.com/remote_api –filename=dump.sql3

Дальше надо бы перенести данные на новую CMS, или на худой конец, согнать данные в статику.

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

Получить статику можно, натравив на сайт обычный wget с рекурсией; но при невысокой скорости интернета этот процесс может затянуться. Поэтому будет рационально развернуть скачанный дамп на локальной машине, и натравить wget на localhost.

Сначала стартуем свое приложение:
./dev_appserver.py your-app-id
В другой консоли разворачиваем скачанный дамп, используя remote api:
./bulkloader.py –restore –app_id=your-app-id –url=http://127.0.0.1:8080/remote_api –filename=dump.sql3
Используем wget для получения статических файлов HTML:
wget -r http://localhost:8080

Все, теперь у нас есть куча статики, которую можно использовать.

Не исключено, что гугл все-таки одумается, и снимет блокировки айпи адресов на своей стороне. Поэтому окончательно отказываться от GAE я бы не стал, пока что есть возможность поддерживать CMS на локальной машине.

Однако неожиданно выяснилось, что так же просто забрать данные с локальной машины и залить их в гугловский GAE не получится. При попытке скачать dump с локальной машины в один файл, bulk_uploader ругается примерно так:

[ERROR ] Unable to download kind stats for all-kinds download.
[ERROR ] Kind stats are generated periodically by the appserver
[ERROR ] Kind stats are not available on dev_appserver.

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

./bulkloader.py –dump –app_id=your-app-id –kind=table1 –url=http://127.0.0.1:8080/remote_api –filename=table1.sql3

./bulkloader.py –dump –app_id= your-app-id –kind=table2 –url=http://127.0.0.1:8080/remote_api –filename=table2.sql3

Сохраненные таким образом дампы таблиц без проблем заливаются по очереди на Google App Engine.

Обновление Mplayer и файлы WMV

Очередное обновление Mplayer оказалось неудачным, при попытке проиграть любой файл WMV программа сваливается с вот таким текстом ошибки:

MPlayer interrupted by signal 11 in module: init_video_codec

- MPlayer crashed by bad usage of CPU/FPU/RAM.

Recompile MPlayer with --enable-debug and make a 'gdb' backtrace and

disassembly. Details in DOCS/HTML/en/bugreports_what.html#bugreports_crash.

- MPlayer crashed. This shouldn't happen.

It can be a bug in the MPlayer code _or_ in your drivers _or_ in your

gcc version. If you think it's MPlayer's fault, please read

DOCS/HTML/en/bugreports.html and follow the instructions there. We can't and

won't help unless you provide this information when reporting a possible bug.

Чтобы все заработало снова, надо всего лишь удалить пакет w32codec-all из системы, и все заработает.

Решение весьма странное, поскольку видеокодеки всегда помогали Mplayer’у в обработке различных видеофайлов. Похоже, что последние версии Mplayer’а больше не нуждаются в этом пакете и более того, конфликтуют с кодеками из w32codec-all.

Как скачать видео с сайта: продолжение.

В своей предыдущей статье Как скачать видео с сайта я рассказал о 4-х способах сохранения видеофайлов с сайтов, и самый популярный из них – достать файл из кэша браузера. Однако сейчас ситуация изменилась, после обновления Flash Player стал себя вести по-другому. Он по-прежнему кэширует видеофайлы на диске в директории /tmp, однако невооруженным взглядом такие файлы не видны; команда ls ничего не покажет.

Однако, если начать загрузку интересующего нас видео ролика:

и в командной строке запустить:

$ lsof | grep Flash
plugin-co 12081 ed 16u REG 8,4 32839768 473170 /tmp/FlashXXqNVerC (deleted)

Интересное кино получается. Файл открыт, используется, и при этом удален! Ну и хрен с ним, все равно его можно будет «оживить» простой командой копирования из поддиректории /proc/

Не буду томить, вот оживляющий скрипт:

#!/bin/bash
pid=`pgrep -f flashplayer | tail -1`
file=`lsof -p $pid | grep '/tmp/Flash' | awk 'END{print "/proc/" $2 "/fd/" $4}' | sed 's/[rwu]$//'`
/bin/cp $file "/tmp/movie.flv"

после запуска скрипта интересующее нас видео будет лежать в /tmp/movie.flv

Просмотр первого канала онлайн

Дело было вечером, отходить от компа было лень. И тут начинается какая-то передача, которую не хотел пропустить. Думаю, а не посмотреть ли мне ее онлайн? Зашел на сайт первого канала, кликнул ссылку – и вроде бы заработало все под моей OpenSuSe 11.2. Да только спустя 15 минут просмотра в полноэкранном режиме изображение свернулось в маленький квадрат, оставив остальную часть экрана в черном цвете.

«Интересно девки пляшут», подумал я, поперхнувшись пивом. А не обновить ли мне mplayer и браузерный плагин к нему? Нарушил я золотое правило админа и таки обновил его до последней версии. И получил не совсем то, что хотел, ибо онлайн трансляции первого канала перестали показываться.

Стал я разбираться в чем дело, и нашел вот что. Если взять URL online трансляции и скормить его обновленному mplayer’у, то видим примерно вот такие сообщения об ошибках:

$ mplayer "http://live3.1internet.tv/1tv-efir?key=+qs2TPeN6JUcMK7AQRfDiBKE&wmbitrate=350000"

....
Ahhhh, stream_chunck size is too small: 0
Error while parsing chunk header
Ahhhh, stream_chunck size is too small: 4
Error while parsing chunk header
Ahhhh, stream_chunck size is too small: 0
Error while parsing chunk header
Ahhhh, stream_chunck size is too small: 4
Error while parsing chunk header
Ahhhh, stream_chunck size is too small: 0
Error while parsing chunk header
Ahhhh, stream_chunck size is too small: 4
Error while parsing chunk header
...

Ну все, думаю, приплыли… Сломался mplayer.

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

Silverlight – это поделка Microsoft, который с линуксом не шибко дружит. Однако добрые люди написали порт под Linux c открытым кодом, и назвали его Moonlight. И даже сделали плагин для Firefox, и что самое интересное, плагин работает! Только ставить надо не последнюю версию плагина, а последнюю стабильную (2.4).

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

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

Как правильно удалять временные файлы

У меня OpenSuSe 11.2 живет уже довольно долго, и пока что ее менять ни на что не собираюсь. Однако в директории /tmp скапливается очень много временных файлов, которые система по умолчанию чистить не хочет. Я уж подумывал над написанием скрипта, который бы при перезагрузке очищал бы содержимое /tmp, но как оказалось, это был бы неправильный подход к решению проблемы.

В системе для этого предусмотрен совсем другой механизм. В Yast имеется редактор /etc/sysconfig, в котором можно настроить периодичность очистки временных файлов, а так же список директорий с временными файлами. Если компьютер с OpenSuSe используется как десктоп, то очистки /tmp при перезагрузке вполне достаточно. Если же он месяцами не перезагружается, то настройка должна быть более тонкой.

В редакторе /etc/sysconfig внутри ветки System => Cron есть специальные переменные, которые все это регулируют. Мои настройки выглядят так:

MAX_DAYS_IN_TMP = 100
MAX_DAYS_IN_LONG_TMP = 100
TMP_DIRS_TO_CLEAR = /tmp
LONG_TMP_DIRS_TO_CLEAR = /var/tmp
OWNER_TO_KEEP_IN_TMP = root
CLEAR_TMP_DIRS_AT_BOOTUP = yes

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

Как докачивать файлы по протоколу SFTP

Однажды мне потребовалось забрать бэкап с одного правильного хостинга. Архив получился большой, примерно в 4 Гб. Скачал где-то 92%, и тут бац – интернет-провайдер подвел, соединение померло.

Я качал файл с помощью утилиты sftp, и она стала показывать stalled вместо прогресса скачивания. Жалко файл было до безумия, заново качать 4 Гб очень не хотелось. Ну должен же быть способ докачивать файлы по протоколу SFTP, сам протокол докачку поддерживает

Стал курить мануалы, и выяснил – надо было качать с помощью scp, а не sftp – эта утилита 100% поддерживает докачку, в отличие от sftp. Ну как говориться, поздно пить боржоми, файл-то уже на 92% скачан. Оказалось, что докачать его все-таки можно, только вместо sftp надо использовать lftp. Выглядело это примерно так:

lftp sftp://mylogin@host.tld
cd /path/to/backup
get -c backup.tgz

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

Как обойти защиту от хотлинкинга

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

Работает это как прокси-сервер, скрипт забирает картинку и отдает ее тому, кто ввел капчу. Вроде несложно и кому-то может пригодиться. Кстати, вручную реферер вбивать не обязательно, скрипт попытается его вычислить. Но надежности ради я предусмотрел возможность добавления реферера вручную. Проверить можно хотя бы на этом примере.

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

З.Ы. Сервис абсолютно бесплатный

Кириллические домены и iDNS

Некоторые регистраторы с недавних пор предлагают зарегистрировать домены в зонах .рф, .ру, .ком, .нет, .орг и т.п. И есть же люди, которые таки хотят их использовать, несмотря на то, что корневые DNS-сервера вообще ничего не знают о этих доменных зонах.

Даже самый известный кириллический домен президент.рф и тот толком не распознается некоторыми серверами. Публичные DNS сервера Google о нем что-то знают:

dig xn--d1abbgf6aiiy.xn--p1ai @8.8.8.8

; <<>> DiG 9.6.1-P3 <<>> xn--d1abbgf6aiiy.xn--p1ai @8.8.8.8
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 61712
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;xn--d1abbgf6aiiy.xn--p1ai. IN A

;; ANSWER SECTION:
xn--d1abbgf6aiiy.xn--p1ai. 564 IN A 195.208.24.91

;; Query time: 75 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Wed Dec 1 17:29:40 2010
;; MSG SIZE rcvd: 59

А вот один из корневых серверов DNS не знает ничего:

dig xn--d1abbgf6aiiy.xn--p1ai @4.2.2.2

; <<>> DiG 9.6.1-P3 <<>> xn--d1abbgf6aiiy.xn--p1ai @4.2.2.2
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: SERVFAIL, id: 20017
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;xn--d1abbgf6aiiy.xn--p1ai. IN A

;; Query time: 78 msec
;; SERVER: 4.2.2.2#53(4.2.2.2)
;; WHEN: Wed Dec 1 17:29:49 2010
;; MSG SIZE rcvd: 43

Что касается зон iDNS (.ком, .нет, .орг), так они вообще мало кому доступны. Регистраторы (Webnames.ru) например предлагают воспользоваться какой-то говнософтиной вроде iChat, чтобы ваш компьютер смог нормально работать с такими доменами. Вот кому надо чего-то скачивать и ставить себе? Мало кто будет это делать.

На самом деле этот говнософт никому не нужен. Все, что надо, чтобы ресолвились доменные зоны .ком, .нет и .орг, это всего лишь прописать у себя правильный iDNS сервер, вместо DNS провайдера. На idns.net есть файл (db.cache) с корневыми серверами iDNS, можно один из них использовать вместо DNS провайдера:

> cat /etc/resolv.conf
nameserver 64.62.142.131 # iDNS
nameserver 195.161.113.189 #iDNS
nameserver 120.50.44.141 #iDNS

Но на самый правильный способ я натолкнулся на блоге ihtiandr.info, надо интернет провайдерам настроить свои DNS-сервера примерно вот так, и тогда ни у кого не будет геморроя с кириллическими доменами.

OpenSuSe 11.3, D-Link DWA 525 и танцы с бубном

D-Link DWA 525, сетевая карта с WiFi

Моя домашняя сеть продолжает расти, и мне потребовалось подключить еще один компьютер к моей точке доступа D-Link DWL 2100 AP. Посмотрев на прайс-листы ближайшего приличного магазина, присмотрелся я к сетевой карте с антенной – а именно к D-Link DWA 525. Традиционно погуглил эту карту на предмет наличия проблем с установкой под линуксом – вроде все чисто, решил купить. И тут началось….

Под Windows XP она встала и работает неплохо, но с картой совершенно не было драйверов под линукс. Свежепоставленная OpenSuSe 11.3 так же карточку не опознала как сетевую, пришлось качать драйвер с сайта dlink.ru и собирать его.

Дальше было еще интереснее, драйвер от dlink собрался, но карта работала только с открытыми сетями, без WEP или WPA шифрования. Разумеется, меня такой вариант не устроил, стал искать другое решение проблемы. Оказалось, что драйвера от d-link – это совсем не то, что нужно. Для карты D-Link DWA 525 прекрасно подошел последний драйвер от карты на том же чипсете (Ralink 3060, последнюю версию драйвера можно скачать с официального сайта: http://www.ralinktech.com/support.php?s=2).

Однако и тут обошлось не без танцев с бубном. Перед компиляцией драйвера надо залезть в файл os/linux/config.mk и поправить 2 строчки:

HAS_WPA_SUPPLICANT=y
HAS_NATIVE_WPA_SUPPLICANT_SUPPORT=y
(эти фичи выключены по умолчанию).

После сборки драйвера (make и make install) все замечательно заработало бы, если бы не ошибка в скрипте /etc/sysconfig/network/scripts/ifup-wireless Вместо этого глючного скрипта следует скачать исправленный скрипт, и только тогда все заработает, как надо.

Все вышесказанное относится к OpenSuSe 11.3 без обновлений (из коробки). Возможно, что после обновления этот скрипт уже будет пропатчен