Stratum1のなんちゃってNTPサーバーを作る

インターネットに繋がらない環境でもPCやMac、マイコンなどで正確な時刻合わせを行いたい(*´ェ`)

GPSから時刻を取得してNTPサーバを作れば良さそう(*゚ェ゚*) ということで作ってみた(*゚ェ゚*)

使用部品は
・GPS受信機 GT-505GGBL5-DR-N 1つ
・マイコンボード W55RP20-EVB-Pico 1つ

GT-505GGBL5-DR-Nは1PPS出力も付いていてUARTで通信する(*゚ェ゚*)
1PPS出力を使用して精度を上げて信号確認用にLEDも付けてみると1Hzでピカピカしている(*´ェ`)

W55RP20-EVB-Pico は Raspberry Pi Pico互換のマイコンボードでRP2040とTCP/IPコントローラーW5500を統合したSoC「W55RP20」を搭載している(*゚ェ゚*)

Raspberry Pi Picoにイーサネット接続機能も使えて便利(*゚ェ゚*)

Raspberry Pi Pico側でNTPサーバを稼働させて各端末からはNTPクライアントで接続してもらえば良い(*´ェ`)

GPS/GNSSやNTPサーバの情報が見られたら良いなと思ったので簡易HTTPサーバも搭載してみた(*゚ェ゚*)

こうなるとネットワーク周りの設定値も変えられると便利かもと思い実装してみた(*´ェ`)

sntpコマンドで確認すると

