LCD制御スクリプト

KURO-BOX/T4には、TeraStationと同様のLCDディスプレイが付いています。
標準でのインストールでは機能しないので、これを機能するようにスクリプトを作成しました。
私が実際に使っているスクリプトファイルを、一番下でダウンロード出来ます。

LCD表示スクリプト(LANリンク速度、ディスク容量、ホスト名、IP、日付、ファン回転数、ケース内温度)

#!/bin/sh

PATH=$PATH:/usr/local/sbin
export PATH

# lcd back light bright {0 | 10 | 20 | 30 | 40 | 50 | 60 | 70 | 80 | 90 | 100}
BACK_LIGHT_BRIGHT="70"

miconapl -a lcd_set_bright $BACK_LIGHT_BRIGHT

hostname=`cat /etc/hostname`
miconapl -a lcd_set_hostname $hostname
miconapl -a lcd_disp_hostname

miconapl -a lcd_disp_fanspeed_on
miconapl -a lcd_disp_temp_on

#私の場合は固定IPなので、ここにリンク速度のスクリプトへのパスを書いています。(IP取得も同様に1回しか呼んでいません)

#ここにディスク容量取得スクリプトのパス

#ここにディスクRAID設定スクリプトのパス

miconapl -a lcd_set_dispitem linkspeed hostname ipaddress date buffer0 buffer1

miconapl -a lcd_changemode_auto

idx=1
while :
do
sleep 60

dispdatetime=`date '+%y %m %d %k %M %S'`
miconapl -a lcd_set_date $dispdatetime

idx=`expr $idx + 1`
if [ $idx -ge 10 ]; then
idx=1;
#ここにディスク容量取得スクリプトのパス

#ここにディスクRAID設定スクリプトのパス
fi
done

NICリンクアップ時スクリプト(DHCPなどでIPが変更になる人は/etc/network/if-up.dなどの下にスクリプトとして書いてください)

#!/bin/sh

PATH=$PATH:/usr/local/sbin
export LANG=C
export PATH

ipaddress=`ifconfig | grep "inet addr" | awk '{print $2}' | awk -F: 'NR==1 {print $2}'`

miconapl -a lcd_set_ipaddress $ipaddress

リンク速度設定スクリプト

#!/bin/bash

PATH=$PATH:/usr/local/sbin
export PATH

eth_dev="eth0"

link_nolink="nolink"
link_10h="10h"
link_10f="10f"
link_100h="100h"
link_100f="100f"
link_1000="1000"

mii_result=`mii-tool $eth_dev`

case $mii_result in
*"10baseT-HD"*) set_link_speed=$link_10h;;
*"10baseT-FD"*) set_link_speed=$link_10f;;
*"10baseT-HD"*) set_link_speed=$link_100h;;
*"10baseT-HD"*) set_link_speed=$link_100f;;
*"1000baseT-FD"*) set_link_speed=$link_1000;;
*) set_link_speed=$link_nolink
esac

miconapl -a lcd_set_linkspeed $set_link_speed

exit

※リンク速度を表示する場合は
miconapl -a lcd_set_dispitem にlinkspeedを追加してください。
(リンク速度を設定することにより、本体のLinkActランプが自動的に点灯、点滅します)

ディスク容量セットスクリプト

#!/bin/bash

PATH=$PATH:/usr/local/sbin
export PATH

device1="/dev/sda"
device2="/dev/sdb"
device3="/dev/sdc"
device4="/dev/sdd"

d1=`df -m | grep $device1 | awk 'BEGIN {use=0; total=0} // {use+=$3; total+=$2} END{printf "%d", use/total*100}'`
d2=`df -m | grep $device2 | awk 'BEGIN {use=0; total=0} // {use+=$3; total+=$2} END{printf "%d", use/total*100}'`
d3=`df -m | grep $device3 | awk 'BEGIN {use=0; total=0} // {use+=$3; total+=$2} END{printf "%d", use/total*100}'`
d4=`df -m | grep $device4 | awk 'BEGIN {use=0; total=0} // {use+=$3; total+=$2} END{printf "%d", use/total*100}'`

if [ $d1 -lt 0 ]; then
d1=0;
fi
if [ $d2 -lt 0 ]; then
d2=0;
fi
if [ $d3 -lt 0 ]; then
d3=0;
fi
if [ $d4 -lt 0 ]; then
d4=0;
fi

