2014年10月2日木曜日

WordpressのBackWPupでfalse http statusエラーが出た際の対処

WordpressのBackWPupで以下のようなエラーが出た
The HTTP response test get a false http status (401).
ちょっと調べるとサイトにBASIC認証がかかっていると発生してしまうらしい。
認証解除すればOK、とのことだけど、認証する必要があるから認証かけてるわけで。

もうちょっと調べてみると、SettingsのNetworkにユーザIDとパスワード入れればいいらしい。

ちゃんと動いた!やったね!

2014年5月16日金曜日

PerlのFile::Tailでハマった

Perlでtail -fみたいなことがしたくて、File::Tailに辿り着いた。

サンプルを見て書いてみた。けど、何も出力されない…。
use File::Tail;
$file = File::Tail->new(name => "test.txt");

while( defined($line = $file->read)) {

  print "$line";

}
ちょっと調べてみると、マニュアルにmaxintervalなるものがある。
http://search.cpan.org/~mgrabnar/File-Tail-0.99.3/Tail.pm



maxinterval
The maximum number of seconds (real number) that will be spent sleeping. Default is 60, meaning File::Tail will never spend more than sixty seconds without checking the file.

これか。要は60秒ほど待ってしまうわけだ。
さっきのサンプルを動かして、放置しておくと1分経てば出力されていた。

なるほど。

とりあえずすぐ見たいので、maxintervalを1秒に変更すると、更新から1秒後に出力されるようになった。



ただ、本当はファイル全体を読み込んで、かつ、tail -f のようにしたい。

これは
$file->tail(-1);
すれば出来ますよ、みたいなのを見つけてやってみたけど、動かない。

マニュアルに戻ると、tailはnewのargmentsになってるので、以下のように書き換え。

use File::Tail;

$file = File::Tail->new(name => "test.txt", maxinterval => 1, tail => -1) or die("cannot tail test.txt");

while( defined($line = $file->read)) {

  print "$line";

}
ちゃんと動くようになった。

2013年2月28日木曜日

Win7で2012年12月から802.1xが繋がらない

無線LANに802.1xで繋いでいるんだけれど、Windows 7から急に繋がらなくなった。
思い当たるのはWindows Update。
でも、なかなか情報がなくて放ったらかし状態にしていたが、少し仕事が落ち着いたのでやっと調べてみることに。

ズバリこれでした。
http://serverfault.com/questions/391959/nps-eap-authentication-failing-after-windows-update


In December 2012, this issue occurred for many people when Microsoft messed up update KB931125 on December 11th 2012 by accidentally applying the root cert update to clients and servers, when it should've only been applied on clients. This added hundreds of 3rd-party root certificates to the trusted root certs list on servers, causing problems like you showed.
Took me long enough to find it, but MS has an article and fix available at KB2801679 "SSL/TLS communication problems after you install KB 931125".The faulty update has since been expired on Windows Update and WSUS, but if you've already applied it, you can clean up the root cert list by running the Fix-it provided in the article on all affected servers. 
どうやらMicrosoftがルート認証局の更新を間違って、サーバにも当ててしまったらしい。
で、大量のルート認証局の情報を送ってしまい、認証時のメッセージのサイズが肥大化し、適切なサイズにおさまらなくなって、認証失敗、と。

サーバでリンクのFix itを動かせばすぐに直りました。

解決してよかったけど…、FixもUpdateで送ってくれ、放置しないでくれ、と思ったり。

ネットワーク ポリシー サーバのイベントログが記録されない

802.1xでうまく繋げないPCがあり、なんでだろう?と調べようとしたところ、ネットワーク ポリシー サーバ(Network Policy Server, NPS)のイベントログが記録されていないことに気が付いた。

デフォルトで勝手に記録されるはずなんだけど…。

強制的に書く方法もあったので、手順通りにやってみた。
http://support.microsoft.com/kb/951005/ja

機械翻訳とはいえ、ひどい日本語だな…。
なんとなくわかるけど、コマンドを勝手に訳すのはやめてくれ。
これじゃ通らない…。
"ネットワーク ポリシー サーバ"とかやってみたが、エラーになる…。
スペースが全角かとか英語にしてみるとかやってみたけど、問題は"サーバ"じゃなくて、"サーバー"なのね。

正しくはこちら

auditpol /set /subcategory:"ネットワーク ポリシー サーバー" /success:enable /failure:enable

