суббота, 17 ноября 2012 г.

Настройка VirtualBox в ubuntu 12.04 server

Устанавливаем virtualbox c официального сайта https://www.virtualbox.org/wiki/Downloads.
Для запуска сервиса vboxweb-service необходимо наличие файла /etc/default/virtualbox. Если он не существует, его необходимо создать. Перечень доступных опций:

Setting Description
VBOXWEB_USER The user as which vboxwebsrv will run.
VBOXWEB_HOST The host to bind to (localhost).
VBOXWEB_PORT The port to bind to (18083).
VBOXWEB_TIMEOUT Session timeout in seconds; 0 = disable timeouts (300).
VBOXWEB_CHECK_INTERVAL Frequency of timeout checks in seconds (5).
VBOXWEB_THREADS Maximum number of worker threads to run in parallel (100).
VBOXWEB_KEEPALIVE Maximum number of requests before a socket will be closed (100).
VBOXWEB_LOGFILE Name of file to write log to (no file).
INSTALL_DIR The location of the vboxwebsrv binary (/usr/lib/virtualbox).

Необходимо указать хотя бы пользователя, от имени которого будет производиться запуск сервиса. Если планируется получать доступ к сервису удаленно, то нужно указать также VBOXWEB_HOST. В моем случае, чтобы jenkins мог подключаться к сервису пришлось явно  указать ip.

Настройка svn+sasl+ldap

Задача
Настроить аутентификацию Active Directory пользователей в Subversion для работы по протоколу SVN.

Использованные материалы
Using Cyrus SASL Authentication with Subversion
Настройка SVN вместе с LDAP
SVN SASL Commit - Authorisation failed
Subversion+OpenLDAP
SVN Authentication against a Microsoft Active Directory using svnserve sasl, ldap
Chapter 6. Server Configuration
Создаем свой SVN сервер: 3$ и 30 минут


Реализации
Доступ к SVN может быть предоставлен несколькими способами:
1. Доступ по протоколу SVN используя встроенную аутентификацию.
2. Доступ по протоколу SVN используя SASL аутентификацию.
3. Доступ по протоколу HTTP/HTTPS через Apache и libapache2-svn.
4. Доступ через тонель поверх SSH.

На данный момент у нас настроен с пособ с Apache/HTTPS. Устраивает всё кроме скорости работы. Посему всё склоняются к работе по протоколу svn:// и используя внутренюю аутентификцию.
Будет использован механизм аутентификации SASL-ldap.

Настройка
Окружение
cat /etc/lsb-release
Цитировать
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=12.04
DISTRIB_CODENAME=precise
DISTRIB_DESCRIPTION="Ubuntu 12.04 LTS"

svn --version
Цитировать
svn, version 1.6.17 (r1128011)
   compiled Dec 17 2011, 16:12:52

