いますぐ実践! Linuxシステム管理

[バックナンバーのトップへ] [Linux システム管理のトップへ]


いますぐ実践! Linux システム管理 / Vol.174 / 読者数:1470名

こんばんは、うすだです。

今月中に、本業も含めて、 いくつかの文章を書かなければいけない状況に陥っております。

もともと、文章を書くのは苦手で、当メルマガも、 あれやこれやと悩んで試行錯誤したあげく、最後にはもういいやと投げ出して発行する、 というサイクルを繰り返しています。

それが、あと1週間でいくつも重なるのかと思うと…(ふぅ)。

もっとも困るのは、優先度がいずれも同レベルで、甲乙つけがたいということです。 どれからやるべきか、と考え始めると頭の中がデッドロックを起こしてしまい、 まったく関係ないことを始めてしまいます。

とりあえず期限が一番早い、当メルマガから着手してまいります。
他のことはしばし忘れて、今回もはりきってまいりますね。

ちなみに、いま、我が家のラブリーチャーミングなオカメインコさんが、 私の左手の上で寝ておられますので、右手だけでキーを打っています。
そのことを想像しながら読んでいただけますと幸いです。

今回のお題 - NetworkManager をもう少し活用してみる

近年稀にみるいい加減なまえふりのことは忘れて(忘れてばかりですね)、 本題に入らさせていただきます。

さて、前回は、NetworkManager の設定方法などをご紹介しました。

Vol.173 - NetworkManager を活用する
http://www.usupi.org/sysad/173.html

よく考えますと、NetworkManager はシステム管理ネタではない気がしてきましたが、 それもここでは忘れていただいて、今回は、 ネットワークを切替えたときに何かアクションを起こしてみたいと思います。
具体的には、以下の通りです。

あと、 コマンドラインでも NetworkManager が使えると便利ではないかと思いますので、 cnetworkmanager なるものもご紹介したいと思います。

NFSでマウントする

会社にはNFSサーバがあり、ネットワークに接続すると自動的にマウントされて使えたら、 ちょびっと便利なのではないかと思います。

それを実現するためのスクリプトを作成してみました。
設定されたIPアドレスが 192.168.1.* だったら、 NFSサーバ 192.168.1.1 の /exportfs を /mnt にマウントします。

#!/bin/sh
MOUNTPATH=/mnt
MOUNTOPT="-o nolock"
case "$IP4_ADDRESS_0" in
    192.168.1.*) NFSPATH=192.168.1.1:/exportfs;;
    *) exit 0
esac
case "$2" in
    up)
        [ -z "`grep $MOUNTPATH /proc/mounts`" ] && \
            mount $MOUNTOPT $NFSPATH $MOUNTPATH;;
    down)
        [ -n "`grep $MOUNTPATH /proc/mounts`" ] && \
            umount $MOUNTPATH;;
    *)
esac

最初の case 文で、自分のIPアドレスが 192.168.1.* かどうかの確認をしています。 そうなら $NFSPATH を設定し、違えば exit します。
そして後半の case 文では、up のときにNFSマウントし、 down のときにアンマウントします。

これを、 たとえば /etc/NetworkManager/dispatcher.d/98nfsmount などという名前で保存して、 root だけが書ける実行ファイルにします。

  $ chmod u+wx,go-w /etc/NetworkManager/dispatcher.d/98nfsmount

設定する前は、df コマンドで確認すると以下のようになっています。

  $ df
  Filesystem         1K-blocks      Used Available Use% Mounted on
  /dev/mapper/vg_fedora12-lv_root
                       7017984   2857068   4089620  42% /
  tmpfs                 255072       632    254440   1% /dev/shm
  /dev/sda1             198337     21999    166098  12% /boot

ここで、NetworkManagerアプレットで設定しますと、 df コマンドの出力結果が以下のようになり、NFSでマウントできていることがわかります。

  $ df
  Filesystem         1K-blocks      Used Available Use% Mounted on
  /dev/mapper/vg_fedora12-lv_root
                       7017984   2857072   4089616  42% /
  tmpfs                 255072       632    254440   1% /dev/shm
  /dev/sda1             198337     21999    166098  12% /boot
  192.168.1.1:/exportfs
                      98447616  73957632  19489024  80% /mnt

そして、ネットワークを切断したり別の設定を選択すると、 もれなくアンマウントされます。

sSMTP の設定を切替える

さて、お次は、設定ファイルを切替えてみたいと思います。

前々回、sSMTP の設定方法などをご紹介しました。

