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

Ozawa/Sankyo email@hidden
2011年 7月 13日 (水) 17:06:41 JST


竹之下様

小澤です。
早速、ご回答頂きましてありがとうございました。
わかりやすく説明いただき大変助かりました。ご指摘いただいた
とおりsudoersへ実行ファイルを記述しCGIでsystem()関数を
動作できるようになり、戻り値も0を返してきました。
Wi-Fiを経由して動作確認もできましたので報告いたします。
今後ともよろしくお願いいたします。

----- Original Message ----- 
From: "Takenoshita Koyo" <email@hidden>
To: <email@hidden>
Sent: Tuesday, July 12, 2011 4:46 PM
Subject: [Armadillo:07392] Re: lighttpdでCGIよりGPIOを制御するには


> 竹之下です。
>
> > まずどこをチェックしたらよいかご教授ください。
> 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 mailing list
> email@hidden
> http://lists.atmark-techno.com/cgi-bin/mailman/listinfo/armadillo
>




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