Copyright (C) 2000-2009 CollabNet.
Subversion is open source software, see http://subversion.apache.org/
This product includes software developed by CollabNet (http://www.Collab.Net/).

The following repository access (RA) modules are available:

* ra_neon : Module for accessing a repository via WebDAV protocol using Neon.
  - handles 'http' scheme
  - handles 'https' scheme
* ra_svn : Module for accessing a repository using the svn network protocol.
  - with Cyrus SASL authentication

  - handles 'svn' scheme
* ra_local : Module for accessing a repository on local disk.
  - handles 'file' scheme
Т.е. настройка в Ubuntu 12.04 где SVN уже идёт с поддержкой SASL.

Устанавливаем необходимые пакеты
sudo apt-get install sasl2-bin libsasl2-2 libsasl2-modules libsasl2-modules-ldap
Настраиваем SASL
vi /etc/default/saslauthd
Цитировать
START=yes
MECHANISMS="ldap"

vi /etc/saslauthd.conf
Цитировать
ldap_servers: ldap://dc.domain.com
ldap_search_base: OU=Users,DC=DOMAIN,DC=COM
ldap_bind_dn: domain\ldapuser
ldap_bind_pw: *******
# Misc options for LDAP to make it work with Microsoft AD
ldap_deref: never
ldap_restart: yes
ldap_scope: sub
ldap_use_sasl: no
ldap_start_tls: no
ldap_version: 3
ldap_auth_method: bind
ldap_filter: (sAMAccountName=%u)
ldap_password_attr: userPassword
ldap_timeout: 10
ldap_cache_ttl: 30
ldap_cache_mem: 32768

Стартуем SASL демон
/etc/init.d/saslauthd restart
Тестируем что наш SASL-ldap механизм работает
testsaslauthd -u domainuser -p *******
Цитировать
0: OK "Success."
Ежели проблемы, то стартуем sasl демон с дебагом и смотирм логи
/usr/sbin/saslauthd -a ldap -d -n 1 -V
tail /var/log/auth.log

Указываем SVN что аутентификация у нас будет через SASL
vi /var/svn/sandbox/conf/svnserve.conf
Цитировать
[general]
anon-access = none
auth-access = write
authz-db = ../../authz
realm = Sandbox

[sasl]
use-sasl = true
min-encryption = 0
max-encryption = 256

Создаём файл с настройками уатентификации для SVN в папке с плагинами для sasl(имя файла svn.conf)
vi /usr/lib/sasl2/svn.conf
Цитировать
## Password check method, default to the SASL AUTH daemon
pwcheck_method: saslauthd
## Auxiliary (propery) plugin, use ldapdb
auxprop_plugin: ldapdb
## Mechanism list, MS AD requires you to send credentials in plain text
mech_list: PLAIN
ldapdb_mech: PLAIN
## Saslauthd socket path
saslauthd_path: /var/run/saslauthd/mux
## Ldap server uri
ldapdb_uri: ldap://dc.domain.com

Перегружаем демон SVN
service svnserve restart
Теперь пользователи Active Directory смогут получать доступ к репозиторию согласно доступам прописанным в файле authz-db = ../../authz

Недостатки метода
При таком методе аутентификации мы вынуждены передавать пароль в PLAIN а иначе мы несможем cоедениться с AD.
В результате:
tcpdump -ni eth0 -A src host 192.168.1.2 and tcp dst port 3690
Цитировать
17:10:10.488834 IP 192.168.1.2.59751 > 192.168.1.1.3690: Flags [P.], seq 145:184, ack 166, win 65115, length 39
E..O.b@...."..@...@     .g.j....~...P..[....( PLAIN ( 21:AHVzZXIAcGFzc3dvcmQ=
Заходим Base64 Decode и видим какой пароль передавался по сети.

Метод я настроил и понял что пользоваться им нестоит, т.к. под угрозу ставяться пароли пользователей.

Пошёл смотреть в сторону SVN + SASL GSSAPI(Kerberos)

Источник:
http://forum.ubuntu.ru/index.php?topic=197819.0

Стоит обратить внимание на параметр auxprop_plugin: в файле svn.conf. В ubuntu 12.04 precise его значение должно быть ldapdb, хотя в других системах, в том числе и ubuntu 10.04 lucid допускалось ldap.

воскресенье, 28 октября 2012 г.

wifi адаптер Atheros AR9285

В убунту 12.04 появились проблемы со стабильностью подключения по wifi через встроенный в lenovo b570e wifi адаптер Atheros AR9285. Найденные советы в сети по отключению power managment (http://www.emmolution.org/?p=253) не помогли. Решением является установка BSSID в менеджере подключений (http://ubuntuforums.org/showpost.php?p=11647255&postcount=643).

Ссылки:
http://ubuntuforums.org/showpost.php?p=11647255&postcount=643
http://ubuntuforums.org/showthread.php?t=1983003
http://www.emmolution.org/?p=253

четверг, 4 октября 2012 г.

Импорт плагина qml через ресурсы qrc

Qt позволяет воспользоваться системой ресурсов для вкомпиливания в бинарь .qml и qmldir файлов. В таком подходе все отлично, до тех пор пока не понадобится импортировать с++ плагин для qml. Движок импорта ищет плагин, описанный в qmldir как plugin name relpath, в окружении "qrc:/". Соответственно, не может найти там плагин. При попытке задать вместо relpath абсолютный путь файловой системы все заработало. Следует подумать в этом направлении.

зы Включить трассировку импорта можно так:
     QByteArray data = "1";
    qputenv("QML_IMPORT_TRACE", data); 

вторник, 28 августа 2012 г.

sudo/kdesudo перестает работать для gui из-за правил в sudoers

При добавлении строки
Defaults        env_keep="HOME USER PATH http_proxy https_proxy"
в файл /etc/sudoers перестает работать gui через sudo. Например, sudo partitionmanager или kdesudo partitionmanager.

воскресенье, 15 июля 2012 г.

Настройка proxy для sudo

Для того чтобы команда sudo подхватывало переменные окружения вида http_proxy, необходимо в файле /etc/sudoers добавить строку Defaults env_keep="HOME USER PATH http_proxy https_proxy"

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

Настройка cdt eclipse

Для того, чтобы заработал context assist с библиотекой qt необходимо в настройках проекта включить ВСЕ пути к заголовочным файлам qt и запустить indexer -> rebuild.

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

вторник, 26 июня 2012 г.

subversion 1.7 в kubuntu 12.04 (precise)

Для установки subversion 1.7 в kubuntu 12.04 (precise) необходимо добавить в файл /etc/apt/sources.list строку
deb http://ppa.launchpad.net/dominik-stadler/subversion-1.7/ubuntu precise main

Далее выполнить установку или обновление пакета subversion

sudo aptitude update
sudo aptitude install subversion (sudo aptitude safe-upgrade)

вторник, 19 июня 2012 г.

Заморозка GUI в Qt

Для решения проблем заморозки GUI и реализации отзывчивых приложений необходимо придерживаться советов из следующих статей:
http://doc.qt.nokia.com/qq/qq27-responsive-guis.html
http://qt-project.org/wiki/Progress-bar

Класс для выполнения длительных операций в отдельном потоке с выводом QProgressBar:

file.h



typedef boost::function< void () > BusyFunction;

class Busy : public QObject
{
    Q_OBJECT

public:

    Busy( const QString& label
          , const BusyFunction& longOperationFunction
          , QWidget* parentWidget );
 
private:
 
    void start();
 
private:

    CONST_PROPERTY( QPointer< QFutureWatcher< void > >
                    , watcher );
 
    CONST_PROPERTY( QPointer< QProgressDialog >, progress );

    CONST_PROPERTY( BusyFunction, longOperationFunction );
};


file.cpp


Busy::Busy( const QString& label
            , const BusyFunction& longOperationFunction
            , QWidget* parentWidget )
    : QObject()
      , INIT_PROPERTY( watcher, new QFutureWatcher< void >( this ) )
      , INIT_PROPERTY( progress
                       , new QProgressDialog( label, QString(), 0, 0
                                              , parentWidget ) )
      , INIT_PROPERTY( longOperationFunction, longOperationFunction )
{
    this->progress()->setWindowFlags( Qt::Tool | Qt::CustomizeWindowHint
                                          | Qt::WindowTitleHint );
 
    this->progress()->setWindowModality( Qt::WindowModal );

    this->progress()->setCancelButton( 0 );

    connect( this->watcher(), SIGNAL( finished() )
             , this->progress(), SLOT( cancel() ) );

    this->start();
}

void Busy::start()
{
    QFuture< void > future = QtConcurrent::run( this->longOperationFunction() );

    this->watcher()->setFuture( future );

    this->progress()->exec();
}


preocessEvents из дополнительного потока Qt

В qt нельзя вызвать processEvents из другого (не gui) потока. При создании потока и связи сигнала этого потока со слотом главного потока посредством connect через Qt::DirectConnection, слот будет выполняться в дополнительном потоке. Проверить принадлежность к потоку можно вызовом QThread::currentThread(). В связи с этим вызов метода QApplication::processEvents() из слота не предпримет никаких действий, т.к. для дополнительного потока очередь gui событий будет пуста. (QApplication::hasPendingEvents() вернет false).

понедельник, 4 июня 2012 г.

Хранение GUI настроек окна в Qt4

В виду особенностей X11 не рекомендуется для хранения геометрии окна использовать метод QWidget::geometry() и восстанавливать методом QWidget::setGeometry(). Вместо этого нужно использовать QRect( QWidget::pos(), QWidget::size() ) и восстанавливать через QWidget::move() и QWidget::resize();

links:
http://qt-project.org/doc/qt-4.8/application-windows.html
http://qt-project.org/doc/qt-4.8/qsettings.html

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

#include "" и INCLUDEPATH

В файлах #include нужно указывать относительно текущего файла. В таком случае includepath можно не указывать, компилятор производит автоматический поиск относительно компилируемого файла.

Например,
src
    - first
        - signal.h
        - first.cpp
    - second
        - signal.h
    - main
        - main.cpp

main.cpp
#include "../first/signal.h" // правильно
#include "../second/signal.h" // правильно

first.cpp
#include "signal.h" //правильно, равно first/signal.h, вне зависимости от includepath

Но если main.cpp будет такого вида:
#include "signal.h" // неверно, хотя и будет работать, если установлен INCLUDEPATH
и присутствует includepath, то выберется тот signal.h, папка которого находится раньше в includepath.

По мере разрастания проекта или выделения библиотеки позволяется для поиска хедеров в определенной директории установить INCLUDEPATH.

http://www.mingw.org/wiki/IncludePathHOWTO

Ограничение mingw на уровень вложенности хедера

Необъяснимое ограничение в mingw количество уровней вложенности файлов, включаемых через #include. Ошибка: no such file or directory.

Например, file.cpp
#include "../../../../../../../some_path/maybe_yet_path/file2.h"

При компиляции в win не находить файл file2.h, хотя в линуксе все норм. Критическое количество уровней не определял. Может из-за длины имени файла, но вроде ntfs, да и путь не такой уж длинный.

понедельник, 14 мая 2012 г.

pysvn + sasl + ldap

Проблема.
После перевода сервера svn на режим аутентификации sasl + ldap перестал работать модуль pysvn на windows машинах. Вываливался с ошибкой: cannot negotiate authentication mechanism. Очевидно subversion библиотеки, которые с ним поставляются, скомпилированы без поддержки sals + ldap.

Решение.
Необходимо установить пакет консольных утилит subversion от кампании wandisco (или другой, лишь бы была поддержка sasl + ldap), добавить в переменную окружения PATH путь к wandisco, далее скопировать все динамические библиотеки (dll) из wandisco в папку, куда установлен pysvn (по умолчанию, python/lib/site-packages/pysvn). После этого должно заработать.
ps Замечено, что при удалении или переименовании wandisco перестает работать pysvn. Не удаляйте wandisco. Костыли конечно.

суббота, 5 мая 2012 г.

Установка нескольких процессоров для windows в virtualbox


Если при установке windows в virtualbox сначала машина была сконфигурирована как однопроцессорная, то после добавления процессора в свойствах настройки дополнительные процессора не будут видны в windows. Виной тому драйвер ОС, отвечающий за режим работы многопроцессорной системы. Решение следующее.
Если у вас ядро с ACPI.
Сменить его можно: диспетчер устройств-оборудование-компьютер-"многопроцессорный компьютер с ACPI-обновить драйвер-нет,не в этот раз-установка из указанного места-не выполнять поиск,я сам выберу драйвер. выбираем нужное ядро в табличке.
Существуют ядра(здесь и далее под ядром я понимаю ядро windows а не ядро процессора ):
"Стандартный компьютер"
"Компьютер с ACPI"
"Однопроцессорный компьютер с ACPI"
"Многопроцессорный компьютер с ACPI"
"Однопроцессорный компьютер с MPS"
"Многопроцессорный компьютер с MPS"
И еще одно:

Если того что вам нужно в списке нет, то нужное ядро появится после изменения HardwareID: рис (http://aceq.by.ru/ru/smena-tipa-komputera/jpg-kartinki/1.jpg) (SYSTEM\Current Control Set\Enum\Root\ACPI_HAL\). Если не позволяет сменить HardwareId, то нужно на папке выше вызвать контекстное меню и установить разрешение.
Меняем HardwareID на
acpiapic_mp -> добавляется строка с "Многопроцессорный компьютер с ACPI"
acpipic_up -> компьютер с ACPI
acpiapic_up -> "Однопроцессорный компьютер с ACPI"
mps_mp -> "Многопроцессорный компьютер с MPS"
e_isa_up -> "Стандартный компьютер"
mps_up -> "Однопроцессорный компьютер с MPS"
возможные значения HardwareID можно посмотреть в WINDOWS\inf\hal.inf
вообще необязательно указывать HardwareID именно для искомого типа ядра. Если указать acpiapic_up то в меню выбора ядер появятся все шесть типов.

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

Загрузка waf tool

Проблема.
При выполнении конфигурации множества модулей со схожей конфигурацией методом recurse для каждого модуля производится поиск библиотек.

Решение.
Выполнение загрузки (load) расширения waf выполняется только однажды. Соответственно, только один раз выполняются методы options, configure и т.д., определенные в расширении. Но  configure для каждого модуля выполняется отдельно. Отсюда, если в модуле будет стоять conf.check_boost(), то проверка будет проходить каждый раз для модуля. Если необходимо в расширении проверить наличие библиотек, то вызов функции проверки должен осуществлять, например, из configure. 

пятница, 27 апреля 2012 г.

Установка jenkins в качестве службы windows

Вначале необходимо создать узел в jenkins с требуемой конфигурацией. Затем запустить машину, которая будет использоваться в качестве узла сборки. Установить на нее java, далее открыть браузер и пройти по адресу http://jenkins_host/computer/node_name/slave-agent.jnlp, где jenkins_host - адрес сервера jenkins, node_name - имя узла сборки на jenkins. Данная команда начнет скачивание java-файла, после запуска которого установиться соединение с jenkins. Из меню исполняемого java-файла можно установить jenkins в качестве службы windows.