Mac に MRTG をインストールする。

だいたい次のような3つのステップを踏むことになります。

  1. Web サーバを立ち上げる
  2. SNMP デーモンを起動
  3. MRTG をインストール

◯ 広告

簡単な 需要予測ツール を作りました。MRTGログを貼り付けるだけで逼迫が想定される日を自動で計算してくれます。ちなみに MRTG のログは mrtg_page.html を mrtg_page.log にすると取得できます。

Step1. Web サーバを起動

Web サーバを起動して MRTG が log や html ファイルを保存するためのディレクトリを用意します。

Step1-1. Web サーバ起動

Apacheは、El Capitanではインストール済みです。」だそうです。

$ httpd -v
$ sudo /usr/sbin/apachectl start

Mac OSX 10.11 El Capitan に ...

Step1-2. ディレクトリ作成

ここに MRTG の log ファイルであったりページを保存します。

sudo mkdir /Library/WebServer/Documents/mrtg

Step1-3. ディレクトリの権限を変更

sudo で作成されたディレクトリなので、このままでは MRTG がログファイルを保存できません。権限を変更して MRTG サーバが書き込めるようにします。

sudo chmod -R 777 /Library/WebServer/Documents/mrtg/

Step2. SNMP デーモンを移動する。

設定ファイル snmpd.conf を修正して SNMP デーモンを起動します。

Step2-1. snmpd.conf を取る。

たぶん、失敗します。sudo 使ってるのにファッ!?って思ったのですが...

$ sudo mv /etc/snmp/snmpd.conf /usr/share/snmp
mv: rename /etc/snmp/snmpd.conf to /usr/share/snmp/snmpd.conf: Operation not permitted

Step2-2. System Integrity Protection を無効にする

Step3-1. OSX起動時にCommand + Rを押しっぱなしにしてRecovery OSを起動する。
Step3-2. そのあと、Terminalを起動してcsrutil disableを実行すればよい。

System Integrity Protectionを無効にする方法
$ sudo mv /etc/snmp/snmpd.conf /usr/share/snmp

? 読み込み先は /usr/share/snmp/snmpd.conf って決まってるのかな

Step2-3. コミュニティ名を修正

sudo vi /usr/share/snmp/snmpd.conf でコミュニティ名を修正

#         sec.name  source          community
# 修正前
# com2sec local     localhost       COMMUNITY
# com2sec mynetwork NETWORK/24      COMMUNITY
# 修正後
com2sec   local     localhost       mycomunity
com2sec   mynetwork 127.0.0.1/24    mycomunity

?コミュニティってなんだったっけ

Step2-4. SNMP デーモンを起動させて、その起動を確認する。

$ snmpwalk -v2c -c mycomunity localhost
Timeout: No Response from localhost
$ # SNMP デーモンが起動していません。
$ # SNMP デーモンを起動させます。
$ sudo launchctl load -w /System/Library/LaunchDaemons/org.net-snmp.snmpd.plist
$ snmpwalk -v2c -c mycomunity localhost
SNMPv2-MIB::sysDescr.0 = STRING
... 長大な文字列 ...
$ # SNMP デーモンの起動が確認できました。

?launchctl load -w じゃないコマンドは

Step3. MRTG をインストール

設定ファイル /usr/local/mrtg/mrtg.cfg を作成して mrtg コマンドを実行します。

Step3-1. MRTG をインストール

brew install mrtg

Step3-2. cfgmaker で MRTG の config を作成

$ # 1) MRTG の設定を保存するためのディレクトリを作成
$ mkdir /usr/local/mrtg
$
$ # 2) MRTG の config を自動生成
$ cfgmaker --output=/usr/local/mrtg/mrtg.cfg mycomunity@127.0.0.1
--base: Get Device Info on mycomunity@127.0.0.1:
--base: Vendor Id: Unknown Vendor - 1.3.6.1.4.1.8072.3.2.255
--base: Populating confcache
--base: Get Interface Info
--base: Walking ifIndex
...

Step3-3. SNMP_Session.pm の line 149, 604 を修正

もし以下のようなエラーが発生したら...(エラーが出力されても基本的な config は出力してくれるので、さして問題ではなさそうですが...。)

$ cfgmaker --ifref=descr --ifdesc=descr mycommunity@127.0.0.1
Subroutine SNMP_Session::pack_sockaddr_in6 redefined at /System/Library/Perl/5.18/Exporter.pm line 66.
 at /usr/local/bin/../lib/mrtg2/SNMP_Session.pm line 149.
Subroutine SNMP_Session::unpack_sockaddr_in6 redefined at /System/Library/Perl/5.18/Exporter.pm line 66.
 at /usr/local/bin/../lib/mrtg2/SNMP_Session.pm line 149.
