#author("2017-12-11T22:42:23+09:00","default:nowsky","nowsky")
*Raspbian [#m2988d58]
-[[Raspbian:+https://www.raspberrypi.org/downloads/raspbian/]]

Raspberry Pi用としてメンテナンスされているDebian系ディストリビューションの一つ。
Debian系なのでAPT(apt-get)を利用してパッケージをインストールする事が出来る。
初期設定を簡素化する為にRaspbian特有のシェルスクリプトが準備されており、
Linux初心者でも楽に最低限のOS設定をする事が出来るようになっている。

~
*イメージバックアップ [#bd61a0cf]
Raspberry PiではSDカードにOSをインストールする事を前提としている為、
ddコマンドによるイメージバックアップ・リストアが簡単に実行できるが、
小さい容量のSDカードへリストアすると、SDカード容量不足でddが欠落してしまう。
 
よって、Raspberry Pi(Raspbian)では専用のOSコピー(バックアップ)コマンドが用意されており、
こちらを利用する方が正確にコピーを取得する事が出来る。
 
#region(&color(#ff0000){rpi-clone};)
-&font(b){参考サイト};
[[billw2/rpi-clone:+https://github.com/billw2/rpi-clone]]
[[Raspberry PiでIoTなシステム開発:+http://www.homu.net/raspberry-pi%E3%81%A7iot%E3%81%AA%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E9%96%8B%E7%99%BA%EF%BC%9Asd%E3%82%AB%E3%83%BC%E3%83%89%E3%81%AE%E3%83%90%E3%83%83%E3%82%AF%E3%82%A2%E3%83%83%E3%83%97%E3%81%AFrpi/]]
 
-&font(b){コマンド実行};
バックアップ取得前に、コピー先SDカードをRaspberry Piに接続しておく。
今回はSDカードが、&color(#ff0000){"/dev/sda"};に接続されているとする。
 # git clone https://github.com/billw2/rpi-clone
 # ./rpi-clone sda -f
 ---
 Do you want to initialize the destination disk /dev/sda? (yes/no): "yes"
 You may enter a label for the destination rootfs /dev/sda2: [Enter]
 Final check, is it Ok to proceed with the clone (yes/no)?: "yes"
 Starting the filesystem rsync to sda
 (This may take several minutes)...
 ---
 Hit Enter when ready to unmount the /dev/sda partitions... [Enter]
 unmounting /mnt/clone/boot
 unmounting /mnt/clone
#endregion

~
*Crystal Signal Pi [#l6835d36]
Raspberry Piでパトライト(回転灯)を実装する追加モジュール。
(株)インフィニットループが開発・販売をしており、[[amazon:+https://www.amazon.co.jp/dp/B06XW4C8YD]]で購入出来る。
APIも用意されている為、監視システムからパトライト代わりに光らせる事も可能。
~

&size(16){&font(b){1. インストール};};
詳細は[[オフィシャルページ:+http://crystal-signal.com/]]のマニュアル参照。
インストール先やapacheのスクリプト設定は固定となるが、インストール用スクリプトが用意されている。
インストールにはroot権限が必要なのでrootユーザか、sudoでスクリプトを実行する。
スクリプト実行時はシェルをbashにする必要があるので、bash以外を利用している人は注意する。
 # curl -O https://raw.githubusercontent.com/infiniteloop-inc/crystal-signal/master/install.sh
 # ./install.sh
~

&size(16){&font(b){2. アップデート};};
Crystal Signal Piのミドルウェアアップデートもスクリプトから実行する。
OSアップデートと同時にCrystal Signal Piのミドルウェアもアップデートする場合、
下記のオプションを[fullupdate]に変更して実行する
 # curl -O https://raw.githubusercontent.com/infiniteloop-inc/crystal-signal/master/install.sh
 # ./install.sh update
~

&size(16){&font(b){3. スクリプト修正};};
apacheのListenを[0.0.0.0]からIPアドレス指定に変更している場合、
スクリプトからAPIを叩けなくなり、結果としてCrystal Signal Piのアラート停止ボタンも使えなくなる。
停止ボタンを使えるようにするには、下記コマンドを実行してスクリプトを修正する。
 ・apacheのListenを192.168.0.1にしている場合
 ---
 # cd /var/lib/crystal-signal/scripts/
 # mv Ack.sh           Ack.sh-
 # mv AckNewestOnly.sh AckNewestOnly.sh-
 # cat Ack.sh-           | sed -e 's/localhost/192.168.0.1/g' > Ack.sh
 # cat AckNewestOnly.sh- | sed -e 's/localhost/192.168.0.1/g' > AckNewestOnly.sh
 # chmod 755 Ack.sh AckNewestOnly.sh
 # rm Ack.sh- AckNewestOnly.sh-
~

&size(16){&font(b){4. APIスクリプト};};
Crystal Signal PiはAPIを備えているので、スクリプトを用意すればパトライト代わりに光らせる事が出来る。
参考までに作成したスクリプトを掲載。
バーストした時にLEDへ負荷が掛からないように、一度APIを叩くと1分間はAPIを叩けないようにしてみた。
~
#region(&color(#ff0000){スクリプト [zabbix_csp.pl]};)
 #!/usr/bin/perl
 
 use strict;
 use warnings;
 use utf8;
 
 
 
 ###
 ### Const variable
 ###
 my $OPT_DEBUG   = 0;
 my $OPT_FORCE   = 0;
 my $OPT_LEVEL   = 0;
 my $OPT_HELP    = 0;
 
 my @LINE;
 my $DATE        = time;
 my $DELTA       = 0;
 my $LOCK        = "/tmp/zabbix_csp";
 my $INTERVAL    = 60;
 
 my $BIN_CURL    = "/usr/bin/curl";
 my $OPT_CURL    = "-o /dev/null --silent";
 
 my $PROT    = "http://";
 my $FQDN    = "192.168.0.1";
 my $TYPE    = 0;
 my $API     = 0;
 
 my %ALERT;
 $ALERT{'clear'}         = '?ack=1&info=CLEAR';
 $ALERT{'information'}   = '?color=000,128,000&mode=1&repeat=5&period=1000&info=INFORMATION';
 $ALERT{'warning'}       = '?color=064,064,000&mode=1&repeat=5&period=1000&info=WARNING';
 $ALERT{'average'}       = '?color=064,032,000&mode=1&repeat=5&period=1000&info=AVERAGE';
 $ALERT{'high'}          = '?color=064,000,000&mode=1&repeat=5&period=1000&info=HIGH';
 $ALERT{'disaster'}      = '?color=128,000,000&mode=1&repeat=5&period=1000&info=DISASTER';
 
 
 
 ###
 ### Main program
 ###
 ## Set of execution options
 ##
 foreach my $tmp_OPT(@ARGV){
     # Default value
     if(($tmp_OPT eq '-d')||($tmp_OPT eq '--debug')){ $OPT_DEBUG++; };
     if(($tmp_OPT eq '-f')||($tmp_OPT eq '--force')){ $OPT_FORCE++; };
     if(($tmp_OPT eq '-h')||($tmp_OPT eq '--help' )){ $OPT_HELP++;  };
 
     # Alert type
     if(($tmp_OPT =~ '^-l=')||($tmp_OPT =~ '^--level=')){
         $OPT_LEVEL++;
         $tmp_OPT =~ s/^-l\=//;
         $tmp_OPT =~ s/^--level=\=//;
         $TYPE = lc($tmp_OPT);
     }
 }
 if($OPT_DEBUG){
     print "VALUE::OPT_DEBUG $OPT_DEBUG\n";
     print "VALUE::OPT_FORCE $OPT_FORCE\n";
     print "VALUE::OPT_LEVEL $OPT_LEVEL\n";
     print "VALUE::OPT_HELP  $OPT_HELP\n";
     print "-----\n";
 }
 
 
 ## Print script help
 ##
 if($OPT_HELP){
     print "usage: zabbix_csp [-l=\"AlertType\"] [-d DebugMode]\n";
     print "                  [-f ForceExecute] [-h OutputHelp]\n";
     print "examp: zabbix_csp -l=warning\n";
     print "       zabbix_csp -l=warning -d\n";
     print "       zabbix_csp -l=warning -f\n";
     exit 0;
 }
 
 
 ## Check last log
 ##
 # Read log
 if(-f $LOCK){
     open(READ, "$LOCK");
     foreach(<READ>){
         @LINE = split(/,/, $_);
     }
     close(READ);
 
     # Get of delta
     $DELTA = $DATE-$LINE[0];
     if($OPT_DEBUG){
         print "VALUE::TYPE      $TYPE\n";
         print "VALUE::LINE(OLD) $LINE[0]\n";
         print "VALUE::DATE(NEW) $DATE\n";
         print "VALUE::INTERVAL  $INTERVAL\n";
         print "VALUE::DELTA     $DELTA\n";
         print "-----\n";
     }
     if(!$OPT_FORCE&&($DELTA<$INTERVAL)){
         exit 0;
     }
 }
 
 # Write log
 open(WRITE, "> $LOCK");
 print WRITE "$DATE,$TYPE";
 close(WRITE);
 
 
 ## Running the API
 ##
 if(($OPT_LEVEL)&&(exists($ALERT{$TYPE}))){
     $API = $PROT.$FQDN."/ctrl/".$ALERT{$TYPE};
     if($OPT_DEBUG){
         print "VALUE::API       $API\n";
         print "-----\n";
     }else{
         system("$BIN_CURL $OPT_CURL \"$API\"");
     }
 }else{
     print "ERROR:: Hash key does not exist.\n";
     exit 1;
 }
#endregion
~
#region(&color(#ff0000){実行方法};)
 ・レベル4(重度の障害)でスクリプト実行
 ---
 # zabbix_csp.pl -l=HIGH
 
 ・LED消灯(停止)の実行
 ---
 # zabbix_csp.pl -l=CLEAR
 
 ・1分間インターバルを無視して強制実行
 ---
 # zabbix_csp.pl -l=HIGH -f
 
 ・変数表示などのデバッグモード
 ---
 # zabbix_csp.pl -l=HIGH -d
#endregion