ブログ

Armadillo-810でat-cgiを使ってみる

at_takuya.sasaki
2016年1月11日 22時20分

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行目に追加します)
      chmod(template,S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH);
    なおsystem-config.cも同様に、189行目に追加する形ですが、
      #include <sys/stat.h>
    をインクルードしてあげないとコンパイルエラーになりました。

他にもmkstempを使っている箇所があれば、同様な修正が必要でしょう。