2013年4月30日火曜日

VALUE DOMAINのDDNS用Shell Scriptを作った

今まで固定IPな環境だったのが、非固定IPな環境に移ってしまったので、VALUE DOMAINのDDNSを使用して自宅サーバーのホスト名を管理すべくShell Scriptを作成してみた。

こんなこともあろうと、DDNSが使用出来るVALUE DOMAINで契約しておいて良かったよ。

#!/bin/sh

HOST='foo'                         # ホスト名('*'も可)
DOMAIN='example.jp'                # ドメイン
PASSWORD='*******'                 # DDNSのパスワード
DNS_SERVER='ns1.value-domain.com'  # VALUE DOMAINのネームサーバー

wget=`/usr/bin/which wget`
host=`/usr/bin/which host`
grep=`/usr/bin/which grep`
mail=`/usr/bin/which mail`

# 現在のIPアドレスを取得
CURRENT_IP=`$wget -q http://dyn.value-domain.com/cgi-bin/dyn.fcg?ip -O -`

# DNSに登録されているIPをCURRENT_IPでgrepする。
if [ "${HOST}" = "*" ]; then
    CHANGE=$($host $DOMAIN $DNS_SERVER | $grep -F $CURRENT_IP)
else
    CHANGE=$($host $HOST.$DOMAIN $DNS_SERVER | $grep -F $CURRENT_IP)
fi
# IPが変更になった場合はCHANGEは空が入ってくるので、登録処理に入る
if [ -z "${CHANGE}" ]; then
    # DNSへ登録
    RESULT=$($wget -q "http://dyn.value-domain.com/cgi-bin/dyn.fcg?d=$DOMAIN&p=$PASSWORD&h=$HOST" -O - )
    STATUS=$(echo $RESULT | $grep -F 'status=0')
    if [ -z "${STATUS}" ]; then
	    # 登録失敗の場合は、root@localhostへメールを送信
        echo "Dynamic DNS Updating was NG.\nresult:$RESULT" | $mail -s "DDNS updating failed" root@localhost
    fi
fi

自宅サーバーはルータにもなっているので、boot時にプロバイダーとの接続が確立されてIPアドレスの取得後に一回実行させれば良いと思われるので、rc.localに下記のように記述を追加。

if[ -f /usr/local/sbin/ddns.sh ]; then
        /usr/local/sbin/ddns.sh
fi

2013年4月23日火曜日

phpで深いオブジェクトのメンバ変数を動的にアクセスする方法

phpでは変数に値を代入してオブジェクトのメンバ変数を動的アクセスすることが出来ます。

<?php
$foo->bar0 = "hoge0";
$foo->bar1 = "hoge1";
$foo->bar2 = "hoge2";
for($i=0;$i<3;$i++){
    $idx = "bar".$i;
    echo $foo->$idx."\n";
}
?>

これの結果は次のようになります。

$ php test.php
hoge0
hoge1
hoge2
$

しかし、オブジェクトが深くなるとこの方式ではアクセス出来なくなります。

<?php
$foo->bar->hoge0 = "moge0";
$foo->bar->hoge1 = "moge1";
$foo->bar->hoge2 = "moge2";
for($i=0;$i<3;$i++){
    $idx = "bar->hoge".$i;
    echo $foo->$idx."\n";
}
?>

これだとUndefined propertyと言われてしまい、アクセス出来ませんでした。

$ php test.php
PHP Notice:  Undefined property: stdClass::$bar->hoge0 in /Users/yanagimoto/public_html/test.php on line 8

Notice: Undefined property: stdClass::$bar->hoge0 in /Users/yanagimoto/public_html/test.php on line 8

PHP Notice:  Undefined property: stdClass::$bar->hoge1 in /Users/yanagimoto/public_html/test.php on line 8

Notice: Undefined property: stdClass::$bar->hoge1 in /Users/yanagimoto/public_html/test.php on line 8

PHP Notice:  Undefined property: stdClass::$bar->hoge2 in /Users/yanagimoto/public_html/test.php on line 8

Notice: Undefined property: stdClass::$bar->hoge2 in /Users/yanagimoto/public_html/test.php on line 8

