• 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分ほど待った後・・・

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