pythonのsftpserverを試す

pythonで書いているバッチのテスト用にsftpサーバを簡単に立ち上げたかった。
探してみるとちょうどよいsftpseverというものを見つけたので使い方を含めてメモ。
GitHub - rspivak/sftpserver: A simple single-threaded SFTP server

gist.github.com

ニフティクラウドのロードバランサをAnsibleから操作できるようにしてみた

AWSならbotoと連携するモジュールをAnsibleが正式に提供しているが、
ニフティクラウドSDKがそもそもPythonに対応していないので、Ansible対応は難しい。

ということでAnsibleに対応するために2点実装した。
(1)botoをニフティクラウド用に修正
(2)Ansible用のモジュール作成

(1)はやり始めると途方がないので、ロードバランサからインスタンスの装着/取外しができるところまで実装した。

以下の様なplaybookを書くと動く
gist.github.com


(1)
github.com


(2)
gist.github.com

implementation of smtpd always returning 500 error.

常に500エラーを返すSMTPサーバを実装した。テスト等に使えるはず。
gist.github.com

工夫ポイント: エラーコードの返し方がsmtpdのドキュメントにはなかったので、ソースから特定した。

ログ監視ツール比較

ログ監視を行いたいが、どのツールがよいのか検討したので、簡単にメモする どのツールが良いかというのは、既存環境との組み合わせや、そもそも既存のツールで完結させたいとかそういう要望次第なのでなんとも言えない。 あくまで自分視点で比較をする。

調べた限り以下のツールが出てきた。

  • logmon
  • swatch(simple log watcher)
  • Zabbix
  • fluentd
  • logwatch

logmon

github: https://github.com/moomindani/logmon

IBM製のツール。シンプル。サンプルコードとして提供されている。

正規表現を書いて、一致する行が出てきたら即刻メールが飛んでくる。 ファイル名のパターンや正規表現に関する機能もシンプルなので、細かいところに手が届かない。

所詮サンプルなのでカスタマイズが必要

  • 言語: perl
  • 動作形態: デーモン

swatch(simple log watcher)

URL: https://sourceforge.net/projects/swatch/

イメージ的にはlogmonを改良したもの。 正規表現に一致する行があった時の動作はメールもしくはパイプで任意のコマンドを実行できる。 例えば、以下の記事のようにfluentdと連携することが可能。

http://kyudy.hatenablog.com/entry/2016/06/22/181907

  • 言語: perl
  • 動作形態: デーモン

Zabbix

URL: https://www.zabbix.com/documentation/2.2/jp/manual/config/items/itemtypes/log_items

logmonと変わらないぐらいシンプル。 単純なログ監視をする場合、かつ既にZabbixを運用しているのなら有用かもしれない。

  • 言語: なし(Zabbixのアイテム・トリガー)
  • 動作形態: Zabbixの付属機能

fluentd(grep Filter Plugin等)

URL: http://docs.fluentd.org/articles/filter_grep

grepのfilterとfluent-plugin-mailなどを使えば高度なログ監視が実現できるかもしれない。 fluentdが既に入っているなら良いかもしれない。

ただ、正規表現を追加することを想定する場合には、fluentdのリロードが必要なのが少し気持ち悪い気がした。

要件によっては自分でpluginを書いて見てもよいかも。

※ ただの個人の所感です。

  • 言語: なし(fluentdの設定で記載する)plugin書く場合はruby
  • 動作形態: fluentdの機能の組み合わせ。

logwatch

URL: https://sourceforge.net/projects/logwatch/files/

/var/log以下のログを整形して毎日レポートをくれる。 一般的なsyslogに対応していて、何か起きているとわかりやすく記載してくれるようだ。 内容としては例えばpostfix等でどのぐらいrejectしていたのかなど。

エラーログが出たときにすぐ知りたい、という使い方には対応できない。 他のツールとはその点が大きく異る。

独自アプリのログに対応させるには自分でスクリプト書かないと行けない。

  • 言語: perl
  • 動作形態: cronで定期実行

swatchをfluentdに連携させる

swatch(Simple Log Watcher)は昔からあるログ監視ツールらしい。

詳細は置いておいて、このswatchの出力をfluentdに送りたい。なぜならばデフォルトでswatchが出力できるのはmailと標準出力なので、サーバの台数が増えてくると管理できなくなる(メール100通とか毎日見たくないし、標準出力をターミナル100個見続けるとか無理)

幸いswatchは出力をpipeすることができる。
このpipeとfluent-catを組み合わせることでswatchの出力をfluentdに送出できる。
実際に動かすところまで実践してみたので、設定内容をメモする。

gist.github.com

pipeの引数にforward_fluent.shを指定している。
このシェルは下記の通り、受けた標準出力をfluent-catに渡すものだ。
tagを指定するのと、swatchの出力をfluent-catの入力フォーマット(デフォルトではjson)に変換する必要があるので、シェルを一つかましている。

forward_fluent.sh

gist.github.com

実行

$ swatch --daemon -c swatch.conf -f test.log --pid-file=pid

実行すると、echoもしているので色分けされた出力が標準出力に表示される。
また、同時にfluentdにも送信されているのを確認した。

以上

leapmotionでキー入力がしたいのでプロトタイプを作ってみた

勢いでleapmotionを新宿のヨドバシカメラで買ってきてしまった。
実は前々からジェスチャーで文字入力をやってみたかった。

環境

どのような入力を実現するか

手の指を一本折り曲げた状態で手を左右上下前後に動かし、
どの指が曲がっているかと、手を動かしている方向の組み合わせを入力パターンとする。
とりあえず片手だけにしたので、指の本数(5) x 左右上下前後(6) = 30通りの入力が可能。
アルファベットは網羅できる。

イメージ↓
f:id:KYudy:20160504165028p:plain

ソースコードは以下のとおり。leapmotionのAPIが非常によく出来ていて、簡単につくることができた。

gist.github.com

動いているところ↓
f:id:KYudy:20160504165608p:plain

正直全然実用できないが、形にはなった。

perlワンライナー集計処理

以下の様なテキストを入力として受け、出力を合計値にしたい。

a 10000
b
c 33
b 100
a 3993

出力

c 33
a 13993
b 100

シェルスクリプトで実装する方法も考えたが、なんだか面倒なので、
なれないPerlワンライナーにチャレンジ

以下を参考にした。
Perlワンライナー覚書」tossh
http://qiita.com/tossh/items/f8d448c0c039f68c0ea3

結論としては以下とすればよい。

$ cat << EOF | perl -anle '$count{$F[0]}+=$F[1]; END{foreach(keys(%count)){print "$_ $count{$_}"}}'
> a 10000
> b
> c 33
> b 100
> a 3993
> EOF
c 33
a 13993
b 100

勉強したこと

perlワンライナーを各ときはオプションが重要

-a AWK的な感じで入力を区切り文字(スペース)で分割して変数で扱えるようにする。
-n インプットを一行ずつ処理する
-l printの文字列に改行を明示的に書かなくてよい
-e ワンライナーを指定するために必須

ハッシュは初期化しなくても良い。既知のキーが入ってなくても参照できるし、+=を使った場合に0が入っていたかのように振る舞う。
Perlはよくわかっていないが、ワンライナーのために頑張っている感がある。