Get periodic log via mail

periodic maintenance reportsをメールで受け取る方法についてメモ。
またメールに送り出すと、/var/log/daily.outといったローカルファイルには書き出されなくなる。それはそれで嫌だなーということで、ローカルファイルにも書き出しつつ、メールでも受信するようにした。
OS X Server特有のイケてないとこの回避策も合わせてメモする。

## periodic maintenance とは
定期的に行うメンテナンスの仕組みで古くからある仕組み。毎日、毎週、毎月の3つのタスクが用意されている。統計情報をまとめてくれたり、/tmpの掃除をしたり、いろいろ便利だったりする。その結果は、/var/log/daily.outなどのファイルに書き出される

## periodic の設定ファイル
periodic maintenanceの設定ファイルは、 */etc/defaults/periodic.conf* です。この中に
```periodic_conf_files="/etc/periodic.conf /etc/periodic.conf.local"```
という行があります。これらのファイルの中の設定値が */etc/defaults/periodic.conf* の設定を上書きするというわけです。これらのファイルは標準では存在しないので自分で作る必要があります。私は */etc/periodic.conf.local* を作成しています。

## /etc/periodic.conf.local の中でメール送信の宛先を記載する。
こんな感じで記述します。

```
# Mail Report settings
daily_output="dailyreport@osxserver.example.com"
weekly_output="weeklyreport@osxserver.example.com"
monthly_output="monthlyreport@osxserver.example.com"
```

*osxserver.example.com* はサーバ自体のことです。

## OS X Serverでメールサービスを実行
サーバがローカルでメールを発信しそれを受信配送する必要がありますから、メールサービスを動かします。OS X ServerではONにするだけなので、細かい説明は抜きます。
*dailyreport* などの宛先は予めあるわけではないのでそれを用意します。 */etc/aliases* ファイルにalias設定を追記します。

```
# Periodic Reports
dailyreport:    /var/log/periodic.outs/daily.out, myaccount@icloud.com
weeklyreport:   /var/log/periodic.outs/weekly.out, myaccount@icloud.com
monthlyreport:  /var/log/periodic.outs/monthly.out, myaccount@icloud.com
```

これで```newaliases```コマンド発行後、ローカル配送されたメールが、ローカルの /var/log/periodic.outs/*.out に書き出されつつ、その後ろに書いたメールアドレスに外部配送されるようになります。

## /var/log/periodic.outs/なわけ
標準では、/var/log/*.outに書き出されますが */var/log/periodic.outs/* にした事には理由があります。
メールサービス（postfixです）がファイルを書き出すときlockファイルを作るのですが、 */var/log* はpostfixユーザにとってwritableではありません。と言って、このディレクトリに書き込み権を与えるのもちょと変です。そこでサブディレクトリを作成してそこに書き込ませるようにしました。また、ファイルのownerはnobodyですからowerをnobodyに設定しています。

```
$ ls -la  /var/log/periodic.outs
total 3928
drwxrwxr-x    5 nobody  _postfix      170 Oct 19 10:37 ./
drwxr-xr-x  123 root    wheel        4182 Oct 19 10:36 ../
-rw-r--r--    1 nobody  _postfix  1624777 Oct 19 10:37 daily.out
-rw-r--r--    1 nobody  _postfix   176713 Oct  7 03:11 monthly.out
-rw-r--r--    1 nobody  _postfix   204568 Oct 15 01:13 weekly.out
$ 
```
互換性（？）を取るためにシンボリックリンクを張っておくのもいいかもしれません。

```
$ cd /var/log
$ ls -l *.out
lrwxr-xr-x  1 root  wheel  32 Oct 19 10:35 daily.out@ -> /var/log/periodic.outs/daily.out
lrwxr-xr-x  1 root  wheel  34 Oct 19 10:36 monthly.out@ -> /var/log/periodic.outs/monthly.out
lrwxr-xr-x  1 root  wheel  33 Oct 19 10:36 weekly.out@ -> /var/log/periodic.outs/weekly.out
$ 
```

## OS X Serverのちょっとイケてないとこ
OS X Serverのpostfixの設定ディレクトリは、標準的な */etc/postfix* ではありませんが、このディレクトリとその中のファイルは存在しています。 実際使われているのは、 */Library/Server/Mail/Config/postfix* です。なので、postfixの設定ファイルを見るコマンド```postconf```では *-c* スイッチを忘れずにつけないとハマります。そしてaliasesの設定を確認します。

```
$ postconf -c /Library/Server/Mail/Config/postfix 2> /dev/null | grep -e ^alias 
alias_database = hash:/etc/aliases
alias_maps = hash:/Library/Server/Mail/Config/postfix/aliases
```

この状態でnewaliasesをするとaliasesのhash dbが */Library/Server/Mail/Config/postfix/aliases.db* で更新されるのですが、実際配送するときには、 */etc/aliaes.db* を見ているようです。 */var/log/mail.log* には、

```
warning: database /etc/aliases.db is older than source file /etc/aliases
```
というエラーが出力されます。
そこで、シンボリックリンクを張ることでこの問題を回避することにしました。

```
$  ls -l /etc/aliases.db 
lrwxr-xr-x  1 root  wheel  46 Oct 19 09:25 /etc/aliases.db@ -> /Library/Server/Mail/Config/postfix/aliases.db
$ 
```