$ sntp -d 192.168.11.88
sntp_exchange {
        result: 0 (Success)
        header: 24 (li:0 vn:4 mode:4)
       stratum: 01 (1)
          poll: 00 (1)
     precision: FFFFFFEC (9.536743e-07)
         delay: 0000.0000 (0.000000000)
    dispersion: 0000.5F37 (0.371932983)
           ref: 47505373 ("GPSs")
         t_ref: EDCE4F6E.E2A6DED8 (3989720942.885358741)
            t1: EDCE4F6E.7ABC0E38 (3989720942.479431999)
            t2: EDCE4F6E.E2A6DED8 (3989720942.885358741)
            t3: EDCE4F6E.E2A76510 (3989720942.885366741)
            t4: EDCE4F6E.7DB77C02 (3989720942.491080999)
        offset: 0000000000000000.666D5CD700000000 (0.400106242)
         delay: 0000000000000000.02FAE79200000000 (0.011641000)
          mean: 00000000EDCE4F6E.E2A721F400000000 (3989720942.885362625)
         error: 0000000000000000.5F37000000000000 (0.371932983)
          addr: 192.168.11.88
}
sntp_exchange {
        result: 0 (Success)
        header: 24 (li:0 vn:4 mode:4)
       stratum: 01 (1)
          poll: 00 (1)
     precision: FFFFFFEC (9.536743e-07)
         delay: 0000.0000 (0.000000000)
    dispersion: 0000.695F (0.411605835)
           ref: 47505373 ("GPSs")
         t_ref: EDCE4F6E.ECF55EB4 (3989720942.925619048)
            t1: EDCE4F6E.7DC810A5 (3989720942.491333999)
            t2: EDCE4F6E.ECF55EB4 (3989720942.925619048)
            t3: EDCE4F6E.ECF5B297 (3989720942.925624048)
            t4: EDCE4F6E.88432CA5 (3989720942.532274999)
        offset: 0000000000000000.69EFEA0080000000 (0.413817048)
         delay: 0000000000000000.0A7AC81D00000000 (0.040936000)
          mean: 00000000EDCE4F6E.ECF588A580000000 (3989720942.925621510)
         error: 0000000000000000.695F000000000000 (0.411605835)
          addr: 192.168.11.88
}
sntp_exchange {
        result: 0 (Success)
        header: 24 (li:0 vn:4 mode:4)
       stratum: 01 (1)
          poll: 00 (1)
     precision: FFFFFFEC (9.536743e-07)
         delay: 0000.0000 (0.000000000)
    dispersion: 0000.7387 (0.451278687)
           ref: 47505373 ("GPSs")
         t_ref: EDCE4F6E.F7429FCB (3989720942.965860354)
            t1: EDCE4F6E.885F394B (3989720942.532702999)
            t2: EDCE4F6E.F7429FCB (3989720942.965860354)
            t3: EDCE4F6E.F7430475 (3989720942.965866354)
            t4: EDCE4F6E.928900C5 (3989720942.572402999)
        offset: 0000000000000000.69CEB51800000000 (0.413310355)
         delay: 0000000000000000.0A2962D000000000 (0.039694000)
          mean: 00000000EDCE4F6E.F742D22000000000 (3989720942.965863228)
         error: 0000000000000000.7387000000000000 (0.451278687)
          addr: 192.168.11.88
}
sntp_exchange {
        result: 0 (Success)
        header: 24 (li:0 vn:4 mode:4)
       stratum: 01 (1)
          poll: 00 (1)
     precision: FFFFFFEC (9.536743e-07)
         delay: 0000.0000 (0.000000000)
    dispersion: 0000.7DF0 (0.491943359)
           ref: 47505373 ("GPSs")
         t_ref: EDCE4F6E.01911558 (3989720942.006120046)
            t1: EDCE4F6E.92B4FA48 (3989720942.573073999)
            t2: EDCE4F6E.01911558 (3989720942.006120046)
            t3: EDCE4F6E.01917A02 (3989720942.006126046)
            t4: EDCE4F6E.9D425F20 (3989720942.614293999)
        offset: FFFFFFFFFFFFFFFF.69959AF900000000 (-0.587560953)
         delay: 0000000000000000.0A8D002E00000000 (0.041214000)
          mean: 00000000EDCE4F6E.019147AD00000000 (3989720942.006123066)
         error: 0000000000000000.7DF0000000000000 (0.491943359)
          addr: 192.168.11.88
}
sntp_exchange {
        result: 0 (Success)
        header: 24 (li:0 vn:4 mode:4)
       stratum: 01 (1)
          poll: 00 (1)
     precision: FFFFFFEC (9.536743e-07)
         delay: 0000.0000 (0.000000000)
    dispersion: 0000.8818 (0.531616211)
           ref: 47505373 ("GPSs")
         t_ref: EDCE4F6E.0BDEAA52 (3989720942.046366353)
            t1: EDCE4F6E.9D5A187A (3989720942.614655999)
            t2: EDCE4F6E.0BDEAA52 (3989720942.046366353)
            t3: EDCE4F6E.0BDEED6E (3989720942.046370353)
            t4: EDCE4F6E.A723FEE2 (3989720942.652892999)
        offset: FFFFFFFFFFFFFFFF.699FC03200000000 (-0.587406147)
         delay: 0000000000000000.09C9A34C00000000 (0.038233000)
          mean: 00000000EDCE4F6E.0BDECBE000000000 (3989720942.046368122)
         error: 0000000000000000.8818000000000000 (0.531616211)
          addr: 192.168.11.88
}
selected:
sntp_exchange {
        result: 0 (Success)
        header: 24 (li:0 vn:4 mode:4)
       stratum: 01 (1)
          poll: 00 (1)
     precision: FFFFFFEC (9.536743e-07)
         delay: 0000.0000 (0.000000000)
    dispersion: 0000.5F37 (0.371932983)
           ref: 47505373 ("GPSs")
         t_ref: EDCE4F6E.E2A6DED8 (3989720942.885358741)
            t1: EDCE4F6E.7ABC0E38 (3989720942.479431999)
            t2: EDCE4F6E.E2A6DED8 (3989720942.885358741)
            t3: EDCE4F6E.E2A76510 (3989720942.885366741)
            t4: EDCE4F6E.7DB77C02 (3989720942.491080999)
        offset: 0000000000000000.666D5CD700000000 (0.400106242)
         delay: 0000000000000000.02FAE79200000000 (0.011641000)
          mean: 00000000EDCE4F6E.E2A721F400000000 (3989720942.885362625)
         error: 0000000000000000.5F37000000000000 (0.371932983)
          addr: 192.168.11.88
}
+0.400106 +/- 0.383574 192.168.11.88 192.168.11.88

