Ubuntu server でlm_sensors の値をsnmpで送りたい

cactiでlm_sensorsのファンとか温度とかグラフ化出来そうだったので、snmpd側の設定をしてた。
中々上手く行かなくてソースから入れてみたりしたけど、snmpwalkでディスクの情報を取得するとsnmpdが落ちる謎の現象に見舞われたので、結局パッケージからインストールして取得できた。

まずインストール

% sudo aptitude install snmp
% sudo aptitude install snmpd

あと、参考サイトにやれと書いてあったので一応やったけど

% sudo snmpconf -i -g basic_setup

対話式で設定ファイルを作るものらしいけど,全然basicじゃないわ・・・
で、最後までやったら /usr/share/snmp/snmpd.conf が作られるので、それを /etc/snmp/snmpd.conf にコピーして、ちょっと修正。

参考までに snmpd.conf

あとはsnmpdを再起動したらいける・・・はず。

以下ソースからインストールして、ディスク情報を取るとsnmpdが落ちたやり方。(lm_sensorsの値は取れる)
続きを読む Ubuntu server でlm_sensors の値をsnmpで送りたい

Linuxでsudoをしたとき、環境変数を引き継げなかった

Linuxでsudoをしたとき、環境変数を引き継げなかった。

1. 状況

Debianを利用しているとき、Subversionを利用したい場面があった。そそくさとapt-getでsubversionのクライアントをインストールしようとしたんだけれどうまくいかない。エラーメッセージを見てみるとldconfigが見つからない、と言われている。

エラーの内容は以下の通り


shell> sudo apt-get install subversion
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following extra packages will be installed:
libneon27-gnutls libserf-0-0 libsvn1
Suggested packages:
subversion-tools db4.8-util
The following NEW packages will be installed:
libneon27-gnutls libserf-0-0 libsvn1 subversion
0 upgraded, 4 newly installed, 0 to remove and 47 not upgraded.
Need to get 0 B/2,490 kB of archives.
After this operation, 7,152 kB of additional disk space will be used.
Do you want to continue [Y/n]? y
dpkg: warning: 'ldconfig' not found in PATH or not executable.
dpkg: warning: 'start-stop-daemon' not found in PATH or not executable.
dpkg: error: 2 expected programs not found in PATH or not executable.
Note: root's PATH should usually contain /usr/local/sbin, /usr/sbin and /sbin.
E: Sub-process /usr/bin/dpkg returned an error code (2)

2. 解決

これを見る限りどうやらldconfigがPATHに含まれていないか実行権限がないよ、と言われている。試しに手元でldconfigを試してみるけれど確かに実行できない。
locateで場所を探すとldconfig自体は入っているようだ。となると恐らくsudoでapt-getしたとき、PATHが一般ユーザのままでapt-getが走ってて、そのせいでldconfigが見つからないんだろう、ということに。

通常、そのままsudoを利用すると環境変数などはsudoを実行したユーザの物を引き継ぐ。PWDとかの情報も一緒だ。今回のように-uでsudoの実行ユーザを変更していないのでsudoで実行される命令はrootのものになる。
sudoをしたときに新たにrootのPATHなどの環境変数をロードするようにしたい。
manを漁ると出てきた。


-i [command]
The -i (simulate initial login) option runs the shell
specified by the password database entry of the target user
as a login shell.  This means that login-specific resource
files such as .profile or .login will be read by the shell.
If a command is specified, it is passed to the shell for
execution via the shell's -c option.  If no command is
specified, an interactive shell is executed.  sudo attempts
to change to that user's home directory before running the
shell.  The security policy shall initialize the
environment to a minimal set of variables, similar to what
is present when a user logs in.  The Command Environment
section in the sudoers(5) manual documents how the -i
option affects the environment in which a command is run
when the sudoers policy is in use.

 

ということで sudo -iをしてインストールが完了。

eclipse上でのsvn管理下ファイルのマージ手順(Subclipse使用)

  • trunk/hoge.txt  (rev.1)
  • branch/hoge.txt  (rev.3)