$

あまり、良い方法ではありませんがeval関数を使うとアクセス出来ます。

<?php
$foo->bar->hoge0 = "moge0";
$foo->bar->hoge1 = "moge1";
$foo->bar->hoge2 = "moge2";
for($i=0;$i<3;$i++){
    $idx = '$foo->bar->hoge'.$i;
    echo eval("return {$idx};")."\n";
}
?>

結果は下記のようになりました。

$ php test.php
moge0
moge1
moge2
$

しかし、マニュアルにも書いてある通り、任意のPHPコードを実行できてしまう危険な関数なので用法はお間違えの無いように。

2013年4月15日月曜日

MarsEditでMarkdown表記で書いた記事をbloggerに投稿するためのAppleScriptを作った

なんかすごく長い記事になってしまったが、bloggerはMarkdown表記の記事をサポートしていないので、投稿するときの少し便利にするMarsEdit用のAppleScriptを作ってみました。

目次

MarsEditでMarkdownを変換したときの不満点

Markdown 記法でブログを書くで紹介されているように、MarsEditは最初からMarkdown記法をサポートしていて、MarkdownからHTMLに変換することも可能なのですが、不満点がいくつかあります。

変換したHTMLに一部不具合が出る。

例えば、下記のようなCode Blocksを含んだ文章をMarkdownで書いたとします。

Markdown sample

これを変換するには ⌘ + ⇧ shift + Tで一度リッチテキストに変換します。すると下記のようにCode Blocksにあった改行が無くなって一行になってしまいます。

Rich Text

さらに⌘ + ⇧ shift + TをしてHTMLに変換しても下記のように無くなった改行はそのままです。

Rich TextからHTMLに変換

プレビューでみると下記のようになり、ソースコードが一行で表示されすごく見づらくなっています。ソースコードをたくさん貼り付けたい場合、修正の作業量が多くなってしまいかえって不便になってしまいます。

HTMLの変換結果をプレビュー

HTMLにいったん変換するとMarkdownに戻せない。

Markdown → リッチテキスト → HTMLと変換した状態で、もう一度 ⌘ + ⇧ shift + TをしてもMarkdownに戻る事はなく、リッチテキストになってしまいます。

記事を投稿した後で、修正したいと思ってもHTMLを直接修正するか、どこかにMarkdown形式の記事を保存しておいて、それをコピーして使うと言うことになると思います。しかし、それではMarkdown記法をMarsEditで書いている意味が無くなってしまいます。

Markdown Scripts for MarsEdit

同じような不満を抱いている人がいないかと思い、ググってみるとMarkdown Scripts for MarsEditと言う、MarsEdit用のAppleScripts1を見つけました。

インストール

softpediaからMarsEditMarkdownScripts.zipをダウンロードして展開します。そして展開したファイルを~/Library/Application\ Support/MarsEdit/Scripts/にコピーします。

$ cd ~/Desktop/MarsEditMarkdownScripts/
$ cp *.scpt ~/Library/Application\ Support/MarsEdit/Scripts/
$ cp html2text.py ~/Library/Application\ Support/MarsEdit/TextFilters/Markdown_1.0/
$

インストールが終了すると、MarsEditのメニューバーにあるスクリプトメニューにTranslate Markdown to HTMLとTranslate HTML to Markdownが増えていると思います。MarsEditのスクリプトメニュー

Translate Markdown to HTML の不満点

早速、さきほどのMarkdownを変換してみます。変換の仕方は、エディタ画面上でスクリプトメニューのTranslate Markdown to HTMLを選択するだけでHTMLに変換してくれます。

メニューからTranslate Markdown to HTMLを実行

下記のようにCode Blocksの改行も保たれたまま変換されています。

Translate Markdown to HTMLの実行結果

プレビューでの表示も問題ありません。Translate Markdown to HTMLの実行結果をプレビュー

しかし、変換エンジンがオリジナルのMarkdown.plを使用しているため、Markdownの拡張シンタックスが使えないので表現力が落ちます。 但し、Translate Markdown to HTML.scpt変更すれば、別の変換エンジンを使用することが可能です。