miconapl -a lcd_set_disk_capacity $d1 $d2 $d3 $d4

exit

※ディスク容量を表示する場合は
miconapl -a lcd_set_dispitem にhostnameを追加してください。
(T4のマイコン仕様書ではLinkSpeedと同じバッファを使ってるように読み取れましたが、miconaplではhostnameで表示されました)
ディスク容量セットスクリプトを定期的に動かすことで容量を再セットしてください。
また、ディスクの容量はマイコン仕様書では16進でセットしますが
miconaplが内部で変換しているようで0~100の値をセットで問題ありません。
(100まで行かなくても、95でFull表示になりました)

尚、raidを組んでいる場合はsdaやsdbの文字では正常に値が取得できませんので、md0などraidのデバイスとして登録してある文字f列をセットしてあげてください。
(一つのディスクに複数のraid用タイプfdを作成し,raidを複数組んでる場合は、このスクリプトは使用できません)
私の場合は、Disk2、Disk3、Disk3の3台をRaid5で運用していますので
device2=”/dev/md0″とし
d3=とd4=をコメントにし
miconapl -a lcd_set_disk_capacity $d1 $d2 $d2 $d2
としています。

電源ボタン監視スクリプト

#!/bin/sh

GET_SW="/usr/local/sbin/miconapl -a int_get_switch_status"
BEEP="/usr/local/sbin/miconapl -a bz_on button"
BEEP2="/usr/local/sbin/miconapl -a bz_on boot"
LCD_OFF="/usr/local/sbin/miconapl -a lcd_changemode_button"
LCD_FAN_OFF="/usr/local/sbin/miconapl -a lcd_disp_fanspeed_off"
LCD_TEMP_OFF="/usr/local/sbin/miconapl -a lcd_disp_temp_off"
LCD_BUF2_ON="/usr/local/sbin/miconapl -a lcd_disp_buffer2"
LCD_BRIGHT_ZERO="/usr/local/sbin/miconapl -a lcd_set_bright 0"
COUNT=4

while :
do
SW=`$GET_SW |grep "int=" |sed -e "s/int=//"`
case ${SW} in
power_sw)
COUNT=`expr ${COUNT} - 1`
if [ ${COUNT} -eq 0 ]
then
${BEEP2}
${LCD_OFF}
${LCD_FAN_OFF}
${LCD_TEMP_OFF}
${LCD_BUF2_ON}
${LCD_BRIGHT_ZERO}
/sbin/shutdown -hP now
else
${BEEP}
fi
sleep 1
;;
init_sw_front)
;;
*)
COUNT=4
sleep 2
;;
esac
done

2009/11/13 輝度制御スクリプトの追加
輝度制御設定ファイル(/etc/lcd_control.confで保存してください)

###################################################################
#
# LCD&LED輝度コントロール設定ファイル
#
###################################################################

# LED輝度通常時 {0 | 10 | 20 | 30 | 40 | 50 | 60 | 70 | 80 | 90 | 100}
NORMAL_LED=100

# LCD輝度通常時 {0 | 10 | 20 | 30 | 40 | 50 | 60 | 70 | 80 | 90 | 100}
NORMAL_LCD=70

# 時刻連動使用 {true | false}
TIME_LINKED=true

# LED輝度減光時 {0 | 10 | 20 | 30 | 40 | 50 | 60 | 70 | 80 | 90 | 100}
DOWN_LED=50

# LCD輝度減光時 {0 | 10 | 20 | 30 | 40 | 50 | 60 | 70 | 80 | 90 | 100}
DOWN_LCD=50

# LED輝度通常時刻 {0 - 23} step 1
NORMAL_START_TIME=7

# LED輝度減光時刻 {0 - 23} step 1
DOWN_START_TIME=23

輝度制御スクリプト

#!/bin/sh

PATH=$PATH:/usr/local/sbin
export PATH
# 設定ファイル
CONF_FILE=/etc/lcd_control.conf

if [[ -f "$CONF_FILE" ]]
then
. $CONF_FILE
else
echo "LCD輝度制御設定ファイル $CONF_FILE が見つかりません。"
exit 1
fi

if [ $TIME_LINKED = 'false' ]; then
exit
fi

while :
do
sleep 60

