Yandex DNSのdDNSクライアントを作成します

なんらかの理由で、私はYandexドメインのメールヘルプに入り、そこに彼がいることに気付きました。待望のDNS APIです。
そして、ユーザーエミュレーションによる2か月のソリューションよりも、よりネイティブなdDNSクライアントを作りたかったのです。


Cでは、私自身の力でそれを行うのは長い時間がかかるので、PythonもPerlも知らないので、真珠でそれを行います。

与えられた合計:

すべてやり直したいです。

最初に、レコードを置き換えるIPを決定します。
サブ getip {
私の $インターフェース 私の $ ipconf = @_ ;
$ ipconf = defined $ ipconf $ ipconf '/ sbin / ip' ;
my $ res = `ip a s $インターフェイス| grep "inet" ` または die " ipから情報を取得できません: " $! ;
if $ res =〜 / ( [►dd{1,3►.[\d{{1,3►.►\d{{1,3►.[\d{{1,3► ) / {
リターン $ 1 ;
}
die "ipが見つかりません" ;
}

指定されたインターフェイスの最初のIPを取得します。

そして、APIへのリクエストと一般的なレスポンスチェックを関数にスローします。
サブヤピ{
私の $ url = $ _ [ 0 ] ;
die 'params yapi funcのURLではありません'
定義し ない限り $ url ;
私の $ cont = $ ua- > get $ url ;
die 'HTTP Error:' $ cont- > status_line
$ cont- > is_successで ない限り
die 'Not XML、given' $ cont- > content_type
$ cont- > content_type eq 'text / xml'で ない限り ;
my $ resp = XML :: シンプル
-> 新規
-> XMLin $ cont- > content ;
die 'API error:' $ resp- > { domains } -> { error }
$ resp- > { domains } -> { error } eq 'ok' ;
return $ resp- > {ドメイン} -> {ドメイン} ;
}

特に、サーバーからの応答があることを確認し、XMLを解析して、YandexがAPIエラーを返したかどうかを確認します。

ここで主要な部分:
#!/ usr / bin / perl
#ドメイン名
私の $ domain = 'example.org' ;
#認証トークン
私の $トークン = '1bdf72e04d6b50c82a48c7e4dd38cc6920116dfd6774a9e7b32eddfe' ;
#新しいIP、最初の引数として渡されたインターフェイス名によって決定
#すなわち、例えば./yaddns.pl ppp0
私の $ currentip = getip $ ARGV [ 0 ] ;

strictを使用し ます。
LWP :: UserAgentを 使用し ます。
XMLを使用 :: シンプル ;
#use Data :: Dumper; #デバッグ用!
私の $ ua = LWP :: UserAgent- > new ;
$ ua- > エージェント 「pdd.yandex.ruのdDNSクライアント」 ;


my $ domainlist = yapi 'https://pddimp.yandex.ru/nsapi/get_domain_records.xml?token='。$ token '&domain =' $ domain -> { response } -> { record } ;
while my $ record_id $ record = each %$ domainlist {
#print Dumper($レコード);
if $ record- > { type } eq 'A' && $ currentip ne $ record- > { content } {
私の $ update = 'https://pddimp.yandex.ru/nsapi/edit_a_record.xml?token=' $トークン
'&domain =' $ domain '&サブドメイン=' $レコード -> {サブドメイン}
'&record_id =' $ record_id '&content =' $ currentip ;
「レコードの更新」を 印刷し ます $ record_id '(host' $ record- > { subdomain } ") \ n " ;
yapi $ update ;
}
}

シム、このドメインのレコードのリストを取得し、IPが必要なものではないすべてのAレコードを更新します。

一般的には以上です。 これで、インターフェイスを上げるときにスクリプトの起動を登録することができ、静かに生きることができます。

PS:debianでは、パッケージlibcrypt-ssleay-perl、libxml-simple-perl、libwww-perlを提供する必要があります。

APIは2014年12月に廃止されました。

Source: https://habr.com/ru/post/J129600/


All Articles