[H8-ML(5252)] Re: GUI について
From: Shigeru Makino <mac@xxxxxxx>
Date: 2004年12月24日(金)15時50分33秒
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


スレッド概略
[5235(R)](起点)
 └[5245(U)]
   └[表示中]


投稿順に移動
[←前の記事へ(P)]
[→次の記事へ(N)]


リスト表示へ
[このスレッド(T)]
[本記事の前後(L)]