Raspberry Pi Zero 2 Wにcactiサーバになってもらいます。
ラズパイ02Wを買えたのでcacti鯖として初期設定(cacti前まで)
cacti前までにした設定は上記。
インストール
apt install cacti cacti-spine
apache2とか沢山(250MBくらい)が一緒にインストールされる。
インストールされたもののバージョンなど適当に抽出
http://deb.debian.org/debian bullseye/main arm64 apache2 arm64 2.4.53-1~deb11u1 [273 kB]
http://deb.debian.org/debian bullseye/main arm64 mysql-common all 5.8+1.0.7 [7,464 B]
http://deb.debian.org/debian bullseye/main arm64 mariadb-common all 1:10.5.15-0+deb11u1 [36.7 kB]
http://deb.debian.org/debian bullseye/main arm64 rrdtool arm64 1.7.2-3+b7 [480 kB]
http://deb.debian.org/debian bullseye/main arm64 snmp arm64 5.9+dfsg-3+b1 [170 kB]
http://deb.debian.org/debian bullseye/main arm64 cacti all 1.2.16+ds1-2 [15.9 MB]
cactiの設定画面もいくつか出てくる。
ウェブサーバーの選択: Apache2
dbconfig-commonでデータベース作るか: Yes
そのパスワード: admin でEnter。 (ログインの初期パスになる。空白はランダム生成らしい)
cronの設定
nano /etc/cron.d/cacti
# /5を削除(毎分pollする)、" | if [f /usr/bin/ts ]"以降を削除 (poller-error.logへの出力をやめる)
* * * * * www-data php /usr/share/cacti/site/poller.php 2>&1 >/dev/null
cactiのエキスポート用ディレクトリを作成しておく
mkdir /var/www/html/cacti_static
chmod 777 /var/www/html/cacti_static
初期パスワードをadminリセット (apt install時にadminで作ってなかった場合)
mysql -u root -p
use cacti;
update user_auth set password=md5('admin') where username='admin';
quit;
Graph Exportプラグイン導入 (1.2では機能が削除されているため)
cd /usr/share/cacti/site/plugins/
wget https://github.com/Cacti/plugin_gexport/archive/refs/tags/v2.0.tar.gz #GitHubに最新があればそれを。多分
tar xvzf v2.0.tar.gz
mv plugin_gexport-2.0 gexport
rm v2.0.tar.gz
参考
apache2の設定、大体はcactiのついで
宅内NW専用(しかも二重ルータ内)なのでhttp。wifi(一応WPA2)なのが気がかりだけど。インターネットに公開しないしhttpsめんどいので放置。
初期設定
cd /etc/apache2/mods-enabled/
# a2enmod proxy #リバースプロキシ用 使わないなら不要
# a2enmod proxy_http #リバースプロキシ用 使わないなら不要
a2enmod headers #bmpのブラウザキャッシュをオフにさせるため
a2dismod reqtimeout #access.logに408のログが溜まるので無効化(SetEnvIfのhostが効かない?)。
#"RequestReadTimeout header=0 body=0"と同値らしい
nano /etc/apache2/apache2.conf
<directory var="" www="">
# AllowOverride None #コメントアウト htaccessを利用する設定
AllowOverride All
</directory>
ServerTokens ProductOnly #apacheのバージョン情報を表示しない (末尾に書いた方がいい)
特定IPやinternal dummy connectionのアクセスログを残さない (SDカード延命)
nano /etc/apache2/sites-enabled/000-default.conf
SetEnvIf User-Agent "internal dummy connection" nolog
SetEnvIf Remote_Addr "192.168.あ.ア" nolog
SetEnvIf Remote_Addr "192.168.あ.イ" nolog
SetEnvIf Remote_Addr "192.168.あ.ウ" nolog
SetEnvIf Remote_Addr "192.168.あ.エ" nolog
SetEnvIf Remote_Addr "192.168.あ.オ" nolog
CustomLog ${APACHE_LOG_DIR}/access.log combined env=!nolog #最後にenv=!nologを追記する
TvRock用リバースプロキシ (cacti無関係、NW外からアクセスしないなら不要、使ってない)
# nano proxy.conf
# ProxyRequests Off
# ProxyPass /tvrock/ http://192.168.あ.ア:8969/nobody/
# ProxyPassReverse /tvrock/ http://192.168.あ.ア:8969/nobody/
インデックス表示用
nano autoindex.conf
IndexOptions ほげほげ SuppressDescription FoldersFirst
#"SuppressDescription"と"FoldersFirst"を末尾追記
IndexHeadInsert "<meta name=\"viewport\" content=\"width=device-width,initial-scale=0.5\">"
#自分用サイトのスマホ表示用
主にbmpのブラウザキャッシュ対策
nano /var/www/html/.htaccess
AddType image/bmp bmp #bmpのMIME-Typeを修正。image/bmpでないと画像として扱われない?@泥
Options -Indexes #rootはIndexオフ
<filesmatch "\.bmp$"=""> #bmpファイルのブラウザキャッシュをオフにさせる
FileETag None
Header unset ETag
Header add Pragma "no-cache"
Header set Cache-Control no-cache
</filesmatch>
nano /var/www/html/ほげ/.htaccess
Options Indexes #ほげ/はIndexオン
systemctl restart apache2
CIFSマウント
crontab -e
@reboot sleep 20;mount -t cifs -o guest,username=guest,ro //192.168.あ.ア/ふが /var/www/html/ほげ/ふが/
@reboot sleep 20;mount -t cifs -o guest,username=guest,ro //192.168.あ.ア/ぴよ /opt/ups/datalog/
@reboot sleep 20;mount -t cifs -o username=asusguest,password=asusguest,vers=2.0 //192.168.あ.1/asus-script /opt/ふにゃ/
mkdir /var/www/html/ほげ/ふが/ #個人的にリスト化したいフォルダのマウント (win側でReadOnly共有)
mkdir /opt/ups/
mkdir /opt/ups/datalog/ #windowsに繋げたBY50Sのfile0.csv,file1.csvがあるフォルダのマウント (win側でReadOnly共有)
mkdir /opt/ふにゃ/ #Asusルータにさせてるarping,pingのフォルダのマウント
参考
cactiの設定 (ブラウザから)
コマンドを用いたグラフを新規に作る手順は大体、
- Presets > Data Profiles (データ収集周期,保持期間)
- Data Collection > Data Input Methods (データ入力用コマンド)
- Templates > Data Source (1と2を使ってデータ項目を設定する)
- Templates > Graph (3を使ってグラフの見た目を設定する、グラフ作成後も変えられる)
- Create > New Devices (デバイス追加)
- Create > New Graphs (グラフを実際に作成)
1分毎に更新する6時間グラフを基本にする。
データの保持期間が短すぎるので大幅に長くする(1分更新は3ヶ月)。
初期設定
Configuration > Settings
General
Language Support: Disabled #日本語が中途半端なので英語化
RRDtool Version: RRDtool 1.7.2+ #apt installで導入されたバージョン
Enable Automatic Graph Creation: off #デバイス追加すると勝手にグラフ作成される
Enable Automatic Tree Item Creation: off
Poller
Poller Type: spine #ホスト数2,3でも十分速くなる
Poller Interval: Every Minute #毎分更新
Cron/Daemon Interval: Every Minute
Visual
Rows Per Page: 100
Configuraton > Users > admin
User Settings
Default Time Range: Hourly (1 Minute Average)
Default Timespan: Last 6 Hours
Configuraton > Users > guest (グラフエキスポート用)
Graph Perms ~ Tree Perms
全て Default * Policy for this User: Deny にする (後でGrantしたグラフだけエキスポートする)
あとは好みで適当に
データ保持期間の設定。グラフを作成し始めると弄れなくなるので先に決める
Presets > Data Profiles にてAddで新規作成
Data Source Profile
Polling Interval: Every Minute
Consolidation Functions: Ave,Min,Max,Last 全て
Default: On
Data Source Profile RRAs 全て新規作成
Name Timespan Aggregation Row Retention
Hourly (1 Minute Average) 6 Hours 1 min 129600 3 Months
Daily (5 Minute Average) 1 Day 5 min 105121 1 Year
Weekly (15 Minute Average) 1 Week 15 min 1 #Row=0だとグラフ出来ない
Monthly (1 Hour Average) 1 Month 60 min 43800 5 Years
Yearly (12 Hour Average) 1 Year 720 min 21900 30 Years
これで1つあたりのRRDfile Size: 9M Bytesになる。
グラフ閲覧ページでWeeklyグラフを見れるようにしたいが、15分データは保持したくない(容量削減したい)。
なのでWeeklyの項目だけ作りRow=1に設定。機能します。
データ保持期間を全データに適用
Templates > Data Source にて全選択
Change Profileで、上記で新規作成したProfileにする
SNMP機器(Windows用)のテンプレート設定
Templates > Device > Generic SNMP Device
Associated Graph Templates > SNMP - Generic OID Template: 削除する。何のグラフも生成されない
Associated Graph Templates > Add Graph Template: Host MIBのものを全て追加
Associated Data Queries > Add Data Query: SNMPを全て追加 (Net-SNMPは追加しない)
Data Input Methodから自作しなくていいデフォ機能で十分なグラフはCreateで作れるはず。
参考
USBRH+cactiで作成した温湿度グラフ
温度が左軸で湿度が右軸。
左軸と右軸は独立できず、数値が対応するようにしか作れない
(この場合はTemp=30,Humi=80が一致するように作っている)。
Right Axis (--right-axis ) = 2:20
の設定で、左軸をscale倍した後にshiftした数値が右軸の対応値となる。この場合、
30*2 + 20 = 80
で左軸30と右軸80が対応。
ただ右軸は表示しているだけでItem #7(以下の画像)を右軸に対応させることはできないので、
Item #7の値(80)を対応する左軸の値(30)に変換するCDEFが必要。(CDEFって何の略?)
この場合、
30*2 + 20 = 80 ⇔ 30 = (80 - 20)/2
⇔ 30 = 80/2 - 20/2
⇔ 30 = 80*0.5 - 10
ということで、0.5を掛けてから10を減算する処理として
cdef=CURRENT_DATA_SOURCE,0.5,*,10,-
となるように設定。
設定は以下。
参考
Custom - Get Linux Memory Usage
/proc/meminfoのメモリ使用量のグラフ作成用
cat /proc/meminfo | awk '/^MemTotal:/{total=$2}/^MemFree:/{free=$2}/^Buffers:/{buffer=$2}/^Cached:/{cache=$2;filebacked=cache+buffer}/^AnonPages:/{anon=$2;kernel=total-free-buffer-cache-anon;print "total:" total " free:" free " filebacked:" filebacked " anonymous:" anon " kernel:" kernel}'
出力 anonymous: AnonPages
filebacked: Cached + Buffers
free: MemFree
total: MemTotal
kernel: MemTotal - MemFree - Cached - Buffers - AnonPages の値
Custom - Get Linux ext4 write KBs
SDカードに書き込んだ容量
cat /sys/fs/ext4/mmcblk0p2/lifetime_write_kbytes
Custom - Get Linux Uptime
Uptimeの日数。デフォのUptimeが10ms単位だった気がするので。
cat /proc/uptime | awk '{print $1 /60 /60 /24}'
Custom - Get UPS Status
UPS BY50Sのデータ取得
/opt/ups/by50s-status.sh
出力 min: UPS Load 1分間の最小値
max: UPS Load 1分間の最大値
now: UPS Load 現在値
bottom: グラフの下限(min - 0.5) 1分間に35~45%だったら34.5
height: グラフの高さ(max-min+1) 1分間に35~45%だったら11。bottomにAREA(STACK)でグラフ作る用
soc: UPSバッテリーの容量%
/opt/ups/by50s-status.sh
#!/bin/bash
if [ /opt/ups/datalog/file0.csv -nt /opt/ups/datalog/file1.csv ]; then
cp -f /opt/ups/datalog/file0.csv /tmp/datalog-now.csv
else
cp -f /opt/ups/datalog/file1.csv /tmp/datalog-now.csv
fi
if [ -e /tmp/datalog-now.csv ]; then
soc=`cat /tmp/datalog-now.csv | tail -n 1 | awk -F, '{print $10}' | sed -e 's/^0\+\([0-9]\+\)$/\1/'`
now=`cat /tmp/datalog-now.csv | tail -n 1 | awk -F, '{print $6}' | sed -e 's/^0\+\([0-9]\+\)$/\1/'`
max=`cat /tmp/datalog-now.csv | tail -n 12 | awk -F, '{if(l<$6) l=$6} END{print l}' | sed -e 's/^0\+\([0-9]\+\)$/\1/'`
min=`cat /tmp/datalog-now.csv | tail -n 12 | awk -F, 'BEGIN{s=100}{if(s>$6) s=$6} END{print s}' | sed -e 's/^0\+\([0-9]\+\)$/\1/'`
bottom="$((min - 1)).5"
height="$((max - min + 1))"
fi
if [ -z $max ]; then
unset min;
unset bottom;
unset height;
fi
rm -f /tmp/datalog-now.csv
echo "now:$now max:$max min:$min bottom:$bottom height:$height soc:$soc"
Pingの収集はASUSルータにarpingさせるで得た ping-status.txt をcatして使っている。
cacti グラフエキスポートの設定
guestユーザーが閲覧可能なグラフをapacheのパス(/var/www/html/cacti_static)に出力する。
guestユーザー設定
Configuraton > Users > guest (グラフエキスポート用)
General
Enabled: On
Permissions
View Graphsのみ
Graph Perms~Tree Perms
全て Default * Policy for this User: Deny にする
(以下でGrantしたグラフだけエキスポートする)
Graph Perms
エキスポートしたいグラフを選択してGrant(許可)、他は全てRestrictedを確認
User Settings
Default Time Range: Hourly (1 Minute)
グラフエキスポートの有効化
Configuration > Plugins > Gexport
ActionからInstallしてEnableする
グラフエキスポートの設定
Utilities > Graph Exports > guest Graph Export
Export Name: guest Graph Export
Export Method: Local
Presentation Method: Site
Site: All Sites Selected
Export Directory: /var/www/html/cacti_static
ログにエラーが出ないようにする
Utilities > System Utilities > Log Administration
グラフエキスポートでファイルが無いとエラーを吐く。
存在しないという理由でエラーを吐いているファイルパスをtouchコマンドで形だけ作成しておく
/cacti_static のページを開いてもツリーが見えなかったりするけど、
個別の画像やページ(cacti_static/graph_**.html)を使うのでOK。
LFTPでweb上にcactiグラフを上げる
上げて問題ないやつだけ、上げて問題ないところに。
タイムアウトの設定をしないと、WANに接続できないときに毎分プロセスが増え続けるので、要対策。
インストール
apt-get install lftp
設定項目
nano /etc/lftp.conf
set net:timeout 10 #デフォだと死ぬほどリトライしまくるらしいので控えめに
set net:max-retries 3
set net:reconnect-interval-base 5
set dns:fatal-timeout 10
set dns:max-retries 3
set xfer:log no #ログを保存しない
毎分実行
nano /etc/cron.d/cacti
* * * * * root lftp -e "mput -O /ぴえん/ぱおん/graphs/ /var/www/html/cacti_static/graphs/*; bye" -u [username],[password] [server]
#パスワードを保護したいが、無理そう。
lftp -d -u [username],[password] [server]
でlsしてみて、CertificateしてるならTLS使っている。
参考
2022/9/10: lftpのタイムアウト用の設定を追記