четверг, 21 июня 2012 г.

Настройка Eclipse для разработки простого web-приложения на языке Python для развертывания в среде Google App Engine

Описан процесс установки, настройки среды разработки Eclipse, необходимых плагинов для него и создания простого web-приложения на языке Python для размещения в среде Google App Engine. При разработке приложения рассматриваются вопросы создания правил маршрутизации http-запросов с помощью среды webapp2, предоставляемой облаком Google App Engine, использования шаблонов в среде Jinja2.

Установка среды разработки Eclipse и плагинов для него

  1. Скачайте и установите комплект разработки Java с этой страницы http://www.oracle.com/technetwork/java/javase/downloads/jdk-7u4-downloads-1591156.html
  2. Скачайте и установите тоже самое для Python'а со страницы http://python.org/download/releases/2.7.3/
  3. Качаем и устанавливаем комплект разработчика для Google App Engine для Python со страницы https://developers.google.com/appengine/downloads#Google_App_Engine_SDK_for_Python
  4. Скачайте с этой страницы http://www.eclipse.org/downloads/packages/eclipse-ide-java-and-report-developers/indigosr2 Eclipse для вашей платформы, распакуйте скачанный архив, запустите Eclipse с помощью программы eclipse.exe папки eclipse, извлеченной из архива.
  5. Установите плагин Google App Engine для Eclipse: 
    1. Откройте окно установки плагинов через пункт меню Help - Install New Software...
    2. Нажмите кнопку Add... для добавления нового источника программного обеспечения
    3. В поле Name напишите GAE Plugin, а в поле Location: http://dl.google.com/eclipse/plugin/3.7 и нажмите кнопку OK
    4. Дождемся, когда загрузится список доступных из этого источника плагинов, и отметим пункты:
      • Google Plugin for Eclipse (required)
      • SDKs
    5. Нажмем кнопку Next дважды, соглашаемся с лицензиями и нажимаем кнопку Finish
    6. Терпеливо ждем окончания установки, попутно соглашаемся со всеми вопросами и предупреждениями, а в конце соглашаемся с перезагрузкой Eclipse'а
  6. Установите плагин PyDev для поддержки языка Python:
    1. Откройте окно установки плагинов через пункт меню Help - Install New Software...
    2. Нажмите кнопку Add... для добавления нового источника программного обеспечения
    3. В поле Name напишите PyDev, а в поле Location: http://pydev.org/updates и нажмите кнопку OK
    4. После загрузки списка плагинов отмечаем пункт PyDev
    5. Нажимаем кнопку Next, а потом еще раз, соглашаемся с лицензией и нажимаем кнопку Finish
    6. Ждем окончания процесса установки, соглашаясь со всем, в конце и с перезагрузкой
  7. Подключим интерпретатор Eclipse к установленному Python'у: откроем окно настроек через меню Window - Preferences; разверните ветку PyDev и выберите пункт Interpreter - Python; нажмите кнопку New...; рядом с полем Interpreter Executable нажмите кнопку Browse... и укажите python.exe из папки с Python'ом, установленном в пункте 2, нажмите ОК и в следующем окне тоже; кнопкой OK закройте окно настроек.
  8. Этот пункт следует выполнять после создания web-приложения. Добавим пункт запуска web-приложения в кнопку Run на панели инструментов: нажмите кнопочку со стрелкой вниз рядом с кнопкой Run и выберем пункт Run Configurations...; слева выберите ветку Python Run и нажмите кнопку New launch configuration в верхней части окна; в правой части окна заполните реквизиты следующими значениями:
    1. Name (название пункта запуска): helloworld
    2. Project: выберите наш проект
    3. Main Module (файл старта сервера разработки приложений: dev_appserver.py, он находится в комплекте разработчика для Google App Engine, установленном в пункте 3): в моем случае выглядит так: D:/gae-python-1.6.6/dev_appserver.py
    4. На закладке Arguments реквизит Program Arguments: "${workspace_loc}/helloworld" (название нашего проекта, создаваемого в следующем пункте)
    5. На последней закладке в реквизите Display in favorites menu установите галочку для пункта Run
    6. Нажмите кнопку Apply и теперь пунктик запуска будет доступен в кнопке Run

Создание простого web-приложения