実は地道に

auditpol /list /category /v

でGUID出して、

auditpol /list /subcategory:{...上で取ったGUID...}

と、頑張って正しい名前を見つけたんだけど…。

しかし、こういうサービス名は訳して欲しくないなぁ…。
個人的には日本語にするんでも、表示名だけとかにして欲しいけど、「全部日本語で!」という人もいるんだろう。
Microsoftも悩ましいところかな。

2013年1月23日水曜日

perlでPicasaの写真をダウンロード

perlでPicasaウェブアルバム上の写真を取りたくなった。
CPANでモジュールを探してみたところ、ちゃんとありました。
http://search.cpan.org/~hanenkamp/Net-Google-PicasaWeb-0.11/

cpanでインストールして早速試してみる。

アルバムごとにディレクトリを作って、その下に写真をダウンロードするスクリプト。


use Net::Google::PicasaWeb;

my $service = Net::Google::PicasaWeb->new;

$service->login('YOUR USER ID','YOUR PASSWORD');

my @albums = $service->list_albums(user_id => 'YOUR USER ID');

foreach my $album (@albums) {
  print "Album ID: ", $album->entry_id, "\n";

  mkdir $album->entry_id;

  my @photos = $album->list_media_entries;
  foreach my $photo (@photos) {
    my $media_info = $photo->photo;

    my $main_photo = $media_info->content;
    print "Image URL: ", $main_photo->url, "\n";

    my $photo_data = $main_photo->fetch;
    $main_photo->fetch( file => $album->entry_id . "/" . $media_info->title );
  }
}



アルバム名の方が分かりやすいけど、日本語を使いたくなかったのでアルバムIDを使っただけなので、アルバム名の方がよければ
$album->title
を使ってください。

list_albumsで指定するuser_idは自分にアクセス権があれば他のユーザ名でもいけるらしい。試してないけど。

ALMiniumでbashのシンタックスハイライト

redmine+backlogsの環境を構築するのに、ALMiniumを利用した。
(自分でやってハマったせいもある)
https://github.com/alminium/alminium

便利になったなぁ…。
インストールに時間はかかるけど、シェルスクリプト起動しただけでほとんど終わった。

そのまま利用していたが、bashやperlのシンタックスハイライト(syntax highlight)が出来ない。
よく使うのになぁ…。

シンタックスハイライトにはcoderayというものを使っており、現在のバージョン(1.0.8)だと対応言語が少ない…。
http://coderay.rubychan.de/
1.1ではかなり増やす予定らしいが、現時点では使えない

ultravioletという似たようなツールもあり、こっちの方が圧倒的に対応言語が多いのでこっちを使ってみたかったけど、redmineのプラグインは1.3までしか対応してないし、開発も2年前くらいで止まってしまっているような感じ…。
一応、試してみたけどエラーが出てしまって、うまく行かない

coderayでなんとかするしかないかなぁ~と探してみたところ、bashのcoderayスキャナーは発見。
https://github.com/pejuko/coderay_bash
http://odd-eyed-code.org/issues/31
でも、どっちも動かなかった…。

で、発見したのがこちら。
http://www.redmine.org/boards/3/topics/29926

ここのbash.rbをダウンロードして、rubyの/coderay-1.0.8/lib/coderay/scanners入れたら、あっさり動いた!

自分の場合は、/usr/lib/ruby と /usr/lib64/ruby の両方があって、困惑したけど以下のスクリプト書いてパスを出させたらすぐ分かった。

require 'rubygems'

version = '1.0.8'

gem 'coderay', version
print Gem.bin_path('coderay', 'coderay', version)


こんな感じで動きました!

# .bashrc

# Source global definitions
if [ -f /etc/bashrc ]; then
        . /etc/bashrc
fi

# User specific aliases and functions



2012年11月9日金曜日

Javaから表示灯を操作する

JavaからPatlite社やアイエスアイ社の警子ちゃんを操作するクラスを書いたので、公開。 SNMPでやってます(rshでも書いたけど、Linuxから動かしたらPermission deniedになってしまったので)。
https://github.com/doitnow420/snmp-tool 

あ、snmp4jのフリー版使ってます。
http://www.snmp4j.org/

赤、黄色、緑とブザーしか対応してません。
それぞれにON/OFFのステータスを持ってて、状態変化がなければSNMPは発行しない。
 秒数対応もなし。 
