久しぶりにonamae_ddnsを更新しました。
というのも、最近ネットワーク不良でモデムの交換とか色々やってもらっていたんですが、その間にグローバルIPアドレスが変わってしまっていたのと、cronが正しく動作していなかったので、プログラムを久しぶりにチェックしてアップデートを行いました。
今回は2つのバージョンをまとめて書き残しておきます。
初めに、onamae_ddnsがわからない方はこちらをご覧ください。
さて、更新内容についてですが、ver0.02については、以下のような改善を行いました。こちらはプルリクをいただいて修正を行ったものです。
- ifconfig.ioがIPv6環境でv4アドレスを返さない問題の修正
これだけです。
ソースコードではこんな感じになっています。
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
int main(){
FILE *file;
char buffer[128];
char *pcmd;
strcpy(buffer,"curl ifconfig.io -4 > /tmp/gbip.buff");
pcmd=(char*)buffer;
system(pcmd);
file=fopen("/tmp/gbip.buff","r");
fgets(buffer,128,file);
fclose(file);
buffer[strlen(buffer)-1]='\0';
file=popen("openssl s_client -connect ddnsclient.onamae.com:65010 -quiet","w");
sleep(1);
fprintf(file,"LOGIN\nUSERID:12345678\nPASSWORD:pass1234\n.\n");
sleep(1);
fprintf(file,"MODIP\nHOSTNAME:hostname\nDOMNAME:test.com\nIPV4:%s\n.\n",buffer);
sleep(1);
fprintf(file,"LOGOUT\n.\n");
pclose(file);
printf("\n%s\n",buffer);
return 0;
10行目のこの一文を変更してます。
strcpy(buffer,"curl ifconfig.io -4 > /tmp/gbip.buff");
いままで「-4」の部分がなかったので、これを追加してv4アドレスを返すようにしました。プルリクをいただいて助かりました。
次に、ver0.03での更新内容は以下のようになっています。
- systemコマンドからpopenコマンドへ変更
- これによりI/O負荷軽減と、読み取りにかかる時間がなくなり多少の高速化
- 不要なincludeファイルを削除
- ifconfig.ioからの戻り値がないときにエラーメッセージを表示するように変更
- example.comのような例示用ドメインにサンプルを変更
このような更新をしました。
コードはこちらです。
#include <stdio.h>
#include <unistd.h>
#include <string.h>
int main(){
FILE *file;
char buffer[128];
char *pcmd;
file=popen("curl ifconfig.io -4","r");
if (file==NULL){
printf("ERROR!! Can't reach \"ifconfig.io\"\n");
return -1;
}
fgets(buffer, 128, file);
pclose(file);
buffer[strlen(buffer)-1]='\0';
file=popen("openssl s_client -connect ddnsclient.onamae.com:65010 -quiet","w");
sleep(1);
fprintf(file,"LOGIN\nUSERID:12345678\nPASSWORD:Pass1234\n.\n");
sleep(1);
fprintf(file,"MODIP\nHOSTNAME:hostname\nDOMNAME:example.com\nIPV4:%s\n.\n",buffer);
sleep(1);
fprintf(file,"LOGOUT\n.\n");
pclose(file);
printf("\n%s\n",buffer);
return 0;
}
最初の方が大きく変わっています。
ver.0.02までは、IPアドレスの保存を外部ファイルである「/tmp/gbip.buff」へ書き出していたのですが、この処理系統だと、わざわざ外部ファイルに書き出すのは不要なI/O負荷を与えることでしかないので、popenの形にして直接データを取得するように変更しました。
もともと、更新するIPアドレスが前のIPアドレスと同じであった場合に更新をしないような挙動を考えていた名残だったのですが、そうする必要もないので、今回コードの見直しも兼ねて変更を行いました。
これによってI/O負荷軽減はもちろん、若干の高速化ができます。この程度のプログラムなので負荷なんてあってないようなものなのですが、少しでも必要リソースは少なくしたいというのがSBCを使っているとあるので自己満足の範囲です。
あとはサンプルで埋めている項目をexample.comというものに変えました。前は違うのを書いていたのですが、どうもドメインの例を出す場合に例示用のドメインというのを使うのがマナーらしくそれに倣った形になります。
あとはこれに併せてコードを少し整理しました。
更新内容としてはこれぐらいです。
今回のver.0.03が不要な動作もなく早いと思うので、従来版を使用している方は更新されたら良いかと思います。当然ながら私の環境では更新を行いました。
さて、将来的な話をすると、そんなにこのツールですることってないんですよね。方法としては完成されているツールなのでこれ以上やることはないかなと。
今回ソースコードを見直すきっかけになったのが、我が家のグローバルIPが変更されて、それが自動でうまく更新できていなかったというのがあるからですね。まあ、cronを適当に登録していた自分が悪いのですがね。
なので、やるとしたら機能追加とかになるんですが、簡単なコードで考えているのはLINEのAPIを使ってLINE Notifyにメッセージを送るのはありかなとか思っています。
コマンドライン上のツールだと正しく実行されているかが一目でわかりにくいというのもあるので、とりあえず実行しましたっていうのを送信できたら便利なのかなとか思います。ローカルのファイルに実行時間を記録してもいいんですが、無駄にファイル書き込みとかしたくないですし。
ただ、このonamae_ddnsの仕様や目的としては、不要なコードを混ぜたくないというのもあるので機能追加については少し悩ましいところです。
コマンドラインでv6の方も更新ができそうなら両方とも更新できるようにするとかもありかなと思っています。本来の仕組みならv6アドレスは変わるものではないんですけどね。まあ、お名前ドットコムの方がIPv6の自動更新には非対応って書いてあるので難しいと思いますが。
とりあえず更新内容と展望については以上です。