[Armadillo:07392] Re: lighttpdでCGIよりGPIOを制御するには

Takenoshita Koyo email@hidden
2011年 7月 12日 (火) 16:46:10 JST


竹之下です。

> まずどこをチェックしたらよいかご教授ください。
CGIを作成する際には、まずは以下の点についてご確認ください。
(他の方にも参考となるように、一般的な事も含めて書きます。)

1. CGIプログラムのファイル名と配置場所パーミッション
通常、HTTPサーバーの設定でどのファイルをCGIとして実行するか
指定できるようになっています。
Armadilloでは、CGIプログラムは「.cgi」で終わるファイル名になって
いなければなりません。

また、ファイルがある場所はHTTPサーバーのドキュメントルート以下
(多くの場合、cgi-bin以下)にCGIファイルが配置されている必要が
あります。
Armadilloの場合、/home/www-data ディレクトリ以下にあれば
良いです。

2. CGIファイルの所有者とパーミッション
Armadilloでは、CGIファイルの所有者と所有グループは
"www-data"にしてください。また、www-dataでの実行を
許可しておく必要があります。

例: CGIファイル(sample.cgi)の所有者とパーミッションの変更
[armadillo /home/www-data]# chown www-data:www-data sample.cgi
[armadillo /home/www-data]# chmod +x sample.cgi
[armadillo /home/www-data]# ls -l sample.cgi
-rwxr-x--x    1 www-data www-data     7749 Jan  1 09:00 sample.cgi*

3. 外部コマンドの実行
CGIプログラムから、外部コマンドを実行したい場合、
fork/exec で新しいプロセスを作成し実行するか、
system()関数を使って実行することができます。

この際、外部コマンドはwww-dataユーザーで実行される点に
ご注意ください。つまり、特権(root)ユーザーの権限が必要な
コマンドは実行できません。

Armadilloの標準イメージでは、CGIのサンプルとして
at-cgiが動作していますが、at-cgiでは特権ユーザー権限が必要な
コマンドは、sudoを介して実行しています。

www-dataユーザーがsudoを介して実行できるコマンドは、/etc/sudoersファイル
で設定してあります。ifup、ifdown、netflash、ledctrlなどが指定されています。
もし、その他のコマンドも実行できるようにしたい場合には、ここに追加してください。
sudoersファイルの書式は、man sudoersで調べることができます。



と、ここまでが一般論です。

今回のケースについて考えると、
> system()関数の戻り値は、任意の整数値を返しエラー表示もありません。
任意の整数値が返ってきているということは、system()関数で指定したコマンドが
失敗しているように見えます。
system()で指定したコマンドが成功した場合、0が返ってくるはずです。

Armadillo-400シリーズでは、LEDやGPIOはsysfsを介して制御しますが、
sysfsファイルへの書き込みには特権(root)ユーザー権限が必要です。
(www-dataユーザーで実行されるCGIからは、sudoを介さないと書き込めない)
そのあたりで、エラーになっているのではないでしょうか?

(2011年07月12日 11:24), Ozawa/Sankyo wrote:
> 小澤と申します。
> 初めて参加させていただきますので不備がありましたら
> ご指摘ください。
> 
> 現在、A-420wlanを使用してwebサーバー上でCGIプログラムを
> 動作させ、CON9_28のpinをhigh/lowさせようとしています。
> 
> C言語でGPIOのvalueファイルの書き換えを行うプログラムを作り、
> /www-data/内でも単独では動作出来ています。
> しかし、CGIプログラムを作成しsystem()関数内で動作させると
> 動作しません。CGIプログラムは、その他表示内容を含め問題なく
> ブラウザに表示してきますので動作しています。
> system()関数の戻り値は、任意の整数値を返しエラー表示もありません。
> 
> CGIプログラム内のsystem()関数内でシェルコマンドpwd、ls-lを使うと
> 動作しますので関数は動いている感じがします。ただし、GPIOは動作
> できていない状況です。
> 
> その他、echoコマンドでvalueファイルを書き変える方法も
> /www-data内でも動作しますが、system()関数内ではGPIOを変更
> できません。
> また、LEDドライバでechoコマンドを使用して/brightnessファイルを
> 書き換える場合も同様の現象です。単純にファイルの書き換えが
> lighttpd上の環境で許されていないのかもしれませんが。
> 
> まずどこをチェックしたらよいかご教授ください。
> よろしくお願いいたします。
> 
> _______________________________________________
> armadillo mailing list
> email@hidden
> http://lists.atmark-techno.com/cgi-bin/mailman/listinfo/armadillo
> 


-- 
Koyo Takenoshita




armadillo メーリングリストの案内