いろいろ足りないと思うので、適当にひな形というかサンプル程度と思って使ってください。

2012年8月23日木曜日

Ciscoの設定ファイルを自動SVN管理

Ciscoの設定をいじって、あとあと「しまった!」と思うことがあったりする。 何をどう変えたか分からなくなってしまったり…。 変更ごとにtftpでローカルに落として、自分で世代管理して、とかやってたけど、やっぱり面倒。 世代管理はSVNに任せられるから、リポジトリを作ってみた。
そうすると欲が出てきて、なんとか自動的にできないかなぁ、と思ってきた。
Linuxサーバからなんらかの方法でconfigが取れれば、あとはSVNのワーキングディレクトリに突っ込めばどうとでもなる。 ここがどうにかならないか、と調べて分かったのが、PerlのNet::Telnet::Ciscoモジュール。 Perlで、Ciscoデバイスにtelnet接続し、任意のコマンドを実行できるモジュールらしい。 これで入って、show running-config でも show startup-config でも実行すれば求めるものは取れる。 ということで、簡単なPerlスクリプトを書いてみた。 とりあえずget_config.plと命名。

#!/usr/bin/perl
# オプション解析モジュールのロード
use Getopt::Long;
# Ciscoコマンド操作モジュールのロード
use Net::Telnet::Cisco;

# IPアドレス
my $host = '';
# ユーザ名
my $username = '';
# vtyログインパスワード
my $password = '';
# ENABLEモード パスワード
my $epassword = '';

GetOptions( 'host=s' => \$host, 'username=s' => \$username, 'password=s' => \$password, 'epassword=s' => \$epassword );

# Cisco.pm用オブジェクトの作成 -> ルータに接続
my $obj_Session= Net::Telnet::Cisco->new( Host => $host );

# vtyパスワードを用いてログイン
$obj_Session->login($username, $password, );
# enable
$obj_Session->enable( $epassword );

# コマンドの実行
@cmd_output = $obj_Session->cmd('show running-config');

# コマンド実行結果のアウトプット
print "Last command: <", $obj_Session->last_cmd, ">\n";
print "Last error: <", $obj_Session->errmsg, ">\n";
print "Cmd output: <", @cmd_output, ">\n";

exit 0;
./getconfig.pl -h <ホスト名> -p <パスワード> -e <特権モードパスワード> で、sh run 結果を返してくれる。 まぁ、最初と最後に若干情報が出るけど…。
$ ./get_config.pl -h 172.xxx.xxx.xxx -p password -e enable_password
Last command:
Last error: <>Cmd output:Current configuration : 18623 bytes ! ! Last configuration change at 11:58:40 JST Fri Aug 17 2012 ! NVRAM config last updated at 11:05:37 JST Sat Aug 11 2012 ! ~(省略)~ end
>
ここからシェルスクリプトの出番。 最初3行と最後1行は不要なので、続くシェルスクリプトで削る。 あと、やってみると分かるけどntp clock-periodはよく変わるので、有用な情報とは言えないので削る。 Ciscoデバイスの名前、IPアドレス、ログインパスワード、特権モードパスワードをスペース区切りでテキストファイルに保存。 cisco_file.txtとしよう。 こんな感じ。

cisco_router1 172.xxx.xxx.xxx password1 enable_password1cisco_router2 172.yyy.yyy.yyy password2 enable_password2
SVNのワークディレクトリを作っておく とりあえず
/home/foo/networks/trunk
にした
シェルスクリプトを実行すれば、指定したCiscoデバイスの設定ファイルを取って、SVNのワークディレクトリに書き込み。 で、SVNコミットさせる。 違いがあれば、コミットするし、なければコミットしない。 とそんな仕様のスクリプト。

#!/bin/bash

# Cisco機器のstartup-configファイルを取得し、リポジトリと違っていればコミットしておく

REPO=http://<リポジトリ>/networks/trunk
WORK_DIR=/home/foo/networks/trunk

PNAME=$( basename $0 )

# Cisco機器の名前、IPアドレス、ログインパスワード、Enableパスワードをスペース区切りで
CISCO_FILE=/home/foo/cisco_file.txt

get_config()
{
  typeset HOSTNAME=$1
  typeset HOST=$2
  typeset PASSWD=$3
  typeset ENABLE_PASSWD=$4

  ./get_config.pl -h $HOST -p $PASSWD -e $ENABLE_PASSWD | sed '/^ntp clock-period/d' | sed -e '1,3d' | sed -e '$d' &gt; $WORK_DIR/${HOSTNAME}.config
}

