Armadillo-400シリーズのAtmark Distで標準でインストールされるat-cgi [*1] は、Armadillo-810では標準インストールされていません。 このat-cgiをArmadillo-810で使ってみた際の、作業メモです。
構成としてはArmadillo-810開発セットにUSB-LANアダプタを接続して、LANに接続しています。 ただし、すべての機能を使ってみたわけではないので、ご注意ください。
ユーザーランドコンフィギュレーションで有効化
以下のようにmake menuconfigで変更が可能です。
atmark@atde5:~/atmark-dist$ make menuconfig Userland Configuration Miscellaneous Applications ---> [*] at-cgi ←チェックをつける [ ] top-only (NEW) [*] system (NEW) ←チェックをつける [*] firewall (NEW) ←チェックをつける [*] bridge (NEW) ←チェックをつける [*] usbdata (NEW) ←チェックをつける [*] packet scan (NEW) ←チェックをつける
新しいユーザーランドで起動してみた結果
1. top画面が表示できない
topページを表示しようとすると、以下のようにブラウザにエラーが表示されます。
An error occurred when obtaining system info
これは解消するためには、Armadillo-810の/etc/config/at-admin 内の以下のエントリを
eth0に修正する必要があります。
*usb0を使ってLANに接続している場合には、at-cgiのソースコード修正が必要になりそうです。
[armadillo ~]# vi /etc/config/at-admin PRIMARY_IF="usb0" ↓ PRIMARY_IF="eth0"
2. IPアドレスを変更した後、topページが表示できない
[System-Network]でIPアドレスを変更すると、再度topページを表示するように促されますが、 その際に以下のようなエラーが出て表示できなくなります。
An error occured when obtaining system info
原因としてはat-cgi経由で作成した /etc/config配下の interfacesとresolv.confのパーミッションが 600になってしまっており、at-cgiから読みだせないことです。
400シリーズでは問題ないのですが、差分を追ってみるとbusyboxの cp コマンドの仕様が異なっているようです。(詳しい調査は後ほどしてみたいと思います)
interfacesやresolv.confは以下のソースコード中の mkstemp()で一時ファイルを600のパーミッションで生成して、その後に cp を使って本物のファイルにコピーしています。
atmark-dist/user/at-cgi/at-cgi/common/misc-utils.c
400シリーズのcpの場合は、この時、コピー先のパーミッションを保持するようなのですが、810のcpの場合、元ファイルのパーミションを保持してしまうために、/etc/config配下に600のファイルが生成されてしまいます。
最終的な解決としては/etc/configの下のファイルを 644 にしてあげることですが、対処方法はいくつか考えられるかと思います。 以下は、私が考えた対処方法です。
- cpをbusyboxではないものに変える
→ 試していませんが、busyboxではない cp に切り替えることで、400シリーズと同等の動きになる可能性はあります。ただし、他のアプリケーションの動作にも影響を与えそうですので、これは避けたほうがよいかもしれません。 - コピー後に chmod で 644 に変更する
→ misc-utils.c内で cp した後に、明示的に chmod 644 をしてあげる方法です。 ただ、cgi経由でsudoをつけて実行できるコマンドは限られており、 chmodは対象外のため、ここも直す必要があります。なお、cgi経由でsudoをつけて実行できるコマンドは、 /etc/sudousers 内に定義されています。 - 一時ファイルを 644 に変更する
→一番修正が少ないかと思います。私の方では以下のように修正することで、2を含めて解消できました。
mkstempで一時ファイルを作りfdopen後にfputsなどで書き込み、fclose した後に、以下のようにchmodで644に変更します。
(具体的には 68行目.422行目に追加します)なおsystem-config.cも同様に、189行目に追加する形ですが、chmod(template,S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH);
をインクルードしてあげないとコンパイルエラーになりました。#include <sys/stat.h>
他にもmkstempを使っている箇所があれば、同様な修正が必要でしょう。