Vol.172 - sSMTP でメールを送信できるようにする
http://www.usupi.org/sysad/172.html

sSMTP は、SMTPサーバを介してメールを送信する、 sendmail の代替的な役割をするプログラムです。
/etc/ssmtp/ssmtp.conf という設定ファイルに、 SMTPサーバなどの情報を書いておくだけでよいという、簡単便利なお方でした。

しかし、たとえば、会社にいるときと自宅にいるときとで、 設定ファイルの内容が変わってくるのではないかと思います。
というわけで、設定ファイルを切替えるスクリプトを作成してみました。

#!/bin/sh
[ "$2" != "up" ] && exit 0
case "$IP4_ADDRESS_0" in
    10.*)        SUFFIX=work;;
    192.168.1.*) SUFFIX=home;;
    *)           SUFFIX=default;;
esac
cp -p /etc/ssmtp/ssmtp.conf.$SUFFIX /etc/ssmtp/ssmtp.conf

会社では 10.x.x.x、自宅では 192.168.1.x というIPアドレスを使用すると仮定します。

そして、それぞれの設定ファイルを、以下のように作成しておきます。

  • /etc/ssmtp/ssmtp.conf.work (会社用)
  • /etc/ssmtp/ssmtp.conf.home (自宅用)
  • /etc/ssmtp/ssmtp.conf.default (上記以外)

たとえば、会社には社内向けのSMTPサーバがあると思いますし、 自宅ですとプロバイダのSMTPサーバを使用することになると思います。 それ以外の場合ですと、SSL および SMTP AUTH が必須な、 どこからでも使えるSMTPサーバを使用する、といった具合でしょうか。 (弊社の場合はそうです。)

とにかく、設定されたIPアドレスを見て、 上記のいずれかを ssmtp.conf にしてしまえばよいですよね。
というわけで、上記スクリプトはそのような処理を行ってくれます。

上記スクリプトを、 /etc/NetworkManager/dispatcher.d/97ssmtp という名前で保存して、 root だけが書ける実行ファイルにします。

  $ chmod u+wx,go-w /etc/NetworkManager/dispatcher.d/97ssmtp

試しに、会社のネットワークの設定を選択しますと、以下のように、 会社用の設定ファイルがコピーされていることがわかります。

  $ ls -l ssmtp.conf*
  -rw------- 1 usu adm  651 2010-02-20 15:16 ssmtp.conf
  -rw------- 1 usu adm  717 2010-02-13 19:40 ssmtp.conf.default
  -rw------- 1 usu adm  728 2010-02-19 23:17 ssmtp.conf.home
  -rw------- 1 usu adm  651 2010-02-20 15:16 ssmtp.conf.work

環境によって設定を切替えるというネタは、以前ご紹介していました。
テンプレート・ファイルから作り出したりしていますので、 よろしければご覧くださいませ。

Vol.103 - 設定ファイルを自動的に変更する
http://www.usupi.org/sysad/103.html

cnetworkmanager のインストール

以上で、ネットワークを切替えたときに何かを実行する方法が、 何となくはご理解いただけたと思います。

しかし、システム管理者たるもの、マウスに手をのばさず、 キーボードですべての作業を行いたいと思うのが、フツーではないでしょうか。
そこで、cnetworkmanager というコマンドをご紹介したいと思います。

cnetworkmanager - Command Line Interface for NetworkManager
http://vidner.net/martin/software/cnetworkmanager/

 

さて、まずはインストールですが、ありがたいことに、 Fedora などにはパッケージがあるようです。ですので、 ご使用のディストリビューションにあれば、yum などでインストールすれば万事解決です。

  # yum install cnetworkmanager

そうでない貴兄は、パッケージがなければ作ればいいじゃないということで、 がんばって作ってみましょう。

まずは、上記のサイトからソースコードを入手し、以下の手順でバイナリを作成します。

  $ tar xvfz cnetworkmanager-0.21.1.tar.gz
  $ cd cnetworkmanager-0.21.1
  $ python setup.py bdist

上記を実行しますと、 dist ディレクトリの下に tar+gzip で固めたものを作成してくださいます。
ちなみに、RPM な貴兄は、以下のように実行しますと、 一気に RPM まで作成してくださるようです。(すみません未確認です…。)

  $ python setup.py bdist_rpm 

ただ、Ubuntu 9.10 では、prefix が /usr/local になってしまいます。
それがイヤな方は、下記のように setup.py ファイルを作ってからお試しください。

  $ cat > setup.cfg << E-O-F
  [install]
  prefix=/usr
  E-O-F
  $ python setup.py bdist

