[Armadillo:07834] at-cgi で0600なresolv.confが生成される
Yasuhisa Nakamura
email@hidden
2012年 1月 21日 (土) 11:35:33 JST
中村です。
at-cgiが生成する /etc/config/resolv.conf がrootしか読めない
0600のファイルになってしまうケースがあります。
●発生ケース
IPアドレス固定でDNSを使わないファームウェア(romfs)を作ります。
具体的には、vendor/Atmark...../etc/default/interfaces を
書き換えてIPアドレス固定の設定にし、/etc/default/resolv.confは、
作りません。
このromfsイメージ作り、netflashでフラッシュに書き込んだ後、
flatfsd -i
で再起動します。
"-i"は、reboot前にconfigフラッシュをクリアしますので、
もしそれ以前に/etc/config/resolv.confがあったとしても、
再起動後にはresolv.confはなくなります。
ブラウザでat-cgiにアクセスして、"Network"の画面をみると、
"DNS Server"のところは空になっているはずです。
このような状態のときに、DNSサーバによる名前解決が必要に
なって(たとえば、at-cgiの"Firmware"の画面を使って、
アットマークテクノ社のサイトから純正ファームウェアを
ダウンロードして書きかえる、というような作業が必要に
なったとき)、"Network"の画面で"DSN Server"のアドレスを
設定して[update]ボタンで保存します。
この操作で生成される /etc/config/resolv.conf ファイルが、
オーナーがrootで、パーミッションが0600になっています。
#"DNS Server"は設定せずに空のままにしておいて、
#自分のIPアドレスだけを変更する目的で、ネットワーク設定を
#変更したときにも、0600の空の/etc/config/resolv.confが
#生成されます。0600のresolv.confができてしまうと、
#このあとどんな操作をしても0600のままです。
#"AutoIP"にしてDHCPで取ってきても0600のままです。
● rootしか読めないrosolv.confだと・・・
rootしか読めないファイルですから、at-cgiでは読むことが
できません。今設定したはずの"DNS Server"のところは空は、
空のままです。
また、"Firmware"の画面で[Get firmware options]ボタンを押すと、
"Failed to get update options"というエラーになります。
これは、root以外はresolv.confを読めないので、at-cgiから
起動されたwgetが、ファームウェアダウンロードサーバの
IPアドレスを解決できないためです。
● 原因
/misc-utils.cのsudo_string_to_file()内のmkstemp()が
つくる一時ファイルは0600ですので、それを/etc/config/resolv.confに
コピーすると、0600なresolv.confができあがります。
#resolv.confがないときにDHCPで作られるresolv.confは
#0644なので、その状態で0600のresolv.confをコピーしても
#resolv.confは0644のままです。
● パッチ
いろいろな解決方法があると思いますが・・・
--- at-cgi/common/misc-utils.c (revision xxx)
+++ at-cgi/common/misc-utils.c (working copy)
@@ -296,6 +296,7 @@
{
int ret;
char line_buffer[MAX_STR_LEN_S];
+ char *chmod_args[] = {SUDO_PATH, CHMOD_PATH, "0644", RESOLV_CONF_PATH, NULL};
if (!nameserver) {
return -1;
@@ -312,6 +313,11 @@
return -1;
}
+ ret = cgi_exec(chmod_args[0], chmod_args);
+ if (ret < 0) {
+ syslog(LOG_WARNING, "at-cgi: failed to chmod resolv.conf");
+ }
+
return 0;
}
Index: at-cgi/common/core.h
===================================================================
--- at-cgi/common/core.h (revision 238)
+++ at-cgi/common/core.h (working copy)
@@ -59,6 +59,7 @@
#define CAT_PATH "/bin/cat"
#define RM_PATH "/bin/rm"
#define CP_PATH "/bin/cp"
+#define CHMOD_PATH "/bin/chmod"
#define LED_CTRL_PATH "/bin/ledctrl"
#define CRONTAB_PATH "/usr/bin/crontab"
#define MAIL_PATH "/bin/mail"
この他に、vendor/Atmark...../etc/sudoersに "/bin/chmod" を
追加する必要があります。
別な方法として、空の/default/resolv.conf を0644で作っておく、
というのでもいいかもしれません。
--
なかむら
armadillo メーリングリストの案内