Eclipse запущен, содержит необходимые плагины, и даже немного настроен, теперь создадим простое web-приложение и запустим его на локальном сервере разработки.
  1. Через меню File - New - Project... открываем окно создания проекта
  2. Разворачиваем ветку PyDev и выбираем пункт PyDev Google App Engine Project, нажимаем кнопку Next >
  3. Вводим следующие характеристики создаваемого приложения:
    • Project name: helloworld
    • Project type: Python
    • Grammar Version: 2.7
    • Interpreter: Default
    • Add project directory to the PYTHONPATH?
  4. Нажимаем кнопку Next >
  5. На следующей странице указываем каталог с комплектом разработчика Google App Engine для Python, установленного в 3-ем пункте предыдущего абзаца
  6. Потом появится окошко со списком добавляемых библиотек, нажмите OK, а потом кнопку Finish
  7. На вопрос о необходимости переключиться в перспективу PyDev - соглашайтесь
Проект создан приступим к разработке. Будем использовать фреймвок webapp, он уже установлен в Google App Engine.

Создание конфигурационного файла web-приложения

Конфигурационный файл определяет название приложения, его версию, а также различные компоненты приложения.
В корневой папке проекта создайте файл app.yaml со следующим содержимым:


Первые четыре реквизита определяют: название приложения, его версию, тип среды исполнения, версию используемого API.
Блок, начинающийся с элемента handlers, определяет коллекцию обработчиков http-запросов, каждый обработчик начинается с дефиса. В нашем случае все запросы обрабатываются объектом app скрипта main.py, кроме тех, что адресованы к каталогам css и img, эти папки содержат статические ресуры, о чем и указано в конфигурационном файле.
Блок, начинающийся с элемента libraries, определяет библиотеки, подключаемые к web-приложению, в нашем случае подключается библиотека jinja версии 2.6, используемая для реализации шаблонов отображения страниц.


Создание простого контроллера для отображения главной страницы

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


Строки, начинающиеся с import, подключают используемые библиотеки.
Класс MainPage, унаследованный от webapp2.RequestHanlder, определяет метод get, ответственный за обработку запроса. Метод создает шаблон на основе html-файла, описываемого ниже, и передает результат генерации страницы на основе шаблона в объект http-ответа.
Строка, определяющая объект app, содержит определение правил маршрутизации запроса http-запроса, из этого определения видно, что запрос к корневому каталогу ("/") должен обрабатываться классом Main.
Последняя строка создает окружение jinja для генерации  страниц из шаблонов.


Создание главной страницы

  1. В каталоге проекта создайте каталог pages, в ней будем размещать страницы нашего одностраничного web-приложения.
  2. В каталоге pages создайте файл main.html со следующим содержимым:

Страница представляет собой описание блоков шаблона страницы, у нас два блока: title и body.


Создание шаблона отображения страниц

Будем отображать главную страницу с помощью шаблона Simplex, а возьмем его отсюда http://www.oswd.org/design/preview/id/2552. Шаблон состоит из трех файлов:
  1. html -страница,
  2. css-стиль,
  3. изображение, используемое для рисования рамок.
Можно использовать и любой другой шаблон.
  1. В папке проекта создадим папки templates, css и img для хранения шаблонов html-страниц, листов стилей и изображений соответственно.
  2. В папку css положим лист стилей style.css.
  3. В папку img положим файл изображения bg.gif.
  4. В папку templates положим файл index.html и переименовываем его в simplex.html.
  5. В файле simplex.html находим строку, начинающуюся с <link href="style.css" и меняем значение реквизита href на "../css/style.css".
  6. Теперь в файле css/style.css меняем путь к файлу картинки на "../img/bg.gif".
  7. Добавим в шаблон точки вхождения блоков страницы, они отмечены конструкциями, вида: {% block [имя блока] %}{% endblock %}, в нашем случае их две под названиями title и body, шаблон должен выглядеть следующим образом:


Запуск web-приложения

Для запуска приложения выберите пункт меню helloworld из кнопки Run. После появления надписи "Running application dev~helloworld on port 8080: http://localhost:8080", откройте введите адрес http://localhost:8080 в адресную строку браузера.
Сейчас приложение запущена на локальном компьютере, это удобно в процессе разработки и отладки приложения. После завершения разработки необходимо опубликовать приложение в облаке Google AppEngine. Эта процедура несложна и аналогична созданию кнопки запуска приложения, при этом используется строка запуска скрипта: appcfg.py update ${workspace_loc}/helloworld

четверг, 3 мая 2012 г.

Использование Spring MVC для разработки приложений в среде Google App Engine


Использование Spring MVC для разработки приложений в среде Google App Engine

