macです。
わさびぃ さん wrote:
> え、これは、参考というより、そのものですね。
> ありがとうございます。
>
> > それに、(これが危険だから避けて通っているのですが)、
> > Cだから、I/Oも制限なしに操作可能です。
> > 通常は、apache, nobodyの権限で動いていますが、
> > /etc/sudoersの設定で、別の権限を与えることもできるので
> す。
> この部分ですが、見ると、そのような
> ディレクトリがないのですが、もう少し詳しく
> お願いできますか?
実際I/Oがないので、例示が難しいです。
DDNSのサーバーとして実装してみましょう。
クライアントは、内緒のURLに内緒の引数をつけて、
定期的にサーバーにHTTPで見に行き、
サーバーは、もし、IPに変化があれば、
zone fileを書き換え、namedをreloadする。
exsample.comは固定IPで、
www.exsample.com sub domainを動的に設定する。
===============================================================
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#define PASSWD "BBDBABDB"
int
ChangeDNS(int serial, char *ip)
{
char buf[BUFSIZ];
FILE *fp;
if ((fp = fopen("/etc/named.d/data-ext/exsample.com", "w")) == NULL) {
return (errno);
}
fprintf(fp, "$TTL 15M ;\n");
fprintf(fp, "@ IN SOA exsample.com. postmaster.exsample.com. (\n");
fprintf(fp, "%d ; Serial\n", serial);
fprintf(fp, "3H ; Refresh\n");
fprintf(fp, "1H ; Retry\n");
fprintf(fp, "15M ; Expire\n");
fprintf(fp, "15M ) ; TTL\n");
fprintf(fp, "@ IN NS exsample.com.\n");
fprintf(fp, "@ IN MX 5 exsample.com.\n");
fprintf(fp, "* IN MX 5 exsample.com.\n");
fprintf(fp, "@ IN A 218.222.193.18\n");
fprintf(fp, "www IN A %s\n", ip);
fprintf(fp, "localhost IN A 127.0.0.1\n");
fclose (fp);
if((fp = popen("/usr/sbin/rndc reload", "r")) == NULL) {
return (errno);
}
while(fgets(buf, BUFSIZ, fp) != 0){}
pclose (fp);
return(0);
}
int main(int argc, char argv[], char *env[])
{
FILE *fp;
char buf[BUFSIZ];
int i;
int serial;
int n;
char *p, *q;
printf("Content-type: text/html; charset=Shift_JIS\n\n");
printf("<html>\n");
printf("<hader>\n");
printf("</hader>\n");
printf("<body>\n");
printf("<p>\n");
printf("<p>\n");
if ((q = getenv("QUERY_STRING")) != NULL) {
printf("QUERY_STRING = %s\n", q);
}
else {
printf("No QUERY_STRING\n");
}
if ((p = getenv("REMOTE_ADDR")) == NULL) {
printf("No IP\n");
}
else if (strncmp(q,PASSWD,strlen(PASSWD)) != 0) {
printf("Get out !\n");
}
else {
if ((fp = fopen("/home/httpd/html/ddns/lastip",
"r+")) == NULL) {
printf("<p>Can't open lastip<p>\n");
}
else {
rewind(fp);
fgets(buf, BUFSIZ, fp);
serial = atoi(buf);
fgets(buf, BUFSIZ, fp);
if (strncmp(buf, p, (strlen(buf)-1)) == 0) {
printf("<p>same ip = %s, serial = %d</p>\n", p, serial);
}
else {
printf("<p>ip change from %s to %s, serial = %d</p>\n",
buf, p, serial);
fflush(fp);
rewind(fp);
fprintf(fp, "%d\n%s", ++serial, p);
if((n = ChangeDNS(serial, p)) != 0) {
printf(strerror(n));
}
fflush(fp);
}
fclose(fp);
}
}
printf("</p>\n");
printf("</body>\n");
printf("</html>\n");
return(0);
}
===============================================================
file:/etc/named.d/data-ext/exsample.com
file:/home/httpd/html/ddns/lastip
はownerをapacheにすればよいが、
/usr/sbin/rndc reload
は、実行できない。
そこで、
file:/etc/sudoers
に
apache localhost = NOPASSWD: /usr/sbin/rndc
を追加する。
# ぜんぜんCGIでないか (^^;
-- mac