Translate HTML to Markdown の不満点

Translate Markdown to HTMLで変換したHTMLをMarkdownに戻してみます。

メニューからTranslate HTML to Markdownを実行

微妙に変換後のインデントが変わってしまいます。

Translate HTML to Markdownの実行結果

このため何回かHTML ↔ Markdownの変換をすると、下記のように結果的に表示が崩れてしまいます。

Translate HTML to Markdownの実行結果をプレビュー

これでは、編集作業には向きません。

Toggle Markdown

AppleScriptを使用してMarkdownをHTMLにするという発想は良いアイディアだと思うので、その考えを少し転換して下記のような動きをするAppleScriptを作成してみました。

  1. MarkdownからHTMLを変換する。
  2. 変換は拡張シンタクスも変換出来るようにする。
  3. 変換時にオリジナルのMarkdownはHTML内にコメントとして挿入しておく。
  4. HTMLからMarkdownに戻すときは、コメントにしておいたMarkdownから復元する。

Toggle Markdownのインストール

kramdownのインストール(optional)

最初にkramdownをインストールします。拡張されたMarkdown記法を使用しない場合はスキップしてもかまいません。

$ sudo gem install kramdown
Password:
Successfully installed kramdown-0.14.2
1 gem installed
Installing ri documentation for kramdown-0.14.2...
Installing RDoc documentation for kramdown-0.14.2...
$

MarsEditの設定(optional)

こちらも、拡張されたMarkdown記法を使用しない場合はスキップしてもかまいません。

MarsEditはデフォルトでmarkdown表記のプレビューが可能ですが、これはMarkdown.plを使用してプレビューを行っています。このため、kramdownの拡張シンタックスを使うとうまく表示できません。そこで、markdownのプレビューにkramdownを使うように設定します。

{$HOME}/Library/Application Support/MarsEdit/TextFilters/kramdownにkramdownディレクトリを作成し、そこにShell Script ファイルkramdown.shを作成します。

$ midir  ~/Library/Application\ Support/MarsEdit/TextFilters/kramdown/
$ cd ~/Library/Application\ Support/MarsEdit/TextFilters/kramdown/
$ vi kramdown.sh

kramdown.shの内容は下記のようにします。

#! /bin/sh
CMD=/usr/bin/kramdown
CMDARGS=&quot;--auto-ids&quot;
$CMD $CMDARGS $1

CMDARGSに設定するオプションはコマンドラインでkramdown –helpとすると出てきますので、お好みで指定します。

ToggleMarkdown.scptをScripts Folderにコピー

ToggleMarkdown.scptをダウンロードし、MarsEditのScripts Folderにコピーします。

$ cp ToggleMarkdown.scpt ~/Library/Application\ Support/MarsEdit/Scripts/
$

MarsEditのメニューバーにあるスクリプトメニューにToggleMarkdownが出たら完了です。

MarsEditのスクリプトメニューにToggleMarkdown

使い方

ToggleMarkdownを実行する度にMarkdown→HTML→Markdown→HTML→… と変換していきます。

ToggleMarkdownはMarkDownエンジンを次のような優先順位で探しに行きます。

  1. ~/Library/Application Support/MarsEdit/TextFilters/kramdown/kramdown.sh
  2. パスが通った場所にあるkramdownコマンド
  3. ~/Library/Application\ Support/MarsEdit/TextFilters/Markdown_1.0/Markdown.pl

次のようなMarkdownで書かれた文書を変換してみます。変換サンプル

スクリプトメニューのToggleMarkdownを実行します。MarsEditのスクリプトメニュー

すると、MarkdownがHTMLに変換されます。オリジナルのMarkdownは上部にコメントとして保存されます。MarkdownからHTMLの変換結果

上記の状態で、再度スクリプトメニューのToggleMarkdownを実行すると、コメントにしてあったMarkdownを元に戻します。この処理は、HTMLをMarkdownに変換している訳では無いのでHTMLを直接編集した場合は編集内容は消えてしまうので注意してください。HTMLからMarkdownに戻した結果

