提供域名,dnspod 账户密码(毕竟dns密码比较重要 不能谁 cat一下都可以看到 需要base64加密),原IP,切换目标IP,

  1. #!/bin/perl
  2. use warnings;
  3. use MIME::Base64;
  4. use LWP;
  5. use Encode;
  6. use JSON;
  7. use Data::Dumper;
  8. my $ChangeDomain='linuxjs.com';
  9. my $BeforeIP='XXX.XXX.XXX.XXX';
  10. my $ChangeIP='XXX.XXX.XXX.XXX';
  11. my $user= decode_base64("加密后的用户名字符串");
  12. my $passwd= decode_base64("加密后的密码字符串");
  13. chomp($user,$passwd);
  14. sub GetDomainID{
  15. my $url='https://dnsapi.cn/Domain.Info';
  16. my $browser = LWP::UserAgent->new(agent => 'checkdns.pl/1.0.0(hydezhao@gmail.com)');
  17. $response = $browser->post( $url,
  18. [
  19. login_email => $user,
  20. login_password => $passwd,
  21. format => 'json',
  22. domain => $_[0]
  23. ]
  24. );
  25. if ($response->is_success != 1)
  26. {
  27. print "链接失败!\n";
  28. exit;
  29. }
  30. else
  31. {
  32. my $rs=$response->content;
  33. my $json_text = JSON->new->utf8->decode($rs);
  34. if ($json_text->{'status'}->{'code'} != 1 )
  35. {
  36. print $json_text->{'status'}->{'message'}."\n";
  37. exit;
  38. }
  39. else
  40. {
  41. return $json_text->{'domain'}->{'id'};
  42. }
  43. }
  44. }
  45. sub GetRecordId{
  46. my $url='https://dnsapi.cn/Record.List';
  47. my $browser = LWP::UserAgent->new(agent => 'checkdns.pl/1.0.0(hydezhao@gmail.com)');
  48. $response = $browser->post( $url,
  49. [
  50. login_email => $user,
  51. login_password => $passwd,
  52. format => 'json',
  53. domain_id => $_[0]
  54. ]
  55. );
  56. if ($response->is_success != 1)
  57. {
  58. print "链接失败!\n";
  59. exit;
  60. }
  61. else
  62. {
  63. my $rs=$response->content;
  64. my $json_text = JSON->new->utf8->decode($rs);
  65. if ($json_text->{'status'}->{'code'} != 1 )
  66. {
  67. print $json_text->{'status'}->{'message'}."\n";
  68. exit;
  69. }
  70. else
  71. {
  72. for my $record(@{$json_text->{'records'}})
  73. {
  74. $id_name{$record->{'id'}} = $record->{'name'}."||".$record->{'value'};
  75. }
  76. return %id_name;
  77. }
  78. }
  79. }
  80. sub UpdateRecord{
  81. my $url='https://dnsapi.cn/Record.Modify';
  82. my $browser = LWP::UserAgent->new(agent => 'checkdns.pl/1.0.0(hydezhao@gmail.com)');
  83. $response = $browser->post( $url,
  84. [
  85. login_email => $user,
  86. login_password => $passwd,
  87. format => 'json',
  88. domain_id => $_[0],
  89. record_id => $_[1],
  90. sub_domain => $_[2],
  91. value => $ChangeIP,
  92. record_type => $_[3],
  93. record_line => '默认',
  94. ttl => '600'
  95. ]
  96. );
  97. if ($response->is_success != 1)
  98. {
  99. print "链接失败!\n";
  100. exit;
  101. }
  102. else
  103. {
  104. my $rs=$response->content;
  105. my $json_text = JSON->new->utf8->decode($rs);
  106. if ($json_text->{'status'}->{'code'} != 1)
  107. {
  108. print "code:".$json_text->{'status'}->{'code'}." error:".$json_text->{'status'}->{'message'}."\n";
  109. exit;
  110. }
  111. else
  112. {
  113. my $message=$json_text->{'record'}->{'name'}."--->".$json_text->{'record'}->{'value'};
  114. return $message;
  115. }
  116. }
  117. }
  118. my $id=GetDomainID($ChangeDomain);
  119. chomp $id;
  120. #print "$id \n";
  121. my %records= GetRecordId($id);
  122. while (my ($k,$v)= each %records )
  123. {
  124. my ($name,$ip)= split(/\|\|/,$v);
  125. if ($ip eq $BeforeIP)
  126. {
  127. chomp($name,$ip);
  128. print "$name--->$ip\n";
  129. print "changing.....\n";
  130. print UpdateRecord($id,$k,$name,'A')."\n";
  131. }
  132. }

这个脚本 配合宕机检测机制 触发执行 可以在无人值守的情况下 短时间内 切换故障机器 把所有域名 切换到 指定备份机器