Рассматриваются вопросы использования среды разработки web-приложений Spring MVC в облаке Google AppEngine с использованием  декоратора SiteMesh.

Используется следующее программное обеспечение:
  • Eclipse с плагином Google AppEngine (версия Google AppEngine SDK 1.6.4)
  • Spring MVC 3.1.1
В папку /WEB-INF/lib положите следующие библиотеки:
  1. spring-webmvc-3.1.1.RELEASE.jar
  2. spring-asm-3.1.1.RELEASE.jar
  3. spring-beans-3.1.1.RELEASE.jar
  4. spring-context-3.1.1.RELEASE.jar
  5. spring-aop-3.1.1.RELEASE.jar
  6. spring-context-support-3.1.1.RELEASE.jar
  7. spring-core-3.1.1.RELEASE.jar
  8. commons-logging-1.1.1.jar
  9. spring-expression-3.1.1.RELEASE.jar
  10. spring-web-3.1.1.RELEASE.jar
  11. aopalliance-1.0.jar
  12. sitemesh-2.4.2.jar
Чтобы определить список необходимых библиотек, можно создать Maven-проект здесь же, в Eclipse, добавить зависимость spring-webmvc и посмотреть, что требуется. Вообще, есть плагин, позволяющий включить управления зависимостями в проекте web-приложения Google AppEngine, но что-то я с ним не подружился.

В build path проекта web-приложения нужно добавить:
  1. spring-webmvc-3.1.1.RELEASE.jar
  2. spring-context-3.1.1.RELEASE.jar
  3. spring-web-3.1.1.RELEASE.jar
В созданном проекте Google Web Application Project в файл web.xml нужно вставить следующие строки (все, что там уже есть, лучше удалить):


<filter>

    <filter-name>sitemesh</filter-name>
    <filter-class>com.opensymphony.sitemesh.webapp.SiteMeshFilter</filter-class>
</filter>

<filter-mapping>
    <filter-name>sitemesh</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

