そして、ユーザーエミュレーションによる2か月のソリューションよりも、よりネイティブなdDNSクライアントを作りたかったのです。
Cでは、私自身の力でそれを行うのは長い時間がかかるので、PythonもPerlも知らないので、真珠でそれを行います。
与えられた合計:
- 動的外部IP
- Yandexドメインの委任
- Debianルーター
すべてやり直したいです。
最初に、レコードを置き換える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月に廃止されました。