while read LINE
do
  get_config $LINE
done &lt; $CISCO_FILE

if [ "$1" != "" ]
then
  echo "You can commit by $ svn commit -m \"comments\" $WORK_DIR"
else
  svn commit --username  --password  -m "Change detected. Automatically commited by $PNAME" $WORK_DIR
fi
これをcheckciscoconfig.shと命名して、crontabで毎晩23:30とかに仕込んでおけば、その日の変更は必ずコミットされる。
30 23 * * * /home/foo/checkciscoconfig.sh > /dev/null
コメントは実態を反映していないけど、「忘れた!」よりマシという考え。
手動実行でちゃんとコメント付けてコミットしたいときは、
./checkciscoconfig.sh manual
とか、とにかく引数を与えてやれば設定ファイルだけをとってくるようになってます。

2012年8月21日火曜日

TeraTerm Menuのリストを移行


TeraTerm Menuを便利に使ってます。
サーバ情報がそれなりにあるので、これはかなり便利。

なんだけど、PCを移行しようとしたらレジストリに保存していることが分かった。
レジストリをエクスポートしてインポートすれば行けるのかもしれないが、あんまりやりたくないなぁ…。

調べていたら、ttpmenu.iniをttpmenu.exeと同じディレクトリに作れば、テキストファイルで管理できる、とあった。
「それは便利じゃん!」と思ったが、もう少し調べると、それをやっちゃったら設定全部消える。
http://es.sourceforge.jp/ticket/browse.php?tid=11329&group_id=1412
http://www.trapon.jp/log/201205/teraterm_menu.html

まだサーバ情報何も入れていない新しいPCでttpmenu.iniを作成。
TeraTerm Menuを起動して、適当に情報を入れてみる。
で、ttpmenu.iniを確認。
古いPCのレジストリも確認。

当たり前だけど、フォーマットはほぼ同じ。

あ、これ変換スクリプトとか書けそうかも、と思い、作ってみました。
レジストリからttpmenu.iniへの変換になります。

1. regeditで「HKEY_CURREN_USER\Software\ShinpeiTools\TTermMenu」以下をエクスポート(仮にttermmenu.regとする)
2. シェルスクリプトが動かせる環境で以下を作成(仮にmake_ttpmenu.shと命名)
#!/bin/bash

while read LINE
do
  echo $LINE     |
  sed s/\"//g    |
  sed s/://g     |
  sed "s/,/ /g"  |
  sed s/dword//g |
  sed s/hex//g

done < <( nkf --utf8 $1 | sed -e '1,2d' | sed "s/HKEY_CURRENT_USER\\\Software\\\ShinpeiTools\\\//g" | sed "s/TTermMenu\\\//g" )
3. 上記スクリプトにエクスポートした*.regファイルを与えると、標準出力に吐き出すので、リダイレクトさせてttpmenu.iniを作成
$ make_ttpmenu.sh ttermmenu.reg > ttpmenu.ini
4. これを新しいPCのttpmenu.exeと同じフォルダに置けば移行完了。

見ての通り、適当に作ったので「うまく引き継がれていない」等あるかと思うけど、自己責任でお願いします。

2012年8月17日金曜日

EIGRPあれこれ


EIGRPで分かったこと
詳しい人から見たら当たり前なんだろうけど…。


  • インターフェイスの遅延と帯域幅
    EIGRPのデフォルトでメトリック計算に使われる。
    誤解していたんだが、「遅延」は実際のパケットの到達時間とかで自動的に割り出してくれるものではない。
    両方とも静的。
    管理者の裁量である程度変えてもよさそう。
  • VLAN上のインターフェイスの遅延と帯域幅
    VLAN上にインターフェイスを乗っけていたら、いくらインターフェイスの帯域幅と遅延をいじってもメトリックが変わらなかった。
    なんで?と調べてみたら、こういう場合はインターフェイスをいじっても仕方ないのね。
    該当のVLANを変えないと。
    int vlan
    でdelay 500
    とかやったらすぐに反映された。


Nagios備忘録