rev.2でtrunkからbranchを作成し、rev.3でbranchのhoge.txtに変更を加えたという状態があったとして、rev.2からrev.3までで加えた変更をtrunkの方にも適用したいとする。

  1. ecpliseのtrunkの方のプロジェクトのhoge.txtを選択し、右クリック → チーム → マージ。
  2. FromのURLにbranchの方のhoge.txtを指定。
  3. rev.2から3までの変更を適用したいので、Fromのリビジョン番号には2を指定し、Toのリビジョン番号には3を指定。(ToのURLは “From”のURLを利用 にチェック)
  4. (ユニファイドdiff で結果を確認後、)マージ を実行。
  5. trunk/hoge.txt に変更点が適用されるのでコミット。

パーミッションを基準にしてfindをしたかった(FreeBSD)

パーミッションを基準にしてfindをしたかった。

(Linuxで同じように試したけれど、-permのオプションの挙動が違うのでアテにならない)

いままで幾度となくつまづいてきたfind。やっぱり便利なので使わざるを得ないのだけれど、今回もやはりつまづいてみた。

今回はファイルのパーミッションを変更したくて、ファイルの所有者にr, wが出ているファイルに対し、それぞれ同じようにグループに対してr, wを出したかった。

findに-execをつければよかんべ、と思ったのだけれど、ちょっと動作が思った通りに行かなくていろいろとやってみた。

まずググってみたのだけれど、とても有用な情報が出てきた。
find の -permを使う tips – ダイミテイ

このページにはperlのスクリプトがあり、このスクリプトで基本的なすべてのパーミッションを持つファイルを作成できる。
そのスクリプトをここにもパクって記載しておく。

やりたいこと

ファイルの所有者のパーミッションに沿ってgroupのパーミッションもかえてやる。
例えば以下のファイルの場合

-rw-------   1 mysql  mysql         235 Sep  5 00:10 relay-bin.000144

このファイルは所有者に対して読み取りと書き込みが出ている。このファイルの所有者はmysql、所属グループはmysqlとなっている。このとき、mysqlグループに属するユーザであれば、書き込みと読み込みを行わせたい。

また次のケースでは

drwx------   2 mysql  mysql        1536 Sep  2 05:06 search/

このファイル(ディレクトリ)は所有者に対して読み取り、書き込み、実行権限が出ている。このとき、mysqlグループに属するユーザに対しても同じようなパーミッションを出してやりたい。

上記二つの例では、それぞれ実行しようとするchmodコマンドが違う。なのでそれをうまいことやってやれるようなコマンドを探してみた。

まずはググって見つかったfindの良い例をするためのコード

#!/usr/bin/perl

for ($i = 0; $i < 512; $i++) {
    $_ = sprintf("%03o", $i);
    s/0/---/g;
    s/1/--x/g;
    s/2/-w-/g;
    s/3/-wx/g;
    s/4/r--/g;
    s/5/r-x/g;
    s/6/rw-/g;
    s/7/rwx/g;
    open TOUCH, ">$_";
    close TOUCH;
    chmod $i, $_;
}

ここで作成されるファイルは全部で512個ある。owner, group, otherに対してそれぞれr, w, xがあるので
2 ^ (3*3) = 2 ^ 9 = 512個
となる。

さて、先述のリンク先の説明で一通りの理解はできたのだけれど、一つ引っかかるところがあった。

chmodは普段からよく使うので、知ったふりをして日々利用を続けてきたので、chmodなんて余裕、とか余裕をかましてた。

でもfindの-permオプションはちょっと違う。 find ./ -perm +a+wとかある。aの前に+がついてる。これがよくわからなかった。

-permオプションの引数について

まず、findの-permオプションをmanで調べてみる。

-perm [|+]mode The mode may be either symbolic (see chmod(1)) or an octal num- ber. If the mode is symbolic, a starting value of zero is assumed and the mode sets or clears permissions without regard to the process’ file mode creation mask. If the mode is octal, only bits 07777 (S_ISUID | S_ISGID | S_ISTXT | S_IRWXU | S_IRWXG | S_IRWXO) of the file’s mode bits participate in the comparison. If the mode is preceded by a dash (“-”), this primary evaluates to true if at least all of the bits in the mode are set in the file’s mode bits. If the mode is preceded by a plus (“+”), this primary evaluates to true if any of the bits in the mode are set in the file’s mode bits. Otherwise, this primary evaluates to true if the bits in the mode exactly match the file’s mode bits. Note, the first character of a symbolic mode may not be a dash (“-”).