あとは、alien コマンドで deb ファイルに変換し、 それをインストールすればお手軽だと思います。

  $ fakeroot alien --to-deb \
  dist/cnetworkmanager-0.21.1.linux-i686.tar.gz
  cnetworkmanager_0.21.1.-2_all.deb generated
  $ sudo dpkg -i cnetworkmanager_0.21.1.-2_all.deb

…が、Ubuntu では、site-packages を見に行ってくれないようです。
ですので、dist-packages にシンボリックリンクを作成する、 という方法でなんとか動かしました。(パッケージにした意味があまりないですが…)

  $ python -V
  Python 2.6.4
  $ sudo ln -s ../site-packages/cnetworkmanager-0.21.1-py2.6.egg-info \
  /usr/lib/python2.6/dist-packages/cnetworkmanager-0.21.1-py2.6.egg-info
  $ sudo ln -s ../site-packages/dbusclient \
  /usr/lib/python2.6/dist-packages/dbusclient
  $ sudo ln -s ../site-packages/networkmanager \
  /usr/lib/python2.6/dist-packages/networkmanager

上記のパスに含まれる 2.6 の部分は、 ご使用の Python のバージョンに合わせてください。 (python -V でバージョンがわかります。)

以上で…と言いたいところですが、実は、さらに壁があります。
cnetworkmanager コマンドを実行しますと、 以下のように言われてしまうことがあるのです。

  UnicodeEncodeError: 'ascii' codec can't encode characters in \
  position 0-7: ordinal not in range(128)

設定名などに日本語がまじっていると、こうなるようです。
これを回避したい場合は、sitecustomize.py というファイルに、 以下を追加してください。

import sys
sys.setdefaultencoding('utf-8')

その sitecustomize.py の場所は、ディストリビューションによって違うようです。 ぱっと確認した限りでは、以下のようになっていました。
(pythonX.X の X.X は、Python のバージョンに置き換えてください。)

  • /usr/lib/pythonX.X/site-packages/sitecustomize.py (Fedoraの場合)
  • /etc/pythonX.X/sitecustomize.py (Ubuntuの場合)

cnetworkmanager の使用方法

なんとかインストールできましたので、とにかく使ってみましょう。

ちなみにオンラインマニュアルが見当たりませんが、 --help オプションをつけて実行しますと、使用可能なオプションと説明が出力されます。

  $ cnetworkmanager --help

まずは、状況を確認していきましょう。

-d オプションをつけて実行しますと、デバイスの一覧が出力されます。

  $ cnetworkmanager -d
  Interface | Type     | State      
  ----------+----------+------------
  eth0      | ETHERNET | ACTIVATED  
  wlan0     | WIRELESS | UNAVAILABLE

--di オプションとインターフェース名を指定しますと、詳細情報を出力してくれます。

  $ cnetworkmanager --di=eth0
  Property     | Value                                        
  -------------+----------------------------------------------
  Udi          | /sys/devices/pci0000:00/0000:00:19.0/net/eth0
  Interface    | eth0                                         
  Driver       | e1000e                                       
  Capabilities | NM_SUPPORTED,CARRIER_DETECT                  
  State        | ACTIVATED                                    
  Managed      | True                                         
  DeviceType   | ETHERNET                                     
  Carrier      | True                                         

また、-c オプションを指定しますと、アクティブな接続を出力します。

  $ cnetworkmanager -c
  State     | Name           | AP | Devices | Default route
  ----------+----------------+----+---------+--------------
  ACTIVATED | home           |    | eth0    | *            

-s オプションで「全てのユーザで有効」な設定の一覧が、 -u オプションでユーザの設定一覧が出力されます。

  $ cnetworkmanager -s
  Active | Name           | Type          
  -------+----------------+---------------
         | work           | 802-3-ethernet
         | dhcp           | 802-3-ethernet
  *      | home           | 802-3-ethernet
  $ cnetworkmanager -u
  Active | Name         | Type           
  -------+--------------+----------------
         | test-home    | 802-3-ethernet 
  *      | Auto anomaly | 802-11-wireless

 

次に、肝心の設定の切替えを行ってみましょう。
切替えは、--activate-connection オプションで行うことができます。
用法を以下に示します。

  cnetworkmanager --activate-connection=[KIND],ID,[DEV],[APMAC]

