2020年9月25日金曜日

Athrill2 の deb パッケージを作成する

deb パッケージの作成に必要な環境を構築

# deb パッケージビルドに必要な環境変数を設定
export DEBFULLNAME="mikoto2000"
export DEBMAIL=mikoto2000@gmail.com
export LONGNAME="mikoto2000"
export USER="mikoto2000"

# 必要なパッケージのインストール
apt-get update
apt-get install -y build-essential dh-make fakeroot devscripts pbuilder cdbs git vim

deb パッケージビルドに必要なファイル群の取得・生成

# deb パッケージ用のディレクトリ作成
mkdir athrill
cd athrill

# オリジナルのソースコード取得
git clone --recurse-submodules https://github.com/toppers/athrill.git
git clone --recurse-submodules https://github.com/toppers/athrill-target-rh850f1x.git

# deb パッケージに必要なファイル群を生成
dh_make --createorig -s -e ${DEBMAIL} -p athrill_2.0.0

# サンプルファイル類削除
rm -rf debian/*.ex
rm -rf debian/*.EX

メタデータ編集

debian/control

Source: athrill
Section: misc
Priority: optional
Maintainer: kanetugu2015 <kanetugu2015@gmail.com>
Bugs: https://github.com/toppers/athrill-target-rh850f1x
Build-Depends: debhelper (>= 10)
Standards-Version: 4.1.2
Homepage: https://github.com/toppers/athrill-target-rh850f1x

Package: athrill
Architecture: any
Depends: ${shlibs:Depends}, ${misc:Depends}
Description: Athrill emulator for RH850F1x.

コピーライト修正

debian/copyright

TOPPERS ライセンスに修正。

Format:  http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
Upstream-Name: athrill
Source: https://github.com/toppers/athrill-target-rh850f1x

Files: *
Copyright: 2019 by Center for Embedded Computing Systems
                     Graduate School of Informatics, Nagoya Univ., JAPAN
           2019 by ESM, Inc.
License: TOPPERS License
 上記著作権者は,以下の (1)〜(4) の条件を満たす場合に限り,本ソフトウェ
 ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改変・
 再配布(以下,利用と呼ぶ)することを無償で許諾する.
 (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作権
     表示,この利用条件および下記の無保証規定が,そのままの形でソース
     コード中に含まれていること.
 (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使用
     できる形で再配布する場合には,再配布に伴うドキュメント(利用者マ
     ニュアルなど)に,上記の著作権表示,この利用条件および下記の無保
     証規定を掲載すること.
 (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使用
     できない形で再配布する場合には,次のいずれかの条件を満たすこと.
   (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著作
       権表示,この利用条件および下記の無保証規定を掲載すること.
   (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに報
       告すること.
 (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損害
     からも,上記著作権者およびTOPPERSプロジェクトを免責すること.また,
     本ソフトウェアのユーザまたはエンドユーザからのいかなる理由に基づ
     く請求からも,上記著作権者およびTOPPERSプロジェクトを免責すること.

 本ソフトウェアは,無保証で提供されているものである.上記著作権者およ
 びTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的に対す
 る適合性も含めて,いかなる保証も行わない.また,本ソフトウェアの利用
 により直接的または間接的に生じたいかなる損害に関しても,その責任を負
 わない.

ビルドスクリプト修正

debian/rules

#!/usr/bin/make -f
include /usr/share/cdbs/1/rules/debhelper.mk
 
install/athrill::
    install -pd $(DEB_DESTDIR)/usr/bin
    install -pm 755 athrill/bin/linux/* $(DEB_DESTDIR)/usr/bin

build/athrill::
    cd athrill-target-rh850f1x/build_linux; make

コミット・ビルド

# 初回は必要ない(`dpkg-source: info: there are no local changes to record` になるはず)
dpkg-source --commit

# ビルド・もろもろの成果物生成
debuild -rfakeroot -uc -us

ビルドが実行され、 athrill_2.0.0-1_amd64.deb が生成される。

成果物の確認

./
 +- athrill/                          : deb パッケージ用ディレクトリ
 |   +- athrill/                      : clone した athrill リポジトリ
 |   +- athrill-target-rh850f1x/      : clone した athrill-target-rh850f1x リポジトリ
 |   +- debian/                       : deb パッケージに必要な情報を入れたディレクトリ
 +- athrill_2.0.0-1.debian.tar.xz     : debian ディレクトリの中身を圧縮したもの
 +- athrill_2.0.0-1_amd64.build       : ビルドログ
 +- athrill_2.0.0-1_amd64.changes     : 変更履歴
 +- athrill_2.0.0.orig.tar.xz         : オリジナルソースコードを圧縮したもの
 +- athrill-dbgsym_2.0.0-1_amd64.ddeb : デバッグシンボルパッケージ
 +- athrill_2.0.0-1.dsc               : ソースコードの概要が記述されたファイル
 +- athrill_2.0.0-1_amd64.buildinfo   : ビルド時の環境情報
 +- athrill_2.0.0-1_amd64.deb         : apt, dpkg でインストールできるバイナリパッケージ

あとは、生成された athrill_2.0.0-1_amd64.deb を配布すれば OK。

一般的には、これを git-buildpackage で管理するらしいので、その方法を勉強しないと…

以上。

参考資料

2020年9月14日月曜日

Docker で MQTT -> Fluentd -> MySQL する

やること

+-----------------------+  +-------------------+  +-------------------------+  +-------+
| HiveMQ                |->| EMQ X             |->| Fluentd                 |->| MySQL |
| (MQTT パブリッシャー) |  | (MQTT ブローカー) |  | (MQTT サブスクライバー) |  |       |
+-----------------------+  +-------------------+  +-------------------------+  +-------+

前提

とりあえず動かす

MySQL

テーブル定義を作って ./docker-entrypoint-initdb.d にマウント

設定ファイル作成

mkdir -p ./conf/mysql/initdb.d

./conf/mysql/initdb.d/Message.sql

DROP SCHEMA IF EXISTS demo;
CREATE SCHEMA demo;
USE demo;

DROP TABLE IF EXISTS message;

CREATE TABLE message
(
  id           INT(10),
  node_name    VARCHAR(40),
  user_name    VARCHAR(40),
  message      VARCHAR(40)
);

起動

docker run -it --rm --name mysql -e "MYSQL_ROOT_PASSWORD=password" -p "3306:3306" -v "$(pwd)/conf/mysql/initdb.d:/docker-entrypoint-initdb.d" mysql:8.0.21 --default-authentication-plugin=mysql_native_password

EMQ X

docker run で立ち上げるだけ。

docker run -it --rm --name emqx -p 1883:1883 -p 8083:8083 emqx/emqx:4.2.0
  • 1883: MQTT TCP port
  • 8083: MQTT WS port

Fluentd

  1. 使用するプラグインをインストールした Docker イメージを作成
  2. プラグイン定義を作って /fluentd/etc/fluent.conf にマウント

Dockerfile を作成

mkdir dockerfile/fluentd

./dockerfile/fluend/Dockerfile

FROM fluent/fluentd:v1.11.2-1.0

LABEL maintainer "mikoto2000 <mikoto2000@gmail.com>"
LABEL version="1.0.0"
LABEL description "fluentd v1.11.2-1.0, fluent-plugin-mqtt, fluent-plugin-mysql."

USER root

RUN apk add alpine-sdk ruby-dev mariadb-dev

RUN fluent-gem install fluent-plugin-mqtt-io fluent-plugin-mysql

USER fluent

fluentd 設定ファイルを作成

mkdir -p ./conf/fluentd/td-agent

./conf/fluentd/td-agent/td-agent.conf

<source>
  @type mqtt
  host host.docker.internal
  port 1883
  topic test/#
  <parse>
    @type json
  </parse>
</source>

<filter test.**>
  @type record_transformer
  <record>
    node_name ${tag_parts[1]}
  </record>
</filter>

<match test.one>
  @type mysql_bulk
  host host.docker.internal
  port 3306
  database demo
  username root
  password password
  column_names id,node_name,user_name,message
  table message
  flush_interval 10s
</match>

イメージビルド

docker build -t mikoto2000/fluentd:mqtt-mysql ./dockerfile/fluentd

起動

docker run -it --rm --name fluentd -v "$(pwd)/conf/fluentd/td-agent/td-agent.conf:/fluentd/etc/fluent.conf" mikoto2000/fluentd:mqtt-mysql

接続確認

Topic を Publish

  1. http://www.hivemq.com/demos/websocket-client に接続
  2. Connection を設定し、 Connect ボタン押下
    • Host: localhost
    • Port: 8083
  3. Publish を設定し、 Publish ボタン押下
    • Topic: test/one
    • Message: {"id":1, "user_name": "test", "message":"testing"}

MySQL テーブル確認

docker execmysql コンテナに接続してテーブルを確認。

> docker exec -it mysql mysql -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 11
Server version: 8.0.21 MySQL Community Server - GPL

Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> use demo;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> select * from message;
+------+-----------+-----------+---------+
| id   | node_name | user_name | message |
+------+-----------+-----------+---------+
|    1 | one       | test      | testing |
+------+-----------+-----------+---------+
1 row in set (0.00 sec)

参考資料