find – FreeBSD man pages

また、-permのオプションについて、chmodを参考に呼び方を調べてみる。

mode ::= clause [, clause …]
clause ::= [who …] [action …] action
action ::= op [perm …]
who ::= a | u | g | o
op ::= + | – | =
perm ::= r | s | t | w | x | X | u | g | o
chmod – FreeBSD man pages

それぞれの式はclause(句)、また一文字で表されるものはsymbol(シンボル)と呼んでいるみたいだ。

ファイルのパーミッションの対象はwhoシンボル、とでも言えば良いらしい。

さて、findの-permオプションでは、whoシンボルとしてa(all, すべて), u(user, owner, ファイルの所有者), g(group, グループ), o(other, その他)の四種類がある。

先の参考リンクにもある例と同じことをやってみた

例1) -perm -a+r

shell> find ./ -perm -a+r
./r--r--r--
./r--r--r-x
./r--r--rw-
./r--r--rwx
./r--r-xr--
./r--r-xr-x
./r--r-xrw-
(後略)

shell> find ./ -perm -a+r | wc -l
      64

(補注: wcの結果は、./と./test.plを除いたもので-2してカウント)
上記、 -perm -a+r は、”すべてのwho句(シンボル?)に対してrがついているファイル” を対象とするらしい。

そしてもう一つ

例2) -perm +a+r

shell> find ./ -perm +a+r
./------r--
./------r-x
./------rw-
./------rwx
./-----xr--
./-----xr-x
./-----xrw-
(後略)
shell> find ./ -perm +a+r | wc -l
       448

(補注: wcの結果は、./と./test.plを除いたもので-2してカウント)
上記、 -perm +a+r は、 “任意のwho句(シンボル?)に対してrがついているファイル” を対象とするらしい。
言い換えると “whoシンボルのうちいずれかに対してrがついているファイル” ということらしい。

検証
rwxrwxrwxの文字列permに対し、それぞれの呼び方をs1 〜 s9とする。
例えばs5はgに対してのwであり、とりうる値はenumで(‘w’, null)であるとする。
例1)に対して検証する。
s1, s4, s7がとなるような文字列permの組み合わせは、s2, s3, s5, s6, s8, s9が任意となるので
2^6 = 64
これは 例1) -perm -a+rと合致する。

例2)に対して検証する。
s1, s4, s7のいずれかがrとなるような文字列permの組み合わせは、
s1, s4, s7のすべてがnullとなるような文字列permの組み合わせの余事象となる。
s1, s4, s7のすべてがnullとなるような文字列permの組み合わせは先の例と同様で
2^6 = 64 なので
例2な組み合わせは
512 – 64 = 448
これは 例2) -perm +a+rと合致する。

なので、 -permのあと、whoシンボルにつくオプション、+と-については、次のように読み替えるといいのではないかな。
+ => すべての
– => いずれかの
例えば、
+a+rであれば、すべてのwhoシンボルに対してrが出ているファイル
-a+rであれば、いずれかのwhoシンボルに対してrが出ているファイル
ということかな。

ちなみに、whoシンボルがaでないときは全く同じ結果になるみたい。
+u+rと-u+rは同じ結果を導く。
でもちなみに、
-a-rとか、-g-rとか、opシンボルが-な指定には、すべてのファイルが該当するみたい。

さて、ここまでやってきたのだけれど、なにか大きく困ったことがある。
それは以下の-permオプションが思ったように動作しない、ということ。

shell> find ./ -perm o-w | wc -l
1 (すべてのパーミッションが落ちているファイル、---------がヒット)
shell> find ./ -perm -o-w | wc -l
 512 (すべてのファイル)
shell> find ./ -perm +o-w | wc -l
 0 (該当なし)

上記はoに対してrのパーミッションが落ちているファイル、を指定したいのだけれど、いずれもそのようには動作しない。

なんで動かないのか、というのは、permシンボルにたいして、opシンボルが-のものは受け付けない、ということなんだろう。
つまり、あるパーミッションが落ちているファイル、というのは、find側の条件で、 ! -perm +o+w のように書けばよいみたい。
ここで注意する点があって、
otherのwが落ちているファイル、というのは、 ! -perm o+w ではなく、 ! -perm +o+w である、ということ。
! -perm o+w であれば、otherのwのみが立っているファイル以外、つまり002以外のファイルを対象としてしまう。
! -perm +o+w であれば、otherのwが立っていて、ほかのパーミッションは何れかで良いファイル、を対象とする。今回はこれが欲しい。

