пʼятницю, 11 грудня 2015 р.

Тригеры в MySQL

Пришлось как то мне заниматься "свадебкой" - подружить Asterisk с UTM5 (биллинговая система). После нескольких безсонных ночей, мне все таки удалось кое как заставить работать эти системы вместе, но был один существенный недостаток в этой связке. Хотя Asterisk и отдавал данные в UTM5, но обратной связи он не имел с биллинговой системой. Что было очень неудобно, так как приходилось фактически вести две конфигурации, после того как в UTM5 например добавлялся новый абонент, его нужно было переносить руками в конфигурацию Asterisk… Что в конечном итоге могло создать кучу проблем и постоянно нужно было следить за тем что бы конфигурации были одинаковы. Так как базы оба продукта хранили в MySQL, то первое что мне пришло в голову, это использовать тригеры для синхронизации конфигураций. Конечно настроить Asterisk что бы он работал с базой, было еще той задачей, так как я раньше не видел это чудо, только слышал, что есть такой продукт.
Сообственно об этом я расскажу как то в другой раз, думаю это не последняя статья на телефонную тематику у меня :)
Немножко посмотрел документацию по MySQL и приступил, что тут может быть сложного то… сделать три тригера, на вставку, обновление и удаление записи в таблице:
-- Insert peer --
CREATE TRIGGER tel_add AFTER INSERT ON tel_numbers 
  FOR EACH ROW BEGIN 
    INSERT INTO tel_peers SET 
    id = NEW.id, name = NEW.login, 
    callerid = NEW.tel_number, md5secret = MD5(CONCAT(NEW.login,':',NEW.allowed_cid,':',NEW.password)); 
  END;

-- Update peer --
CREATE TRIGGER tel_update AFTER UPDATE ON tel_numbers 
  FOR EACH ROW BEGIN 
    UPDATE tel_peers SET 
    name = NEW.login, 
    callerid = NEW.tel_number, 
    md5secret = MD5(CONCAT(NEW.login,':',NEW.allowed_cid,':',NEW.password)) 
    WHERE id = NEW.id; 
  END;

-- Delete peer --
CREATE TRIGGER tel_del AFTER DELETE ON tel_numbers 
  FOR EACH ROW BEGIN 
    DELETE FROM tel_peers WHERE id = NEW.id; 
  END;
Но как оказалось, UTM5 не удаляет данные когда в GUI нажимаешь кнопку удалить, в таблице есть отдельное поле с признаком того что запись удалена (я так понимаю для того что бы была возможность просмотреть старые записи). Пришлось мне переделывать тригер на обновление, а на удаление просто выбросить.
-- Update peer --
CREATE TRIGGER tel_update AFTER UPDATE ON tel_numbers 
  FOR EACH ROW 
  BEGIN
    IF (OLD.is_deleted = 0 AND NEW.is_deleted = 1) THEN 
      BEGIN
        DELETE FROM tel_peers WHERE id = NEW.id;
      END;
    ELSE 
      BEGIN
        UPDATE tel_peers SET 
        name = NEW.login, 
        callerid = NEW.tel_number, 
        md5secret = MD5(CONCAT(NEW.login,':',NEW.allowed_cid,':',NEW.password)) 
        WHERE id = NEW.id;
      END;
    END IF;
  END;
Конечно это все наверное можно как то более изящно переписать, но так как я не сильно большой специалист в SQL, для решения моей задачи достаточно :)

Массовая обработка файлов

Случилась у меня беда… мой верный Nexus 4 погиб от руки-ноги или еще какой то части тела, в общем раздавили его… Пришлось мне вытащить свой старый iPhone 4. Он конечно тоже не в идеальном состоянии, но хотя бы можно звонить :)
Даа… к чему я это все, блог то как бы про UNIX… В общем решил я залить на него парочку рингтонов, то как их делать я не буду рассказывать, но вот как заменить расширения файлов с m4a на m4r я и расскажу. Хотя рассказывать тут нечего, три команды в одной строке :)
find . -name '*.m4a' | sed  's: :\\\ :g;p;s:m4a:m4r:g;' | xargs -L2 mv 
Все таки какая мощная штука SED, каждый раз что то новое для себя нахожу в его использовании… :)

вівторок, 24 листопада 2015 р.

Windows 10 | Настройка VPN

Настраивал сегодня подключение у себя на Windows 10 к VPN серверу. И не смог найти галочку в настройке подключения - "Не использовать как шлюз по умолчанию".
То есть, теперь если я подключаюсь к VPN то весь трафик направляется через это соединение, и понятно интернет пропадает :( что не очень то приятно, потому как иногда нужно и что то подсмотреть в сети.
Долго рылся в настройках, но ничего не смог найти... но как оказалось, "ларчик просто открывался". Для этого нужно в консоли PowerShell, которую желательно запускать от Администратора, выполнить всего одну команду если вы знаете название своего VPN подключения, или две если не знаете :)
Get-VpnConnection
Name                  : VPN Name
ServerAddress         : vpn.server.ua
AllUserConnection     : False
...
Set-VpnConnection -Name "VPN Name" -SplitTunneling $True
Вот и все, теперь при подключении к VPN и доступ к интернет работает и к локальной сети VPN.

середу, 22 липня 2015 р.

