Архивы по Категориям: ПО

Экспорт-импорт данных django-cms

Приводил сегодня в порядок базу данных одного проекта на django-cms и в ходе этого процесса решил перенести накопившиеся данные в новую БД, инициализированную с нуля и с успешно прогнанными миграциями. И, т.к в документации об этом не было ни слова, пришлось искать решение, и наткнуться на пару ошибок, после которых удалось создать готовый рецепт:

  • Первым делом переносим данные из таблицы auth_user, например, средствами БД;
  • Далее делаем два файла с данными. Так нужно, чтобы избежать проблемы с ключами в таблице cms_placeholder (IntegrityError: duplicate key value violates unique constraint «cms_placeholder_pkey»), которые например описаны в рассылке django-cms:

    ./manage.py dumpdata --indent=2 cms.placeholder > initial_data.cms.01.json

    ./manage.py dumpdata --indent=2 cms.cmsplugin cms.page cms.pagemoderatorstate cms.pageuser \
    cms.title picture snippet text (сюда-же впишем и остальные плагины) > initial_data.cms.02.json

  • И теперь загружаем полученные данные в новую БД:

    ./manage.py loaddata initial_data.cms.01.json
    ./manage.py loaddata initial_data.cms.02.json

Wi-Fi в Ubuntu 11.04

После установки свежей Ubuntu 11.04 (Natty Narwhal) на свой Ideapad U165 обнаружил, что Wi-Fi теперь не включается, даже если включить галочку «Беспроводные соединения» в Network Manager. Полдня было убито на копание в форумах, чтобы вытащить работающий рецепт для устройств broadcom с идентификатором 14e4:4727 (BCM4313): достаточно запретить модуль acer-wmi


modprobe -r acer-wmi

И после этого включить его в /etc/modprobe.d/blacklist.conf, чтобы этот поганец не мешался после перезагрузки.

django-cms, mptt и get_ancestors

Почему-то поисковики плохо выводят на решение проблемы с django-cms, когда, скажем, после обновления, попытка выполнить любую команду через manage.py приводит к ошибке:

File "/usr/local/lib/python2.6/dist-packages/publisher/mptt_support.py", line 142, in install_mptt
    attrs[method_name] = getattr(mptt_models, method_name)
AttributeError: 'module' object has no attribute 'get_ancestors'

Решение на самом деле простое: в django-cms есть уже встроенный модуль mptt. Но, если ставить через pip, то он устанавливает django-mptt, который естественно оказывается приоритетнее и несовместимым. Выход один: удалять django-mptt сразу после установки. Ну и использовать virtualenv, если есть необходимость в свежей версии django-mptt.

Дополнение: в django-cms версии 2.2 обещают прекратить эту порочную практику и нормально работать с django-mptt. Так-что ждём :)

Успел за трендом

Вот и я оказался среди прочих, кто завёл себе профиль на github. В качестве пробного шара выложил туда модуль доставки ЕМС России для Satchmo (интернет-магазин на Django). Модуль обкатан и используется в нашем велоодежном проекте и может пригодится тем, кто смотрит в сторону python для своего магазина в сети. Всё-таки пока для России Satchmo не слишком готов.

Страдания из-за ошибки от git push

Два дня пытался разобраться почему не проходит git push в мой репозиторий. Ошибка была вида «PUT xxxxxxxxxxxxxxxxxxxxxxx failed, aborting (22/413)». Грешил на WebDAV, даже попробовал настроить доступ к репозиторию через nginx (к слову push тогда работать не будет, т.к. nginx не умеет обрабатывать WebDAV комманды вроде PROPFIND). Проблема решилась, когда узнал, что «22/413» означает коды ошибок CURL/HTTP. А HTTP 413 — это «Request entity too large». Всего-то надо было поправить максимальный размер запроса от клиента :)

Как я настраивал gitweb