[] で囲まれた項目は省略可能です。(つまり , は省略できません。)
KIND には、user か system を指定します。省略すると user になりますので、 「全てのユーザで有効」な設定の場合は system を指定します。
ID には、設定名を指定します。
DEV には、eth0 などのインターフェース名を指定します。
APMAC は…ああすみません、よくわかりません。とりあえず、私が試したときは、 指定しなくても特に問題はありませんでした。

たとえば、home に切替えたい場合は、以下のように実行します。

  $ cnetworkmanager --activate-connection=system,home,,
  Entering mainloop
  (17:09:07) State: DISCONNECTED
  (17:09:07) State: CONNECTING
  (17:09:07) State: CONNECTED
  ^CLoop exited   <== Ctrl+c を押下

設定が切り替わった後も、なぜか戻ってきませんので、Ctrl-c で抜ける必要があります。 ですが、Ctrl-c で抜けた後も設定は有効です。

また、ネットワーク全体の有効/無効もできます。
-o オプションと、有効にする場合は true、無効にする場合は false を指定します。 (以下は無効にした場合の実行例です。)

  # cnetworkmanager -o false

おわりに

以上、NetworkManager の設定を切替えたときになにか実行する方法と、 cnetworkmanager コマンドについてご紹介しました。

他にも、Twitter からの一覧の入手や投稿といったことも考えて、 twidgeなるものを試していたのですが、 Fedora でビルドする元気がありませんでしたので、ご紹介するのを諦めました。
もし、Twitter がないと生きていけないくらいに活用されている貴兄は、 twidge を試してみるとよいかもしれません。
(少なくとも、Ubuntu にはパッケージがありました。)

ちなみに、オカメインコさんは、あの後30分ほどで目覚めてくれました。
30分だけとはいえ、右手だけで入力するのは結構たいへんでした。
両手が使えるということは、とてもすばらしいことですね!

宿題の答え

前回の宿題は、

  ネットワークを有功にしたときに、その旨をメールで通知しましょう。

でした。

安直に、環境変数一覧をメールするスクリプトを作成してみました。

#!/bin/sh
[ "$2" != "up" ] && exit 0
/usr/bin/printenv | /usr/bin/Mail -s "[network $1] $2" root

ネットワークが有効になったとき、ですので、第2引数が up のときだけ処理を行います。 ですので、up でなければ exit してしまいます。
その後は、 printenv コマンドの出力を Mail コマンド渡してメールしてもらいます。
ちなみに、上記の場合は root 宛です。他のひとにメールしたい場合は、 上記の root の部分を、ご希望のメールアドレスに書き換えてください。

さて、これを、/etc/NetworkManager/dispatch.d/99upmail という名前で保存したら、 例によって例のごとく、root だけが書ける実行ファイルにしておきます。

  # chmod u+wx,go-w /etc/NetworkManager/dispatch.d/99upmail

そうしますと、ネットワークを選択して有効にするたびに、 以下のようなメールが飛んできます。

  Subject: [network eth0] up

  CONNECTION_UUID=31fb3d7d-73e8-43e2-9f31-b1a56cb85c55
  IP4_NAMESERVERS=192.168.1.254
  DHCP4_DHCP_SERVER_IDENTIFIER=192.168.1.2
  DHCP4_DHCP_LEASE_TIME=6000
  IP4_ADDRESS_0=192.168.1.160/24 192.168.1.254
  ...後略...

情報としては、これで十分な気がします。
ですが、もうちょっとフレンドリーにすると、こんな感じでしょうか。

#!/bin/sh
[ "$2" != "up" ] && exit 0
echo "$IP4_ADDRESS_0 is $2 at `date`" | \
    /usr/bin/Mail -s "[network $1] $2" usu@usupi.org

printenv の出力結果の代わりに、若干人間様に歩み寄ってみました。
若干歩み寄ったと言っても、所詮は以下にしかすぎませんが…。

  Subject: [network eth0] up

  192.168.1.160/24 192.168.1.254 is up at Sat Feb 13 22:08:40 \
  JST 2010

各自、お好みの出力に変えてみてくださいませ。

あ、ちなみに、本題でご紹介した sSMTP の設定の切替えも行う場合は、 sSMTP の設定の切替えの後にメールを送信する必要があると思います。
(アルファベット順に実行されますので、 そのような順になるファイル名にしておきましょう。)

今回の宿題

今回の宿題は、

  NetworkManager では一般ユーザの権限でネットワークの設定ができて
  しまいます。なぜそれが可能なのか、考えてみましょう。