Создаем игровой сервере 7 Days to Die. Немножко автоматизации.


И снова добрый день/вечер/ночь и тд. всем кто читает данный блог.
Потихоньку я осваиваю основы Docker и вникаю в его возможности и функционал. Тяжелый это труд все это описывать, проще все сделать быстренько за какой то часик, а потом тратишь несколько дней на оформление этого все в читабельный вид, что бы можно это все опубликовать. Ну что же продолжим... это было небольшое лирическое отступление :) что бы выровнять первый абзац с картинкой :)
Продолжаем наши эксперименты с Docker. Сегодня поупражняемся с созданием Dockerfile. Подопытным "кроликом" будет у нас все тот же 7 Days to Die.
Несколько слов о новых образах, которые теперь доступны через на официальном "Hub Docker".
~> docker search sovicua
NAME             DESCRIPTION           STARS     OFFICIAL   AUTOMATED
sovicua/debian   Debian Jessie (8.0)   0
Все они построены на базе Debian Jessie. На текущий момент есть два образа с тегами "jessie" и "steamcmd". Собственно первый это чистый Debian с установленными дополнительными пакетами и настроенной временной зоной. Данные настройки были описаны в Установка timezone в базовом образе Docker. Второй собран на базе первого с установленными библиотеками и steamcmd.
Итак, создаем файл конфигурации для создания образа контейнера.
~> mkdir docker/steamcmd/
~> cd docker/steamcmd/
~/d/steamcmd> vim Dockerfile
FROM sovicua/debian:jessie
MAINTAINER Viktor M. Sytnyk <sovicua sovic.org.ua>
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get install -y wget \
 && echo 'deb http://download.opensuse.org/repositories/shells:/fish:/release:/2/Debian_8.0/ /' >> /etc/apt/sources.list.d/fish.list \
 && wget http://download.opensuse.org/repositories/shells:fish:release:2/Debian_8.0/Release.key \
 && apt-key add - < Release.key \
 && apt-get update && apt-get upgrade -y \
 && apt-get install -y lib32gcc1 lib32stdc++6 fish && apt-get clean \
 && useradd -m -c "SteamCMD User" -s /usr/bin/fish steam
WORKDIR /home/steam/steamcmd
RUN wget http://media.steampowered.com/installer/steamcmd_linux.tar.gz \
 && tar -xvzf steamcmd_linux.tar.gz && rm steamcmd_linux.tar.gz \
 && chown -R steam:steam /home/steam
CMD /usr/bin/fish
Как вы можете видеть, shell по умолчанию я использую Fish Shell, хотя это не существенно, но понравился он мне :)
Создаем образ:
~/d/steamcmd> docker build -t sovicua/debian:steamcmd .
После этого можно выгрузить образ на Docker Hub:
~/d/steamcmd> docker push sovicua/debian:steamcmd
Теперь у нас есть готовый образ с установленным steamcmd, что позволит нам в дальнейшем быстро развернуть любую игру которая поддерживает установку с использованием данной утилиты. Теперь переходим к созданию образа с установленным сервером 7 Days to Die.
Для начала создадим файл скрипта с помощью которого будем устанавливать, а также обновлять саму игру.
~> mkdir docker/games/7dtd
~> cd docker/games/7dtd
~/d/steamcmd> vim 7dtd.steamcmd