<servlet>
        <servlet-name>spring</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
        <servlet-name>spring</servlet-name>
        <url-pattern>/spring/*</url-pattern>
</servlet-mapping>

Сначала настроим подсистему декораторов, чтобы не вырисовывать каждую страницу отдельно, сделаем шаблон и будем его применять с помощью sitemesh, добавим в папку WEB-INF файл decorators.xml со следующим содержимым:

<decorators>
</decorators>

С декораторами пока закончим и продолжим позднее.

В папке WEB-INF нужно создать файл spring-servlet.xml (начало названия файла должно совпадать с названием сервлета из файла web.xml):

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:p="http://www.springframework.org/schema/p" 
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/context 
        http://www.springframework.org/schema/context/spring-context-3.0.xsd">

    <context:component-scan base-package="org.samples.controllers"/>


    <bean id="viewResolver"

class="org.springframework.web.servlet.view.UrlBasedViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
    </bean>

</beans>

Элемент <context:component-scan base-package="org.samples.controllers"/> определяет java-package, где Spring MVC будет искать контроллеры для обработки запросов к web-приложению.
Теперь создадим простой контроллер:

package org.samples.controllers;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class IndexController {
    @RequestMapping("/index")
    public String helloWorld(Model model) {
        model.addAttribute("message", "Hello World!");
        return "index";
    }
}

Контроллер будет обрабатывать запрос http://localhost:8888/spring/index

Теперь нужно создать страницу в папке WEB-INF/jsp под именем index.jsp (название файла определяется настройками в файле spring-servlet.xml и возвращаемым значением контроллера) и с текстом:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-">
<title>Приветствие</title>
</head>
<body>
<h1>${message}</h1>
</body>
</html>

После запуска web-приложения из Eclipse через правую кнопку мыши на проекте-Run As-Web Application, указанный выше url будет работать.

Ну а теперь сделаем простенький декоратор. Сначала заменим содержимое файла decorators.xml в папке WEB-INF на следующее:

<?xml version="1.0" encoding="UTF-8"?>

<decorators defaultdir="?WEB-INF/decorators">
    <decorator name="main" page="main.jsp">
          <pattern>/*</pattern>
    </decorator>
</decorators>

В папке /WEB-INF/decorators надо создать файл main.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

<%@ taglib uri="http://www.opensymphony.com/sitemesh/decorator" prefix="decorator" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title><decorator:title default="Hello" /></title>
<link rel="stylesheet" type="text/css" href="http://yui.yahooapis.com/combo?3.5.0/build/cssreset/cssreset-min.css&3.5.0/build/cssfonts/cssfonts-min.css&3.5.0/build/cssgrids/cssgrids-min.css&3.5.0/build/cssbase/cssbase-min.css" />
<style type="text/css">
body {
    margin: auto;
    width: 960px;
    height: 500px;
    border: 1px black dotted;
}
</style>

<decorator:head />
</head>
<body>

<decorator:body />

</body>
</html>

Это все, можно публиковать приложение в облаке Google App Engine.

четверг, 19 апреля 2012 г.

Установка OCS Inventory NG на Ubuntu 11.10

Приводится описание процесса установки системы инвентаризации программных средств и компьютерного оборудования OCS Inventory NG на сервер под управлением операционной системы Ubuntu 11.10. 


Установка стека AMP
Система OCS NG работает в серверной среде Apache+MySQL+PHP, называемой стек AMP, поэтому необходимо установить соответствующие компоненты стека с помощью команд (когда нужно вводите пароль текущего пользователя, а также в процессе установки отвечайте на другие вопросы):

# sudo apt-get install apache2
# sudo apt-get install php5 libapache2-mod-php5 php5-cli php5-common php5-cgi php5-gd
# sudo apt-get install mysql-client mysql-common mysql-server php5-mysql


Установка необходимых модулей
Для установки модулей необходимо выполнить команды:


# sudo apt-get install libxml-simple-perl
# sudo apt-get install libcompress-zlib-perl
# sudo apt-get install libdbi-perl
# sudo apt-get install libdbd-mysql-perl
# sudo apt-get install libapache-dbi-perl
# sudo apt-get install libnet-ip-perl
# sudo apt-get install libsoap-lite-perl
# sudo cpan -i XML::Entities


Установка OCS Inventory
Скачиваем OCS NG командой:


# wget http://launchpad.net/ocsinventory-server/stable-2.0/2.0.3/+download/OCSNG_UNIX_SERVER-2.0.3.tar.gz


и распаковываем:


# tar xvfz OCSNG_UNIX_SERVER-2.0.3.tar.gz


запускаем установку


# cd OCSNG_UNIX_SERVER-2.0.3
# sudo ./setup.sh


далее на все вопросы жмем "Enter".
Перезапускаем web-сервер:


# sudo /etc/init.d/apache2 restart


Заходим браузером по адресу http://localhost/ocsreports/install.php, в качестве пользователя MySQL введите root и пароль указанный при установке сервера MySQL. После этого перейдите на страниц http://localhost/ocsreports/, используя для входа логин admin и пароль admin.


Установка агентов инвентаризации
Агент для ОС Windows на данный момент версии 2.0.3 содержит неизвестную ошибку, не позволяющую агенту скачивать пакеты с сервера инвентаризации. Поэтому стоит установить версию 2.0.3.1, как указано на странице, посвященной этой проблеме. 


Настройка SSL
Поддержка SSL необходима, если планируется использовать встроенные в OCS NG механизмы распространения ПО на наблюдаемых компьютерах (с установленными агентами.). Здесь будет приведен пример настройки SSL с использованием самоподписанного сертификата.


Создайте закрытый ключ:


# openssl genrsa -des3 -out server.key 1024


Создайте запрос на сертификат:


# openssl req -new -key server.key -out server.csr

Удалите пароль из закрытого ключа, предварительно сделав копию ключа:

# cp server.key server.key.bak
# openssl rsa -in server.key.bak -out server.key

Создайте сертификат сервера:

# openssl x509 -req -outform PEM -days 730 -in server.csr -signkey server.key -out server.crt


Скопируйте сертификат и закрытый ключ в каталог с конфигурационными файлами web-сервера (для нашей системы это /etc/apache2):


# sudo cp server.crt /etc/apache2
# sudo cp server.key /etc/apache2


Добавьте следующие строки в конец файла /etc/apache2/apache2.conf:


<VirtualHost *:443>
    SSLEngine on
    SSLCertificateFile /etc/apache2/server.crt
    SSLCertificateKeyFile /etc/apache2/server.key
</VirtualHost>



Включите поддержку ssl в web-сервере командой:


# sudo a2enmod ssl


Перезапустите web-сервер:

# sudo service apache2 restart



вторник, 3 января 2012 г.

Установка OTRS на Ubuntu 11.10

Приводятся инструкции по установке OTRS (использовалась версия 3.0.11) на Ubuntu 11.10. За исключением некоторых незначительных моментов, является переводом статьи.

Установка
Мы будем устанавливать OTRS в каталог /opt, приложение устанавливаем вручную, не используя менеджеры пакетов, начнем.
  • Скачайте исходный код в виде .tar.gz из  http://www.otrs.com/open-source/get-otrs/software-download/ (можно командой, wget http://ftp.otrs.org/pub/otrs/otrs-3.0.11.tar.gz)
  • распаковываем архив и перемещаем его в папку /opt
# tar xfz orts-3.0.11.tar.gz
# sudo mv otrs-3.0.11 /opt/otrs

Теперь устанавливаем необходимые модули Perl'а, web-сервер и сервер базы данных:

# sudo apt-get install libapache2-mod-perl2 libdbd-mysql-perl libnet-dns-perl libnet-ldap-perl libio-socket-ssl-perl libpdf-api2-perl libsoap-lite-perl libgd-text-perl libgd-graph-perl libapache-dbi-perl mysql-server

Конечно, можно запускать сервер БД на другом компьютере или использовать, например, PostgreSQL вместо MySQL. Но эти возможности рассмотрены здесь не будут.
Теперь создадим пользователя для запуска cron-заданий OTRS. Пользователя должен быть добавлен в группу web-сервера и его домашним каталогом должен быть /opt/otrs.

# sudo useradd -r -d /opt/otrs/ -c 'OTRS user' otrs 
# sudo usermod -g www-data otrs

Теперь нужно подготовить конфигурационные файлы OTRS. 


# cd /opt/otrs/Kernel
# cp Config.pm.dist Config.pm
# cp Config/GenericAgent.pm.dist Config/GenericAgent.pm

Теперь нужно добавить разрешения для пользователя OTRS и пользователя web-сервера на папку /opt/otrs. Для этого воспользуемся скриптом.


# cd /opt/otrs
# sudo bin/otrs.SetPermissions.pl --otrs-user=otrs --otrs-group=otrs --web-user=www-data --web-group=www-data /opt/otrs

Конфигурация web-сервера
OTRS содержит конфигурацию по умолчанию для web-сервера Apache.  Необходимо добавить конфигурационный файл и перезапустить web-сервер.
# sudo cp /opt/otrs/scripts/apache2-httpd.include.conf /etc/apache2/conf.d/otrs.conf
# sudo service apache2 restart

Для крутых: Запуск web-сервера от имени пользователя otrs
Единственная причина такого запуска - это создание выделенной системы для OTRS. Это упрощает администрирование, поскольку не приходится беспокоиться о двух пользователях файлов OTRS.
Измените файл /etc/apache2/envvars
Закомментируйте нижеприведенные строки добавив символ # в начале каждой строки.


export APACHE_RUN_USER=www-data
export APACHE_RUN_GROUP=www-data

и добавьте эти две строки:

export APACHE_RUN_USER=otrs
export APACHE_RUN_GROUP=otrs

теперь перезапустите web-сервер командой: sudo service apache2 restart.

Web-установка
Перейдите по адресу http://127.0.0.1/otrs/installer.pl с помощью web-браузера. Если вы не устанавливали браузер на сервере Ubuntu (что сильно распространено) вы можете получить доступ к web-установке, заменив 127.0.0.1 на адрес вашего сервера. В web-установке вы сможете создать базу данных для использования с OTRS (используйте указанный вами ранее пароль root для MySQL), а также другие базовые настройки. Далее вы сможете зайти в OTRS с учеткой по умолчанию root@localhost и паролем root.
Включим рекомендуемый модуль Apache::DBI, позволяющий увеличить производительность.... 
TODO похоже это делать необязательно, поэтому пока пропустим этот этап. 

Настройка cron-заданий OTRS
OTRS использует различные задания cron для времязависимых действий, например, эскалация заявок, отсылка напоминаний, получение почты из POP и IMAP ящиков и т.д. Необходимо настроить эти задания, чтобы они выполнялись от имени пользователя OTRS.

# cd /opt/otrs/var/cron
# sudo su
# for foo in *.dist; do cp $foo `basename $foo .dist`; done

Эти команды заменяют и создают cron-задания OTRS.
Теперь надо добавить их в таблицу заданий (crontab) пользователя otrs:


cd /opt/otrs
bin/Cron.sh start otrs

Теперь задания запланированы и будут исполняться с предопределенным интервалом.
Можно проверить корректность настройки с помощью команды: crontab -l -u otrs.
Система готова можно заходить с использованием учетки по умолчанию root@localhost и паролем root, создавать пользователей, настраивать входящую и исходящую почту.