BuffaloのNASをrsyncサーバとして使う

BuffaloのNAS
LinkStation LS-XHLシリーズの、
LS-XH1.0TLを購入した。


そこで、保証が切れない範囲で弄ってみる。
早速、nmapでポートスキャン。

$ nmap -sT NAS-HOSTNAME


TCPでどんなサービスが動いてるか調べてみる。
と、こんな結果に。

PORT      STATE SERVICE
80/tcp    open  http
139/tcp   open  netbios-ssn
445/tcp   open  microsoft-ds
548/tcp   open  afp
873/tcp   open  rsync
8873/tcp  open  unknown
22939/tcp open  unknown


rsyncが動いてるじゃん。
このNAS、自宅用rsyncサーバとして使えるんじゃね?」
と、思いrsyncでアクセス。

$ rsync -avvvn rsync://admin@NAS-HOSTNAME:873/ .


しかし、下記の様な結果になり、
公開されているモジュールが無い。

opening tcp connection to NAS-HOSTNAME port 873
sending daemon args: --server --sender -vvvnlogDtpre.iLs . / 


よくよく調べてみると、
LinkStationではファイルのバックアップにrsyncを利用しているらしい。
なので、下記の様に公開先をバックアップにするとモジュールとして登録されるっぽい。
公開先をバックアップにして再度アクセス。

opening tcp connection to NAS-HOSTNAME port 873
sending daemon args: --server --sender -vvvnlogDtpre.iLs . / 
disk1_forRsync 


モジュール名が取得出来た。
どうやらprefixとしてdisk1_とか付くみたいだ。


これで普通にrsyncサーバとして使えるみたい。

$ rsync -avz hoge rsync://admin@NAS-HOSTNAME:873/disk1_forRsync 


とかやると、hogeファイルがrsyncでバックアップ出来るよ!
Macだと、TimeMachineとrsyncのダブルでバックアップできる。
とっても便利。

*.appをopenするコマンドの作成

Macで*.appのアプリケーションをターミナルから開きたい。
しかし、

$ open -a /Applications/Safari.app hoge.html

とかいちいち打ち込むのもめんどくさい。
なんでシェルスクリプトを書いて、

$ safari hoge.html

で、開けるようにした。

#! /bin/sh

App="/Applications/Safari.app"

open -a "${App}" "$@"

しかし、*.appのアプリケーションはいっぱいあるので、
いちいちこのスクリプトを手で書いていくのはめんどくさい。
なので、上記のコードを生成するスクリプトを書いた。
アプリケーションの絶対パスを引数として、
フォルダ$HOME/binに上記の様なシェルスクリプトを生成する。
生成されるファイル名は、bオプションで指定が無い限り、
"Application APP.app"を引数としたら、
"application_app"の様に、
".app"を省略し、スペースをアンダーバーに、大文字を小文字に変換したものにしている。

#! /bin/sh

## コマンド名 make_app_bin

## コマンドを生成する標準のフォルダ名
folderName="${HOME}""/bin"

binName=""

## bオプションは、生成するシェルスクリプトのファイル名を指定する。
## fオプションは、生成するシェルスクリプトを格納するフォルダ名を指定する。
while getopts 'b:f:' OPTION
do
    case $OPTION in 
	b) binName="$OPTARG"
	    ;;
	f) folderName="$OPTARG"
	    ;;
	?) echo "Usage: "`basename "$0"`"[-b binName] [-f folderName] appName"
	    exit 2
	    ;;
    esac
done

## オプション部分を切り捨てる。
shift `expr $OPTIND - 1`

if [ "$#" -ne 1 ];
then
    echo "Usage: "`basename "$0"`"[-b binName] [-f folderName] appName"
    exit 2
fi

## bオプションが指定されていなかったら、
## ".app"を省略し、スペースをアンダーバーに、大文字を小文字に変換したものをコマンド名にする。
if [ -z "${binName}" ];
then
    binName=`basename "$1" | sed -e s/".app"/""/g | tr " " "_" | tr A-Z a-z`
fi

bin="${folderName}""/""${binName}"

## ファイルかシンボリックリンクがあったらスルーする。
if ([ -e "${bin}" ] || [ -L "${bin}" ]);
then
   echo "Warnings: "`basename "$0"`": ""${bin}"": file exists"
else
## コマンド生成。
    echo make: \""${binName}"\" -\> \"$1\"
    echo \#\! /bin/sh > ${bin}
    echo >> ${bin}
    echo App=\"$1\" >> ${bin}
    echo >> ${bin}
    echo open -a \"\$\{App\}\" \"\$@\" >> ${bin}
    chmod 755 ${bin}
fi

と、ここまで書けたので、後はApplicationsフォルダより下の階層から*.appを探してきて、
自動でコマンドを生成してくれれば完成である。
その為に以下のコマンドを実行。

$ find /Applications -name "*.app" -print0 |xargs -0 -I{} make_app_bin "{}"

これでターミナルから楽に*.appを開けるようになった。
満足。