月別アーカイブ: 2012年3月

noipへの強制更新

先日noip_updaterのソースを見て、強制的にIPアドレスを更新させる処理が動くようにしたバージョンのプログラムを動かしておきましたが、syslogを見てみるとどうも更新処理が失敗してるみたいです。
Can’t activate host xxxx.no-ip.com
こんな感じのエラーが出てました。
これだけではよくわからんので、デバッガを使って調べてみたいと思います。
まあ、動くのは一日一回なので動くまで待つしかないですが。

Gentooの起動時のログ

OpenRCのログが取れることを今更知った。
起動中にメッセージが出るのを何とか覚えて対処してたり、当該デーモンを単一で動かしてメッセージを確認してましたが、/etc/rc.confの設定でログを記録できる事がわかった。やはり/etc内の設定は全部確認しておかないと駄目ですね。

コミック


最新刊が出てたので買った。気づけば5巻目という感じですかね。
青年向け雑誌かつ作者が元々成人向け作品が多いので内容は成人向けです。絵的には好みですけど、話の大半がエグいものが多いので趣向が合えばって薦められます。まあ、書店での入手は人によっては恥ずかしいか?
話はだいぶ盛り上がってきてそろそろまとめるかなって展開でした。この作品は夢と現実をテーマによくできた話だと個人的にはよくできてると思います。元の雑誌は読んでない・・・というか、田舎なので手に入らないので単行本が出たら手に入れるので続いてるのかどうかもわかりません。

no-ipの自動更新

no-ip.comからツールが提供されてるので、特に問題はないのですが、光回線となるとIPアドレスもそれほど変わることがありません。ツールはIPアドレスの変更がないと更新しません。no-ip.comは一定期間更新が無いと、そろそろ消すぞメールを送ってきます。これまた面倒なのでこれを回避したくて模索してました。

方針としては、IPアドレスが変わってなくても一定期間で更新を行えばいいのですが、提供ツールでは駄目っぽかった・・・と思ったら、#defineの指定で強制更新が可能なことがわかりました。
Webを調べてると大抵の人はシェルスクリプトを作ったりしてそれをcronで実行してるという事例が多くてそれに従うしかないのか?と思ってたのですが、ソースを調べてみたら機能があったという。最悪、共有メモリを持ってるので、それを何とかすればと思いましたが、共有メモリはIPアドレスの変更には参照してないので駄目だった。

で、何を指定したら強制更新が出来るかというと、FORCE_UPDATEを指定すれば可能となります。コンパイル時に-DFORCE_UPDATE=1とすれば機能が動きます。デフォルトは30日後です・・・って長いよね。そこで、-DFORCE_INTERVAL=タイマ値(分単位で指定。1440で一日です)を指定すれば、この時間がExpireすると強制更新するというわけです。念の為、gdbで当該機能がちゃんと有効になってるか確認したら問題なさそうでした。また、当然IPアドレスが変われば更新されるので、万事解決となりました。めでたしめでたし。

・・・のはずでしたが、うちのサーバはGentooなのでこれまた悩むことに。
ツールはemergeで追加できるのですが、コンパイルオプションの指定は全く出来ません。なので、自前のebuildを作成してアップデートする必要がありました。まあ、自分でバイナリを作って上書きしてしまうのが楽なのですけど、万が一パッケージが更新された場合にアップデートしたのを忘れてると思うので、正攻法でいきました。
自分用のebuildを作成し、コンパイルオプション指定と思われるところに上記の指定を行い、emergeしてインストール完了です。

ファンタ

http://www.cocacola.co.jp/products/lineup/fanta06.html
フルーツパンチが売られてました。ペットボトルではありますけど、デザインは昔風なのが何ともです。個人的には今でも売ってるオレンジ、グレープも当時のデザインで出して欲しかったです。あと、復刻するならレモンが飲みたいです。あっという間に消えてしまったのが非常に残念でならない

野良ebuildをやってみる

noip-updaterの細かい#defineの指定が出来ないので、野良ebuildを作ってインストールしてみました。
まず、ebuildのファイルを置くディレクトリの大本を決定します。うちは/usr/local/portageにしました。これを/etc/make.confへPORTDIR_OVERLAY=/usr/local/portageの設定を書き加えます。
Gentooはportage配下にカテゴリのディレクトリとパッケージ名のディレクトリを持ちますので、上記ディレクトリにnet-dns/noip-updaterのサブディレクトリを作成します。そこへ.ebuildファイルをコピーして編集します。
.ebuildファイルは同じバージョンだと駄目なので、うちは-r1を加えたものを作成し、ファイルの編集を行います。
ソースはファイル名のバージョンを取得してダウンロードするので、直接オリジナルのバージョンを含むファイル名に変更しました。コンパイルっぽい箇所へ#defineの指定を加えてファイルを書き込み終了。
次にebuildコマンドで「ebuild ebuildファイル digest」でダイジェストを作成します。これで関連ファイルのダイジェストも作られるので準備OKです。
あとはemergeでアップデートを行えば問題ありません。コンパイルエラーなどが出たらebuildファイルを見直し、ダイジェストを作成、emergeを行えばいいわけです。
ebuildファイルの書き方を覚えれば対応してないパッケージも追加が出来ます。

グローバルIPアドレスの取得

通常は取得するケースは無いと思いますが、気になったので調べてみました。
うちは外向けサーバのドメイン名をno-ip.comを使用してます。IPアドレスの更新がないとサイトへの通知も行われず。そしてある程度更新が無いと消すかもよ?ってメールが届くわけです。Activateを毎回やってもいいのですが、認証やら面倒なので可能なら定期的にIPアドレスを更新したい訳です。

アップデータプログラムはno-ip.comで公開されてるnoip_updaterというプログラムで、Windows用やらLinux用やら用意されてます。Gentooの場合はPortageが用意されてるので、emergeでパッケージ追加が可能です。今回はこのプログラムを調べることでIPアドレスの扱いを調べてみようかと。

○自分のIPアドレス
これはソケットを作り、ioctlで取得することが出来る。ソケットはSOCK_STREAMでもSOCK_DGRAMでもどちらでもOK。そしてioctl(SIOCGIFADDR)でIPアドレスの取得が出来ます。
これは利用するポイントが不明ですがおまけで。

○グローバルIPアドレス
APIで何とかなるのか?と思ったら結局無理だった。つか、大抵のケースはルータマシンならまだしも、ルータ配下にサーバを置くわけで、人様が持つ情報をどうやって取るんだ?ってのが結論でした。
SNMP辺りから攻めてもいいのですが、no-ip.com提供のプログラムは次のように行っていた。

仕組みは、no-ip.comのサーバ(dynupdate.no-ip.com)のポート8245へSTREAMソケットで接続し、HTTPプロトコルのGETメソッドを送ることで、そのリプライにIPアドレスが戻される仕組みだった。
結局他のddns提供されてるのと同じで、サーバへ接続してIPアドレスを調べるしか手がないということです。