ということで結論として
groupのwなどのパーミッションが落ちているファイルのパーミッションを所有者に沿って上げる場合、以下の三つを実行すれば良い。

shell> find ./ ! -perm +g+r -perm +u+r -exec sudo chmod g+r {} \;
shell> find ./ ! -perm +g+w -perm +u+w -exec sudo chmod g+w {} \;
shell> find ./ ! -perm +g+x -perm +u+x -exec sudo chmod g+x {} \;

注意事項として、びっくりマークと-permの間にはスペースを空けること、そうでなければシェルが!を解釈しようとして過去のヒストリから参照しようとしたりする。(at tcsh)
中括弧とバックスラッシュセミコロンの間にスペースを空けること、これはfindの-execに送る決まった書き方で、ここのスペースがないとうまく解釈できない。

そして何やら、chmodにパーミッションをほかのwhoシンボルに似せる、とかありそう•••

wordpressで許可されないメディアをアップロードしたいとき

wordpressで許可されないメディアをアップロードしたいとき。

アップロードされたファイルタイプは許可されていません
アップロードされたファイルタイプは許可されていません

この辺の設定っていうのは、functions.phpに書かれているらしい。ここを直接いじることでアップロードの許可、またアップロードされたファイルのmimetypeを指定することができるらしい。

今回は拡張子を.bin、ファイルの中身は実行可能なバイナリをアップロードしたかった。

さっくりググるとこの問題を解決するための方法があるらしい。

デフォルトの wordpress では、.reg ファイルをアップロードすると、「添付メディアの保存の際にエラーが発生しました。」「Sorry, this file type is not permitted for security reasons.」「このファイルタイプはセキュリティの観点から許可されていません。」などと文句を垂れて来る。

プラグインとかでぱしっと管理する方法が見当たらなかったので、WordPress › フォーラム » メディアライブラリにdoc xlmファイルがアップロードできない を参考に、直接ファイルを編集して無事うまくいった。
[wordpress] メディアライブラリに登録するファイルタイプを追加する « [email protected]

[email protected][email protected]ッシュをもとに作業をしてみた。
以下は上記webページの抜粋、加筆したもの。

単純にファイルをアップロードさせるためには二カ所を編集する必要がある。

一カ所目、

$WPDIR/wp-includes/functions.php

2425 行目あたりに function wp_ext2type( $ext ) があり、ここの配列、$ext2typeを修正してやる。

既にいくつかのタイプが用意されているが、こんかいは当てはまりそうになかったので新規に用意してみた。ここのキーワードがどのように作用するかは不明。


'binary'    => array( 'bin' ),

二カ所目
2548 行目あたりに function get_allowed_mime_types() がある。ここの$mimesという配列に加えることでmime typeを指定できるらしい。またおそらく、関数の名前、またこのファイル内でこの関数が利用されている箇所から、ここにリストされた拡張子がアップロードの許可を得るのではないかな。


'bin' => 'application/octet-stream',

これでメディアライブラリからファイルのアップロードができるようになった。

 

おわりに

最後に、憂慮すべきことはwordpressを構成するファイルに手を加えてしまっていることだ。

おそらくwordpressのアップデートでこのファイルタイプは再びアップロードができなくなるだろう。またmimetypeも不明となって動作はapacheなどのhttpdで規定された動作になるんじゃないだろうか。

この問題をうまく回避したいときにはちゃんとプラグイン化してやればいいと思うよ。

Mac OS XでVNC接続をクライアント側として行いたい場合

Mac OS XでVNC接続をクライアント側として行いたい場合。
サーバとしてDebianでVNCサービスがたっており、そこにMac側からVNCで接続したかった。
さっくりぐぐったらChiken vncなるものがでてきたのだけれど、これをつかったら画面がまるまる占有されてしまい、戻るに戻れなくなってしまった。おかげさまで強制終了をすることになってしまった。

