2011-12-01

Dropboxをつかってネットワーク越しに印刷

できたら便利かもねーと思ったのでちょいとシェルスクリプト書いてみました。zsh 使ってますので zsh スクリプトですが中身はたいしたことないです。
本来なら VPNでつないでやるべきところです、が、
  • わたしの研究室は外向きの HTTP とかしか通りぬけできないネットの孤島ですし
  • わたし自身 USB フラッシュメモリでファイル持ち歩くと間違いなくメモリをどこぞに置き忘れますし
するので、そんな必要ないようにしたいなと。ちょうどつけっぱなしのマシンがあるので
あ、研究室の PC にも dropbox 入ってるから、cron か何かでスクリプト回しておいて、新しい pdf が増えたら勝手に印刷できるようにできるんじゃね?
と思ったわけです。やってること自体は単純です。cron で適当にスクリプトを定期的に動かしておいて、Dropbox のフォルダに入ってるファイルを適当に印刷するわけですから。ただ、同じファイルを何度も印刷するマヌケなことが起こるとだめなので、ちと考える必要があります。タイムスタンプを見てもいいのですが、ファイルを移動するという原始的な方法でやっています。
Dropbox フォルダの下の dropprint ディレクトリが印刷したいファイルを突っ込んでおく場所です。そしてそのさらに下に .completed-jobs/ とか .failed-jobs/ といった隠しディレクトリを作っておくわけです。そしてファイルのパスに /. が含まれていたら印刷をしないようにしておきます。
印刷ができたか失敗したかしたファイルは、それら隠しディレクトリに移動させてしまえばとりあえずは印刷されないことになります。これら隠しディレクトリも Dropbox の管理下なので印刷の成功失敗も他のホストからわかるというわけです。
まあそのいい加減なスクリプト(Dropbox/dropprint/.script/dropprint.zsh)がこっち:
#!/bin/zsh 

echo "Starting dropprint..."
echo "date: `date`"

DIR_CURRENT=$(cd $(dirname $0);pwd)/
DIR_DROPPRINT=${DIR_CURRENT}../
DIR_COMPLETED="${DIR_DROPPRINT}.completed-jobs/"
DIR_FAILED="${DIR_DROPPRINT}.failed-jobs/"
DIR_SCRIPT="${DIR_DROPPRINT}.script/"
DIR_TEMP="/tmp/dropprint-`id -u --name`"

mkdir -p ${DIR_COMPLETED}
mkdir -p ${DIR_FAILED}
mkdir -p ${DIR_TEMP}
DATE=`date +"%Y%m%d-%H%M%S"`

cd $DIR_DROPPRINT
jobnum=0
foreach file (`find . -type f -a -name '*' | grep -v '/\.' `)
    ext=${file##*.}
    job="job-${DATE}-${jobnum}-${file##*/}"
    filename=${DIR_DROPPRINT}${file}
    echo -n "Processing $filename as job name $job..."
    if (cd ${DIR_TEMP} && /bin/zsh ${DIR_SCRIPT}print.$ext.zsh ${filename}) ; then
        mv ${filename} ${DIR_COMPLETED}${job}
        echo "done"
    else
        mv ${file} ${DIR_FAILED}${job}
        echo "fail"
    fi
    jobnum=$((jobnum + 1))
end

echo "Cleaning temporary directory..."
rm -rf ${DIR_TEMP}
実際の印刷の処理はこれと同じディレクトリの Dropbox/dropprint/.script/print.${ext}.zsh に丸投げしています。 PDF 用なら print.pdf.zsh となりますし、PostScript 用なら print.ps.zsh となるわけです。
lpr が使えるなら print.ps.zsh は
/usr/bin/lpr $1
とかと書いておくだけになります。
とにかく cron で定期的に実行する間に処理が終わらないことはないという前提でやってあるので、実行のタイミングでは同じファイルが複数回印刷されるなんてことがあるやもしれません。もっというとファイルによっては double sided でプリントしたいとかいう要望もあるのですがさてどうしたものか。

0 件のコメント:

コメントを投稿