Nagiosを3.0rc3から3.2.3にした。
これでも古いけど、rpmが見つからなかったのでとりあえず。


  • 設定ファイル
    3.0:
    /usr/local/nagios/etc/nagios.cfg
    /usr/local/nagios/etc/minimal.cfg
    (やり方によるんだろうが、自分はminimal.cfgで設定してた)

    3.2.3:
    /etc/nagios/nagios.cfg
    /etc/nagios/objects/以下
  • プラグイン
    3.0:
    /usr/local/nagios/libexec

    3.2.3:
    /usr/lib/nagios/plugins
  • ホスト追加

    /etc/nagios/objects/ホスト名.cfg で
    define host {...}
    を埋める

  • サービス追加
    /usr/lib/nagios/plugins に新サービスとなるプログラム、スクリプトを作成
    /etc/nagios/objects/commands.cfg で
    define command {...}
    を埋める

  • 追加対象のホストのファイル
    /etc/nagios/nagios.cfg で
    cfg_file=/etc/nagios/objects/ホスト名.cfg
    を追加

  • 設定ファイルのチェック
    /usr/bin/nagios -v /etc/nagios/nagios.cfg
    でチェック可能
  • メール通知先の変更
    /etc/nagios/objects/contacts.cfg で
    email nagios@localhost
    部分を任意のアドレスに変更
  • 通知メールの文面変更(メール本文)
    /etc/nagios/objects/commands.cfg の
    'notify-service-by-email'のcommand_line部分を変更

デフォルトでは、Additional Infoだとブラウザで見たときに見える詳細が見えない。
わざわざ参考になる情報を出すようにスクリプトを組んだのに、通知メール→ブラウザで確認するんじゃワンアクションもったいない。
なので、ここを変えてみる。
        command_line    /usr/bin/printf "%b" "***** Nagios *****\n\nNotification Type: $NOTIFICATIONTYPE$\n\nService: $SERVICEDESC$\nHost: $HOSTALIAS$\nAddress: $HOSTADDRESS$\nState: $SERVICESTATE$\n\nDate/Time: $LONGDATETIME$\n\nAdditional Info:\n\n$SERVICEOUTPUT$\n\n$LONGSERVICEOUTPUT" | /bin/mail -s "** $NOTIFICATIONTYPE$ Service Alert: $HOSTALIAS$/$SERVICEDESC$ is $SERVICESTATE$ **" $CONTACTEMAIL$

$LONGSERVICEOUTPUTを足しただけ。


こちらが参考になった。
http://www.marsandares.jp/tools/nagios-config.html

2012年2月17日金曜日

BitNami Redmineの自動起動



便利だけどインストールまでにいろいろすることが多いRedmine。
その面倒なところを全部やってくれるのでBitNamiでインストールしてみた。
メニューで選択していくだけなんで、ものすごく簡単。
「こりゃあ快適~」なんて悦に入っていたけど、サーバを再起動したら動いてない…。


「どこから起動するんだっけ?」と思い、調べてみると
# /opt/redmine-<バージョン>/ctlscript.sh start
でOK。


でも、毎回起動するのメンドイなぁ。
ctlscript.shを/etc/init.d/に持ってきてchkconfig -addでうまく行くか?と思ったけど、chkconfigから「サポートしてない形式」、と言われてしまった。


ってことでさらに調べてみるとここにあたった。
http://bitnami.org/article/how-to-install-services-on-linux
上の例はdrupalだけど、redmineでも他のでも応用可能なはず。


# cp /opt/redmine-<バージョン>/ctlscript.sh /etc/init.d/bitnami-redmine
としただけではダメで、ちょっと編集しないといけないらしい。
最初の4行がこうなるように


#!/bin/sh
#
# chkconfig: 2345 80 30
# description: BitNami Service
runラベルが2345のときは起動して、起動の優先度を80、停止の優先度を30にしてくれるはず。


これで
# chkconfig --add bitnami-redmine
# chkconfig --list bitnami-redmine
bitnami-redmine 0:off   1:off   2:on    3:on    4:on    5:on    6:off


素晴らしい!
再起動してみても、ちゃんと自動起動してくれました!


一応、/etc/rc.d/rc3.dを見てみるとちゃんとS80で動いてる
# ll /etc/rc.d/rc3.d/*bitnami*
lrwxrwxrwx 1 root root 25  2月 17 16:33 /etc/rc.d/rc3.d/S80bitnami-redmine -> ../init.d/bitnami-redmine
さらにrc0.dを見るとK30となってました
# ll /etc/rc.d/rc0.d/*bitnami*
lrwxrwxrwx 1 root root 25  2月 17 16:33 /etc/rc.d/rc0.d/K30bitnami-redmine -> ../init.d/bitnami-redmine


