вторник, 23 августа 2011 г.

Полезное приложение expect (Linux)

Понадобилось автоматизировать процесс развертывания свежей версии веб-приложения на Django из SVN-репозитария.

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

Рассмотрим подробнее - необходимо выполнить:

django-admin.py flush --pythonpath . --settings settings

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

Как организовать эмуляцию ввода?

echo yes|django-admin.py flush --pythonpath . --settings settings

А как быть с вводом нескольких строк?

django-admin.py flush --pythonpath . --settings settings << EOF
yes
yes
admin
...
password
EOF

Все хорошо, да вот пароль так ввести не получится.

Выход? Правильно - expect!

Создаем следующий скрипт flush.exp:

spawn django-admin.py flush --pythonpath . --settings settings
expect continue { send yes\r }
expect create { send yes\r }
...
expect Password { send password\r }
expect again { send password\r }
close

Все! Теперь осталось выполнить:

expect -f flush.exp

О назначении команд скрипта догадаться не сложно, на этом все.

пятница, 19 августа 2011 г.

Sharing ASP.NET MVC views across multiple projects (apps)

Если ведется разработка нескольких проектов, использующих ASP.NET MVC, вполне возможна ситуация, когда появляются представления (views), или частичные представления (partial views) с идентичной функциональностью. Например, календарь для выбора даты. Но попытка получить из одного приложения доступ к ресурсам другого будет пресечена политиками безопасности (что, в принципе, разумно).

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

Для решения задачи целесообразно применить возможность IIS создавать виртуальные директории. Теперь, при разворачивании (deployment) решения, необходимо создать одну физическую директорию (physical directory), содержащую общие представления (shared views), и после этого создать по виртуальной директории (virtual directory) для каждого проекта, которые будут отображаться на эту единственную физическую.

Это решение простое, не требующее особых усилий для реализации и, к тому же, не противоречащее политикам безопасности, принятым по умолчанию, поэтому, как по мне, оно хорошо подходит для использования на практике.

понедельник, 15 августа 2011 г.

IIS Restart

Опытные разработчики скорее всего знают, но все равно отмечу, что iisreset (из командной строки) работает более надежно, чем перезапуск сервера (Restart) с помощью консоли управления (IIS Management).

Таким образом, если "обычный" перезапуск из консоли управления не помогает - iisreset скорее всего решит проблему.

вторник, 2 августа 2011 г.

ASP.NET MVC, ORM, ReflectionPermission и Trust Level

Используя ORM в проекте ASP.NET MVC, который хостится на IIS, можно столкнуться с ошибкой системы безопасности вроде "System.Security.SecurityException: Request for the permission of type 'System.Security.Permissions.ReflectionPermission, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' failed.".

При этом приложение имеет Full Trust Level (...trust level="Full"... в конфиге, что также подтверждается, если заглянуть в консоль управления IIS).

Проблема может быть связана с текущим значением Application Pool Identity (запрет превыше разрешения) - в данном случае использование NetworkService решило проблему, так как у AppPoolIdentity отсутствовали необходимые разрешения.