now_lcd=`miconapl -a lcd_set_bright|grep lcd_bright=|sed -n -e "s/.*=//p"`
now_led=`miconapl -a led_set_bright|grep led_bright=|sed -n -e "s/.*=//p"`

temphour=`date '+%k'`

if [ $NORMAL_START_TIME -eq $DOWN_START_TIME ]; then
# 通常時と減光時の時刻が同じ場合は、常に通常扱い
mode='normal'
elif [ $NORMAL_START_TIME -lt $DOWN_START_TIME ]; then
# 通常時が減光時より小さい場合
if [ $NORMAL_START_TIME -le $temphour -a $DOWN_START_TIME -gt $temphour ]; then
# 通常時の範囲
mode='normal'
else
# 減光時の範囲
mode='down'
fi
else
# 減光時が通常時より小さい場合
if [ $DOWN_START_TIME -le $temphour -a $NORMAL_START_TIME -gt $temphour ]; then
# 減光時の範囲
mode='down'
else
# 通常時の範囲
mode='normal'
fi
fi

if [ $mode = 'normal' ]; then
# 通常時
lcd_set_num=$NORMAL_LCD
led_set_num=$NORMAL_LED
else
# 減光時
lcd_set_num=$DOWN_LCD
led_set_num=$DOWN_LED
fi

# 現在の設定と違う場合は設定変更
if [ $now_lcd -ne $lcd_set_num ]; then
miconapl -a lcd_set_bright $lcd_set_num
fi
if [ $now_led -ne $led_set_num ]; then
miconapl -a led_set_bright $led_set_num
fi
done

2009/11/13 RAID設定スクリプトの追加
※¥は全角で書いていますので、半角に書き換えてください。(blognの制約上)
表示形式は以下の通りです。
LCD下段はRAIDの状態で表示が変わります。
RAIDなし(/proc/partitionsにmdの文字が見つからない場合)
上段:Operation MODE
下段:Normal
RAID0~6
上段:HD 2-3-4
下段:RAID○ [UUUU]
上段はmd○のArrayに使用されているドライブ番号が表示されます。
例:1,2,3,4ドライブでRAID利用=1-2-3-4
下段のUUUUの部分は/proc/mdstatで取得出来るディスクのディスクの動作状況です。
以下はエラー系です。
/proc/mdstatからRAIDの状態を取得出来なかった場合:RAID GET ERROR
/proc/mdstatからディスクの動作状況を取得出来なかった場合:RAID○

#!/bin/sh

PATH=$PATH:/usr/local/sbin
export PATH

#md?のパーティションがあるかチェック
first_md_char=`cat /proc/partitions|grep md|sed -n -e "s/.*md//p"`

raid_mode="Operation MODE  "
if [ $first_md_char = "" ]; then
#md?が見つからない(ノーマルモード)
raid_mode="${raid_mode}Normal          "
else
#md?が見つかった場合
proc_mdstat=`cat /proc/mdstat`

#RAIDのドライブ構成を調べる
raid_mode="HD "
raid_info=""
idx=0
while [ $idx -ne 4 ]
do
drive=`echo "$proc_mdstat"|grep ¥[${idx}]|sed -n -e "s/.¥[${idx}].*//p"|sed -n -e "s/.*sd//p"`
case $drive in
a)drive="1";;
b)drive="2";;
c)drive="3";;
d)drive="4";;
*)drive="";;
esac

#ドライブ構成文字の作成
if [ ! $drive = "" ]; then
if [ ! $raid_info = "" ]; then
raid_info="${raid_info}-${drive}"
else
raid_info="${drive}"
fi
fi
idx=`expr $idx + 1`
done

#RAID表示文字(上段)の作成
raid_mode="${raid_mode}${raid_info}"
#16バイトになるまで空白で埋める
idx=`expr length "$raid_mode"`
while [ $idx -lt 16 ]
do
raid_mode="${raid_mode} "
idx=`expr $idx + 1`
done

#RAIDモード、ドライブ動作状況の取得
raid_mode_num=`echo "$proc_mdstat"|grep md${first_md_char}|sed -n -e "s/ sd.*//p"|sed -n -e"s/.*raid//p"`
if [ $raid_mode_num = "" ]; then
#情報取得エラー
raid_mode="${raid_mode}RAID GET ERROR"
else
#モード取得
raid_state=`echo "$proc_mdstat"|grep '] ¥['|tr -d '¥012'|sed -n -e"s/.*] //p"`
#動作状況取得
raid_mode="${raid_mode}RAID${raid_mode_num} $raid_state"
fi
fi
#miconに文字列をセット
miconapl -a lcd_set_raidmode32 "$raid_mode"