login steam_user steam_password
force_install_dir /home/steam/games/7dtd
app_update 294420 validate
quit
Где, steam_user и steam_password это имя пользователя и пароль на учетной записи которого куплена эта игра.
Теперь создадим собственно сам файл конфигурации создания образа.
~/d/steamcmd> vim Dockerfile
FROM sovicua/debian:steamcmd
MAINTAINER Viktor M. Sytnyk <sovicua@sovic.org.ua>
WORKDIR /home/steam/steamcmd
COPY 7dtd.steamcmd /home/steam/steamcmd/
CMD /usr/bin/fish
Честно говоря, можно было бы и не делать данный образ, для этих целей можно бы использовать предыдущий образ, создав в нем скрипт установки и обновления игры, но раз уж автоматизируем то делаем все типа ка надо :) Изначально я планировал что бы при создании образа, сразу инсталлирована игра, но так как у меня настроен Steam Guard, то он запрашивал у меня код, так как это типа новая машина которая хочет получить доступ к моей учетной записи.
В Dockerfile была команда на запуск скрипта:
RUN ./steamcmd.sh +runscript 7dtd.steamcmd
Победить это, что бы инсталляция останавливалась при запросе кода, у меня так и не получилось. :( По этому инсталляцию придется выполнять руками уже в контейнере.
После этого создаем сам образ как обычно.
~/d/g/7dtd> docker build -t sovicua/games:7dtd
Вот что у нас получилось после всех этих процедур:
~/d/7dtd> docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
sovicua/games   7dtd                c1c3539bbe2b        4 hours ago         594 MB
sovicua/debian  steamcmd            72ebdb1d894c        4 hours ago         594 MB
sovicua/debian  jessie              8ca03adc0398        27 hours ago        478.9 MB
Теперь мы можем быстренько создать контейнер:
~/d/7dtd> docker run --name="7dtd" --net="host" --user="steam" -i -t sovicua/games:7dtd
Выполняем инсталляцию игры, не забываем указать имя пользователя и пароль, если это не сделали раньше.
~/steamcmd> ./steamcmd.sh +runscript 7dtd.steamcmd
После инсталляции правим файл конфигурации сервера serverconfig.xml как вам удобно, и можно запускать сервер.
~/steamcmd> cd ../games/7dtd
~/g/7dtd> vim serverconfig.xml
Из параметров которые я у себя изменил, это установил пароль на доступ по telnet, и небольшие настройки самого сервера, такие как тройной лут и длина суток 2 часа реального времени. И еще пару параметров.
<property name="ServerName"             value="iHome Games Server" />
<property name="ServerPassword"         value="" />
<property name="ServerMaxPlayerCount"   value="4" />
<property name="ServerDescription"      value="iHome 7 Days to Die server" />
<property name="ServerWebsiteURL"       value="home.sovic.org.ua" />
...
<property name="DayNightLength"         value="120" />
<property name="DayLightLength"         value="18" />
...
<property name="DropOnDeath"            value="2" />
<property name="DropOnQuit"             value="0" />
...
<property name="CraftTimer"             value="0" />
<property name="LootTimer"              value="0" />
...
<property name="EnemySpawnMode"         value="4" />
...
<property name="LootAbundance"          value="300" />
<property name="LootRespawnDays"        value="30" />
Дополнительно, можно установить мод на сервер, который добавит пару дополнительных команд и самое вкусное что мне нравиться это возможность просмотра карты через веб. Очень помогает в поиске пещерок :) так как они редко сейчас встречаются, а на игровой карте искать не удобно, пока ищешь могут и "ушатать" :)
~/g/7dtd> wget http://illy.bz/fi/7dtd/server_fixes.tar.gz
~/g/7dtd> tar -xzvf server_fixes.tar.gz
Пример работы данного мода можно посмотреть у меня на сервере iHome 7 Days to Die server.
Ну вот и все, запускаем сервер:
~/g/7dtd> ./startserver.sh -configfile=serverconfig.xml
Если кто забыл, то напоминаю, что бы выйти с контейнера без его остановки, используем комбинацию клавиш Ctrl+p Ctrl+q.
На этом все, приятной игры. Если кто захочет поиграть вместе у меня на сервера, пишите.
Заходите на мой блог - UNIX и не только...

вівторок, 7 липня 2015 р.

Сетевой media сервер для PS3. Продолжение.

Как я и говорил в предыдущей части Сетевой media сервер для PS3 мы не будем использовать rc-скрипты для управление сервисом, а создадим отдельный контейнер для данного сервиса используя возможности Docker.
Создадим отдельную папку для размещения файла конфигурации создания контейнера и скопируем в него скомпилированый файл (смотрите предедущую часть). Для примера:
$ cd ~/docker/ps3netsrv
$ cp ~/source/ps3netsrv/ps3netsrv ./
Создадим файл конфигурации:
$ vim Dockerfile
FROM sovicua:jessie
MAINTAINER Viktor M. Sytnyk <sovicua@sovic.org.ua>
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update && apt-get upgrade -y
RUN groupadd -g 1000 ps3netsrv
RUN useradd -u 1000 -g 1000 -m -c "PS3 Media Server" ps3netsrv
VOLUME /home/ps3netsrv/media
RUN chown ps3netsrv:ps3netsrv /home/ps3netsrv/media
COPY ps3netsrv /home/ps3netsrv/
RUN chown ps3netsrv:ps3netsrv /home/ps3netsrv/ps3netsrv
WORKDIR /home/ps3netsrv
CMD ./ps3netsrv ./media
Создаем образ для данного сервиса:
$ docker build -t sovicua:ps3netsrv .
И запускаем контейнер:
$ docker run --net=host --name=ps3netsrv --user=ps3netsrv -v /mnt/media/ps3netsrv:/home/ps3netsrv/media -i -t -d sovicua:ps3netsrv
- где /mnt/media/ps3netsrv - корневой каталог в основной операционной системе, который монтируется в /home/ps3netsrv/media в контейнере. Все можно проверять работу нашего медиа-сервера на PS3. Думаю что вы сможете дальше не составить труда вам разобрать что и как.
В дальнейшем я планирую выгрузить данный контейнер в общий пул Docker, что бы каждый мог воспользоваться данным готовым контейнером для создания медиа-сервера.
Хотелось бы услышать ваше мнение по данному вопросу.

понеділок, 6 липня 2015 р.

Установка timezone в базовом образе Docker


Как то так случилось что я забыл установить в базовом образе правильную часовую зону, и после этого все контейнеры которые я делал с этого образа понятное дело имели зону UTC вместо Europe/Kiev. Каждый раз устанавливать правильную временную зону меня напрягает, соответственно что бы больше не заморачивать с данной проблемой, я решил обновить базовый образ.
Дополнительно обновим образ и установим еще несколько пакетов которые потребуются нам в дальнейшем.
$ docker run --name=jessie -i -t sovicua:jessie
# export DEBIAN_FRONTEND=noninteractive
# apt-get update && apt-get upgrade -y
# apt-get install -y apt-utils debconf-utils
# echo 'Europe/Kiev' > /etc/timezone
# dpkg-reconfigure tzdata
Выходим из контейнера и обновляем базовый образ.
$ docker commit --author="Viktor M. Sytnyk <sovicua@sovic.org.ua>" jessie sovicua:jessie
Ну вот и все, теперь в базовом образе у нас будет установлена правильная временная зона Europe/Kiev, а не UTC.