です。

正直に申し上げますと、現時点ではその答えを知りません。
次回までに調べ上げたいと思いますが、なんとなく想像はつきますので、 みなさまも、どういう原理で設定できるのかを想像してみてください。

あとがき

スラッシュドットに、ちょっと興味のある記事が載っていました。

オープンソースソフトウェア、仕事で開発するプロダクトに使ってる?
http://slashdot.jp/it/10/02/20/0135255.shtml

コメントがとても興味深いのですが、GPL がいかんのでは?的なご意見があったのが、 ちょいと気になりました。

正直に申し上げますと、お仕事でこの OSS を使いたいと思ったときに、 ライセンスが GPL だと、なんで GPL なんだよ〜と思うことがあります。

ですが、Stallman さんの考えるフリーソフトウェアの「フリー」を守るためには、 GPL が必要だと思いますし、 ライセンスをどうするかは作った人が決めることだと思いますので、 使う側がどうこう言うべきではないという気がいたしました。

GNU オペレーティング・システム
http://www.gnu.org/home.ja.html

ライセンスに限らず、ついつい、短絡的に文句を言ってしまいがちな気がします (あ、私が、です)。脊髄で反射させないで、どうしてなのかということを、 きちんと思い返さないといけないなあ、と思いました。

 

ちなみに、以前、世に出る(かもしれない)製品を開発したときには、 どれが GPL かというのを洗い出し、 ソースの公開の準備らしきことまでした記憶があります。

このときは、世に出かかったところで頓挫してしまい、 日の目を見ることはありませんでしたが…。

といいますか、今の会社に8年もいるのに、 開発したものが世に出た経験がいまだにないということに、我ながら、 あらためて驚愕しております。
(ことごとくポシャっています。わたしは疫病神なのかもしれません…。)

 

今回も、ここまで読んでいただき、誠にありがとうございました。
次回は、3月7日(日) の未明にお会いしましょう!

 

「いますぐ実践! Linux システム管理」の解除は、以下からできます。
http://www.usupi.org/sysad/ (まぐまぐ ID:149633)

バックナンバーは、こちらにほぼ全部そろっています。
http://www.usupi.org/sysad/backno.html

「栗日記」- オーストラリアではいまごろ栗がとれるのでしょうか?
http://www.usupi.org/kuri/ (まぐまぐ ID:126454)
http://usupi.seesaa.net/ (栗日記ブログ)
http://usupi.org/k/ (モバイル栗日記)


[バックナンバーのトップへ] [Linux システム管理のトップへ]

トップ

バックナンバー
    [日付順] [目的別]

プロフィール

▼ リンク

独学Linux
Linuxデスクトップ環境に関する情報が満載です。 メルマガもありますよ。
Server World
CentOS 6をサーバとしたときの設定例が、これでもかというくらいたくさん載っています。 CentOS以外のディストリビューション(Fedora, Ubuntu)も充実しています。
LINUXで自宅サーバーを構築・導入(Fedora9)
Fedora9のインストールの仕方から管理方法まで、詳しく載っています。 SearchManには情報がもりだくさんです。
マロンくん.NET
〜サーバ管理者への道〜
Linuxをサーバとして使用するための、いろいろな設定方法が載っています。 マロンくんもかわいいです。 なんといっても、マロンくんという名前がいいですね!!
日経Linux
今や数少なくなってしまったLinuxの雑誌。ニュースやガイドもあります。
Linux Square − @IT
@ITが提供する、Linux の情報が満載。 載っていない設定方法はないんじゃないでしょうか。
gihyo.jp…技術評論社
Linuxに限らず様々な技術情報が満載のサイト。 SoftwareDesign誌も、 ソフトウェア技術者は必見です。
SourceForge.JP Magazine
Linux に限らず、オープンソース関連の記事が網羅されています。
ITmediaエンタープライズ:Linux Tips 一覧
Tips というより FAQ 集でしょうか。わからないことがあれば覗きましょう。
IBM developerWorks : Linux
開発者向けですが、勉強になりますよ。
Yahoo!ニュース - Linux
Yahoo!のLinuxに関するニュース一覧です。
栗日記
システム管理とかと全然関係ありませんが、毎日栗の絵を描いています。
システム管理につかれちゃったとき、癒されたいときに、ご覧ください。:-)
WEB RANKING - PC関連
ランキングに参加してみました。押してやってください。

▼ 作ってみました

Add to Google

▼ せんでん




▼ 最近読んだ本

▼ 気に入ってる本