stratum: 01 (1)というのが確認できる(*´ェ`)自分で作ったのだから当たり前だけど…

HPE ProLiant MicroServer Gen10 Plus v2 購入

HPのサーバーは12年前に購入したHP ProLiant ML110 Generation 6が今もGitLabやWebAppサーバーとして稼働している(*´ェ`)
それを移行しようと考えて買ってしまったのだ(*゚ェ゚*)
プロセッサーは Xeon E-2314 を選択(*´ェ`)

実はすでに一ヶ月前に届いていて、ようやく設置した(*´ェ`)

OSはRed Hat Enterprise Linux 9をインストール(*゚ェ゚*)

UPS電源を導入していたので今回は電源プラグを3ピンから2ピンに変換するやつは買わなくてもよかった(*゚ェ゚*)なぜか未開封の3ピン→2ピンに変換するやつがジャンクボックスにあったけど..🤔

一人暮らし一周年

マンションで一人暮らしを始めて一年経った(*´ェ`)

この一年間でたくさんの新しいことに触れた。

Android アプリ開発に Java
Webスクレイピングや画像処理に Python
Ruby on Rails で REST API の開発に Ruby

便利なツールもたくさん教わった(*゚ェ゚*)
Middleman
Serverspec
Gitlab の導入で SVN から Git へ移行した。

Let’s Encrypt で無料のSSL証明書を発行したり(*゚ェ゚*)

1U Fanless Server

1U Fanless Server を購入した(*´ェ`)

Wow!ファンレスなので全く音がしない(*゚ェ゚*)

CPU は Intel の Xeon E3-1220L V2 で TDP 17W の 低消費電力!

マザーボードは ASUS P8B-M

ストレージは Intel SSD 520 Series 120GB SSDSC2CW120A310

このファンレスサーバーにCentOSを入れて運用する予定(*´ェ`)

CentOS6.2でPostfix+DovecotのIPv6無効化

PostfixがデフォルトでIPv6が有効になってるので

vi /etc/postfix/main.cf
# Enable IPv4, and IPv6 if supported
#inet_protocols = all
inet_protocols = ipv4

に変更。

DovecotもデフォルトでIPv6が有効になってるので

vi /etc/dovecot/dovecot.conf
# A comma separated list of IPs or hosts where to listen in for connections. 
# "*" listens in all IPv4 interfaces, "::" listens in all IPv6 interfaces.
# If you want to specify non-default ports or anything more complex,
# edit conf.d/master.conf.
#listen = *, ::
listen = *

に変更(*´ェ`)

Apacheログを指定の日数で取り出すシェルスクリプト 2

“今日を含まない”指定した日数で取り出すか
“今日を含む”指定した日数で取り出すか指定できるようにした(*´ェ`)

-t オプションを付けると today で“今日を含む”
-y オプションを付けると yesterday で“今日を含まない”

#!/bin/bash

######################
#
# option  : -t[--today]|-y[--yesterday]
#
# version : Charlie
# author  : foloro
#
######################

#使用方法
function usage() {
	echo "使用方法 : $0 -t|-y 日数" 1>&2
}

#引数の数をチェック
if [ $# -ne 2 ]; then
	usage
	exit 1
fi

#引数のオプションをチェック
if ! [ $1 == "-t" -o $1 == "-y" -o $1 == "--today" -o $1 == "--yesterday" ]; then
	usage
	exit 1
fi

#引数の日数が数字かチェック
if [ `expr "$2" : '[[:digit:]]*'` -eq 0 ] > /dev/null ; then
	usage
	exit 1
fi

#引数の過去の日数をチェック
if [ $2 -lt 1 ]; then
	echo "日数は1以上の値で指定してください" 1>&2
	exit 1
fi

#日付を配列に格納する
DAYNUM=$2

case $1 in
  "-t" | "--today" )
	for (( i = 0; i < $DAYNUM; i++ ))
	do
		DAYS[i]=`LANG=C date -d "$i days ago" +"%d/%b/%Y"`
	done
	;;
  "-y" | "--yesterday" )
	for (( i = 1; i <= $DAYNUM; i++ ))
	do
		DAYS[i-1]=`LANG=C date -d "$i days ago" +"%d/%b/%Y"`
	done
	;;
  * )
	usage
	exit 1
	;;
esac

searchQuery=${DAYS[0]}

for (( i = 1; i < $DAYNUM; i++ ))
do
	searchQuery="$searchQuery""|""${DAYS[$i]}"
done

grep -E $searchQuery

使い方
シェルスクリプトをcutlogday.shという名前で作成して
Apacheのアクセスログがspecial-forces.jp-access_log-yyyymmddで“今日を含む”過去10日間のログが欲しい場合

cat /var/log/httpd/special-forces.jp-access_log* | ./cutlogday.sh -t 10 > matometa.log

もしこのシェルスクリプトをパイプなしで実行した場合

./cutlogday.sh -t 10

標準入力となる(*´ェ`)