これで楽々!

2012年2月14日火曜日

HP-UXのシェルスクリプトで親プロセスのIDを取得する


GNUコマンドがふんだんに使えるLinuxが好きだけど、職務上HP-UXも使ったりする。
シェルスクリプトで親プロセスを取得したくて、いろいろ調べた時に分かったのでちょっと書いておきます。


#!/bin/sh
PID=$$
PPID=$( UNIX95="" ps -o ppid -p $PID | tail -1 )
PCOMM=$( UNIX95="" ps -o comm -p $PPID | tail -1 )
echo PID: $PID
echo PPID: $PPID
echo PPCOM: $PCOMM


実行結果
% sh ./test.sh
PID: 27324
PPID: 25107
PPCOM: -zsh

と一致しているので大丈夫でしょう。

分かりにくいのはここ。
PPID=$( UNIX95="" ps -o ppid -p $PID | tail -1 )

というのもpsもmanを見てみると、-o format とあるものの「UNIX標準の構文」の部分。
英語だとXPG4の部分。
普通に
ps -o pid
としても
ps: オプションが正しくありません。-- o
とか出てくる。

なにこれ、どうすんの?と思ったら、ここを見つけた。
http://d.hatena.ne.jp/cartooh/20050611

要は環境変数UNIX95がセットしてあればいいらしい。値はダミーでもいいみたい。
% UNIX95="dummy" ps -o pid
  PID
26857
25107

…やっぱりLinuxが好きだなぁ~。

2012年2月8日水曜日

DELL PowerEdgeのRAID状態を監視


RAID1で組んでいたDELLのLinuxサーバで、ディスクが片方死んでいたのに気付かず、片肺のまま放置されていた。
再起動をきっかけに死んでいたディスクが一時的に復活し、数週間前の状態に両方のディスクを同期してくれた…。
つまりは、ここ数週間にあった更新が全て消えた…。
バックアップは取っていたけど、一世代前しかなくて、さらにそれも同期された後に気付いた。
どうしようもない…。


実話だけど、二度とこんなことがないようにバックアップ先を複数にして、さらに世代化した。
で、RAIDが死んでたのに気付かない、なんてことがないように監視をしたい。


DELLサーバなので、Open Manage Server Administratorを使えばいいらしい。


参考にしたのはこの辺り。
http://d.hatena.ne.jp/kno1020/20081007/1223387709
http://satospo.sakura.ne.jp/blog_archives/tech/hardware/r210_omsa.html
http://linux.dell.com/wiki/index.php/Repository/OMSA


yumでインストールするために、リポジトリを追加
# wget -q -O - http://linux.dell.com/repo/hardware/latest/bootstrap.cgi | bash
コマンドだけあればいいので、srvadmin-baseとsrvadmin-storageservicesをyumでインストール
# yum install srvadmin-base srvadmin-storageservices
インストール完了後、勇んでコマンドを打ってみる
# omreport
-bash: omreport: command not found
「あれ?」と思い、ログを見たら
     **********************************************************
     After the install process completes, you may need
     to log out and then log in again to reset the PATH
     variable to access the Dell OpenManage CLI utilities
     **********************************************************
としっかり書いてありました。


一回ログアウトして、ログインし直したら、ちゃんとUsageが出た。


よしよし、いい調子。
試しにちょっとやってみよう。
# omreport chassis memory
Memory Information
Error : Memory object not found
え、メモリが見えないって…。
他にもポートもプロセッサもやってみたけど、どれもnot found。
CentOSのバージョン?PowerEdge T100はサポートされない?インストールの問題?とかいろいろ考えたけど、ちょっと調べてみたら、OMSAが起動してない、と。


では、OMSAを起動する方法は?と調べたところ、以下でいいらしい
# /opt/dell/srvadmin/sbin/srvadmin-services.sh start
Starting Systems Management Device Drivers:
Starting dcdbas:                                           [  OK  ]
Starting dell_rbu:                                         [  OK  ]
Starting Systems Management Data Engine:
Starting dsm_sa_datamgrd:                                  [  OK  ]
Starting dsm_sa_eventmgrd:                                 [  OK  ]
Starting DSM SA Shared Services:                           [  OK  ]
libstdc++.so.5 is required to run the Inventory Collector.
あら、何かエラーだ。
libstdc++がないならインストールしてやればいいだけか。