※RAID設定を表示する場合は
miconapl -a lcd_set_dispitem にraidmodeを追加してください。
※表示するRIADの情報は/proc/partitionsにて最初に取得出来るmd○のArrayとなります。

※ケース内温度によるファン回転数制御スクリプトは、ネットなどで転がっている物が使えると思いますので省略します。

2009/11/16 追記
以下は私が使っているスクリプトです。
環境に合わせて書き換えてください。
lcd_scripts.tar.bz2
/usr/loca/sbin に解凍して実行権限を与えてください。

lcd_scripts_conf.tar.bz2
このファイルはスクリプトの設定ファイルになります。
/etc に解凍して、設定を行ってください。

またこれらのスクリプトを実行するために/etc/rc.local に以下の記述を行い、起動時に実行しています。

# init LCD display
if [ -x /usr/local/sbin/Keventd ] ; then
/usr/local/sbin/Keventd &
fi

if [ -x /usr/local/sbin/Fand ] ; then
/usr/local/sbin/Fand &
fi

if [ -x /usr/local/sbin/Displayd ] ; then
/usr/local/sbin/Displayd &
fi

if [ -x /usr/local/sbin/lcd_control.sh ] ; then
/usr/local/sbin/lcd_control.sh &
fi

「LCD制御スクリプト」への5件のフィードバック

  1. 初めまして、大変お世話になっております。

    最近KURO-NAS-T4でいろいろ調べながら設定してるのですが。
    あまり詳しくないのでご質問があります。

    このスクリプトを使わせていただいておりますがディスプレー表示はうまく動いてるようなのですが電源ボタンがうまく使えない状態です。

    TERATERMで起動時に下記のようなエラー?が表示するのですがどこが悪いのかわかりません。
    cat: /proc/mdstat: No such file or directory
    [: 64: =: unexpected operator

    アドバイスいただけると幸いです。

  2. フランキーさん

    はじめまして。

    まず電源スクリプト単体を手動で起動したらどうなりますか?

    /usr/local/sbin/Keventd

    もし、起動するのなら、このファイルに実行権限は付与されていますか?
    (システムが起動出来る権限があるか?)

    ちなみにcat /proc/mdstatはraid関連のコマンドなので、エラー自体はディスク関連のスクリプトで出てると思われます。

  3. 管理人様

    ご回答いただきましてありがとうございます。

    せっかく返信頂いたにもかかわらず返信遅くなり誠にもうしわけございません。

    おっしゃるように単独でコマンドを起動していったらやはりicd_control.shとt4disk_raid.shでエラーが帰ってきます。実行権を755に変えてみても状況変わらずです・・・

    そのままrc.iocalを書き換えて再起動すると下記のエラーが出ます。

    .
    Starting BUFFALO application
    /usr/local/sbin/lcd_control.sh: 14: [[: not found
    LCD輝度制御設定ファイル /etc/lcd_control.conf が見つかりません。

    -----------------------------------------------------------

    しばらくすると定期的にまた
    tarting BUFFALO application
    /usr/local/sbin/lcd_control.sh: 14: [[: not found
    LCD輝度制御設定ファイル /etc/lcd_control.conf が見つかりません。

    が続く次第です。

    素人で申し訳ありませんがご指導お願いいたします。

  4. 基本的にkuro-box自体がRAIDを意識した製品なので、RAID前提でしかスクリプトを作成しておりません。
    なので、RAIDが入っていない場合は、スクリプトを書き換える必要があると思います。
    (もしくは、どこかから/proc/mdstatを拾ってきて置いておけば、RAIDがあると勘違いさせることは出来ます)

    また、電源のスクリプトはRAIDとは関係ありませんので、こちらは単独で動作させることは可能だと思います。

    あと、出ているエラーは/etc/lcd_control.confがないためだと思いますが
    lcd_scripts_conf.tar.bz2をDLして/etcで解答し、/etc/lcd_control.confが存在することを確認してください。

コメントを残す

メールアドレスが公開されることはありません。