Version Delta へ続く。

Apacheログを指定の日数で取り出すシェルスクリプト

Apacheのアクセスログから“今日[実行日]を含まない”指定した日数分を取り出すシェルスクリプトがあれば便利だなと思って作ってみた(*´ェ`)
というより必要だったのだ(*´ェ`)>

イメージにするとこんな感じ
Apacheのアクセスログは月別に保存されている。
cutlogday

#!/bin/bash

######################
#
# version : Alpha
# author  : foloro
#
######################

#引数の数をチェック
if [ $# -ne 3 ]; then
	echo "使用方法 : $0 過去の日数 入力ファイル 出力ファイル"
	exit 1
fi

#引数の過去の日数をチェック
if [ $1 -lt 1 ]; then
	echo "日数は1以上の値で指定してください"
	exit 1
fi

#引数の入力ファイルが存在するか
if [ -f $2 ]; then
	echo "ファイルが存在しません"
	exit 1
fi

#変数に引数の日数、入力ファイル、出力ファイルのパスを格納する
DAYNUM=$1
INPUTFILE=$2
OUTPUTFILE=$3

for (( i = 1; i <= $DAYNUM; i++ ))
do
	DAYS[i-1]=`LANG=C date -d "$i days ago" +"%d/%b/%Y"`
done

searchQuery=${DAYS[0]}

for (( i = 1; i < $DAYNUM; i++ ))
do
	searchQuery="$searchQuery""|""${DAYS[$i]}"
done

echo $searchQuery

cat $INPUTFILE | grep -E $searchQuery > $OUTPUTFILE

使い方
シェルスクリプトをcutlogday.shという名前で作成して
Apacheのアクセスログがspecial-forces.jp-access_log-yyyymmddで過去100日間のログが欲しい場合

./cutlogday.sh 100 /var/log/httpd/special-forces.jp-access_log* matometa.log

とすれば、matometa.logに指定した今日を含めない過去100日分のログが書き出されている(*´ェ`)

という風に使おうと思っていたらどうもスマートじゃない気がする(*´ェ`)
友達から“UNIXという考え方”という本を薦められて買って読んだらピンと来た∑(*゚ェ゚*)ピコン!

そして書き直したコードがこっち

#!/bin/bash

######################
#
# version : Bravo
# author  : foloro
#
######################

#引数の数をチェック
if [ $# -ne 1 ]; then
	echo "使用方法 : $0 過去の日数"
	exit 1
fi

#引数の過去の日数をチェック
if [ $1 -lt 1 ]; then
	echo "日数は1以上の値で指定してください"
	exit 1
fi

#日付を配列に格納する
DAYNUM=$1

for (( i = 1; i <= $DAYNUM; i++ ))
do
	DAYS[i-1]=`LANG=C date -d "$i days ago" +"%d/%b/%Y"`
done

searchQuery=${DAYS[0]}

for (( i = 1; i < $DAYNUM; i++ ))
do
	searchQuery="$searchQuery""|""${DAYS[$i]}"
done

grep -E $searchQuery

使い方
シェルスクリプトをcutlogday.shという名前で作成して
Apacheのアクセスログがspecial-forces.jp-access_log-yyyymmddで過去10日間のログが欲しい場合

cat /var/log/httpd/special-forces.jp-access_log* | ./cutlogday.sh 10 > matometa.log

こうゆうことなのだ∑(*゚ェ゚*)

でも過去2日間のログを取り出すだけで過去何ヶ月ものログを開いているのは無駄な気がする(*´ェ`)

Version Charlie へ続く。

MuninでHDDの使用量と空き容量を監視

MuninでHDDの使用量と空き容量を表示してみよう(*´ェ`)

まーずーは
Munin Exchange | freedisk plugin
からプラグインをダウンロード。
作者さんのサイトはこちら

ダウンロードしたプラグインを
/usr/share/munin/plugins/
ディレクトリに入れる。
実行権限を付加するのを忘れないように!d(゚ー゚*)o

df
コマンドで監視したいHDDを調べる

私が監視したいのは rootfs と home なので
ln -s /usr/share/munin/plugins/freedisk /etc/munin/plugins/freedisk_roots


ln -s /usr/share/munin/plugins/freedisk /etc/munin/plugins/freedisk_home

にした(*´ェ`)

sda1の場合は
ln -s /usr/share/munin/plugins/freedisk /etc/munin/plugins/freedisk_sda1

そしてmunin-node を再起動
/etc/rc.d/init.d/munin-node restart

5分ほど待った後・・・

ハイ、表示された(*゚ェ゚*)
munin-freedisk

んがしかし、このままでは空き容量のラインがディスク容量の裏に描画されており見難いというか見えないなので表にだしてやる(*´ェ`)

ついでに使用量も表示するようにプラグインを改変する(*´ェ`)
改変したコードを公開していいか分からないので公開しません <(_ _)>

うん見やすい(*゚ェ゚*)
munin-freedisk

MuninでHDDの温度を監視

MuninでHDDの温度を表示してみよう(*´ェ`)

まーずーは
yum -y install hddtemp
でインストールする
それから
vi /etc/sysconfig/hddtemp
hddtempの設定ファイルを開いて
HDDTEMP_OPTIONS="-l 127.0.0.1 /dev/sda"
という風に /dev/sda を追記する

そしてhddtempを実行する
hddtemp /dev/sda
そうすると
/dev/sda: GB0160EAPRR: 34°C
と表示された(*´ェ`)

そしてそして Munin のプラグインへのリンクを作成してln -s /usr/share/munin/plugins/hddtemp /etc/munin/plugins/hddtemp

プラグインの設定をする
vi /etc/munin/plugin-conf.d/munin-node
設定ファイルを開いたら
[hddtemp]
user root
env.drives sda

を追記する
どのように設定するかはプラグインファイルに書いてある(*´ェ`)

最後にmunin-node を再起動
/etc/rc.d/init.d/munin-node restart

5分ほど待った後・・・

ハイ、表示された(*゚ェ゚*)

MuninでCPUの温度を監視

MuninでCPUの温度を表示してみよう(*´ェ`)

まーずーは
yum -y install lm_sensors
でインストール

sensors-detect
と入力して実行。

sensors
と入力して実行すると

coretemp-isa-0000
Adapter: ISA adapter
Core 0: +32.0°C (high = +83.0°C, crit = +99.0°C)
coretemp-isa-0001
Adapter: ISA adapter
Core 1: +27.0°C (high = +83.0°C, crit = +99.0°C)
coretemp-isa-0002
Adapter: ISA adapter
Core 2: +31.0°C (high = +83.0°C, crit = +99.0°C)
coretemp-isa-0003
Adapter: ISA adapter
Core 3: +27.0°C (high = +83.0°C, crit = +99.0°C)

と表示された(*´ェ`)

後はMuninの設定をする

ln -s /usr/share/munin/plugins/sensors_ /etc/munin/plugins/sensors_temp

プラグインの設定
vi /etc/munin/plugin-conf.d/munin-node
を開いて
[sensors_*]
user root

と追記する。
そして最後に munin-node を再起動
/etc/rc.d/init.d/munin-node restart

5分ほど待った後・・・

ハイ、表示された(*゚ェ゚*)