で、もうちょっといろいろググってみるとどうやら10.5からVNCのクライアントがデフォルトでついてきてるらしい。
考えてもみれば、windowsにはrdpを利用して、macにはfinderから接続できてしまうので、vncを純粋に使いたいっていう状況となれば、windowsにvncで接続をするときか、はたまた*nix系のx window systemを共有するときしか使う機会がない、ってことだ。

また10.5からデフォルトになったことで、クライアントがosに付属するってことは周知の事実なのか、なかなかこのosにデフォルトで付属っていう情報にあたらず、ちょっと参ってしまった。

Mac OS X v10.5では、VNCクライアント「画面共有」及びVNCサーバが内蔵されている。
VNCクライアントを利用する場合は、Finderのサイドバーの共有に表示されている機器を選択し「画面共有…」を選ぶか、IPアドレスを入力して使う場合は、「/システム/ライブラリ/CoreServices/画面共有(“/System/Library/CoreServices/Screen Sharing.app”)」を起動する、またはFinderの「移動」メニューから「サーバを経接続…」を選び、サーバアドレスに「vnc://」+ IPアドレスを入力し接続する。
VNCサーバを利用する場合、「システム環境設定」→「共有」→「サービス」で出てくるサービス一覧から「画面共有」 をオンにするか、「リモートマネージメント」をONにして画面右下にある「アクセス権…」ボタンを押すと出てくる設定パネル内で「VNC使用者が画面を操作することを許可」をオンし、VNC接続のためのパスワードを右の欄に設定する。

Virtual Network Computing – Wikipedia

さて、ローカルへの接続であればFinderの左のリストからいけるらしい。今回接続を行いたかったケースでは、残念ながらローカルながらルータで分割されているのでここには出てこない、んだと思う。ので、IPアドレス直打で接続を行った。

Mac OS X 10.7.1 Lion でマウスの加速を切る方法

Mac OS X 10.7.1 Lion でマウスの加速を切る方法。

Mac OSではマウスやトラックパッドの加速度周りの設定は一切ない。細かく設定したくともせいぜいマウスの移動速度やダブルクリックの速度までだ。

でもこれはWindowsを除く*nix系のX Window Systemでも同様のこと。

加速があると決まったマウスの移動量で決まったカーソルの移動量とならないのでストレスがたまっちゃう。なのでこれをオフにする方法。


shell> curl -O http://ktwit.net/code/killmouseaccel
shell> chmod +x killmouseaccel
shell> ./killmouseaccel mouse

Kill Mac OS X Mouse Acceleration from the command line

バイナリをktwit.netってトコロから落としてきて、それを実行する。引数にはmouseって与えればいいみたい。
ここに与えるデバイスの名前リストとかはちょっとわからなかった。

バイナリを配布してるサイトに行ってみたけれど、別段このバイナリに対する説明は見当たらなかった。元々はほかの名前で配布されていたものではないのかな、と勝手に推測。

この配布しているサイトが死んでしまうとちょっと困ってしまうので自分の手元でアーカイブする。

FreeBSD 8.2でPHPのアップデートが出来ない

FreeBSD 8.2でPHPのアップデートが出来ない。

この問題は結構前から起こってて、なにげに苦しんでたりした。

PHP自身のバグというか、拡張モジュールが読み込まれない問題に遭遇してて、PHPの入れ直しをしたいなぁと思っていたのだけど、この問題のせいで入れ直しが出来なかった。

問題というのは、portsを利用してphp周りのパッケージをコンパイルするときに、途中でエラーが発生してコンパイルができない。もうちょっと詳しく言うとautoconfの2.68がnot foundって言われて止まってしまうのだ。

この問題に対していくつかの対策を行おうとした。だけれどダメだった。autoconfの入れ直しは行った。複数のバージョンを入れてシンボリックリンクで入れ替えてみたりした。autoconf-wrapperとシンボリックリンクを入れ替えてみた。でもダメだった。

でも今回ちょっとだけググったらうまくいった様子。それについてのメモメモ。

まずは問題点。portupgradeでコンパイルしようとすると./configure?の段階でエラーが出てしまう。


shell> sudo portupgrade -r php5

===>  PHPizing for php5-mcrypt-5.3.6
 Configuring for:
 PHP Api Version:         20090626
 Zend Module Api No:      20090626
 Zend Extension Api No:   220090626
 autoconf: required version 2.68 not found
 *** Error code 1

Stop in /usr/ports/security/php5-mcrypt.

