пятница, 28 ноября 2014 г.

Установка ownCloud под Cubian

Недавно я приобрел Cubietruck для использования в качестве маленького домашнего сервера. В качестве ОС был взят вариант Debian для плат Cubieboard, Cubian, поскольку на своем основном компьютере я использую Debian уже давно. Дистрибутив был скачан и установлен на оказавшуюся под рукой карту micro-SD на 4 Гб - все инструкции есть на сайте Cubian.

Одна тонкость - в варианте "Desktop", который я поставил (предполагая, что иногда я буду использовать Cubietruck и в качестве медиаплеера), не поднимался сетевой интерфейс Loopback (lo). Ethernet (eth0) есть, IP по DHCP получил, SSH работает, а 127.0.0.1 не пингуется, в связи с чем наблюдались разнообразные глюки при установке, например, MySQL. Поиск в Интернете выявил виновного почти сразу - пакет gnome-network-manager. Виновник был немедленно удален, а lo  прописан в /etc/networking/interfaces.

Сервер SSH был перенастроен на стандартный порт, 22. На порту 63000, установленном по умолчанию в Cubian, у меня почему-то не работал SFTP (именно он, копирование по команде scp происходило без каких либо проблем).

Установка торрент-клиента Transmission описана, например, здесь (у меня он стоял еще на Raspberry Pi, где он настраивается аналогично).

Переходим к установке ownCloud (7.0 community edition). Я использовал веб-сервер lighttpd и базу данных MySQL и частично ориентировался по двум руководствам, по установке ownCloud 6 на Debian 7 wheezy (с apache и MySQL) и по установке ownCloud с postreSQL и lighttpd. Из первого я целиком взял все шаги по настройке MySQL, из второго - шаги по конфигурированию lighttpd, в том числе для использования SSL.

Маленький домашний сервер, разумеется, обитает за маршрутизатором с NAT, а доступ к облаку хотелось получить и и извне, причем, разумеется, по HTTPS. Также захотелось попробовать подключить в качестве внешнего носителя Google Drive (в руководстве по ownCloud подробно написано, как это сделать). Доменное имя, полученное через no-ip (раньше был DynDNS, но он умер стал платным), у маршрутизатора есть, порты 80 и 443 проброшены. Тем не менее, возникла проблема - если при доступе к основному сайту на lighttpd все в порядке, то при добавлении к URL /owncloud доменное имя при загрузке страницы меняется на имя машинки с Cubian во внутренней сети (получается https://cubian/owncloud/) и при доступе "снаружи" имя "cubian", разумеется, не резолвится. Как выяснилось, нужно поправить файл конфигурации ownCloud, config/config.php, и вписать в секцию $CONFIG параметры для домена, по которому осуществляется доступ извне:

'trusted_domains' => 
array (
  0 => 'cubian',
  1 => 'a1exanderz.noip.me',
),
'owerwritehost' => a1exanderz.noip.me,

Здесь "cubian" - это имя компьютера в локальной сети, а "a1exanderz.noip.me" -доменное имя, полученное через no-ip.

четверг, 6 ноября 2014 г.

SQLCipher и Qt - часть третья, Android

С SQLCipher под Android все намного проще - свободно распространяются не только исходники, но и собранные бинарные файлы Community Edition. Осваивать кросс-платформенную компиляцию для Android мне не хотелось, поэтому я взял бинарные файлы. К тому же сборку плагина qt-sqlcipher c их использованием делали до меня.

Добавляем в файл qsqlcipher.pro пути к библиотекам скачанной бинарной сборки:

android {
    equals(ANDROID_TARGET_ARCH, x86) {
        LIBS += -L$$PWD/../../../../sqlcipher-for-android-v3.2.0/libs/x86
    }
    equals(ANDROID_TARGET_ARCH, armeabi-v7a) {
        LIBS += -L$$PWD/../../../../sqlcipher-for-android-v3.2.0/libs/armeabi-v7a
    }
}

Добавляем условие для включения нужных библиотек - под Android нет libsqlciper и libcrypto, а используется одна  библиотека из готовой сборки:

!system-sqlite:!contains(LIBS, .*sqlite3.*) {
    CONFIG(release, debug|release):DEFINES *= NDEBUG
    DEFINES += $$SQLITE_DEFINES
    !contains(CONFIG, largefile):DEFINES += SQLITE_DISABLE_LFS
    INCLUDEPATH += $$OUT_PWD/include
    !android {
        LIBS += -L$$OUT_PWD/lib -lsqlcipher -lcrypto
    }
    else {
        LIBS += -L$$OUT_PWD/lib -lsqlcipher_android
    }
    QMAKE_RPATHDIR += $$OUT_PWD/lib
} else {
    LIBS *= $$QT_LFLAGS_SQLITE
    QMAKE_CXXFLAGS *= $$QT_CFLAGS_SQLITE
}

Нужен еще путь к заголовочному файлу sqlite3.h и сам файл. Я его просто взял из сборки для Linux (описанной раньше), INCLUDEPATH остался тот же.

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

android {
    contains(ANDROID_TARGET_ARCH,armeabi-v7a) {
        LIBS += -L$$PWD/armeabi-v7a -lsqlcipher_android
        ANDROID_EXTRA_LIBS = $$PWD/armeabi-v7a/libstlport_shared.so \
            $$PWD/armeabi-v7a/libsqlcipher_android.so
    }
    contains(ANDROID_TARGET_ARCH,x86) {
        LIBS += -L$$PWD/x86 -lsqlcipher_android -lstlport_shared
        ANDROID_EXTRA_LIBS = $$PWD/x86/libstlport_shared.so \
            $$PWD/x86/libsqlcipher_android.so
    }
}

Здесь выяснилась одна интересная особенность - порядок указания библиотек в ANDROID_EXTRA_LIBS имеет значение! Если указать libstlport_shared.so второй, а не первой (как в приведенной выше ссылке), то под Android версий, более старых, чем 4.3 (я проверял на 4.0.3 и 4.2.2) при запуске проекта эта библиотека не находится (could not load library "libstlport_shared.so"), причем эта ошибка воспроизводится под обеими архитектурами. Если же libstlport_shared.so указана первой - все нормально работает под всеми версиями (от 4.0.3 до 4.4.2).