# yum install compat-libstdc++-33
サービスの再起動
# /opt/dell/srvadmin/sbin/srvadmin-services.sh restart
Shutting down DSM SA Shared Services:                      [  OK  ]

Stopping Systems Management Data Engine:
Stopping dsm_sa_eventmgrd:                                 [  OK  ]
Stopping dsm_sa_datamgrd:                                  [  OK  ]
Stopping Systems Management Device Drivers:
Stopping dcdbas:                                           [  OK  ]
Stopping dell_rbu:                                         [  OK  ]
Starting Systems Management Device Drivers:
Starting dcdbas:                                           [  OK  ]
Starting dell_rbu:                                         [  OK  ]
Starting Systems Management Data Engine:
Starting dsm_sa_datamgrd:                                  [  OK  ]
Starting dsm_sa_eventmgrd:                                 [  OK  ]
Starting DSM SA Shared Services:                           [  OK  ]
エラーもなし。毎回ここで起動するのも面倒。
あ、enableすればそれでいいらしい



# /opt/dell/srvadmin/sbin/srvadmin-services.sh enable
instsvcdrv      0:on    1:off   2:off   3:on    4:on    5:on    6:on
dataeng         0:off   1:off   2:off   3:on    4:on    5:on    6:off
dsm_om_shrsvc   0:off   1:off   2:off   3:on    4:on    5:on    6:off


# omreport storage pdisk controller=0
List of Physical Disks on Controller SAS 6/iR Adapter (Slot 2)
Controller SAS 6/iR Adapter (Slot 2)
ID                        : 0:0
Status                    : Ok
Name                      : Physical Disk 0:0
State                     : Online
~(略)~
ID                        : 0:1
Status                    : Ok
Name                      : Physical Disk 0:1
State                     : Online
~(略)~


うまく行った!!
あとはこれをNagiosかなんかで定期的に実行してステータス確認すればよさそう。


コマンドのマニュアルはこちら
http://support.dell.com/support/edocs/software/svradmin/5.4/ja/cli/report.htm

2011年12月27日火曜日

Visioで接続ポイントを追加する


プログラムの相関図をVisioで描いていて、「一つのオブジェクトに複数のプログラムがアクセスする」という事象に遭遇した。
単に、そのままコネクタを接続させれば目的は果たせるんだけど、一つの図形にコネクタが何本もくっついて、コネクタの方はみんな重なって表示されてしまって、どうにも見づらい…。
どうにかならないのかなぁ、と思って調べていたらオブジェクトの接続ポイント増やせばいいことが分かった。
http://office.microsoft.com/ja-jp/visio-help/HP001231166.aspx

簡単に書くと

  1. メニューの[表示]から[接続ポイント]をクリックして、接続ポイントツールを使えるようにする
  2. 接続ポイントを追加したい図形をクリック
  3. [コネクタツール]の横の▽をクリックして[接続ポイントツール]を選択
  4. 接続ポイントを追加した図形上で、Ctrlを押しながら、クリックすればOK


これで見やすくなった!

2011年12月15日木曜日

pg_queryでSQLの失敗時にFALSEを返さない


PHPからPostgreSQLへpg_queryでSQL文を実行してみている。
その時に、構文間違いやデータ整合性などの理由で失敗する。
で、エラーを出して終了してしまう。

マニュアルによるとFALSEを返すはずなんだけど…。
とりあえずset_error_handlerでカスタムエラーハンドラを作って対処してみた。



function pg_query_test( $conn )
{
  $sql = "INSERT INTO NO_EXIST_TABLE VALUES ( 1 );";
  // エラー終了させないようエラーハンドラをセット
  set_error_handler( "my_error_handler" );
  $result = pg_query( $conn, $sql );
  restore_error_handler();if ( $result )
  {
    return true;
  }
  else
  {
    return false;
  }
}
function my_error_handler( $errno, $errstr, $errfile, $errline )
{
  echo "[errno]:   $errno\n";
  echo "[errstr]:  $errstr\n";
  echo "[errfile]: $errfile\n";
  echo "[errline]: $errline\n";
}
?>