Сетевой media сервер для PS3

Давно валялась в черновиках данная заметка, все никак не мог собраться ее оформить и опубликовать. Но как говорят это вечно длится не может, так что приступим к повествовании. Собственно в чем же задача, спросите вы? У кого есть PS3 с установленной CFW, тот знает что записать файл больше 4Гб нельзя на внешний диск, так как это ограничение файловой системы FAT32 (сейчас файловые менеджеры для PS3, такие как Multiman поддерживают возможность чтения с томов NTFS, но эта функциональность появилась довольно недавно). Для решения этой проблемы можно было применить два метода:
  • записывать игру на внутренний диск
  • использовать специальные программы которые разбивали большие файлы на части, которые понимал файловый менеджер PS3 (в конечном итоге он все равно склеивал эти файлы и копировал на внутренний диск приставки) 
Но существовал и еще один метод, это поднять медиа-сервер для "стриминга" контента на PS3. Собственно этим мы займемся :)
У меня на PS3 установлена CFW с функцией Cobra, что позволяет использовать ISO образы, и не требует разворачивания образа в отдельный каталог, как того требуется. Дополнительно у меня еще установлен webMAN что позволяет мне монтировать образы игр не запуская файловый менеджер и даже управлять образами и самой приставкой из веб-браузера (даже с мобильного). Но не это есть предметом данного сообщения. Кому интересно, может обратиться к документации по этому ПО или мне написать личное сообщение.
Собственно, ничего сложного в сборке этого нет (сложно было найти это все в разных форумах и собрать вместе), скачиваем подготовленный архив с исходными файлами. Этот архив предназначен для платформы Linux x86_64, хотя я его собирал и под FreeBSD и даже для роутера ASUS RT-N56U. Я уже не помню всех нюансов сборки под данную платформу, если вас интересует данный вопрос, можете мне написать в личку или почитать Issue 1106: compiling ps3netsrv. В данный архив уже включены измененные файлы "main.cpp" и "netiso.h". Разворачиваем архив и собираем.
$ tar -xzvf ps3netsrv.tar.gz
$ make
Примечание.
В архиве есть скелет rc-скрипта для автоматического запуска/остановки сервиса, но я пошел другим путем и так его и не закончил. 
Запускаем все это очень просто:
$ ./ps3netsrv /mnt/media/ps3netsrv
 - где /mnt/media/ps3netsrv root-директория где будет лежать контент для PS3. Внутри корневой директории создаем папки - GAMES, PS3ISO. В первую складываем обычные распакованые образы, а в вторую образы в формате ISO.

пʼятницю, 3 липня 2015 р.

Собираем и настраиваем DNS сервер bundy (BIND10). Часть 2.

Итак, продолжим наши эксперименты.
После того как закончится сборка, выполняем инсталляцию:
# make install
Подготовка к первому запуску.
По умолчанию сервисы DNS и DHCP не запускаются, их нужно отдельно активировать при помощи утилиты bundyctl. Перед этим нам нужно добавить пользователя от которого мы будем управлять сервисом.
# bundy-cmdctl-usermgr add root
Так же стоит подготовить базу данных для DHCP сервера.
# mysql -u root -p
mysql> CREATE DATABASE bundy;
mysql> CONNECT bundy;
mysql> SOURCE /usr/share/bundy/dhcpdb_create.mysql
mysql> CREATE USER 'bundy'@'localhost' IDENTIFIED BY 'bundy';
mysql> GRANT ALL ON bundy.* TO 'bundy'@'localhost';
mysql> quit
Ну вот и все мы готовы к запуску и посмотреть что же это за зверь такой этот BUNDY 

Поехали...
Из родительской системы выполняем команду запуска, для первого запуска можно даже добавить ключ --verbose
$ docker exec -i -t bundy /usr/sbin/bundy --verbose
В контейнере подключаемся к сервису используя утилиту bundyctl которая позволяет нам  управлять и настраивать все сервисы bundy.
# bundyctl
Username: root
Password:
["login success"]
> help

usage: <module name> <command name> [param1 = value1 [, param2 = value2]]
Type Tab character to get the hint of module/command/parameters.
Type "help(? h)" for help on bundyctl.
Type "<module_name> help" for help on the specific module.
Type "<module_name> <command_name> help" for help on the specific command.

Available module names:
    help        Get help for bundyctl.
    config      Configuration commands.
    execute     Execute a given set of commands
    Stats       Stats daemon
    tsig_keys   The TSIG keyring is stored here
    Init        Init process
    Logging     Logging options
    data_sources
            The sources of authoritative DNS data
    Cmdctl      Interface for command and control
    Msgq        The message queue