Subroutine SNMPv1_Session::pack_sockaddr_in6 redefined at /System/Library/Perl/5.18/Exporter.pm line 66.
 at /usr/local/bin/../lib/mrtg2/SNMP_Session.pm line 604.
Subroutine SNMPv1_Session::unpack_sockaddr_in6 redefined at /System/Library/Perl/5.18/Exporter.pm line 66.
 at /usr/local/bin/../lib/mrtg2/SNMP_Session.pm line 604.
--base: Get Device Info on mycommunity@127.0.0.1
...

 

vi /usr/local/bin/../lib/mrtg2/SNMP_Session.pm で以下の様に編集

# line 149
# 変更前
# Socket6->import(qw(pack_sockaddr_in6 inet_pton getaddrinfo unpack_sockaddr_in6));
# 変更後
Socket6->import(qw(inet_pton getaddrinfo));

... 中略 ...

# line 604
# 変更前
# Socket6->import(qw(pack_sockaddr_in6 inet_pton getaddrinfo unpack_sockaddr_in6));
# 変更後
Socket6->import(qw(inet_pton getaddrinfo));

FIX FOR MRTG GENERATING SNMP_SESSION ERROR

Step3-4. mrtg.cfg を修正してログファイル等の保存先を指定する。

vi /usr/local/mrtg/mrtg.cfg としてファイルを編集します。以下の1行を追記してください。html ファイルや log ファイルが保存されます。mrtg コマンド実行後に確認すると log ファイルや html ファイルが保存されているのを確認することができます。

WorkDir: /Library/WebServer/Documents/mrtg

Step3-5. mrtg コマンドを実行

mrtg /usr/local/mrtg/mrtg.cfg

Step3-6. crontab に登録

*/5 * * * * /usr/local/bin/mrtg /usr/local/mrtg/mrtg.cfg 

crontab は絶対パスで登録してくださいねってことらしいです...。
http://qiita.com/ryusukefuda/items/878556158d8f1d3d887a

Step3-7. indexmaker

indexmaker /usr/local/mrtg/mrtg.cfg > /Library/WebServer/Documents/mrtg/index.html


 

詰まったところ

① snmpwalk -v2c -c comu_name localhost を実行してもタイムアウト

原因 1) プロセスが起動していない

$ # 1) プロセスがないことを確認
$ ps ax | grep snmpd
  780 s000  R+     0:00.00 grep snmpd
$ 
$ # 2) つぎのコマンドを実行し、MacSNMPを有効にします。
$ sudo launchctl load -w /System/Library/LaunchDaemons/org.net-snmp.snmpd.plist
$
$ # プロセスが起動していることを確認
$ ps ax | grep snmpd
  696   ??  Ss     0:02.34 snmpd -f
  780 s000  R+     0:00.00 grep snmpd

macの小ネタ
 

原因2) firewallの設定
/etc/hosts.allow は自分で作らない限りは、無いはずなのでこちらが原因になることはないと思いますが。

/etc/hosts.allowの、"All : ALL : deny"を一時的にコメントしてみた。

$ sudo vi /etc/hosts.allow
All : 192.168.0.2 : allow
All : 192.168.0.11 : allow
All : 192.168.0.12 : allow
#All : ALL : deny

snmpインストール手順 00:25

 

② crontab を設定しても全然更新されない。

コマンドを実行してみるとエラーが返される。

$ mrtg /usr/local/mrtg/mrtg.cfg
2012-11-11 18:30:45: ERROR: Creating templock /usr/local/mrtg/mrtg.cfg_l_860: Permission denied at /opt/local/bin/mrtg line 1968.

 
どうも一時ファイルを作成しようとするも権限がなくて蹴られている。乱暴だけど権限を付与して解決。

sudo chmod -R 777 /usr/local/mrtg/

③ indexmaker 周り

1) vi
cfgファイルを触る時は、文字コードを指定して。
文字化けします。
(Linux)viで文字コードを指定してテキストファイルを開く : 3流プログラマのメモ書き

vi -c ":e ++enc=euc-jp" index.html

 

2) indexmaker 起動時のオプションでも、文字コード指定
でも、index.html を直接さわって削除しないと行けない。

--addhead="<META HTTP-E
 QUIV=\"Content-Type\" CONTENT=\"text/html; charset=euc-jp\">"

 

sed で編集もできない様子。

$ sed -e "s/charset=iso-8859-15/charset=euc-jp/" /Library/WebServer/Documents/mrtg/localhost/index.html
RE error: illegal byte sequence

 

