<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Lua | ばすにっきTips</title>
	<atom:link href="https://takabus.com/tips/tag/lua/feed/" rel="self" type="application/rss+xml" />
	<link>https://takabus.com/tips</link>
	<description>プログラミングやサーバー、日々のTipsをメモしています。</description>
	<lastBuildDate>Wed, 03 Nov 2021 00:10:10 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.4.3</generator>

<image>
	<url>https://takabus.com/tips/wp-content/uploads/2022/12/cropped-tips-1-32x32.png</url>
	<title>Lua | ばすにっきTips</title>
	<link>https://takabus.com/tips</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>ヤマハルーターのトラフィックを可視化する（Luaスクリプト＋PHP＋Grafana＋ラズベリーパイ）</title>
		<link>https://takabus.com/tips/472/</link>
					<comments>https://takabus.com/tips/472/#respond</comments>
		
		<dc:creator><![CDATA[ばすにっきTips]]></dc:creator>
		<pubDate>Wed, 03 Nov 2021 00:10:06 +0000</pubDate>
				<category><![CDATA[ネットワーク]]></category>
		<category><![CDATA[YAMAHA]]></category>
		<category><![CDATA[Grafana]]></category>
		<category><![CDATA[Lua]]></category>
		<guid isPermaLink="false">https://takabus.com/tips/?p=472</guid>

					<description><![CDATA[ヤマハルーターのLuaスクリプトを使い、ヤマハルーターのトラフィックを集計してグラフ化してみました。通信量の変化やVPNが占める割合などをグラフで直感的に把握することができます。]]></description>
										<content:encoded><![CDATA[
<p>ヤマハルーターのLuaスクリプトとラズパイに構築した<strong><span class="bold-red">PHP</span></strong>＋<strong><span class="has-inline-color has-orange-color">MySQL</span></strong>＋<span class="has-inline-color has-deep-orange-color"><strong>Grafana</strong></span>を組み合わせて、<strong><span class="has-inline-color has-indigo-color">ヤマハルーター</span></strong>のトラフィックを集計してグラフ化してみました。</p>



<figure class="wp-block-image size-large"><img fetchpriority="high" decoding="async" width="1024" height="705" src="https://takabus.com/tips/wp-content/uploads/2021/10/image-85-1024x705.png" alt="Grafanaのスクリーンショット" class="wp-image-533" srcset="https://takabus.com/tips/wp-content/uploads/2021/10/image-85-1024x705.png 1024w, https://takabus.com/tips/wp-content/uploads/2021/10/image-85-300x207.png 300w, https://takabus.com/tips/wp-content/uploads/2021/10/image-85-768x529.png 768w, https://takabus.com/tips/wp-content/uploads/2021/10/image-85.png 1085w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption>ヤマハルーターの通信量の変化やVPNが占める割合などをグラフで直感的に把握することができます！ </figcaption></figure>



<h2 class="wp-block-heading">しくみ</h2>



<p>ヤマハルーターでLuaスクリプトを定期実行させ、トラフィック情報を収集し、ラズパイへ送信するようにします。</p>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="576" src="https://takabus.com/tips/wp-content/uploads/2021/10/luaで集計-1024x576.png" alt="システム構成図 ヤマハルーターでLuaスクリプトを動作させ、ラズパイにPOSTでデータを送信する" class="wp-image-473" srcset="https://takabus.com/tips/wp-content/uploads/2021/10/luaで集計-1024x576.png 1024w, https://takabus.com/tips/wp-content/uploads/2021/10/luaで集計-300x169.png 300w, https://takabus.com/tips/wp-content/uploads/2021/10/luaで集計-768x432.png 768w, https://takabus.com/tips/wp-content/uploads/2021/10/luaで集計-1536x864.png 1536w, https://takabus.com/tips/wp-content/uploads/2021/10/luaで集計-120x68.png 120w, https://takabus.com/tips/wp-content/uploads/2021/10/luaで集計-160x90.png 160w, https://takabus.com/tips/wp-content/uploads/2021/10/luaで集計-320x180.png 320w, https://takabus.com/tips/wp-content/uploads/2021/10/luaで集計-374x210.png 374w, https://takabus.com/tips/wp-content/uploads/2021/10/luaで集計.png 1920w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>ラズパイにはあらかじめ送信先となるAPIを用意しておき、送信されたデータを解析して、MySQLなどのデータベースにトラフィック情報を格納します。格納したデータはGrafanaなどの可視化ツールによりグラフ化し、ブラウザからかんたんに確認できるようにします。</p>



<figure class="wp-block-image size-full"><img decoding="async" width="1017" height="469" src="https://takabus.com/tips/wp-content/uploads/2021/10/image-66.png" alt="" class="wp-image-474" srcset="https://takabus.com/tips/wp-content/uploads/2021/10/image-66.png 1017w, https://takabus.com/tips/wp-content/uploads/2021/10/image-66-300x138.png 300w, https://takabus.com/tips/wp-content/uploads/2021/10/image-66-768x354.png 768w" sizes="(max-width: 1017px) 100vw, 1017px" /></figure>



<p><strong><span class="has-inline-color has-deep-orange-color">Grafana</span></strong>はデータ可視化ツールと呼ばれるもので、手軽にデータベースの内容をグラフ化して表示することができるアプリケーションです。ラズパイにインストールすることで、ブラウザからデータベースの内容を視覚的に参照することができます。Grafanaの概要・使い方については、こちらで紹介しています。</p>



<div class="wp-block-cocoon-blocks-blogcard blogcard-type bct-together">

<a rel="noopener" href="https://takabus.com/grafana/" title="データ可視化ツール Grafana入門" class="blogcard-wrap external-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img loading="lazy" decoding="async" src="https://takabus.com/grafana/wp-content/uploads/2022/08/Grafana-ogp.png" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="160" height="90" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">データ可視化ツール Grafana入門</div><div class="blogcard-snippet external-blogcard-snippet">データ可視化ツールGrafanaを使ってみよう！便利な使い方をまとめています。</div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://takabus.com/grafana" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">takabus.com</div></div></div></div></a>
</div>



<p>今回はAPIの作成にPHPを使用しましたが、MySQLにデータを登録できるのであれば、どの言語でも対応できます。ヤマハルーターには専用のLuaスクリプトAPIが用意されていますが、多くの場合はピンポイントで数値を得ることはできません。Luaスクリプトからコマンドを実行し、出力を文字列解析する必要が出てきます。Luaスクリプトでも解析は不可能ではありませんが、できることが限られているため、今回はルーターからはコマンドの実行結果をそのまま送信し、API側で正規表現による文字列解析を行うことにしています。</p>



<p>なお、今回は以下の項目を集計対象とします。</p>



<ul class="has-watery-yellow-background-color has-background"><li><strong>LAN1の受信・送信（合計・IPv4のみ・IPv6のみ）</strong></li><li><strong>LAN2の受信・送信（合計・IPv4のみ・IPv6のみ）</strong></li><li><strong>PP1の受信・送信（PPPoE）</strong></li></ul>



<p>ちなみに、GitHubにはtunnelの集計プログラムも掲載しています。VPNのトラフィックも集計することができますので、興味があれば参照してみてください。</p>




<a rel="noopener" href="https://github.com/takabus/rtx-traffic-logger" title="GitHub - takabus/rtx-traffic-logger: get traffic data from Yamaha RTX router" class="blogcard-wrap external-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img loading="lazy" decoding="async" src="https://opengraph.githubassets.com/6b80118787b2c5a10c04383ac68e672ee27246164e7311053ebab880fbe32ae8/takabus/rtx-traffic-logger" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="160" height="90" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">GitHub - takabus/rtx-traffic-logger: get traffic data from Yamaha RTX router</div><div class="blogcard-snippet external-blogcard-snippet">get traffic data from Yamaha RTX router. Contribute to takabus/rtx-traffic-logger development by creating an account on ...</div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://github.com/takabus/rtx-traffic-logger" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">github.com</div></div></div></div></a>



<h2 class="wp-block-heading">ヤマハルーターのLuaスクリプトの基本</h2>



<p>ヤマハルーターでのLuaスクリプトの扱いについて、基本事項をまとめておきます。</p>



<h3 class="wp-block-heading">コンソールでLuaスクリプトを動かしてみる</h3>



<p>ヤマハルーターでコンソールからLuaスクリプトを実行するには、<strong><span class="marker-under"><code>lua -e</code>コマンド</span></strong>を使用します。</p>



<pre class="wp-block-code"><code>lua -e 'print(123)'</code></pre>



<p>スクリプトの実行には管理ユーザーとしてルーターにログインしておく必要があります。</p>



<p>また、コンソールから直接実行する場合、スクリプトは改行せず、1行にしておく必要があります。コピペして流し込む前に改行をなくしておく必要があるので、注意してください。</p>



<h3 class="wp-block-heading">WebサイトやAPIへPOSTするには？</h3>



<p><span class="marker-under">WebサイトやAPIへのPOSTには、ヤマハルーター独自APIである<span class="bold-red">rt.httprequest</span>を使用します。</span></p>




<a rel="noopener" href="http://www.rtpro.yamaha.co.jp/RT/docs/lua/rt_api.html#rt_httpreq" title="&#12516;&#12510;&#12495;&#12523;&#12540;&#12479;&#12540;&#23554;&#29992; API" class="blogcard-wrap external-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img loading="lazy" decoding="async" src="https://s.wordpress.com/mshots/v1/http%3A%2F%2Fwww.rtpro.yamaha.co.jp%2FRT%2Fdocs%2Flua%2Frt_api.html%23rt_httpreq?w=160&#038;h=90" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="160" height="90" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">&#12516;&#12510;&#12495;&#12523;&#12540;&#12479;&#12540;&#23554;&#29992; API</div><div class="blogcard-snippet external-blogcard-snippet"></div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=http://www.rtpro.yamaha.co.jp/RT/docs/lua/rt_api.html#rt_httpreq" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">www.rtpro.yamaha.co.jp</div></div></div></div></a>



<p>例えば、http://test.lc/rtxlogger/api.phpにPOSTする場合は、以下のようなコードとなります。</p>



<pre class="wp-block-code"><code>-- POSTデータ作成
req_t = {
    url = "http://test.lc/rtxlogger/api.php",//URL
    method = "POST",
    content_type = "application/x-www-form-urlencoded;charset=sjis"
}
req_t.post_text =
    string.format(
    "key1=%s&amp;key2=%s",
    "hoge",
    "fuga"
)</code></pre>



<p>注意点としては、</p>



<ul><li><span class="red"><strong>文字コードがShiftJISになること</strong></span></li><li><span class="red"><strong>エンコードは自分で行う必要があること</strong></span></li></ul>



<p>などがあげられます。</p>



<p>まず、送信される際の文字コードはUTF-8ではなく、ShiftJISになります。日本語を含むデータを送信する際に文字化けの原因となりますので、content_typeに文字コードがShiftJISであることを明記しておくことをおすすめします。上記サンプルにも盛り込んであります。</p>



<p>また、POSTするボディは自分でエンコードを行う必要があります。サンプルのように<strong>string.format</strong>を使用して、content_typeにあったエンコードを行ってください。上記サンプルではcontent_typeを<strong>application/x-www-form-urlencoded</strong>としていますので、「key=value」形式のデータを&amp;（アンパサンド）でつなげています。エンコードした後の形式がわからない場合は、Postmanなどのツールを使用してみるといいかもしれません。</p>



<h3 class="wp-block-heading">コマンドの実行</h3>



<p><span class="marker-under">ヤマハルーターのコマンドを実行するには、<span class="red"><strong>rt.command</strong></span>を使用します。</span></p>



<pre class="wp-block-code"><code>rtn, env = rt.command("show environment")</code></pre>



<p>第1引数には実行結果（成功したらtrue）、第2引数には標準出力（コマンドの出力）が格納されます。管理ユーザーとして実行されますので、十分内容を確認してから実行してください。</p>



<p>rt.commandでコマンドの実行結果を取得し、rt.httprequestでラズパイに送信する感じになりますね。</p>



<h2 class="wp-block-heading">Luaスクリプトの作成</h2>



<p>それではさっそくLuaスクリプトを作成していきましょう。なお、コード全体はGitHubを参照してください。</p>




<a rel="noopener" href="https://github.com/takabus/rtx-traffic-logger" title="GitHub - takabus/rtx-traffic-logger: get traffic data from Yamaha RTX router" class="blogcard-wrap external-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img loading="lazy" decoding="async" src="https://opengraph.githubassets.com/6b80118787b2c5a10c04383ac68e672ee27246164e7311053ebab880fbe32ae8/takabus/rtx-traffic-logger" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="160" height="90" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">GitHub - takabus/rtx-traffic-logger: get traffic data from Yamaha RTX router</div><div class="blogcard-snippet external-blogcard-snippet">get traffic data from Yamaha RTX router. Contribute to takabus/rtx-traffic-logger development by creating an account on ...</div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://github.com/takabus/rtx-traffic-logger" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">github.com</div></div></div></div></a>



<pre class="wp-block-code"><code>
-- YAMAHAルーターで実行するスクリプト

-- コマンド
rtn, lan1 = rt.command("show status lan1")
rtn, lan2 = rt.command("show status lan2")
rtn, pp1 = rt.command("show status pp 1")

-- POSTデータ作成
req_t = {
    url = "http://test.lc/rtxlogger/api.php",
    method = "POST",
    content_type = "application/x-www-form-urlencoded;charset=sjis"
}
req_t.post_text =
    string.format(
    "lan1=%s&amp;lan2=%s&amp;pp1=%s",
    lan1,
    lan2,
    pp1,
)

-- サーバーにPOST
rt.httprequest(req_t)
</code></pre>



<p>LAN1、LAN2、PP1のステータスを取得し、ラズパイにPOSTしています。</p>



<p>コンソールからテストする際は、<code><strong>lua -e</strong></code>につづいて上のスクリプトを記述します。改行は除去する必要があります。</p>



<pre class="wp-block-code"><code>lua -e 'rtn, lan1 = rt.command("show status lan1")rtn, lan2 = rt.command("show status lan2")rtn, pp1 = rt.command("show status pp 1")req_t = {    url = "http://test.lc/rtxlogger/api.php",    method = "POST",    content_type = "application/x-www-form-urlencoded;charset=sjis"}req_t.post_text =    string.format(    "lan1=%s&amp;lan2=%s&amp;pp1=%s",    lan1,    lan2,    pp1,)rt.httprequest(req_t)'</code></pre>



<h2 class="wp-block-heading">ラズパイにAPIを作成する</h2>



<p>次にルーターからPOSTされたデータを受けるAPIをラズパイに作成します。</p>



<pre class="wp-block-code"><code>&lt;?php

require_once __DIR__ . '/vendor/autoload.php';

// 
// Eloquentの初期化
// 

class_alias(Illuminate\Database\Capsule\Manager::class, 'DB');
$database = new DB();
$config = &#91;
    'driver'    =&gt; 'mysql',              // データベースの種類
    'host'      =&gt; 'localhost',          // ホスト名
    'database'  =&gt; '',           // データベース名
    'username'  =&gt; '',               // ユーザー名
    'password'  =&gt; '',           // パスワード
    // 'charset'   =&gt; 'utf8mb4',            // 文字セット(任意)
    // 'collation' =&gt; 'utf8mb4_general_ci', // コレーション(任意)
];
$database-&gt;addConnection($config);
$database-&gt;setAsGlobal();
$database-&gt;bootEloquent();


// 
// POSTされたときの処理
// 
if ($_SERVER&#91;"REQUEST_METHOD"] == "POST") {

    preg_match("/送信パケット:                   (\d+)/u", mb_convert_encoding($_POST&#91;"lan1"], "UTF-8", "sjis"), $d&#91;"lan1_total_send"]);
    preg_match("/受信パケット:                   (\d+)/u", mb_convert_encoding($_POST&#91;"lan1"], "UTF-8", "sjis"), $d&#91;"lan1_total_receive"]);
    preg_match("/IPv4\(全体\/ファストパス\):      (\d+) パケット/u", mb_convert_encoding($_POST&#91;"lan1"], "UTF-8", "sjis"), $d&#91;"lan1_v4_send"]);
    preg_match("/IPv6\(全体\/ファストパス\):      (\d+) パケット/u", mb_convert_encoding($_POST&#91;"lan1"], "UTF-8", "sjis"), $d&#91;"lan1_v6_send"]);
    preg_match("/IPv4:                         (\d+) パケット/u", mb_convert_encoding($_POST&#91;"lan1"], "UTF-8", "sjis"), $d&#91;"lan1_v4_receive"]);
    preg_match("/IPv6:                         (\d+) パケット/u", mb_convert_encoding($_POST&#91;"lan1"], "UTF-8", "sjis"), $d&#91;"lan1_v6_receive"]);

    preg_match("/送信パケット:                   (\d+)/u", mb_convert_encoding($_POST&#91;"lan2"], "UTF-8", "sjis"), $d&#91;"lan2_total_send"]);
    preg_match("/受信パケット:                   (\d+)/u", mb_convert_encoding($_POST&#91;"lan2"], "UTF-8", "sjis"), $d&#91;"lan2_total_receive"]);
    preg_match("/IPv4\(全体\/ファストパス\):      (\d+) パケット/u", mb_convert_encoding($_POST&#91;"lan2"], "UTF-8", "sjis"), $d&#91;"lan2_v4_send"]);
    preg_match("/IPv6\(全体\/ファストパス\):      (\d+) パケット/u", mb_convert_encoding($_POST&#91;"lan2"], "UTF-8", "sjis"), $d&#91;"lan2_v6_send"]);
    preg_match("/IPv4:                         (\d+) パケット/u", mb_convert_encoding($_POST&#91;"lan2"], "UTF-8", "sjis"), $d&#91;"lan2_v4_receive"]);
    preg_match("/IPv6:                         (\d+) パケット/u", mb_convert_encoding($_POST&#91;"lan2"], "UTF-8", "sjis"), $d&#91;"lan2_v6_receive"]);

    preg_match("/受信: (\d+) パケット/u", mb_convert_encoding($_POST&#91;"pp1"], "UTF-8", "sjis"), $d&#91;"pp1_receive"]);
    preg_match("/送信: (\d+) パケット/u", mb_convert_encoding($_POST&#91;"pp1"], "UTF-8", "sjis"), $d&#91;"pp1_send"]);

    // 現在時刻を取得
    $dt = new DateTime();
    $dt = $dt-&gt;modify('-9 hours'); //GrafanaはUTCで登録する必要あり

    // DBに入れるデータを作成する
    $data = array_map(function ($item) {
        if (isset($item&#91;1])) {
            return $item&#91;1];
        } else {
            return null;
        }
    }, $d);
    $data&#91;"update_at"] = $dt;
    $data&#91;"host"]=$_SERVER&#91;"REMOTE_ADDR"];


    // DBにインサートする
    DB::table("traffics")-&gt;insert($data);
}

</code></pre>



<p>POSTされたデータを取得し、取得されたデータからパケットに関する必要な数値を抽出しています。ここは正規表現で抽出するしかありませんので、少し大変です。ダイレクトに値を取得できるAPIがルーターに用意されていればよかったのですが、現状では用意されていませんので、がんばるしかないようです。文字コードがShiftJISであるため、pgrep_matchで抽出する前に、一応UTF-8に変換しています。</p>



<p>抽出した通信量データはひとつの配列にまとめ、<span class="bold-red"><span class="marker-under">illuminate/Database</span></span>を使用して、データベースに格納しています。<span class="marker-under"><strong>illuminate/DatabaseはSQLフリーでデータベースを扱えるライブラリで、Laravelのクエリビルダとまったく同じことができます。</strong></span>PDOやSQL文に関する知識がなくても、MySQLやSQLiteにデータを保存することができますので、とても便利です。インストールもcomposerからコマンド一発でできてしまいます。ぜひ活用してみてください。</p>




<a rel="noopener" href="https://github.com/illuminate/database" title="GitHub - illuminate/database: [READ ONLY] Subtree split of the Illuminate Database component (see laravel/framework)" class="blogcard-wrap external-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img loading="lazy" decoding="async" src="https://opengraph.githubassets.com/0ef8daaab247430c777a3568b9d79b69ba8b886bdbab497cf2a45a3b89f5da5f/illuminate/database" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="160" height="90" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">GitHub - illuminate/database: [READ ONLY] Subtree split of the Illuminate Database component (see laravel/framework)</div><div class="blogcard-snippet external-blogcard-snippet">Subtree split of the Illuminate Database component (see laravel/framework) - illuminate/database</div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://github.com/illuminate/database" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">github.com</div></div></div></div></a>



<p>なお、データベースを用意するのが大変という方のために、データをテキストファイルに書き出すコードも掲載しておきます。上のコードに以下の関数を追加して、<code>logging($d)</code>で呼び出せば、データベースがなくても動作を確認できますよ。</p>




<a rel="noopener" href="https://takabus.com/201214-dump-post-data-php/" title="【PHP】POST・GETされたデータとヘッダーをロギングする方法" class="blogcard-wrap external-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img loading="lazy" decoding="async" src="https://takabus.com/wp-content/uploads/2021/03/image.png" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="160" height="90" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">【PHP】POST・GETされたデータとヘッダーをロギングする方法</div><div class="blogcard-snippet external-blogcard-snippet">デバッグするときに、POST・GETで送信したデータやリクエストヘッダーを確認したいときがあります。こういったデータをテキストファイルに書き出すPHPコードを掲載しておきます。かんたんにクライアントからのリクエストを把握できるようになるので...</div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://takabus.com/201214-dump-post-data-php/" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">takabus.com</div></div></div></div></a>



<pre class="wp-block-code"><code>function logging($val)
{
    // ログ保存ファイル名
    define("TXTFILE", "rtxlogger.log");
    // ファイルを追記モードでオープン
    $fh = fopen(TXTFILE, "a+");
    // GETされたデータをすべて取得して、配列として取得
    $str = print_r($val, true);
    // ファイルに追記する
    fputs($fh,  $str);
    // ファイルを閉じる
    fclose($fh);
}
</code></pre>



<p>もちろんですが、ディレクトリの書き込み許可をお忘れなく。</p>



<h2 class="wp-block-heading">MySQLにデータベースを作成する</h2>



<p>収集したデータを保存するためのデータベースを作成します。データベースの作成方法については、ここでは省略しますが、カラムの作成には次のSQLをご利用ください。</p>



<pre class="wp-block-code"><code>ALTER TABLE `traffics` ADD `host` VARCHAR(15) NULL AFTER `id`;
ALTER TABLE `traffics` ADD `lan1_total_send` BIGINT NULL;
ALTER TABLE `traffics` ADD `lan1_total_receive` BIGINT NULL;
ALTER TABLE `traffics` ADD `lan1_v4_send` BIGINT NULL;
ALTER TABLE `traffics` ADD `lan1_v6_send` BIGINT NULL;
ALTER TABLE `traffics` ADD `lan1_v4_receive` BIGINT NULL;
ALTER TABLE `traffics` ADD `lan1_v6_receive` BIGINT NULL;
ALTER TABLE `traffics` ADD `lan2_total_send` BIGINT NULL;
ALTER TABLE `traffics` ADD `lan2_total_receive` BIGINT NULL;
ALTER TABLE `traffics` ADD `lan2_v4_send` BIGINT NULL;
ALTER TABLE `traffics` ADD `lan2_v6_send` BIGINT NULL;
ALTER TABLE `traffics` ADD `lan2_v4_receive` BIGINT NULL;
ALTER TABLE `traffics` ADD `lan2_v6_receive` BIGINT NULL;
ALTER TABLE `traffics` ADD `pp1_receive` BIGINT NULL;
ALTER TABLE `traffics` ADD `pp1_send` BIGINT NULL;
ALTER TABLE `traffics` ADD `update_at` DATETIME NULL;</code></pre>



<h2 class="wp-block-heading">テストしてみる</h2>



<p>Luaスクリプト、APIの作成からデータベースの容易まですべて終わったら、きちんとデータを収集できるかテストしてみましょう。ルーターのコンソールでスクリプトを実行してみます。</p>



<pre class="wp-block-code"><code>lua -e 'rtn, lan1 = rt.command("show status lan1")rtn, lan2 = rt.command("show status lan2")rtn, pp1 = rt.command("show status pp 1")req_t = {    url = "http://test.lc/rtxlogger/api.php",    method = "POST",    content_type = "application/x-www-form-urlencoded;charset=sjis"}req_t.post_text =    string.format(    "lan1=%s&amp;lan2=%s&amp;pp1=%s",    lan1,    lan2,    pp1,)rt.httprequest(req_t)'</code></pre>



<p>データベースにデータが蓄積されていれば、成功です！</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="510" src="https://takabus.com/tips/wp-content/uploads/2021/10/image-68-1024x510.png" alt="" class="wp-image-482" srcset="https://takabus.com/tips/wp-content/uploads/2021/10/image-68-1024x510.png 1024w, https://takabus.com/tips/wp-content/uploads/2021/10/image-68-300x149.png 300w, https://takabus.com/tips/wp-content/uploads/2021/10/image-68-768x382.png 768w, https://takabus.com/tips/wp-content/uploads/2021/10/image-68.png 1093w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<h2 class="wp-block-heading">Luaスクリプトの定期実行</h2>



<p>毎日AM1:00に作成したLuaスクリプトを実行させ、データを収集するようにします。</p>



<pre class="wp-block-code"><code><strong>schedule at ID 01:00 * lua -e 'スクリプトをここに貼り付け'</strong></code></pre>



<p>例えばこんな感じになります。</p>



<pre class="wp-block-code"><code><strong>schedule at 2 01:00 * lua -e </strong>'rtn, lan1 = rt.command("show status lan1")rtn, lan2 = rt.command("show status lan2")rtn, pp1 = rt.command("show status pp 1")req_t = {    url = "http://test.lc/rtxlogger/api.php",    method = "POST",    content_type = "application/x-www-form-urlencoded;charset=sjis"}req_t.post_text =    string.format(    "lan1=%s&amp;lan2=%s&amp;pp1=%s",    lan1,    lan2,    pp1,)rt.httprequest(req_t)'</code></pre>



<p>毎時に行いたいなら、以下のようになります。</p>



<pre class="wp-block-code"><code>schedule at 2 <strong>*:00</strong> * lua -e 'rtn, lan1 = rt.command("show status lan1")rtn, l
an2 = rt.command("show status lan2")rtn, pp1 = rt.command("show status pp 1")re
q_t = {    url = "http://test.lc/rtxlogger/api.php",    method = "POST",    con
tent_type = "application/x-www-form-urlencoded;charset=sjis"}req_t.post_text =
   string.format(    "lan1=%s&amp;lan2=%s&amp;pp1=%s",    lan1,    lan2,    pp1,)rt.htt
prequest(req_t)'</code></pre>



<p>IDは重複していると、既存の設定を上書きしてしまいますので注意してください。多くの場合、スケジュールのID1にはNTPによる自動時刻修正が登録されているため、上記のサンプルではあえてIDを2としておきました。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://takabus.com/tips/wp-content/uploads/2021/09/man-150x150.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>誤って消してしまった人のためにNTPのスケジュールコマンドも掲載しておきます～</p>



<pre class="wp-block-code"><code>schedule at 1 */Sun 01:00 * ntpdate ntp.nict.jp</code></pre>



<p>自分もうっかりやってしまいましたので(^^;)</p>
</div></div>



<h2 class="wp-block-heading">Grafanaでグラフ化してみる</h2>



<p>データの蓄積も確認できましたので、Grafanaでグラフを表示してみます。Grafanaの基本的な使い方については、以下の記事をご覧ください。</p>




<a rel="noopener" href="https://takabus.com/grafana/" title="データ可視化ツール Grafana入門" class="blogcard-wrap external-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img loading="lazy" decoding="async" src="https://takabus.com/grafana/wp-content/uploads/2022/08/Grafana-ogp.png" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="160" height="90" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">データ可視化ツール Grafana入門</div><div class="blogcard-snippet external-blogcard-snippet">データ可視化ツールGrafanaを使ってみよう！便利な使い方をまとめています。</div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://takabus.com/grafana" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">takabus.com</div></div></div></div></a>



<p>新しいダッシュボードを作成し、クエリビルダで書き出したいデータを設定します。</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="672" height="340" src="https://takabus.com/tips/wp-content/uploads/2021/10/image-72.png" alt="" class="wp-image-488" srcset="https://takabus.com/tips/wp-content/uploads/2021/10/image-72.png 672w, https://takabus.com/tips/wp-content/uploads/2021/10/image-72-300x152.png 300w" sizes="(max-width: 672px) 100vw, 672px" /></figure>



<p>あわせてサイドメニューで<strong>Unit（単位）をBytes</strong>にします。</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="602" src="https://takabus.com/tips/wp-content/uploads/2021/10/image-70-1024x602.png" alt="" class="wp-image-486" srcset="https://takabus.com/tips/wp-content/uploads/2021/10/image-70-1024x602.png 1024w, https://takabus.com/tips/wp-content/uploads/2021/10/image-70-300x176.png 300w, https://takabus.com/tips/wp-content/uploads/2021/10/image-70-768x452.png 768w, https://takabus.com/tips/wp-content/uploads/2021/10/image-70.png 1083w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>これでグラフが表示されました。</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="470" height="294" src="https://takabus.com/tips/wp-content/uploads/2021/10/image-73.png" alt="" class="wp-image-489" srcset="https://takabus.com/tips/wp-content/uploads/2021/10/image-73.png 470w, https://takabus.com/tips/wp-content/uploads/2021/10/image-73-300x188.png 300w" sizes="(max-width: 470px) 100vw, 470px" /></figure>



<p>ただし、ヤマハルーターはパケットで通信量を表記しているため、得られた数値をbyteに変換する必要があります。そこで、クエリエディタに切り替えて、データベースから数値を取得するときに128倍（∵1パケット128byte）するようにクエリを編集します。</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="572" height="346" src="https://takabus.com/tips/wp-content/uploads/2021/10/image-69.png" alt="" class="wp-image-485" srcset="https://takabus.com/tips/wp-content/uploads/2021/10/image-69.png 572w, https://takabus.com/tips/wp-content/uploads/2021/10/image-69-300x181.png 300w" sizes="(max-width: 572px) 100vw, 572px" /></figure>



<p>きちんと表示できました！完成です！</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="523" height="343" src="https://takabus.com/tips/wp-content/uploads/2021/10/image-74.png" alt="" class="wp-image-490" srcset="https://takabus.com/tips/wp-content/uploads/2021/10/image-74.png 523w, https://takabus.com/tips/wp-content/uploads/2021/10/image-74-300x197.png 300w" sizes="(max-width: 523px) 100vw, 523px" /></figure>



<p>通信種類ごとの円グラフも描いてみました。</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="446" height="308" src="https://takabus.com/tips/wp-content/uploads/2021/10/image-78.png" alt="" class="wp-image-495" srcset="https://takabus.com/tips/wp-content/uploads/2021/10/image-78.png 446w, https://takabus.com/tips/wp-content/uploads/2021/10/image-78-300x207.png 300w" sizes="(max-width: 446px) 100vw, 446px" /></figure>



<p><strong><span class="has-inline-color has-indigo-color">青はIPoE</span>、<span class="has-inline-color has-red-color">赤はIPSecVPN、</span><span class="has-inline-color has-amber-color">黄色はPPPoE</span>の通信量</strong>（いずれも下り）を示します。</p>



<p>私の場合、拠点間VPNとリモートVPNのみPPPoEに流し、その他すべてIPoEに流すようにしています。最近はFireTVでYouTubeを垂れ流しにしていることが多かったので、ほとんどがIPoEのトラフィックかなと思っていましたが、意外とVPN通信が多いことがわかりました。VPN接続先にある自宅サーバーに大量の写真をバックアップしているため、気づかぬうちにトラフィックが増えていたようです。</p>



<h2 class="wp-block-heading">まとめ</h2>



<p>RTXのLuaスクリプト機能を使い、ラズパイでトラフィックを監視、Grafanaでグラフ化するという今回の企画。実際に1週間ほど運用してみた結果がこちらです。</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="761" src="https://takabus.com/tips/wp-content/uploads/2021/10/image-83-1024x761.png" alt="" class="wp-image-530" srcset="https://takabus.com/tips/wp-content/uploads/2021/10/image-83-1024x761.png 1024w, https://takabus.com/tips/wp-content/uploads/2021/10/image-83-300x223.png 300w, https://takabus.com/tips/wp-content/uploads/2021/10/image-83-768x571.png 768w, https://takabus.com/tips/wp-content/uploads/2021/10/image-83.png 1051w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>ちゃんと通信量が記録されていることがわかります。この1週間は不在にしていたため、あまり大きなトラフィック増加はありませんでしたが、ふだんはもっとトラフィックが増えているものと思われます。</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="719" src="https://takabus.com/tips/wp-content/uploads/2021/10/image-84-1024x719.png" alt="" class="wp-image-531" srcset="https://takabus.com/tips/wp-content/uploads/2021/10/image-84-1024x719.png 1024w, https://takabus.com/tips/wp-content/uploads/2021/10/image-84-300x211.png 300w, https://takabus.com/tips/wp-content/uploads/2021/10/image-84-768x539.png 768w, https://takabus.com/tips/wp-content/uploads/2021/10/image-84.png 1320w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>固定回線であれば自己満足にすぎませんが、RTX810をはじめ、一部のヤマハルーターはUSB通信端末にも対応しています。移動拠点の場合は通信量を分析することで、最適なプラン設定や無駄な通信を洗い出すのに役立ちそうです。</p>



<p>ちなみに、Grafanaは通知も充実しています。一定のトラフィックを超えたら、LINENotifyで通知するといったこともGrafanaの機能を使えば、かんたんに実現できます。組み合わせてみると面白いかもしれませんね。</p>



<p>まだ1週間しかも不在時ですので、もう少しデータがほしいところです。データが蓄積されてきて、なにか発見があれば、追記していきたいと思います。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://takabus.com/tips/472/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