再度、ToggleMarkdownを実行するとHTMLに変換されます。MarkdownからHTMLの変換結果

欠点

ToggleMarkdownはHTMLのコメントとして、変換元のMarkdownを残すので投稿する記事のバイト数が増えてしまいます。これをなるべく避けるためHTML部分の余分なスペースと改行を削除して出力します。

その方がHTMLが難読化されるので、HTMLをうっかり修正してしまうと言うミスも防げると言う利点も…

おまけ

スペースと改行を削除しないほうが良い場合もあるので、削除しないスクリプトをToggleMarkdownNoCompress.scptとして置いておきます。

今まで、AppleScriptで作った事が無かったので、これが初めてのスクリプトです。言語の仕様をwebで調べて2日程度で作ったので動きがおかしな所もあるかも知れません。これを使用したことにより、今までのブログが消えたとしても一切関知しないと言うことで…

  1. download先がリンク切れになっているようですが、softpediaからダウンロード可能なようです。

2013年4月14日日曜日

StartSSL更新を行う

先日、StartComの証明書を更新したのですが、忘れないように手順を残しておきます。

コントロールパネルログイン用の証明書の更新

StartComで作成した証明書の有効期限2週間前になるとメールが来ます。
メールは「コントロールパネルログイン用の証明書」と「サーバーのSSL証明書」の期限が来るのですが、文面が似ているので「コントロールパネルログイン用の証明書」の更新を忘れないようにしましょう。

認証

StartSSL™ Certificates & Public Key Infrastructureのページに行き、Authenticateからログインします。証明書がインストールされていない場合

その際ブラウザに一年前に作成した「コントロールパネルログイン用の証明書」がインストールされている必要があります。 証明書がインストールされていないと、次のような画面が表示されます。
Operaには証明書がインストールされていなかったので、この画面が出てちょっと焦った。
証明書がインストールされていない場合

証明書がインストールされているブラウザで開くと証明書の要求ダイアログが出ますのでOKを選択します。証明書がインストールされている場合

無事認証が完了すると下記の画面が表示されますので”Control Panel”をクリックして進みます。認証後の画面

“Control Panel”画面に進むと下記の画面になりますので、”Validations Wizard”を選択します。Control Panel画面

Email Address Validation

“Select Validation”画面が表示されますので、Email Address Validation を選択します。
Select Validation画面

“Enter Email Address”画面に移りますので、自分のメールアドレスを入力しContiuneを押下します。Enter Email Addres画面

“Complete Validation”画面が表示された後しばらくして、入力したメールアドレスにメールが送信されますComplete Validation画面

送信されたメールにはVerification Codeが送られてきます。