ただし、環境変数をいじると、上手く行く様子。まだやっていない。
そのまま、Terminal でいじればいいのかな?
MacのデスクトップをGeekToolでカスタマイズ - ソフトウェアエンジニアのブログ

LANG=C
NOLOCALE=1

 

現在の環境変数を確認してから、実行したほうが良さそう。
ただ、何も設定されてない様子(´・ω・`)?
linuxやるブログ LANG 変数

$ echo $LANG

$ #応答無し

おとなしく vi の置換機能を使うのが早いかな。

:%s/charset=iso-8859-15/charset=euc-jp

 

SNMPコマンドを試し打ち

$ snmpwalk -v 2c -c mycommunity localhost 1.3.6.1.2.1.2.2.1.10
IF-MIB::ifInOctets.1 = Counter32: 146477277
IF-MIB::ifInOctets.2 = Counter32: 0
IF-MIB::ifInOctets.3 = Counter32: 0
IF-MIB::ifInOctets.4 = Counter32: 0
IF-MIB::ifInOctets.5 = Counter32: 662048654
IF-MIB::ifInOctets.6 = Counter32: 0
IF-MIB::ifInOctets.7 = Counter32: 0
$ snmpget -v 2c -c mycommunity localhost 1.3.6.1.2.1.2.2.1.10.1
IF-MIB::ifInOctets.1 = Counter32: 146480169
$ snmpget -v 2c -c mycommunity localhost 1.3.6.1.2.1.2.2.1.10.2
IF-MIB::ifInOctets.2 = Counter32: 0
$ snmpget -v 2c -c mycommunity localhost 1.3.6.1.2.1.2.2.1.10.3
IF-MIB::ifInOctets.3 = Counter32: 0
$ snmpget -v 2c -c mycommunity localhost 1.3.6.1.2.1.2.2.1.10.4
IF-MIB::ifInOctets.4 = Counter32: 0
$ snmpget -v 2c -c mycommunity localhost 1.3.6.1.2.1.2.2.1.10.5
IF-MIB::ifInOctets.5 = Counter32: 662049026
$ snmpget -v 2c -c mycommunity localhost 1.3.6.1.2.1.2.2.1.10.6
IF-MIB::ifInOctets.6 = Counter32: 0
$ snmpget -v 2c -c mycommunity localhost 1.3.6.1.2.1.2.2.1.10.7
IF-MIB::ifInOctets.7 = Counter32: 0
$ snmpget -v 2c -c mycommunity localhost 1.3.6.1.2.1.2.2.1.10.8
IF-MIB::ifInOctets.8 = Counter32: 0
$ 
$ snmpwalk -v 2c -c mycommunity localhost 1.3.6.1.2.1.2.2.1.16
IF-MIB::ifOutOctets.1 = Counter32: 146484542
IF-MIB::ifOutOctets.2 = Counter32: 0
IF-MIB::ifOutOctets.3 = Counter32: 0
IF-MIB::ifOutOctets.4 = Counter32: 0
IF-MIB::ifOutOctets.5 = Counter32: 54206934
IF-MIB::ifOutOctets.6 = Counter32: 346
IF-MIB::ifOutOctets.7 = Counter32: 0
IF-MIB::ifOutOctets.8 = Counter32: 0
$ snmpget -v 2c -c mycommunity localhost 1.3.6.1.2.1.2.2.1.16.1
IF-MIB::ifOutOctets.1 = Counter32: 146488115
$ snmpget -v 2c -c mycommunity localhost 1.3.6.1.2.1.2.2.1.16.2
IF-MIB::ifOutOctets.2 = Counter32: 0
$ snmpget -v 2c -c mycommunity localhost 1.3.6.1.2.1.2.2.1.16.3
IF-MIB::ifOutOctets.3 = Counter32: 0
$ snmpget -v 2c -c mycommunity localhost 1.3.6.1.2.1.2.2.1.16.4
IF-MIB::ifOutOctets.4 = Counter32: 0
$ snmpget -v 2c -c mycommunity localhost 1.3.6.1.2.1.2.2.1.16.5
IF-MIB::ifOutOctets.5 = Counter32: 54206934
$ snmpget -v 2c -c mycommunity localhost 1.3.6.1.2.1.2.2.1.16.6
IF-MIB::ifOutOctets.6 = Counter32: 346
$ snmpget -v 2c -c mycommunity localhost 1.3.6.1.2.1.2.2.1.16.7
IF-MIB::ifOutOctets.7 = Counter32: 0
$ snmpget -v 2c -c mycommunity localhost 1.3.6.1.2.1.2.2.1.16.8
IF-MIB::ifOutOctets.8 = Counter32: 0