(後略)

phpに関連するヤツはことごとくダメ。マジでダメ。

2.68 not foundって言われる割にはautoconfの2.68がちゃんと入ってる。


%pkg_info -Ix autoconf
 autoconf-2.68 Automatically configure source code on many Un*x platforms
 autoconf-wrapper-20071109 Wrapper script for GNU autoconf

ここでaucotonf 2.68 not foundあたりのキーワードでググってみるとまさにFreeBSDでPHPをコンパイルするときにエラーがでている人を発見。で、その人はこんな事を書いてる。

IMPORTANT: if you have either devel/autoconf-wrapper or
devel/automake-wrapper installed on your system (and you most likely do)
PLEASE update these ports to their new versions before updating anything
else — Bad Things[tm] are likely to happen otherwise.

"autoconf: required version 2.68 not found" error when trying to make php5 from FreeBSD's ports - Knowledge Base #54

さっくり翻訳すると、autoconf-wrapperかautomake-wrapperをインストールしている場合には、それらをアップデートしましょう、との事。早速確認してみる。


shell> sudo portversion -vL= | grep autoconf
 autoconf-wrapper-20071109   <  needs updating (port has 20101119)

確かに古い。ってことでアップデートをする。


shell> sudo portupgrade autoconf-wrapper-20071109

これでPHPのコンパイルがちゃんとできるようになった。めでたしめでたし。

rsyncで大量のファイルをコピーした

rsyncで大量のファイルをコピーした。
回線はインターネットVPN越し、asahi-netとocnがそれぞれのISP。

利用したコマンドは

shell> rsync -arvz 192.168.2.1:/hoge/fuga ./hoihoi/
(中略)

sent 112137 bytes  received 38402767035 bytes  2392926.39 bytes/sec
total size is 38389426720  speedup is 1.00

トータルで6000ファイル強、38GBの転送。2.392 MB/sで4.45時間かかったみたい。結構速度出てるなぁ。

でも途中途中ではばっちり帯域制限かけられてた。

Ubuntu serverのNFSをMac OS X 10.7.1でマウント

yousanに聞かれて試行錯誤してたんだけど、うまくいかなかったので、自分の環境でもやってみた。
元々うちではNFSを使ってなかったんだけど、よく考えたらNISも入れてるし、MacとWindows以外はUIDもGIDも同じなので、ちょっと使ってみることにした。

まず、Macで
/アプリケーション/ユーティリティ/ディスクユーティリティ.app
(/Applications/Utilities/Disk Utility.app)
を開いて、メニューの “ファイル”->”NFS マウント” を開く
左下の+ボタンを押して項目を追加する。

リモートNFSのURLは、少し注意が必要で、nfs://server_address:/path は動作しない
必ず nfs://server_address/path で、コロンを入れない事。
マウント先は好きなように指定して問題なくて、ディレクトリは自分で作る必要が無い。むしろ存在しない方が良い?

で、詳細マウントパラメータには、サーバ側の設定にもよるけど、まず必要なのが
resvportとnolocksとlocallocks
それ以外は環境によって。

後はNFSマウントのウィンドウを閉じようとすると、管理者パスワードを聞かれるので、入力したら終わり。
マウント先をlsしてみるとマウントされてると思うけど、サーバがUbuntuの場合はおそらく、UID/GIDが1000から開始されるので、Macの501から開始と食い違ってる。map_staticとか試してみたけど、反映されなかったのでMac側のUID/GIDを変更することにした。

一応、sudo suでルートのターミナルを作ってそこで作業する
MacのUIDが501 GIDが20
UbuntuのUIDが1000 GIDが1000
の場合

#dscl . -change /Users/username UniqueID 501 1000
#dscl . -create /Groups/groupname
#dscl . -create /Groups/groupname name groupname
#dscl . -create /Groups/groupname gid 1000
#dscl . -change /Users/username PrimaryGroupID 20 1000
#dscl . -append /Groups/staff GroupMembership yubird

で、Macのユーザ所有ファイルなどのパーミッションがおかしくなったので修正

#cd /Users
#chown -R username:groupname username

もしかしたらApplicationsでも、ドラッグアンドドロップで追加した物がおかしくなってるので、同様にchownしてやればいい。
id username の結果が良さそうなら再起動して、マウント出来ている事を確認