Методом проб и ошибок, наконец разобрался как настроить себе на одном домене gitweb и доступ к репозиториям через HTTP. Ошибкой было то, что я считал, что достаточно одного gitweb а на деле оказалось ещё и небольшое шаманство с Апачем. За основу взята инструкция с хабрахабр.

  • Первым делом установил сами пакеты:
    aptitude install git-core gitweb
    
  • Создал каталоги для репозиториев и веб-доступа:
    mkdir -p /web/git.domain.tld/{htdocs,logs} /web/git.domain.tld/htdocs/git
    
  • Активируем модули DAV в Апаче, для доступа с помощью git:
    a2enmod dav
    a2enmod dav_fs
    a2enmod rewrite
    a2enmod env
    
  • Создаем конфигурацию gitweb:
    vim /web/git.domain.tld/gitweb.conf
    

    Например:

    # адрес репозиториев
    $my_uri = "http://git.domain.tld";
    # название сайта, отображается в заголовке
    $site_name = "git.domain.tld";
    # путь к репозиториям git на жёстком диске
    $projectroot = "/web/git.domain.tld/htdocs/git/";
    
    $git_temp = "/tmp";
    # ссылка на «домашнюю страничку»
    $home_link = $my_uri;
    # текст, можно расскоментировать и вставить свой
    # $home_text = "indextext.html";
    $projects_list = $projectroot;
    $stylesheet = "/gitweb/gitweb.css";
    $logo = "/gitweb/git-logo.png";
    $favicon = "/gitweb/git-favicon.png";
    $projects_list_description_width = 40;
    
    $feature{'pathinfo'}{'default'} = [1];
    
  • И на закуску самое вкусное — настройки Апача:
    <VirtualHost *:80>
            ServerName git.domain.tld
            ServerSignature Off
    
            ServerAdmin admin@git.domain.tld
    
            DocumentRoot /web/git.domain.tld/htdocs/
            ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
    
            SetEnv GITWEB_CONFIG /web/git.domain.tld/gitweb.conf
            Alias /gitweb /usr/share/gitweb/
    
            RewriteEngine on
            RewriteRule ^/([a-zA-Z0-9_\-]+\.git.*)$ /cgi-bin/gitweb.cgi/$1 [L,PT]
    
            <Directory /web/git.domain.tld/htdocs>
                    Options Indexes FollowSymLinks ExecCGI
                    AllowOverride None
                    Order allow,deny
                    allow from all
            </Directory>
    
            <Location /git>
                    DAV on
                    <LimitExcept GET HEAD PROPFIND OPTIONS REPORT>
                            Require valid-user
                    </LimitExcept>
            </Location>
    
            ErrorLog /var/log/apache2/error.log
    
            <Location />
                    DirectoryIndex /cgi-bin/gitweb.cgi
    
                    AuthType Basic
                    AuthName "Version Control Server"
                    AuthUserFile /web/git.domain.tld/htusers
                    Require valid-user
            </Location>
    </VirtualHost>
    

Остается только завести пользователей в web/git.domain.tld/htusers и создавать репозитории в /web/git.domain.tld/htdocs/git. Например, создав myrepo.git (с опцией --bare) мы увидим его в списке проектов, зайдя браузером на git.domain.tld, а чтобы работать с ним через git надо будет использовать url http://git.domain.tld/git/myrepo.git/,

Do it satchmo way

Недавно потребовалось быстро развернуть более-менее универсальный магазин для нашего нового проекта торговли велотоварами. PHP-системы мне как-то не нравились и из симпатии к python начал было писать проект на django, но вскоре понял, что скорее всего получается велосипед, и начал искать что-то готовое. Оно пришло в виде Satchmo, весьма универсального и накручиваемого решения для электронной торговли. Что понравилось — немало настроек, в которых поначалу можно запутаться. Есть тонкости в адаптации под себя, но они описаны в документации (один отсутствующий момент — это как обновлять sitemaps, пришлось додумывать и доделывать самома). Но главное, магазин развернулся из коробки и через пару часов в нём уже можно было добавлять товары. А вот допиливания мелочей происходят уже по ходу, и зачастую незаметно для посетителей :)

Получение приватного SSL-ключа без пароля

Защищать приватный ключ SSL-соединений паролем в большинстве случаев очень хорошая идея, но некоторое ПО (в частности некоторые классы PHP) не всегда нормально воспринимают такие файлы, особенно в формате PEM. Чтобы дать им счастье и умиротворение достаточно с помощью openssl провести пару простых операций импорта-экспорта и получить желаемый файл без паролей:

cat my.crt my.key > my.pem
openssl pkcs12 -export -in my.pem -nodes -out my.pfx
openssl pkcs12 -in my.pfx -out my-nodes.key -nodes -nocerts

В примере из файлов my.crt и my.key получаем незащищенный файл my-nodes.key. Взято отсюда.

Задание разрешения экрана в VirtualBox

На рабочей системе я держу Kubuntu под VirtualBox в которой провожу основную разработку (привык к bash, да и gvim там как-то симпатичнее). Но вот проблема: разрешение рабочего стола у меня 1280×800, но при запуске виртуальной машины в полный экран при загрузке получаю всего 1024×768. Помогало переключение в оконный режим и возврат в полноэкранный. Но оказалось есть более удачный способ. Нужно зайти в каталог где установлен VirtualBox и запустить команду вида:


VBoxManage setextradata global GUI/MaxGuestResolution 1280,800

где последний параметр — это собственно и есть желаемое разрешение. Работает, сохраняется после выключения и новой загрузки. Такая вот магия командной строки :)

Unknown SSL protocol error

При запросе из PHP с помощью HTTPRequest к интерфейсу одной серьёзной биллинговой системы получал постоянно ошибку «Unknown SSL protocol error in connection to xxx.xxx.xxx.xxx:443». Быстрый взгляд в гугл подсказал только перебирать параметры, что оказалось вполне верной догадкой: оказывается хост нормальное работал с SSLv2, который не использовался при соединении. Пришлось указать принудительно строкой:

$req->setOptions(array('ssl' => array('version' => SSL_VERSION_SSLv2)));

Потом правда всплыли и другие прелести, вроде отдачи XML в UTF-8 с типом «text/html; charset=ISO-8859-1», но такие шутки находятся быстрее и решаются проще.