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