perl 切换 dnspod 域名记录的更多相关文章

  1. DNS域名记录

    DNS域名记录 DNS数据库 在DNS的解析过程中用到域名的解析资源的记录,这个解析记录在DNS当中称为DNS数据库. 这个数据库又分为正解和反解,正解就是从主机名到ip的过程,反解就是从ip反响解析 ...

  2. 域名注册域名解析域名绑定 dns服务器解析 域名记录的添加 记录类型含义@ www 访问域名请求过程

    创建一个web应用,简言之就是访问一个域名,可以到达一个地方,这个地方就是你存放供别人查看的文件的地方 就像一条绳,从这头拉一下,可以拉出来另一头的东西 主要有两个部分: 域名 虚拟主机(空间) 1. ...

  3. 常用域名记录解释:A记录、MX记录、CNAME记录、TXT记录、AAAA记录、NS记录

    A记录 A记录是用来创建到IP地址的记录. A记录设置技巧 1.如果想创建不带www的记录,即ezloo.com,在主机记录中填写@或者留空,不同的注册商可能不一样. 2.创建多个域名到同一个IP,比 ...

  4. ProxySQL+MGR实现读写分离和主节点故障无感知切换 - 完整操作记录

    前面的文章介绍了ProxySQL用法,这里说下ProxySQL中间件针对Mysql组复制模式实现读写分离以及主节点故障时能够自动切换到新的主节点,而应用对此过程无感知的功能.Mysql组复制(MGR) ...

  5. Windows环境下JDK的配置及多版本JDK切换的方法记录

    (这里记录了笔者了解的关于JDK环境配置的信息,以及针对系统上存在不同版本JDK时所尝试的解决方案.具体来说,是已安装 JDK 8 后,又安装了 JDK 9 时所遇到的问题和尝试的解决方法.这次记录以 ...

  6. 淘宝 NPM 镜像站切换新域名啦

    镜像下载.域名解析.时间同步请点击 阿里云开源镜像站 源起 淘宝 NPM 镜像站(npm.taobao.org)自 2014 年 正式对外服务,一开始只是想简单地做 NPM 的中国镜像站点,回馈国内前 ...

  7. 关于mha手动切换的一些记录(mha方案来自网络)

    mha方案出自:http://www.cnblogs.com/xuanzhi201111/p/4231412.html 当主服务器故障时,人工手动调用MHA来进行故障切换操作,具体命令如下: 先停MH ...

  8. Perl 正则匹配经验记录

    0.正则匹配字典:http://www.cnblogs.com/itech/archive/2010/03/19/1689793.html 1.$/=">";重新定义字符串分 ...

  9. 验证mongodb副本集并实现自动切换primary~记录过程

    接 验证mongodb主从复制过程 1.创建数据目录 同 验证mongodb主从复制过程 的实验一样,本次实验也是采用直接指定启动参数来启动mongodb数据库,本次实验我们需要启动三个数据库,为了与 ...

随机推荐

  1. 将input file的选择的文件清空的两种解决方案

    <input type="file" id="fileupload" name="file" /> 上传文件时,选择了文件后想清 ...

  2. [转]ubuntu 下无法启动chrome

    这很不爽,google了半天也不知道答案(搜索到要重装chrome,可是我怎么都卸载不干净.....),最终解决方法如下: -------------------------------------- ...

  3. Win7 U盘安装Ubuntu16.04 双系统详细教程

    Win7 U盘安装Ubuntu16.04 双系统详细教程 安装主要分为以下几步: 一. 下载Ubuntu 16.04镜像软件: 二. 制作U盘启动盘使用ultraISO: 三. 安装Ubuntu系统: ...

  4. WriteableBitmap 给透明的控件截图的问题

    在WP开发中,我们经常会用到截取某一部分区域,然后分享到微博等等,Writeablebitmap 是一个很好的辅助,但是它本身也有一个限制:只有一个 SaveJpeg 方法,因此透明的区域无法保存,都 ...

  5. Mysql调整字段顺序

    1.增加(add/modify/change)一个字段使之位于第1列 alter table table_name add `id` int first; 2.增加一个字段使之位于某列后 alter ...

  6. 分享篇——我的Java学习路线

    虽然之前我是开发出身,但是我学习的语言是Objective-c,这个语言使用起来范围比较窄,对于自动化学习来说也是无用武之地,所以我自己学习了Java,对于一个有开发经验的人来说学习一门新语言相对来说 ...

  7. 谈谈PHP代码规范

    [转] http://www.syyong.com/php/Talk-about-PHP-code-specification.html 我向往这样一个php世界,里面没有代码规范之争.你我都一样,都 ...

  8. jQuery缓存数据

    很多同学在项目中都喜欢将数据存储在HTMLElement属性上,如 1 2 3 4 <div data="some data">Test</div> < ...

  9. Windows Commands and API

    Shortcuts ... Symbolic Links https://en.wikipedia.org/wiki/NTFS_symbolic_link Hard Links https://en. ...

  10. Easyui之datagrid实现点击单元格修改单元格背景颜色

    前段时间有个需求中有点击datagrid的单元格实现某种事件,调用datagrid的onclickCell这个方法很容易实现,但是体验不好啊,完全不知道自己刚才点击的是哪个单元格,然后就尝试单击单元格 ...