PC関連のチラ裏

自分用(素人)

ラズパイ02Wを買えたのでcactiを設定した

Raspberry Pi Zero 2 Wにcactiサーバになってもらいます。

ラズパイ02Wを買えたのでcacti鯖として初期設定(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の設定 (ブラウザから)

コマンドを用いたグラフを新規に作る手順は大体、

  1. Presets > Data Profiles (データ収集周期,保持期間)
  2. Data Collection > Data Input Methods (データ入力用コマンド)
  3. Templates > Data Source (1と2を使ってデータ項目を設定する)
  4. Templates > Graph (3を使ってグラフの見た目を設定する、グラフ作成後も変えられる)
  5. Create > New Devices (デバイス追加)
  6. 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,-
となるように設定。

設定は以下。

参考

作ったData Input Methodとか

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のタイムアウト用の設定を追記