実行してみて、errnoは2(E_WARNING)と分かった。
しかし、pg_queryの前でset_error_handlerして、終わったらrestore_error_handlerってのもあんまりスマートなやり方じゃないね…。
ひとまずこれで行っておくか…。

と思いきや、pg_queryだけじゃなくて、pg_copy_fromなんかでも同じようにエラーを出して終了しちゃう…。
さすがにpg_系が全部間違っているとは考えにくいので、DBかPHPの設定?と思い、とりあえず/etc/php.iniを見てみた。
"Error handling and logging"の部分で、
error_reporting  =  E_ALL
となっているのを発見。

試しに関数内で
error_reporting( E_ERROR );
にしてみたところ、失敗してもちゃんとFALSEを返すようになった!

ただ、これだと毎回error_reporting関数を呼ばなくちゃいけないので、面倒。
/etc/php.iniを変えて問題なければ、書き換えたほうが楽だね。
多分、問題ないけど検証してからやってみよう!

2011年12月14日水曜日

シェルスクリプトの関数にパイプで渡す


bashでシェルスクリプトを書いていて、関数を使っていたんだけど、パイプで標準入力を渡したくなった。
で、どうしたもんかと思っていたら、こちらに出会った。
http://dsas.blog.klab.org/archives/51060184.html

これは素晴らしい!
実はパイプでどう受けるとかも知らなかったので、
cat -
を知っただけで目からウロコ。

さらには、testコマンドで パイプで繋いできてるのかまで判定できると知って衝撃。
これは便利。

助かりました!

2011年11月29日火曜日

rootでパスワードなしのSSHを使用してrsync…危険じゃないの?


元々はFTPだけしか使えない、ログイン不可のユーザ(シェルが/sbin/nologin)でrsyncも出来るようにしたかった。
でも、nologinのユーザだとrsync -e sshとしても失敗。
rsyncはログインしなくちゃできないから、それも当然。

そこで、rsync用のユーザを作って、rsyncすることにした。
sshでパスワードなしにすることも簡単。
ただ、ファイルの権限がrsyncになってしまう…。chmodで変更が出来ない…。
chmodはrootじゃないとダメだから。

じゃあ、rootでパスワードなしのSSHなら出来る。
いや、それはさすがにマズイ。
どうしたもんか、と思っていたところ見つけた。
http://sonic64.com/2004-11-17.html
http://www.ice.is.kit.ac.jp/~umehara/misc/comp/20061121.html

つまり、鍵ファイルによって実行できるコマンドを絞ることが出来る。
authorized_keyの鍵情報にcommandを追加。
そこにrsyncコマンドを入れておけば、いいわけだ。
通常のsshは鍵なしだから、普通にsshしてきたら普通に使える。
鍵を指定してsshしてきたら、指定したcommandだけ実行して終わり。

全然知らなかったけど、sshは奥が深いね!なんとなく世界が広がる気がする!

2011年11月21日月曜日

MCITP合格


70-663 Pro: Designing and Deploying Messaging Solusions with Microsoft Exchange Server 2010に合格。
この前受けた、70-662の上位資格。

日本語では情報が乏しいので、英語のテキストや問題集を使い、英語で受けた。
変な訳とかないので、その辺は英語の方がいいのかも。
テキストは一回通して読みつつ、あとは問題集を繰り返しやった。
多分、7回ぐらい。
分からないところをテキストとtechnet等でチェック。

他の人の合格体験記を読むと、technetだけで合格してたりするね。
スゴイわ、尊敬。
問題集なかったら絶対ダメだったと思う。

Exchange Server 2010の上位資格なんだけど、未だに本社のExchange Serverには触れないまま…。
忘れてしまう前に触っておきたいなぁ…。

2011年11月17日木曜日

PostgreSQLで文字列の結合(||)をすると勝手にトリムされる


開発中に「あれ?!」と思ったので記録の意味で。

DBからデータを引っ張っていて、フィールド定義はtext型だが、固定長で出力する必要があったため、
SELECT 'hoge ' || field1::char(20) FROM table1;
というように書いた。

が、結果は
hoge AAA↵(改行コード)
というように勝手にトリム(trim)されている。

なんで?と思って、調べたら文字列を結合する演算子の||は、返す型がtextのため、不要な空白は消してくれているらしい。

なので、実装には
SELECT 'hoge ' || rpad( field1, 20 ) FROM table1;
というようにしたら大丈夫になりました。