This mail is intended for the person who requested verification of email ownership at StartSSL™ (http://www.startssl.com).
		
Your verification code is XXXXXXXXXXXXXXXX  
Copy and paste this code now into the form at your open browser window.
	
Thank you!
	
StartCom Ltd.  
StartSSL™ Certification Authority

ここに記載されているコードをVerification Codeに入力します。Verification Codeを入力

Verification Successの画面が出たら終了です。
Email Address Validationは30日間有効なので、その間にDomain Name Validationを行いクライアント証明書を入手する必要があります。Verification Success画面

Domain Name Validation

“Validations Wizard”を選択し”Select Validation”画面を表示させます。今度はDomain Name Validationを選択します。Domain Name Validationを選択

次にドメイン名を入力します。ここではトップレベルのドメイン名を入力します。たとえば foo.invalid.com の場合はinvalid.comを入力します。ドメイン名の入力

Verification Codeを送るメールアドレスを選択してContinueを押下します。(なんか文字化けしてるものがありますね。)ドメイン名の入力

“Complete Validation”画面が表示された後しばらくして、Email Address Validationと同様に選択したメールアドレスにメールが送信されますComplete Validation画面

送信されたメールにはVerification Codeが送られてきます。

This mail is intended for the person who requested verification of domain control at 
StartSSL™ (http://www.startssl.com).

Your verification code is OOOOOOOOOOOO
Copy and paste this code now into the form at your open browser window.

Thank you!

StartCom Ltd.
StartSSL™ Certification Authority

ここに記載されているコードをVerification Codeに入力します。Verification Codeを入力

Verification Successの画面が出たら終了です。
Domain Name Validationも30日間有効なので、30日以内にクライアント証明書を入手する必要があります。Verification Success画面

クライアント証明書の更新

Cerifications Wizardを選択してSelect Cretificate Purpose画面を表示させ、”S/MIME and Authentication Certificate”の選択し次に進みます。Select Cretificate Purpose画面

Generate Private Key画面で”高強度の暗号化”を選んで次に進みます。Generate Private Key画面

Select Email Address画面ではSecure Hash Algorithmを”SHA2”にして次に進みます。Select Email Address画面
これで成功すれば、Congratulations!画面になり、ブラウザにクライアント証明書が自動的にインストールされます。Congratulations画面

クライアント証明書のバックアップ

クライアント証明書が失われてしまった場合に、startSSLにログイン出来なくなりますので証明書のバックアップをしておきます。 Firefoxの詳細画面を表示して「証明書の表示」を押下します。

Firefox詳細画面

先ほどインストールされた証明書を選択して、「バックアップ」押下しファイルへ保存します。

証明書マネージャー画面

サーバー証明書の更新

Cerifications Wizardを選択してSelect Cretificate Purpose画面を表示させ、”Web Server SSL/TLS Certificate”の選択し次に進みます。Select Cretificate Purpose画面

Generate Private Key画面では、Private Keyは以前サーバ上で作成したキーを再利用しますのでskipを押下して次に進みます。Select Cretificate Purpose画面

Submit Certificate Request画面では、以前作成した証明書署名要求ファイルserver.csrをフォームにコピペする。Select Cretificate Purpose画面
作成したファイルが見つからない場合は下記のようにして証明書署名要求ファイルserver.csrを再度作成します。

証明書要求の作成 手順(server.csr)

$ su
# cd /etc/ssl/private
サーバー秘密鍵の作成 (server.key)
# openssl genrsa -out server.key -aes256 4096
パスフレーズを削除
# openssl rsa -in server.key -out server.key
証明書要求の作成(server.csr)
# openssl req -new -key server.key -out server.csr
#

証明書署名要求ファイルに問題が無ければ下記の画面が出ますので次にいきます。Select Cretificate Purpose画面

証明書に紐付けるドメインを選んで次にいきます。Select Cretificate Purpose画面

証明書に紐付けるサブドメインを選んで次にいきます。Select Cretificate Purpose画面

確認画面が出ますので次にいきます。Select Cretificate Purpose画面

作成されたサーバー証明書が、テキストアリアの中に表示されますので、コピーしてfoobar.com.crtとファイル名を付けてセーブします。FinishをクリックするとThank you画面に遷移して終了です。

Select Cretificate Purpose画面

サーバー側の設定

証明書の作成が終了したならば、サーバー側のファイルを新しい証明書を使って更新します。

以前のファイルをバックアップ

$ su
# cd /etc/ssl/startssl
# cp foobar.jp.crt foobar.jp.crt.old
# cp imapd.pem imapd.pem.old
# cp postfix.pem postfix.pem.old
#

新しいサーバー証明書のコピー

# mv ~/foobar.jp.crt /etc/ssl/startssl

startSSLの証明書が無い場合はダウンロードしておくこと。

# cd /etc/ssl/startssl
# wget https://www.startssl.com/certs/ca.pem
# mv ca.pem startssl.ca.pem
# wget https://www.startssl.com/certs/sub.class1.server.ca.pem
# mv sub.class1.server.ca.pem starssl.sub.class1.server.ca.pem
# wget https://www.startssl.com/certs/ca-bundle.pem
# mv ca-bundle.pem startssl.ca-bundle.pem
#

postfixの設定

# cat foobar.jp.crt startssl.sub.class1.server.ca.pem startssl.ca.pem > postfix.pem

/etc/postfix/main.cfには次の記述

smtpd_tls_cert_file = /etc/ssl/startssl/postfix.pem
smtpd_tls_key_file  = /etc/ssl/private/server.key

リスタートして接続確認

# /etc/rc.d/postfix restart
# openssl s_client -connect localhost:smtps -CAfile /etc/ssl/startssl/startssl.sub.class1.server.ca.pem

imapの設定

# cat /etc/ssl/private/server.key foobar.com.crt startssl.sub.class1.server.ca.pem startssl.ca.pem > imapd.pem

/etc/courier/imapd-sslには次の記述

TLS_CERTFILE=/etc/ssl/startssl/imapd.pem

リスタートして接続確認

# /etc/rc.d/courier_imap_ssl restart
# openssl s_client -connect localhost:imaps -CAfile /etc/ssl/startssl/startssl.sub.class1.server.ca.pem

2013年4月12日金曜日

Markdownを使う環境を整えてみた

素のhtmlを使って書くより、Markdownを使用した方がblogやドキュメントが書きやすそうなので、Markdownを使用する環境を整えてみました。

Markdownのインストール

Markdownはオリジナルの表記を拡張した、派生バージョンがあるらしいけれど、まずはオリジナルであるMarkdown.plインストールしてみました。

Markdown.plをインストールする

最初にMarkdownのサイトよりMarkdown.plをダウンロードし、インストールします。

# wget http://daringfireball.net/projects/downloads/Markdown_1.0.1.zip
# unzip  Markdown_1.0.1.zip
# cd Markdown_1.0.1
# chmod 755 Markdown.pl
# mv Markdown.pl /usr/local/bin/Markdown
#

試しにmarkdown.plを使用していくつかの文章を書いてみましたが、ちょっと凝った構造の文章を書こうとすると、HTMLを使わないと表現できなかったりするので、ちょっと貧弱かなと思いました。

kramdown コマンドのインストール

もう少し表現力高いものが欲しいので、シンタクスを拡張したバージョンを使ってみようかと色々と調べてみると、kramdownが機能が豊富で使いやすそうなので、これをインストールしてみました。

$ sudo gem install kramdown
Password:
Successfully installed kramdown-0.14.2
1 gem installed
Installing ri documentation for kramdown-0.14.2...
Installing RDoc documentation for kramdown-0.14.2...
$

これで、/usr/bin/kramdownにインストールされます。

kramdownのドキュメントを見ると、かなり拡張されていて表現力もオリジナルよりアップしています。これならばHTMLタグに頼らなくても大体の文章は書けるのでは無いかと思います。

MarsEditでkramdownを使いプレビューさせる設定

MarsEditはデフォルトでmarkdown表記のプレビューが可能ですが、これはMarkdown.plを使用してプレビューを行っています。このため、kramdownの拡張シンタックスを使うとうまく表示できません。

そこで、markdownのプレビューにkramdownを使うように設定します。

{$HOME}/Library/Application Support/MarsEdit/TextFilters/kramdownkramdownディレクトリを作成し、そこにShell Script ファイルkramdown.shを作成します。

$ midir  $HOME/Library/Application\ Support/MarsEdit/TextFilters/kramdown/
$ cd $HOME/Library/Application\ Support/MarsEdit/TextFilters/kramdown/
$ vi kramdown.sh

kramdown.shの内容は下記のようにします。

#! /bin/sh
CMD=/usr/bin/kramdown
CMDARGS="--auto-ids"
$CMD $CMDARGS $1

CMDARGSに設定するオプションはコマンドラインでkramdown --helpとすると出てきますので、お好みで指定します。

ファイルの作成が完了したならば、プレビュー画面左下にあるPreview Text Filterプルダウンをkarmdownにすれば、kramdownの拡張シンタックスが正常にレンダリングされます。

karmdown でプレビュー

emacsの設定

emacsからもmarkdownを扱えるようにmarkdown-mode.elをインストール・設定をします。

markdown-mode.elのインストール

Emacs Markdown Modeのサ イトよりmarkdown-mode.elをダウンロードしてelispのディレクトリに置きま す。

$ cd ~/.elisp
$ wget http://jblevins.org/projects/markdown-mode/markdown-mode.el
$

.emacs.elの編集

.emacs.elに下記のコードを追加します。

;;==========================================================
;;	   Markdown モードの設定
;;==========================================================
(autoload 'markdown-mode "markdown-mode"
   "Major mode for editing Markdown files" t)
(add-to-list 'auto-mode-alist '("\\.\\(text\\|md\\|mdwn\\|mdt\\)\\'" . markdown-mode))
(defun markdown-custom ()
  "markdown-mode-hook"
  (auto-fill-mode -1)
  (setq markdown-command "/usr/bin/kramdown"))  ;; コマンドパスの設定
(add-hook 'markdown-mode-hook '(lambda() (markdown-custom)))

2013年4月11日木曜日

デザインを変えてみた。

今までのデザインは、幅が狭くて大きめな画像を張ったりすると、はみ出してしまっていたのでレイアウトを変えたいと思ってた。 また、最近Markdowsでドキュメント等を書き始め出して、すごく簡単に書けるのでもっと早くから使っておけばと後悔したりしました。

現在のデザインをかえるならば、cssもいじりまわしてMarkdownが出力するHTMLに最適化したページにして、今後はMarkdownでBlogを書こうと思い2日ほどグダグダといじくり回して出来たのが現在のデザインです。

新デザイン

bloggerのtemplate siteからひな形となるテンプレートを選んで、修正しまくっていたのでエラい時間がかかりましたが、概ね満足なデザインになったと思います。

2013年4月6日土曜日

MacをSyslog Serverにする方法

リモートでSyslogを取りたい場面があって、手元にあるMac miniで取れば良いじゃんと思い方法を調べてみました。

最初にlaunchdの設定を簡単にできるアプリLingonをインストールします。

launchdを立ち上げると下記のような画面が出てきます。ここで、サイドメニューにあるSYSYTEM DAEMONSをマウスオーバーするとSHOWと言う文字が現れますのでこれをクリックします。

クリックすると隠れていたデーモンの一覧が出てきますので、com.apple.syslogdを探してクリックします。

次に画面右下にあるExpert Modeボタンを押下してエキスパートモードにします。

この画面で、下記の赤色で書かれた部分を追加します。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>EnableTransactions</key>
    <true/>
    <key>EnvironmentVariables</key>
    <dict>
        <key>ASL_DISABLE</key>
        <string>1</string>
    </dict>
    <key>HopefullyExitsLast</key>
    <true/>
    <key>JetsamProperties</key>
    <dict>
        <key>JetsamMemoryLimit</key>
        <integer>300</integer>
        <key>JetsamPriority</key>
        <integer>-49</integer>
    </dict>
    <key>Label</key>
    <string>com.apple.syslogd</string>
    <key>MachServices</key>
    <dict>
        <key>com.apple.system.logger</key>
        <true/>
    </dict>
    <key>OnDemand</key>
    <false/>
    <key>ProgramArguments</key>
    <array>
        <string>/usr/sbin/syslogd</string>
    </array>
    <key>Sockets</key>
    <dict>
        <key>NetworkListener</key>
        <dict>
            <key>SockServiceName</key>
            <string>syslog</string>
            <key>SockType</key>
            <string>dgram</string>
        </dict>
        <key>AppleSystemLogger</key>
        <dict>
            <key>SockPathMode</key>
            <integer>438</integer>
            <key>SockPathName</key>
            <string>/var/run/asl_input</string>
        </dict>
        <key>BSDSystemLogger</key>
        <dict>
            <key>SockPathMode</key>
            <integer>438</integer>
            <key>SockPathName</key>
            <string>/var/run/syslog</string>
            <key>SockType</key>
            <string>dgram</string>
        </dict>
    </dict>
</dict>
</plist>

編集が終了したら、左上にあるsaveボタンを押下して保存します。保存後下記のコマンドを実行してsyslogdを再起動させます。

$ sudo launchctl unload /System/Library/LaunchDaemons/com.apple.syslogd.plist
$ sudo launchctl load /System/Library/LaunchDaemons/com.apple.syslogd.plist
$

あとはクライアントの設定を行えば、コンソール.appにクライアントのログが記録されます。今回はMac OSX 10.7.5で行いましたが、他のバージョンでも出来ると思います。