>
Как я и говорил выше, по умолчанию сервисы DNS и DHCP (и другие) не запущены, для их инициализации есть готовый скрип который выполняет инициализацию авторизированного DNS сервер. Итак, для начала посмотрим какие у нас процессы запущены до начала инициализации.
> Init show_processes
[
    [
        18493,
        "Socket creator",
        null
    ],
    [
        18494,
        "msgq",
        null
    ],
    [
        18496,
        "cfgmgr",
        "ConfigManager"
    ],
    [
        18498,
        "bundy-stats",
        "Stats"
    ],
    [
        18499,
        "bundy-cmdctl",
        "Cmdctl"
    ]
]
Выполняем скрипт инициализации и снова смотрим что у нас теперь с процессами:
> execute init_authoritative_server
adding Authoritative server component
adding Xfrin component
adding Xfrout component
adding Zone Manager component
Components added. Please enter "config commit" to
finalize initial setup and run the components.
> config commit
> Init show_processes
[
    [
        18493,
        "Socket creator",
        null
    ],
    [
        18494,
        "msgq",
        null
    ],
    [
        18496,
        "cfgmgr",
        "ConfigManager"
    ],
    [
        18498,
        "bundy-stats",
        "Stats"
    ],
    [
        18499,
        "bundy-cmdctl",
        "Cmdctl"
    ],
    [
        18559,
        "bundy-xfrout",
        "Xfrout"
    ],
    [
        18560,
        "bundy-xfrin",
        "Xfrin"
    ],
    [
        18561,
        "bundy-zonemgr",
        "Zonemgr"
    ],
    [
        18562,
        "bundy-auth",
        "Auth"
    ]
]
Думаю, что разница заметна :) У нас появились 4 новых процессов:



  • bundy-xfrout
  • bundy-xfrin
  • bundy-zonemgr
  • bundy-auth

  • Проверим работу DNS сервера через запрос его версии.
    # dig @127.0.0.1 -c CH -t TXT version.bind
    
    ; <<>> DiG 9.9.5-9-Debian <<>> @127.0.0.1 -c CH -t TXT version.bind
    ; (1 server found)
    ;; global options: +cmd
    ;; Got answer:
    ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 27337
    ;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1
    ;; WARNING: recursion requested but not available
    
    ;; OPT PSEUDOSECTION:
    ; EDNS: version: 0, flags:; udp: 4096
    ;; QUESTION SECTION:
    ;version.bind.   CH TXT
    
    ;; ANSWER SECTION:
    version.bind.  0 CH TXT "bundy 1.2.0"
    
    ;; AUTHORITY SECTION:
    bind.   0 CH NS bind.
    
    ;; Query time: 1 msec
    ;; SERVER: 127.0.0.1#53(127.0.0.1)
    ;; WHEN: Fri Jul 03 07:39:41 UTC 2015
    ;; MSG SIZE  rcvd: 79
    

    Ну что же нас можно поздравить - не взирая на всякие препятствия при компиляции, мы смогли запустить и инициализировать  авторизированный DNS сервер BUNDY|BIND10. Думаю что на сегодня достаточно буковок 

    В следующей части мы немного разберемся с модулями которые входят в bundy и кто за что отвечает.

    четвер, 2 липня 2015 р.

    Scala первые впечетления

    Вспомнить все и забыть, так можно описать мое впечатление от знакомства с Scala. Все началось с того, что однажды в выходные я вытянул архив с исходниками что я когда то писал на Java. Посмотрел на все это, мне захотелось что то написать небольшое, так сказать для души... хотя какая может быть душа, если последний раз я что то писал серьезно на Java наверное несколько лет назад.
    У меня иногда случаются такие вот "хотелки", которые возникают после просмотра архивов прошлых работ ☺ И даже иногда я все таки что-то могу написать, но как обычно это просто небольшие программки (даже не программки, а просто скелеты/заготовки) которые в конечном итоге я так и не доводил до готовой программы которую можно было бы использовать.

    Последнее такое мое желание наступило когда мне захотелось написать небольшую программку для Android, что то типа напоминалки и базы данных клиентов в одном флаконе. Для хранение базы клиентов я решил использовать SQLite, ну так как в наше время напрямую с базой практически не работают, зачем писать какие то там SQL-запросы, если все можно типа обернуть в классы и работать с базой через них.
    В общем модно сейчас работать напрямую с базами, но это мое мнение и вы можете с ним не согласиться. По крайней мере для небольших проектов, как мне кажется оно может быть и удобно и позволяет не призываться к особенностям реализации каждой БД. Выдержка с wiki о данной технологии:

    ORM (англ. object-relational mapping, рус. объектно-реляционное отображение) — технология программирования, которая связывает базы данных с концепциями объектно-ориентированных языков программирования, создавая «виртуальную объектную базу данных»

    Собственно для этих целей я выбрал популярный фреймворк для Java - ORMLite, который по отзывам очень не плох как по функционалу так и по производительности.

    ... нда, что-то я отвлекся сильно от темы данного поста.

    Итак, возвращаемся к Scala... правда это наверное будет уже в следующий раз. ☺

    середу, 1 липня 2015 р.

    Собираем и настраиваем DNS сервер bundy (BIND10). Часть 1.

    Как то незаметно ☺ дошли руки все таки потрогать BIND10. Для начала немного истории о данном продукте.
    Первый релиз BIND10 был представлен консорциумом ISC в феврале 2013. 17 апреля 2014 консорциум ISC выпустил последний релиз BIND10 1.2.0, после это передал все наработки сообществу независимых разработчиков. Данного решение было принято в связи с тем что у консорциума нет ресурсов для разработки двух альтернативных проектов. Поэтому они будут развивать только BIND9, а BIND10 полностью переходит в руки сообщества. Для уменьшения путаницы с BIND9, на GitHub был создан новый проект в который перенесли все наработки консорциума по BIND10 и данный проект получил название Bundy.

    Ну что же, думаю можно приступать к эксперименту.

    Создадим новый контейнер и подключаемся к нему:
    $ docker run --name bundy --hostname=bundy -d -i -t sovicua:jessie
    $ docker attach bundy
    

    Как обычно обновляемся и устанавливаем нужные пакеты для сборки.
    # apt-get update
    # apt-get upgrade
    # apt-get install git-core g++ make pkg-config python3-dev sqlite3 libsqlite3-dev libbotan1.10-dev liblog4cplus-dev libboost-dev python3-setproctitle dnsutils net-tools autoconf autoconf-archive automake libtool
    

    Получаем исходные коды проекта и выполняем сборку:
    # git clone https://github.com/bundy-dns/bundy.git
    # cd bundy
    # autoreconf --install
    # ./configure --prefix=/usr --sysconfdir=/etc --without-werror --enable-experimental-resolver
    # make
    

    И получаем ошибку при сборке resolver :(
    Ошибку получаем из-за того что ветке master отсутствуют некоторые файлы, в частности в папки src/lib/xfr которая нужна для сборки resolver. Если собирать без этой опции то все собирается и работает. Но так как мне хотелось попробовать все, то мне пришлось загрузить исходные коды с другой ветки и собирать все снова.
    Дополнительно включаем для сервера DHCP хранение базы в MySQL. В процессе инсталляции нам зададут несколько вопросов на которые думаю не сложно будет ответить ☺
    # wget http://dev.mysql.com/get/mysql-apt-config_0.3.6-1debian8_all.deb
    # dpkg -i mysql-apt-config_0.3.6-1debian8_all.deb
    
    Выбираем самую последнюю версию (DRM - Developer milestone releases)
    Configuring mysql-apt-config
    ----------------------------
    
    MySQL APT Repo features MySQL Server along with a variety of MySQL components. You may select the appropriate product to choose the version that you wish to receive.
    
    Once you are satisfied with the configuration then select last option 'Apply' to save the configuration. Advanced users can always change the configurations later,
    depending on their own needs.
    
      1. Server  2. Connector-Python  3. Utilities  4. Apply
    
    Which MySQL product do you wish to configure? 1
    
    This configuration program will detect the current state of your system, check for any installed MySQL Server packages, and try to select the most appropriate version
    of MySQL Server to be installed. If you are not sure which version to choose for yourself, do not change the auto-selected version. Advanced users can always change
    the version later, depending on their own needs.
    
      1. mysql-5.6  2. mysql-5.7-dmr  3. none
    
    Which server version do you wish to receive? 2
    
    MySQL APT Repo features MySQL Server along with a variety of MySQL components. You may select the appropriate product to choose the version that you wish to receive.
    
    Once you are satisfied with the configuration then select last option 'Apply' to save the configuration. Advanced users can always change the configurations later,
    depending on their own needs.
    
      1. Server  2. Connector-Python  3. Utilities  4. Apply
    
    Which MySQL product do you wish to configure? 4
    
    Если вы решили использовать стабильную версию, то нужно выполнить команду:
    # dpkg-reconfigure mysql-apt-config
    
    ... и выбрать требуемую версию ПО которое вы хотите использовать.
    После этого обновляем данные репозитория и устанавливаем MySQL сервер.
    # apt-get update
    # apt-get install mysql-server libmysqlclient-dev libz-dev
    
    Запускаем сервер MySQL
    # service mysql start
    ..
    [info] MySQL Community Server 5.7.7-rc is started.
    # service mysql status
    [info] MySQL Community Server 5.7.7-rc is running.
    

    Теперь мы готовы к повторной сборке.
    # git clone --branch bundyfork --single-branch https://github.com/bundy-dns/bundy.git
    # cd bundy
    # autoreconf --install
    # ./configure --prefix=/usr --sysconfdir=/etc --without-werror --with-dhcp-mysql --enable-experimental-resolver 
    # make
    ...

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

    четвер, 25 червня 2015 р.

    Дополнительная настройка Docker

    Так уж случилось что у меня в моем домашнем типа NAS два диска, один маленький всего 20G  на котором установлена система и второй большой, который я использую для хранения файлов, как обычно говорят - файлопомойка :). С учетом того что я довольно часто играюсь с Docker, и образы его иногда получаются не маленькие, так как я часто пробую делать игровые сервера :)
    REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
    sovicua/games       csgo                72db510df094        2 weeks ago         11.73 GB
    sovicua/games       7dtd                11ec48e2f063        6 weeks ago         3.001 GB
    sovicua/steam       jessie              ad9da57cc230        9 weeks ago         573.2 MB
    
    Понятно что место на системном диске быстро закончится, так как по умолчанию Docker складывает образы контейнеров в /var/lib/docker. Самым простым решением это конечно просто перенести данную директорию в новое место (на большой диск) и сделать простую символическую ссылку. Но в некоторых случаях пишут что это не работает или возникают некоторые проблемы в работе. Более правильно нужно использовать опцию -g /mnt/docker.
    И так, приступаем:
    Останавливаем сервис
    # service docker stop
    Редактируем файл /etc/default/docker, добавляем параметр
    DOCKER_OPTS="-g /mnt/docker"
    Переносим папку /var/lib/docker и для верности еще создаем символическую ссылку :)
    Запускаем сервис
    # service docker start
    Проверяем что у нас сменился Root Dir
    # docker info | grep Root
     Root Dir: /mnt/docker/aufs

    середу, 22 квітня 2015 р.

    Игровой сервер 7 Days to Die

    Ну вот я и дома, рабочий день закончился...
    Иногда, когда просто все реально надоед и хочется просто отключить мозг и не думать о том что творится в стране, на работе и тд., я играю в разные игры жанра зомби-апокалипсис или песочницы, такие как DayZ, H1Z1, RUST, 7 Days to Die или в Minecraft :) куда же без него :)
    Все эти игры жанра Online MMO Game, что совсем не очень то располагает к расслаблению, так как обычно там куча каких то неадекватных людей играет :( и ты быстрее умрешь от руки другого игрока чем от какого то зомби (Minecraft не считаем, так как там есть одиночный режим). Последнее время я выбираю 7 Days to Die, но самому играть не интересно, вначале конечно интересно бегать что то исследовать, но как обычно это заканчивается тем что тебя зомби быстро убивают. И приходится все начинать сначала.
    Что бы хоть как то разнообразить это дело, и можно было поиграть в многопользовательский режим без всяких "бубуинов" с домашними или друзьями, я как обычно решил поднять на своем домашнем NASе, выделенный сервер для игры 7 Days to Die.  Но что бы не забивать основную ОС разными там библиотеками и тд. для этого я решил приспособить контейнеры Docker. Я не стал делать отдельный Dockerfile, так как это все делается для себя.

    Итак, у меня уже был базовый образ для Debian Jessie, то его и будем использовать для создания игрового сервера.
    Так как мне не нужно что бы контейнеру был выделенный отдельный сетевой адрес из подсети Docker, я использовал опцию --net=host, что позволило мне обращаться к контейнеру по адресу самого сервера.

    Создаем новый контейнер
    # docker run --net=host --name jessie -i -t sovicua:jessie
    
    Обновляем образ
    # apt-get update
    # apt-get upgrade
    
    Подготавливаем образ для установки SteamCMD, устанавливаем дополнительные библиотеки и утилиты
    # apt-get install lib32gcc1 lib32stdc++6 wget
    # useradd -m -c "SteamCMD User" -s /bin/bash steam
    
    Скачиваем и устанавливаем SteamCMD
    # su - steam
    $ mkdir SteamCMD
    $ cd SteamCMD/
    $ wget http://media.steampowered.com/installer/steamcmd_linux.tar.gz
    $ tar -xvzf steamcmd_linux.tar.gz
    
    После установки, файл с архивом инсталляции можно удалить что бы не путался под ногами.
    Запускаем steamcmd и устанавливаем игру в ~/games/7dtd/, app_id = 294420 для 7 Days to Die Linux Dedicated Server
    Важное замечание:
    Для игры 7 Days to Die, нужно регистрироваться под учетной записью где она у вас куплена, в остальных случаях можно регистрироваться под анонимным пользователем. Перечень доступных серверов которые можно создать с помощью SteamCMD и их параметры можно найти по ссылке Dedicated Servers List  
    $ ./steamcmd.sh
    ... идет установка ...
    Steam> login steam_user steam_password
    Steam> force_install_dir ./../games/7dtd/
    Steam> app_update 294420 validate
    ... идет установка ...
    Success! App '294420' fully installed.
    Steam> exit
    
    Осталось немножко подправить файл конфигурации serverconfig.xml на свое усмотрение и можно запускать сервер.
    Данный файл хорошо документирован, так что разобраться что и как нужно править думаю не составит большого труда.
    Так же стоит исправить файл запуска сервера 7DaysToDie.sh, добавив опцию -configfile=serverconfig.xml и убрав добавление даты и времени к лог файлу. Кстати я так и не понял почему в данном файле закоментировано проверка платформы и запуск 64-битной версии, у меня что та 32 что 64 битная версия заработала.
    $ cd ../games/7dtd/
    $ cat 7DaysToDie.sh
    #!/bin/sh
    
    export LD_LIBRARY_PATH=~/.local/share/Steam/ubuntu12_32/steam-runtime/i386/usr/lib/i386-linux-gnu
    #export MALLOC_CHECK_=0
    
    #if [ $(getconf LONG_BIT) = 64 ]; then
    #   ./7DaysToDie.x86_64 -configfile=serverconfig.xml -logfile 7DaysToDie_Data/output_log__`date +%Y-%m-%d__%H-%M-%S`.txt $@
    #else
        ./7DaysToDie.x86 -configfile=serverconfig.xml -logfile 7DaysToDie_Data/output.log $@ &
    #fi
    
    Можно выполнить первый запуск.
    $ ./7DaysToDie.sh
    
    После первого запуска нужно подправить serveradmin.xml что бы назначить себя администратором. Обычно он лежит в ~/7 Days To Die/Saves/

    После всех исправлений, запускаем еще раз сервер руками и проверяем что все работает и клиент подключается.
    Для управления сервером, подключаемся к нему телнетом на порт 8081 (по умолчанию). Если все нормально, то останавливаем сервер командой shutdown через консоль управления.

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

    Выходим из контейнера
    $ exit
    # exit
    
    Сохраняем образ в локальном репозитории
    # docker commit --author="Viktor M. Sytnyk <sovicua@mail.ua>" jessie sovicua/steam:7dtd
    
    Можно посмотреть на созданный образ :)
    # docker images
    
    REPOSITORY          TAG                 IMAGE ID            CREATED              VIRTUAL SIZE
    sovicua/steam       7dtd                620bfd31cc61        About a minute ago   2.643 GB
    sovicua             jessie              0d4a8604eed7        24 hours ago         423 MB
    sovicua/games       minecraft           e2555d48e61b        10 weeks ago         835.3 MB
    debian              jessie              58052b122b60        3 months ago         122.8 MB
    
    Контейнер с которым мы до этого игрались, можно удалить, зачем он будет только место занимать.
    Итак создаем контейнер с уже настроенной игрой, используя подготовленный образ и запускаем.
    # docker run --net=host --name=7dtd --user=steam -t -i sovicua/steam:7dtd
    $ cd ~/games/7dtd/
    $ ./7DaysToDie.sh
    
    Для выхода из контейнера используем комбинацию Ctrl+p Ctrl+q
    В дальнейшем мы сможем подключиться к контейнеру используя команду
    # docker attach 7dtd
    

    В следующий раз мы попробуем создать игровой сервер для игры Factorio, для запуска которой требуется Х-сервер. 

    понеділок, 9 лютого 2015 р.

    Устанавливает Oracle Java (JRE)

    В процессе игры с Docker, решил я приспособить его для создания игрового сервера Minecraft. Но, для запуска сервера игры, требуется java. Так как у меня когда то были проблемы с запуском некоторых java-приложений на OpenJDK, решил я поставить родную JRE от SUN|Oracle. Собственно ничего сложного, но решил записать что бы было под рукой.
    # echo "deb http://ppa.launchpad.net/webupd8team/java/ubuntu vivid main" | tee /etc/apt/sources.list.d/webupd8team-java.list
    # echo "deb-src http://ppa.launchpad.net/webupd8team/java/ubuntu vivid main" | tee -a /etc/apt/sources.list.d/webupd8team-java.list
    # apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys EEA14886
    # apt-get update
    # apt-get install oracle-java8-installer
    Примечание: Инструкция для Ubuntu, но у меня Debian 8.0 (jessie) соответственно я использовал так же нестабильный релиз Ubuntu 15.05 (vivid)

    пʼятницю, 23 січня 2015 р.

    Инсталляция новой системы. Что же дальше...?

    После начальной инсталляции, я доставляю несколько пакетов которые нам просто необходимы, но перед этим конечно же нужно обновить список доступных пакетов и сами пакеты.
    # apt-get update
    # apt-get upgrade
    После этого устанавливаем нужные нам пакеты и настраиваем их.
    # apt-get install sudo vim
    Настраиваем редактор vim. 
    Для этого копируем пример файла настройки:
    # cp /usr/share/vim/vim73/vimrc_example.vim ~/.vimrc
    Настраиваем редактор под себя, первое я отключаю резервное копирование (ну не травятся мне эти файлы с тильдой в конце), хотя это полезная фича, но тут каждый решает для себя что ему лучше. Находим секцию:
    if has("vms")
      set nobackup          " do not keep a backup file, use versions instead
    else
      set backup            " keep a backup file (restore to previous version)
      set undofile          " keep an undo file (undo changes after closing)
    endif
    
    Удаляем или комментируем все строчки кроме:
    set nobackup            " do not keep a backup file, use versions instead
    Устанавливаем предпочитаемую цветовую схему, добавив строчку
    colorscheme desert
    Если вы занимаетесь написанием скриптов, то будет полезно включить отображение номера строки:
    set number
    Настройка sudo.
    Тут все просто, нужно прописать пользователя которому разрешено получать права администратора. Примечание, дополнительно я для этого пользователя еще отключаю ввод пароля (снижает безопасность), так как обычно я один администратор на этой системе, а каждый раз набирать пароль мне не нравится :)
    А лучше конечно включить пользователя в группу и дать группе права:
    ALL=NOPASSWD: ALL
    Настройка окружения пользователя.
    Как для администратора так и для обычного пользователя я включаю раскраску файлов для вывода команды ls, а так же настраиваю цветное приглашение.
    Все изменения вносим в ~/.bashrc
    Раскоментируем строку для принудительного включения цветного приглашения (раньше в FreeBSD это была Esc-последовательность как мне помнится) 
    force_color_prompt=yes
    И устанавливаем вид приглашения, для пользователя:
    PS1='\[\e]0;\w\a\]\[\e[36m\][\[\e[34m\]\D{%H:%M}\[\e[36m\]] \[\e[32m\]\u\[\e[36m\]@\[\e[32m\]\h \[\e[33m\]\w\[\e[36m\] $\[\e[0m\] '
    Для администратора:
    PS1='\[\e]0;\w\a\]\[\e[36m\][\[\e[34m\]\D{%H:%M}\[\e[36m\]] \[\e[31m\]\u\[\e[36m\]@\[\e[32m\]\h \[\e[33m\]\w\[\e[31m\] #\[\e[0m\] '
    и
    export LS_OPTIONS='--color=always'
    На этом как бы все...