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月に廃止されました。



All Articles