示例#1
0
文件: main.cs 项目: zakailynn/AliDDNS
        private void updateDomainRecord()
        {
            string[] symbols = new string[1] {
                "."
            };
            string[] data       = fullDomainName.Text.Split(symbols, 30, StringSplitOptions.RemoveEmptyEntries);
            string   domainRR   = data[0];
            string   domainName = data[1] + "." + data[2];

            UpdateDomainRecordRequest request = new UpdateDomainRecordRequest();

            request.Type     = "A";
            request.RR       = domainRR;
            request.RecordId = recordId.Text;
            request.Value    = localIP.Text;
            try
            {
                UpdateDomainRecordResponse response = client.GetAcsResponse(request);
                recordId.Text = response.RecordId;
            }
            //处理错误
            catch (ServerException e)
            {
                MessageBox.Show(e.ErrorCode + e.ErrorMessage);
            }
            catch (ClientException e)
            {
                MessageBox.Show(e.ErrorCode + e.ErrorMessage);
            }
        }
示例#2
0
        public async Task CheckAndModify()
        {
            string ip = await IPHelper.GetIP_Amazon();

            if (string.IsNullOrEmpty(ip))
            {
                throw new Exception("Get Local IP error:GetIP_Amazon()");
            }
            foreach (var item in describeDomainRecords_Records)
            {
                if (Options.MonitorHosts.Contains(item.RR) && item._Value != ip)
                {
                    //比对不相同的时候更新本地ip到服务器
                    var updateRequest = new UpdateDomainRecordRequest();
                    updateRequest.RecordId = item.RecordId;
                    updateRequest.RR       = item.RR;
                    updateRequest.Type     = item.Type;
                    updateRequest._Value   = ip;
                    var updateResponse = client.GetAcsResponse(updateRequest);
                    if (!updateResponse.HttpResponse.isSuccess())
                    {
                        Log.Logger.Error($"主机记录:{item.RR},IP:{ip},更新ip失败");
                    }
                    else
                    {
                        //更新本地存储的dns,方便下次对比,保证和服务端一致
                        item._Value = ip;
                        Log.Logger.Information($"更新主机记录:{item.RR},更新前IP:{item._Value},更新后IP:{ip},");
                    }
                }
            }
        }
示例#3
0
        public override DomainRecordActionResult UpdateDomainRecord(UpdateDomainRecordParam param)
        {
            var request = new UpdateDomainRecordRequest()
            {
                RecordId = param.RecordId,
                RR       = param.RR,
                Type     = param.Type.ToString(),
                _Value   = param.Value,
                TTL      = param.TTL
            };

            try
            {
                var response = client.GetAcsResponse(request);
                if (response == null || response.HttpResponse.Content == null || response.HttpResponse.Content.Length == 0)
                {
                    throw new Exception($"Update subdomain record info failed. record id is {param.RecordId}, new value is {param.Value}");
                }
                string result    = Encoding.UTF8.GetString(response.HttpResponse.Content);
                var    resultObj = new JsonSerializer().Deserialize <DomainRecordActionResult>(new JsonTextReader(new StringReader(result)));
                if (resultObj != null)
                {
                    resultObj.Status = true;
                }
                return(resultObj);
            }
            catch (ServerException e)
            {
                throw new Exception($"Aliyun server error. {e.Message}");
            }
            catch (ClientException e)
            {
                throw new Exception($"Reuqest client error. errcode is {e.ErrorCode}, {e.Message}");
            }
        }
示例#4
0
        // 更新IP信息
        private static void UpdateIP(DefaultAliyunClient aliyunClient, Record record, string ip)
        {
            int errorTimes = 0;

            while (true)
            {
                var changeValueRequest = new UpdateDomainRecordRequest()
                {
                    RecordId = record.RecordId,
                    Value    = ip,
                    Type     = "A",
                    RR       = SUBDOMAIN_NAME
                };
                try
                {
                    aliyunClient.Execute(changeValueRequest);
                    LogHelper.WriteLog(string.Format("域名解析记录更新成功:{0}.{1} => {2}", SUBDOMAIN_NAME, DOMAIN_NAME, ip));
                    return;
                }
                catch
                {
                    errorTimes++;
                    if (errorTimes > ERROR_RETRIES)
                    {
                        LogHelper.WriteLog("多次更新域名解析记录失败,程序退出");
                        Environment.Exit(0);
                    }
                    else
                    {
                        LogHelper.WriteLog("更新域名解析记录失败,正在重试");
                    }
                    Thread.Sleep(TIME_UNIT);
                }
            }
        }
示例#5
0
        private void btn2_Click(object sender, EventArgs e)
        {
            var ip = tb1.Text.Trim();

            if (!string.IsNullOrEmpty(ip) && ip.Length < 16 && ip.Length > 6)
            {
                btn2.Enabled = false;

                BackgroundWork(() =>
                {
                    var request = new UpdateDomainRecordRequest
                    {
                        RR       = domainRecordRR,
                        RecordId = domainRecordId,
                        Type     = "A",
                        _Value   = ip
                    };
                    client.GetAcsResponse(request);
                    InvokeVoid(() =>
                    {
                        btn2.Enabled = true;
                        Process.Start("cmd.exe", "/k ipconfig /flushdns");
                    });
                });
            }
        }
示例#6
0
        private async Task <UpdateDomainRecordRequest> CheckIP()
        {
            //string ip = await IPHelper.GetIP_Amazon(logger);
            string ip = "";
            UpdateDomainRecordRequest updateRequest = null;

            if (string.IsNullOrEmpty(ip))
            {
                return(updateRequest);
            }

            try
            {
                //IAcsClient提供了两种类型的调用结果返回, 一种方式是通过调用doAction方法获取取得原始的api 调用结果, 即返回HttpResponse类型的结果. 示例代码如下:
                //HttpResponse httpResponse = client.doAction(describeCdnServiceRequest);
                //System.out.println(httpResponse.getUrl());
                //System.out.println(new String(httpResponse.getContent()));
                //另一种方式, 通过调用 getAcsResponse 方法, 获取反序列化后的对象, 示例代码如下:
                var response   = client.GetAcsResponse(request);
                var domainList = response.DomainRecords;

                if (domainList.Count == 2)
                {
                    var domainRecord = domainList[0];
                    //logger.LogInformation("domain name:" + domainRecord.DomainName);
                    //logger.LogInformation("domain type:" + domainRecord.Type + "\r\n" + "domain value:" + domainRecord.Value);
                    if (domainRecord.Value != ip)
                    {
                        //logger.LogInformation("当前外网IP:" + ip + "\r\n" + "解析IP:" + domainRecord.Value);
                        //logger.LogInformation("IP发生变化,开始修改域名解析..." + domainRecord.DomainName);

                        updateRequest          = new UpdateDomainRecordRequest();
                        updateRequest.RecordId = domainList[0].RecordId;
                        updateRequest.RR       = domainList[0].RR;
                        updateRequest.Type     = domainList[0].Type;
                        updateRequest.Value    = ip;
                    }
                }
                else
                {
                    throw new Exception($"域名数:{domainList.Count}");
                }
            }
            catch (ServerException e)
            {
                //logger.LogError(e, e.Message);
            }
            catch (ClientException e)
            {
                //logger.LogError(e, e.Message);
            }

            return(updateRequest);
        }
示例#7
0
        public Task Execute(IJobExecutionContext context)
        {
            var publicIP = GetPublicIPEx();
            var cachedIP = CacheHelper.GetCacheValue <string>(CACHEKEY_CachedIP);

            if (!string.IsNullOrWhiteSpace(cachedIP) && cachedIP.Equals(publicIP, StringComparison.OrdinalIgnoreCase))
            {
                return(Task.CompletedTask);
            }

            IClientProfile   profile = DefaultProfile.GetProfile("cn-hangzhou", ConfigUtil.GetConfigVariableValue("accessKeyId"), ConfigUtil.GetConfigVariableValue("accessSecret"));
            DefaultAcsClient client  = new DefaultAcsClient(profile);
            var request = new DescribeDomainRecordsRequest();

            //request.Value = "3.0.3.0";
            //request.Type = "A";
            //request.RR = "apitest1";
            request.DomainName  = ConfigUtil.GetConfigVariableValue("DomainName");
            request.TypeKeyWord = ConfigUtil.GetConfigVariableValue("DomainRecordType");
            request.RRKeyWord   = ConfigUtil.GetConfigVariableValue("DomainRecordRR");
            try
            {
                var response = client.GetAcsResponse(request);
                if (response.TotalCount > 0)
                {
                    var rec = response.DomainRecords.FirstOrDefault(t => t.RR.Equals(request.RRKeyWord, StringComparison.CurrentCultureIgnoreCase));
                    if (rec != null && rec.Value != publicIP)
                    {
                        var reqChange = new UpdateDomainRecordRequest();
                        reqChange.RecordId = rec.RecordId;
                        reqChange.RR       = rec.RR;
                        reqChange.Type     = rec.Type;
                        reqChange.Value    = publicIP;

                        var respChange = client.GetAcsResponse(reqChange);

                        CacheHelper.SetCacheValue(CACHEKEY_CachedIP, publicIP);

                        Console.WriteLine($"[{DateTime.Now}]:{rec.RR}.{rec.DomainName} Changed to IP {publicIP} success");
                    }
                }
                // Console.WriteLine(System.Text.Encoding.Default.GetString(response.HttpResponse.Content));
            }
            catch (ServerException e)
            {
                Console.WriteLine($"[{DateTime.Now}]【Exception】{e}");
            }
            catch (ClientException e)
            {
                Console.WriteLine($"[{DateTime.Now}]【Exception】{e}");
            }

            return(Task.CompletedTask);
        }
示例#8
0
        /// <summary>
        /// 更新域名解析值
        /// </summary>
        /// <param name="ipaddr">新的ip地址</param>
        /// <param name="recordId">解析条目的主键</param>
        public void UpdateDomainRecords(string ipaddr, string recordId)
        {
            var changeValueRequest = new UpdateDomainRecordRequest()
            {
                RecordId = recordId,
                Value    = ipaddr,
                Type     = "A",
                RR       = CGlobalConfig.FirstName
            };

            aliyunClient.Execute(changeValueRequest);
        }
        public static void UpdateDomainRecords(DescribeDomainRecordsResponse.Record record)
        {
            IClientProfile            clientProfile = DefaultProfile.GetProfile("cn-hangzhou", CGlobalConfig.AccessKey, CGlobalConfig.AccessKeySecret);
            DefaultAcsClient          client        = new DefaultAcsClient(clientProfile);
            UpdateDomainRecordRequest request       = new UpdateDomainRecordRequest();

            request.RecordId = record.RecordId;
            request.RR       = record.RR;
            request.Type     = record.Type;
            request.Value    = record.Value;
            UpdateDomainRecordResponse response = client.GetAcsResponse(request);
        }
示例#10
0
        private void UpdateDNS(string recordId, string ip)
        {
            var updateRequest = new UpdateDomainRecordRequest()
            {
                RecordId = recordId,
                RR       = ip,
                Type     = "A",
                _Value   = ip
            };

            _ = _acsClient.GetAcsResponse(updateRequest);

            _logger.LogInformation($"[Update DNS] {_rr}.{_domainName} ->  {ip}");
        }
示例#11
0
        public static void DomainRecordCheck(DefaultAcsClient client, string checkDomain, string currentIP)
        {
            try
            {
                DescribeDomainRecordsRequest req = new DescribeDomainRecordsRequest();
                req.PageSize   = 10;
                req.PageNumber = 1;
                req.DomainName = checkDomain;
                var rsp = client.GetAcsResponse <DescribeDomainRecordsResponse>(req);

                // 修改
                foreach (var record in rsp.DomainRecords)
                {
                    if (record.Value == currentIP)
                    {
                        continue;
                    }

                    Console.WriteLine($"域名: {checkDomain} 当前解析地址为 {record.Value}, 需要重新解析成 {currentIP}, RR: {record.RR}, Type: {record.Type}");

                    UpdateDomainRecordRequest updateReq = new UpdateDomainRecordRequest();
                    updateReq.RecordId = record.RecordId;
                    updateReq.RR       = record.RR;
                    updateReq.Type     = record.Type;
                    updateReq.Value    = currentIP;

                    try
                    {
                        var updateRsp = client.GetAcsResponse <UpdateDomainRecordResponse>(updateReq);
                        if (updateRsp.HttpResponse.isSuccess())
                        {
                            Console.WriteLine("解析地址修改成功!");
                        }
                        else
                        {
                            Console.WriteLine("解析地址修改失败! -- " + Encoding.UTF8.GetString(updateRsp.HttpResponse.Content));
                        }
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine("请求修改解析地址出现异常: " + ex.Message);
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("DomainRecordCheck出现异常: ", ex.Message);
            }
        }
示例#12
0
        /// <summary>
        /// 修改记录值
        /// </summary>
        /// <param name="info"></param>
        /// <returns></returns>
        public OutAliyunDNSVO UpdateDomainRecord(InAliyunDNSVO info)
        {
            IClientProfile   profile = DefaultProfile.GetProfile("cn-hangzhou", info.accessKeyId, info.accessSecret);
            DefaultAcsClient client  = new DefaultAcsClient(profile);
            var request = new UpdateDomainRecordRequest()
            {
                RecordId = info.RecordId,
                RR       = info.RR,
                _Value   = info.Value,
                Type     = info.Type
            };
            var response = client.GetAcsResponse(request);

            return(JsonConvert.DeserializeObject <OutAliyunDNSVO>(Encoding.Default.GetString(response.HttpResponse.Content)));
        }
示例#13
0
 private void ModifyRecord(UpdateDomainRecordRequest updateRequest)
 {
     try
     {
         var updateResponse = client.GetAcsResponse(updateRequest);
         //logger.LogInformation("解析完成!");
     }
     catch (ServerException e)
     {
         //logger.LogError(e, $"解析异常!异常信息:{e.Message}");
     }
     catch (ClientException e)
     {
         //logger.LogError(e, $"解析异常!异常信息:{e.Message}");
     }
 }
示例#14
0
        /// <summary>
        /// 更新域名记录
        /// </summary>
        private void updateDomainRecord()
        {
            string[] symbols = new string[1] {
                "."
            };
            string[] data       = fullDomainName.Text.Split(symbols, 30, StringSplitOptions.RemoveEmptyEntries);
            string   domainRR   = data[0];
            string   domainName = data[1] + "." + data[2];

            clientProfile = DefaultProfile.GetProfile("cn-hangzhou", textBox_accessKeyId.Text.ToString(), textBox_accessKeySecret.Text.ToString());
            client        = new DefaultAcsClient(clientProfile);
            UpdateDomainRecordRequest request = new UpdateDomainRecordRequest();

            request.Type     = "A";
            request.RR       = domainRR;
            request.RecordId = textBox_recordId.Text;
            request.TTL      = Convert.ToInt32(textBox_TTL.Text);
            request.Value    = localIP.Text;
            try
            {
                textBox_log.AppendText(System.DateTime.Now.ToString() + " " + "正在将WAN口IP:" + localIP.Text + "与域名" + fullDomainName.Text + "绑定..." + "\r\n");
                UpdateDomainRecordResponse response = client.GetAcsResponse(request);
                if (response.RecordId != null)
                {
                    domainIP.Text = localIP.Text; //更新窗体数据
                    textBox_log.AppendText(System.DateTime.Now.ToString() + " " + "域名绑定IP更新成功!" + "\r\n");
                }
                textBox_recordId.Text = response.RecordId;
            }
            //处理错误
            catch (Exception error)
            {
                textBox_log.AppendText(System.DateTime.Now.ToString() + " " + "updateDomainRecord() Exception:  " + error + "\r\n");
            }

            /*
             * catch (ServerException e)
             * {
             *  textBox_log.AppendText(System.DateTime.Now.ToString() + " " + "Server Exception:  " + e.ErrorCode + e.ErrorMessage + "\r\n");
             * }
             * catch (ClientException e)
             * {
             *  textBox_log.AppendText(System.DateTime.Now.ToString() + " " + "Client Exception:  " + e.ErrorCode + e.ErrorMessage + "\r\n");
             * }*/
        }
示例#15
0
        /// <summary>
        /// 更新解析记录。
        /// </summary>
        /// <param name="rd">原记录。</param>
        /// <param name="ip">公网IP。</param>
        /// <returns>更新成功返回true,否则返回false。</returns>
        private bool UpdateRecord(Record rd, string ip)
        {
            if (string.IsNullOrEmpty(ip))
            {
                return(false);
            }
            else if (ip == rd._Value)
            {
                Log.Print($"{ rd.Type }记录{ rd.RR }.{ rd.DomainName }({ rd.Line })不需要更新。");
                return(false);
            }

            try
            {
                var client = GetNewClient();
                UpdateDomainRecordRequest request = new UpdateDomainRecordRequest
                {
                    RecordId = rd.RecordId,
                    RR       = rd.RR,
                    Type     = rd.Type,
                    _Value   = ip,
                    TTL      = Options.Instance.TTL,
                    Line     = rd.Line
                };
                var response = client.GetAcsResponse(request);
                if (response.HttpResponse.isSuccess())
                {
                    Log.Print($"成功更新{ rd.Type }记录{ rd.RR }.{ rd.DomainName }({ rd.Line })为{ ip }。");
                    return(true);
                }
                else
                {
                    Log.Print($"更新{ rd.Type }记录{ rd.RR }.{ rd.DomainName }({ rd.Line })失败。");
                    return(false);
                }
            }
            catch (Exception e)
            {
                Log.Print($"更新{ rd.Type }记录{ rd.RR }.{ rd.DomainName }({ rd.Line })时出现异常:{ e }。");
                return(false);
            }
        }
示例#16
0
        public void SetupRecord(string domain, string rrKeyword, string newValue)
        {
            var reqRecords = new DescribeDomainRecordsRequest();

            reqRecords.DomainName = domain;
            reqRecords.RRKeyWord  = rrKeyword;
            reqRecords.Type       = "A";
            var records = getResponse(reqRecords).DomainRecords;

            if (records.Count == 0)
            {
                var add = new AddDomainRecordRequest
                {
                    RR         = rrKeyword,
                    _Value     = newValue,
                    Type       = "A",
                    TTL        = TTL,
                    DomainName = domain
                };
                getResponse(add);
                return;
            }

            var record = records[0];

            if (newValue == record._Value &&
                record.RR == rrKeyword &&
                record.Type == "A" &&
                record.TTL == TTL)   //解析值没有变化则跳出
            {
                return;
            }

            var reqUpdate = new UpdateDomainRecordRequest();

            reqUpdate.RR       = rrKeyword;
            reqUpdate.RecordId = record.RecordId;
            reqUpdate._Value   = newValue;
            reqUpdate.Type     = "A";
            reqUpdate.TTL      = TTL;
            getResponse(reqUpdate);
        }
示例#17
0
        /// <summary>
        /// 修改A解析记录
        /// </summary>
        /// <param name="RR">主机记录,如果要解析@.exmaple.com,主机记录要填写"@”,而不是空</param>
        /// <param name="Domain">域名</param>
        /// <param name="Value">记录值</param>
        /// <returns></returns>
        public string UpdateDomainRecord(string RR, string Domain, string Value)
        {
            var request = new UpdateDomainRecordRequest()
            {
                RecordId = GetSubDomainRecordId($@"{RR}.{Domain}"),
                RR       = RR,
                Type     = @"A",
                Value    = Value
            };

            try
            {
                var response = client.GetAcsResponse(request);
                return(response.RecordId);
            }
            catch
            {
                return(string.Empty);
            }
        }
示例#18
0
        static void UpdateRecord(Record record)
        {
            var request = new UpdateDomainRecordRequest
            {
                RecordId = record.RecordId,
                RR       = record.RR,
                Type     = record.Type,
                Value    = currentIp,
                TTL      = record.TTL
            };

            var response = Client.GetAcsResponse(request);

            if (response.HttpResponse.isSuccess())
            {
                Log(string.Format("{0} 的解析已更新为 {1}", currentDomain, currentIp));
            }
            else
            {
                Log(string.Format("{0} 的解析更新失败 {1}", currentDomain, response.HttpResponse.Content));
            }
        }
示例#19
0
 /// <summary>
 /// 修改解析记录
 /// </summary>
 /// <param name="record"></param>
 /// <param name="strContent"></param>
 /// <returns></returns>
 public static bool UpdateDomainRecords(DescribeDomainRecordsResponse.Record record, out string strContent)
 {
     try
     {
         IClientProfile            clientProfile = DefaultProfile.GetProfile("cn-hangzhou", CGlobalConfig.AccessKey, CGlobalConfig.AccessKeySecret);
         DefaultAcsClient          client        = new DefaultAcsClient(clientProfile);
         UpdateDomainRecordRequest request       = new UpdateDomainRecordRequest();
         request.RecordId = record.RecordId;
         request.RR       = record.RR;
         request.Type     = record.Type;
         request.Value    = record.Value;
         request.Line     = record.Line;
         try
         {
             UpdateDomainRecordResponse response = client.GetAcsResponse(request);
             strContent = response.RecordId;
             return(!string.IsNullOrEmpty(strContent));
         }
         catch (ServerException e)
         {
             strContent = " UpdateDomainRecords 发送异常:" + e.ErrorCode + "\t" + e.ErrorMessage;
             CLogHelper.WriteError(strContent);
         }
         catch (ClientException e)
         {
             strContent = " UpdateDomainRecords 发送异常:" + e.ErrorCode + "\t" + e.ErrorMessage;
             CLogHelper.WriteError(strContent);
         }
     }
     catch (Exception ex)
     {
         strContent = " UpdateDomainRecords 发送异常:" + ex.ToString();
         CLogHelper.WriteError(strContent);
     }
     return(false);
 }
示例#20
0
        public void UpdateRecord(DescribeRecord record)
        {
            IClientProfile   profile = DefaultProfile.GetProfile("cn-hangzhou", accessKey, accessSecret);
            DefaultAcsClient client  = new DefaultAcsClient(profile);

            var request = new UpdateDomainRecordRequest();

            request.RecordId = record.RecordId;
            request.RR       = record.RR;
            request.Type     = record.Type;
            request.Value    = record.Value;
            try
            {
                var response = client.GetAcsResponse(request);
            }
            catch (ServerException e)
            {
                Console.WriteLine(e);
            }
            catch (ClientException e)
            {
                Console.WriteLine(e);
            }
        }
示例#21
0
        private static void Main(string[] args)
        {
            try
            {
                var configs         = File.ReadAllLines("config.txt");
                var accessKeyId     = configs[0].Trim();    //Access Key ID,如 DR2DPjKmg4ww0e79
                var accessKeySecret = configs[1].Trim();    //Access Key Secret,如 ysHnd1dhWvoOmbdWKx04evlVEdXEW7
                var domainName      = configs[2].Trim();    //域名,如 google.com
                var rr = configs[3].Trim();                 //子域名,如 www
                Console.WriteLine("Updating {0} of domain {1}", rr, domainName);

                var aliyunClient = new DefaultAliyunClient("http://dns.aliyuncs.com/", accessKeyId, accessKeySecret);
                var req          = new DescribeDomainRecordsRequest()
                {
                    DomainName = domainName
                };
                var response = aliyunClient.Execute(req);

                var updateRecord = response.DomainRecords.FirstOrDefault(rec => rec.RR == rr && rec.Type == "A");
                if (updateRecord == null)
                {
                    return;
                }
                Console.WriteLine("Domain record IP is " + updateRecord.Value);

                //获取IP
#if NET35
                var ipRequest = (HttpWebRequest)WebRequest.Create("http://www.ip.cn/");
                ipRequest.AutomaticDecompression = DecompressionMethods.None | DecompressionMethods.GZip |
                                                   DecompressionMethods.Deflate;
                ipRequest.UserAgent = "aliyun-ddns-client-csharp";
                string htmlSource;
                using (var ipResponse = ipRequest.GetResponse())
                {
                    using (var responseStream = ipResponse.GetResponseStream())
                    {
                        using (var streamReader = new StreamReader(responseStream))
                        {
                            htmlSource = streamReader.ReadToEnd();
                        }
                    }
                }
#else
                var httpClient = new HttpClient(new HttpClientHandler
                {
                    AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate | DecompressionMethods.None,
                });
                httpClient.DefaultRequestHeaders.UserAgent.Add(new ProductInfoHeaderValue(new ProductHeaderValue("aliyun-ddns-client-csharp")));
                var htmlSource = httpClient.GetStringAsync("http://www.ip.cn/").Result;
#endif
                var ip = Regex.Match(htmlSource, @"(?<=<code>)[\d\.]+(?=</code>)", RegexOptions.IgnoreCase).Value;
                Console.WriteLine("Current IP is " + ip);

                if (updateRecord.Value != ip)
                {
                    var changeValueRequest = new UpdateDomainRecordRequest()
                    {
                        RecordId = updateRecord.RecordId,
                        Value    = ip,
                        Type     = "A",
                        RR       = rr
                    };
                    aliyunClient.Execute(changeValueRequest);
                    Console.WriteLine("Update finished.");
                }
                else
                {
                    Console.WriteLine("IPs are same now. Exiting");
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
            Thread.Sleep(5000);
        }
示例#22
0
        public override void Sync(SyncContext context)
        {
            var config = DomainConfigHelper.GetProviderInfo <AliyunConfig>(context.DomainConfigItem);

            IClientProfile profile = DefaultProfile.GetProfile("cn-hangzhou", config.Id, config.Secret);

            var client = new DefaultAcsClient(profile);

            client.SetConnectTimeoutInMilliSeconds(60000);
            client.SetReadTimeoutInMilliSeconds(60000);

            var item = context.DomainConfigItem;

            // 更新解析记录使用的请求,为了便于 catch 时获取相关数据,所以定义在 try 块外面
            UpdateDomainRecordRequest updateRequest = null;

            try
            {
                string recordId;
                string rr;
                string originalIP;

                var domainName       = item.Domain;
                var domainTypeString = item.Type.ToString();

                // 先用获取子域名的 API DescribeSubDomainRecordsRequest 进行尝试,如果查询不到该子域名,再尝试使用 DescribeDomainRecordsRequest 进行根域名查询
                Console.WriteLine($"Try use sub domain api to search. SubDomain = {domainName}, Type = {domainTypeString}");

                var subQueryRequest = new DescribeSubDomainRecordsRequest
                {
                    SubDomain = domainName,
                    Type      = domainTypeString
                };

                var subQueryResponse = client.GetAcsResponse(subQueryRequest);
                if (subQueryResponse.TotalCount > 0)
                {
                    Console.WriteLine("Is sub domain");

                    // 虽然 DescribeSubDomainRecordsRequest 没有问题,安全起见还是过滤一下(具体问题参见后面 DescribeDomainRecordsRequest 的注释)
                    var result = subQueryResponse.DomainRecords.SingleOrDefault(d => d.Type == domainTypeString);
                    recordId   = result?.RecordId;
                    rr         = result?.RR;
                    originalIP = result?._Value;
                }
                else
                {
                    Console.WriteLine($"Not sub domain. Try use root domain api to search. SearchMode = EXACT, KeyWord = @, DomainName = {domainName}, TypeKeyWord = {domainTypeString}, Type = {domainTypeString}");

                    // 由于 Type 和 TypeKeyWord 属性实测没有作用,过滤不了域名类型
                    // 所以得到查询结果后还需要再手动过滤一次
                    var rootQueryRequest = new DescribeDomainRecordsRequest
                    {
                        SearchMode  = "EXACT",
                        DomainName  = domainName,
                        KeyWord     = "@",
                        TypeKeyWord = domainTypeString,
                        Type        = domainTypeString
                    };

                    var rootQueryResponse = client.GetAcsResponse(rootQueryRequest);
                    var result            = rootQueryResponse.DomainRecords.SingleOrDefault(d => d.Type == domainTypeString);
                    recordId   = result?.RecordId;
                    rr         = result?.RR;
                    originalIP = result?._Value;
                }

                Console.WriteLine($"Search succeed: id = {recordId}, RR = {rr}, Value = {originalIP}");

                if (recordId == null)
                {
                    throw new KeyNotFoundException($"Update failed: cannot find a record for the domain name {item.Domain}.");
                }

                var address = IPHelper.GetAddress(item.Interface, item.AddressFamily);
                Console.WriteLine($"Interface {item.Interface} {item.AddressFamily} address is {address}");

                updateRequest = new UpdateDomainRecordRequest
                {
                    RecordId = recordId,
                    RR       = rr,
                    Type     = domainTypeString,
                    _Value   = address
                };

                var updateResponse = client.GetAcsResponse(updateRequest);

                Console.WriteLine($"{item.Domain} updated successfully: {originalIP} -> {address}");

                item.LastSyncStatus            = SyncStatus.Success;
                item.LastSyncSuccessOriginalIP = originalIP;
                item.LastSyncSuccessCurrentIP  = address;
                item.LastSyncSuccessTime       = DateTime.Now;
            }
            catch (ClientException ex)
            {
                // 如果更新时返回了 DomainRecordDuplicate 错误
                // 有可能是本地记录的 LastSyncSuccessCurrentIP 和机器实际的 IP 以及域名解析提供商一侧的地址不匹配
                // 例如有段时间里程序没有执行,但 IP 发生了改变,就会造成 LastSyncSuccessCurrentIP 和提供商处的 IP 地址,以及实际地址不匹配)
                if (ex.ErrorCode == "DomainRecordDuplicate")
                {
                    item.LastSyncStatus = SyncStatus.Ignore;

                    if (updateRequest._Value != item.LastSyncSuccessCurrentIP)
                    {
                        item.LastSyncSuccessCurrentIP = updateRequest?._Value;

                        App.Out.WriteLine($"Update failed because the IP address recorded in the cache does not match the actual IP address and the IP address stored by the provider. The cache record has been updated, you can ignore this prompt.");

                        return;
                    }

                    App.Out.WriteLine($"{ex.ErrorMessage} You can ignore this prompt.");
                }
                else
                {
                    throw;
                }
            }
        }
示例#23
0
        public void CheckOrChangeAnalysis(object sender, ElapsedEventArgs e)
        {
            if (!File.Exists(_logPath))
            {
                File.Create(_logPath);
            }

            var streamWriter = new StreamWriter(_logPath, true);

            // var configs = File.ReadAllLines("config.txt");
            try
            {
                // 默认修改在Service App.Config 修改 也可以手动指定
                var accessKeyId     = ConfigurationManager.AppSettings["AccessKeyId"]; //Access Key ID,如 DR2DPjKmg4ww0e79
                var accessKeySecret =
                    ConfigurationManager.AppSettings["AccessKeySecret"];
                ;                                                                //Access Key Secret,如 ysHnd1dhWvoOmbdWKx04evlVEdXEW7
                var domainName = ConfigurationManager.AppSettings["DomainName"]; //域名,如 google.com
                var rr         = ConfigurationManager.AppSettings["RR"];         //子域名,如 www
                var ttl        = ConfigurationManager.AppSettings["TTL"];        // TTL 时间 单位秒 免费最低120 2分钟 收费最低1秒

                var aliyunClient = new DefaultAliyunClient("http://dns.aliyuncs.com/", accessKeyId, accessKeySecret);
                var req          = new DescribeDomainRecordsRequest {
                    DomainName = domainName
                };
                var response = aliyunClient.Execute(req);

                // 筛选只有A类解析,且前缀为设置的前缀
                var updateRecord = response.DomainRecords.FirstOrDefault(rec => rec.RR == rr && rec.Type == "A");
                if (updateRecord == null)
                {
                    return;
                }

                var httpClient = new HttpClient(new HttpClientHandler
                {
                    AutomaticDecompression =
                        DecompressionMethods.GZip | DecompressionMethods.Deflate | DecompressionMethods.None
                });
                httpClient.DefaultRequestHeaders.UserAgent.Add(
                    new ProductInfoHeaderValue(new ProductHeaderValue("aliyun-ddns-client-csharp")));
                // 默认修改在Service App.Config 修改 也可以手动指定 获取本地外网IP的地址
                var htmlSource = httpClient.GetStringAsync(ConfigurationManager.AppSettings["IpServer"]).Result;

                var ip = Regex.Match(htmlSource,
                                     @"((?:(?:25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d)))\.){3}(?:25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d))))",
                                     RegexOptions.IgnoreCase).Value;

                if (updateRecord.Value == ip)
                {
                    return;
                }

                if (!int.TryParse(ttl, out var ttlInt))
                {
                    ttlInt = 120;
                }

                var changeValueRequest = new UpdateDomainRecordRequest
                {
                    RecordId = updateRecord.RecordId,
                    Value    = ip,
                    Type     = "A",
                    RR       = rr,
                    TTL      = ttlInt
                };
                aliyunClient.Execute(changeValueRequest);

                streamWriter.WriteLine(
                    $"Time:{DateTime.Now}\r\n   Before Ip:{updateRecord.Value}\r\n   Change Ip:{ip}");
            }
            catch (Exception ex)
            {
                streamWriter.WriteLine(ex.ToString());
            }
            finally
            {
                streamWriter.Close();

                streamWriter = null;
            }
        }
示例#24
0
        private static void Main(string[] args)
        {
            try
            {
                var configs         = File.ReadAllLines("config.txt");
                var accessKeyId     = configs[0].Trim();    //Access Key ID,如 DR2DPjKmg4ww0e79
                var accessKeySecret = configs[1].Trim();    //Access Key Secret,如 ysHnd1dhWvoOmbdWKx04evlVEdXEW7
                var domainName      = configs[2].Trim();    //域名,如 google.com
                var rr = configs[3].Trim();                 //子域名,如 www
                println("正在更新记录:" + rr + ",域名:" + domainName);

                var aliyunClient = new DefaultAliyunClient("http://dns.aliyuncs.com/", accessKeyId, accessKeySecret);
                var req          = new DescribeDomainRecordsRequest()
                {
                    DomainName = domainName
                };
                var response = aliyunClient.Execute(req);

                var updateRecord = response.DomainRecords.FirstOrDefault(rec => rec.RR == rr && rec.Type == "A");
                if (updateRecord == null)
                {
                    return;
                }
                println("目前域名IP:" + updateRecord.Value);

                //获取IP
#if NET35
                var ipRequest = (HttpWebRequest)WebRequest.Create(ConfigurationManager.AppSettings["IpServer"]);
                ipRequest.AutomaticDecompression = DecompressionMethods.None | DecompressionMethods.GZip |
                                                   DecompressionMethods.Deflate;
                ipRequest.UserAgent = "aliyun-ddns-client-csharp";
                string htmlSource;
                using (var ipResponse = ipRequest.GetResponse())
                {
                    using (var responseStream = ipResponse.GetResponseStream())
                    {
                        using (var streamReader = new StreamReader(responseStream))
                        {
                            htmlSource = streamReader.ReadToEnd();
                        }
                    }
                }
#else
                var httpClient = new HttpClient(new HttpClientHandler
                {
                    AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate | DecompressionMethods.None,
                });
                httpClient.DefaultRequestHeaders.UserAgent.Add(new ProductInfoHeaderValue(new ProductHeaderValue("aliyun-ddns-client-csharp")));
                var htmlSource = httpClient.GetStringAsync(ConfigurationManager.AppSettings["IpServer"]).Result;
#endif
                var ip = Regex.Match(htmlSource, @"((?:(?:25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d)))\.){3}(?:25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d))))", RegexOptions.IgnoreCase).Value;
                println("本机IP地址:" + ip);

                if (updateRecord.Value != ip)
                {
                    var changeValueRequest = new UpdateDomainRecordRequest()
                    {
                        RecordId = updateRecord.RecordId,
                        Value    = ip,
                        Type     = "A",
                        RR       = rr
                    };
                    aliyunClient.Execute(changeValueRequest);
                    println("IP地址更新完成。");
                }
                else
                {
                    println("IP地址无变化,退出。");
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
            //Thread.Sleep(5000);
        }
        public void UpdateDomainRecord(string currentIp)
        {
            //基础参数
            string regionId        = Options.Config.RegionId;
            string accessKeyId     = Options.Config.AccessKeyId;
            string accessKeySecret = Options.Config.AccessKeySecret;
            int    globalPageSize  = Options.Config.PageSize;

            //string domainName = "mydomain.com";
            //string rr = "www";
            //string currentIp = GetCurrentIp();

            Logger.LogDebug($"This computer's network IP address is \"{currentIp}\"");

            foreach (var domainRecord in Options.DomainRecords)
            {
                Logger.LogDebug($"Ready to update the domain name is \"{domainRecord.DomainName}\"");
                Logger.LogDebug($"The RR is \"{domainRecord.RR}\"");
                Logger.LogDebug($"Current DateTime is \"{DateTime.Now.ToLongDateTime()}\"");
                Logger.LogDebug(string.Empty);

                try
                {
                    int pageSize = domainRecord.PageSize > 0 ? domainRecord.PageSize : globalPageSize;
                    //初始化默认的ACS客户端
                    IClientProfile   clientProfile = DefaultProfile.GetProfile(regionId, accessKeyId, accessKeySecret);
                    DefaultAcsClient client        = new DefaultAcsClient(clientProfile);

                    //初始化指定域名的解析记录信息查询请求
                    DescribeDomainRecordsRequest describeDomainRecordsRequest = new DescribeDomainRecordsRequest
                    {
                        PageNumber  = 1,
                        PageSize    = pageSize,
                        RRKeyWord   = domainRecord.RR,
                        TypeKeyWord = Type,
                        DomainName  = domainRecord.DomainName
                                      //AcceptFormat = FormatType.JSON
                    };
                    //执行并且获取查询指定域名的解析记录信息的响应结果
                    DescribeDomainRecordsResponse describeDomainRecordsResponse = client.GetAcsResponse(describeDomainRecordsRequest);
                    Logger.LogDebug($"No.0 <<DescribeDomainRecordsResponse>> The request id is \"{describeDomainRecordsResponse.RequestId}\"");
                    Logger.LogDebug($"No.0 <<DescribeDomainRecordsResponse>> Total number of records matching your query is \"{describeDomainRecordsResponse.TotalCount}\"");
                    Logger.LogDebug($"No.0 <<DescribeDomainRecordsResponse>> The raw content is \"{Encoding.UTF8.GetString(describeDomainRecordsResponse.HttpResponse.Content)}\"");
                    Logger.LogDebug(string.Empty);

                    if (describeDomainRecordsResponse.TotalCount.HasValue && describeDomainRecordsResponse.TotalCount.Value > 0 && describeDomainRecordsResponse.DomainRecords.Any())
                    {
                        //待更新的解析记录总列表
                        var domainRecords = describeDomainRecordsResponse.DomainRecords;

                        //总页数
                        int totalPage = Convert.ToInt32(describeDomainRecordsResponse.TotalCount.Value / pageSize);
                        if ((describeDomainRecordsResponse.TotalCount.Value % pageSize) > 0)
                        {
                            totalPage++;
                        }

                        //当总页数大于1时,表示还有下一页
                        if (totalPage > 1)
                        {
                            //从第二页开始获取待更新的解析记录列表
                            for (int pageNumber = 2; pageNumber <= totalPage; pageNumber++)
                            {
                                describeDomainRecordsRequest.PageNumber = pageNumber;
                                describeDomainRecordsResponse           = client.GetAcsResponse(describeDomainRecordsRequest);
                                if (describeDomainRecordsResponse.DomainRecords.Any())
                                {
                                    //添加到待解析记录总列表
                                    domainRecords.AddRange(describeDomainRecordsResponse.DomainRecords);
                                }
                            }
                        }

                        //更新指定域名的解析记录值
                        int index = 0;
                        foreach (var item in domainRecords)
                        {
                            index++;
                            if (item.Value == currentIp)
                            {
                                Logger.LogDebug($"No.{index} <<DescribeDomainRecordsResponse>> The record id is \"{item.RecordId}\", Domain Name is \"{item.DomainName}\", RR is \"{item.RR}\", value is \"{item.Value}\", does not need to be updated");
                                Logger.LogDebug(string.Empty);
                                continue;
                            }

                            //初始化指定域名的解析记录更新请求
                            UpdateDomainRecordRequest updateDomainRecordRequest = new UpdateDomainRecordRequest
                            {
                                RecordId = item.RecordId,
                                RR       = item.RR,
                                Type     = item.Type,
                                Value    = currentIp
                            };
                            //执行并且获取更新指定域名的解析记录的响应结果
                            UpdateDomainRecordResponse updateDomainRecordResponse = client.GetAcsResponse(updateDomainRecordRequest);
                            Logger.LogDebug($"No.{index} <<UpdateDomainRecordRequest>> updating the domain name is \"{item.RR}.{item.DomainName}\"");
                            Logger.LogDebug($"No.{index} <<UpdateDomainRecordRequest>> Before updating the record value is \"{item.Value}\"");
                            Logger.LogDebug($"No.{index} <<UpdateDomainRecordRequest>> Updated the record value is \"{currentIp}\"");
                            Logger.LogDebug($"No.{index} <<UpdateDomainRecordRequest>> The request id is \"{updateDomainRecordResponse.RequestId}\"");
                            Logger.LogDebug($"No.{index} <<UpdateDomainRecordRequest>> The record id is \"{updateDomainRecordResponse.RecordId}\"");
                            Logger.LogDebug(string.Empty);
                        }
                    }

                    Logger.LogDebug($"Update \"{domainRecord.DomainName}\" completed!");
                    Logger.LogDebug(string.Empty);
                }
                catch (ServerException ex)
                {
                    Logger.LogDebug(0, ex, $"Throw {nameof(ServerException)}");
                }
                catch (ClientException ex)
                {
                    Logger.LogDebug(0, ex, $"Throw {nameof(ClientException)}");
                }
                catch (Exception ex)
                {
                    Logger.LogDebug(0, ex, $"Throw {nameof(Exception)}");
                }
            }

            Logger.LogDebug("Update all completed!");
        }
示例#26
0
        //定时执行事件
        private void TimedEvent(object sender, System.Timers.ElapsedEventArgs e)
        {
            //每次都重新获取配置(可以动态修改而不用重启服务)
            GetConfig();
            if (!configExist_)
            {
                logger.Error(" Not Config Yet ...... 【Skip】");
                return;
            }
            string currentInternetIp = GetInternetIP();

            if (currentInternetIp.Length == 0)
            {
                logger.Info("Can't Get Current Internet Ip ...... 【Skip】");
                return;
            }
            IClientProfile               clientProfile = DefaultProfile.GetProfile("cn-hangzhou", accessKeyId_, accessKeySecret_);
            DefaultAcsClient             client        = new DefaultAcsClient();
            DescribeDomainRecordsRequest reqFetch      = new DescribeDomainRecordsRequest();

            reqFetch.AcceptFormat = Aliyun.Acs.Core.Http.FormatType.JSON;
            reqFetch.DomainName   = domainName_;

            string dnsIp = "", recordId = "";

            try {
                DescribeDomainRecordsResponse resFetch = client.GetAcsResponse(reqFetch);
                foreach (var r in resFetch.DomainRecords)
                {
                    if (r.RR == subDomainName_)
                    {
                        dnsIp    = r.Value;
                        recordId = r.RecordId;
                    }
                }
            } catch (ServerException ex) {
                logger.Error("Server Error >> code : " + ex.ErrorCode + " | Error Message : " + ex.ErrorMessage);
            } catch (ClientException ex) {
                logger.Error("Client Error >> code : " + ex.ErrorCode + " | Error Message : " + ex.ErrorMessage);
            }
            if (dnsIp.Length == 0)
            {
                logger.Info("Can't Get Dns Record , Add New Record .");
                AddDomainRecordRequest reqAdd = new AddDomainRecordRequest();
                reqAdd.AcceptFormat = Aliyun.Acs.Core.Http.FormatType.JSON;
                reqAdd.DomainName   = domainName_;
                reqAdd.RR           = subDomainName_;
                reqAdd.Type         = "A";
                reqAdd.Value        = currentInternetIp;
                try {
                    //添加解析记录
                    AddDomainRecordResponse resAdd = client.GetAcsResponse(reqAdd);
                    logger.Info("\r\n Dns Record Add ...... 【OK】 \r\n New Dns Record Is : " + currentInternetIp);
                } catch (ServerException ex) {
                    logger.Error("Dns Record Add ...... 【Error】 \r\n Server Error >> code : " + ex.ErrorCode + " | Error Message : " + ex.ErrorMessage);
                } catch (ClientException ex) {
                    logger.Error("Dns Record Add ...... 【Error】 \r\n Client Error >> code : " + ex.ErrorCode + " | Error Message : " + ex.ErrorMessage);
                }
            }
            else
            {
                if (currentInternetIp == dnsIp)
                {
                    logger.Info("Current Internet Ip Is : " + currentInternetIp + " ,Same As Dns Record ...... 【Skip】");
                }
                else
                {
                    //更新记录
                    UpdateDomainRecordRequest reqUpdate = new UpdateDomainRecordRequest();
                    reqUpdate.AcceptFormat = Aliyun.Acs.Core.Http.FormatType.JSON;
                    reqUpdate.RecordId     = recordId;
                    reqUpdate.RR           = subDomainName_;
                    reqUpdate.Type         = "A";
                    reqUpdate.Value        = currentInternetIp;
                    try {
                        //更新解析记录
                        UpdateDomainRecordResponse resUpdate = client.GetAcsResponse(reqUpdate);
                        logger.Info("\r\n Update Dns  Record ...... 【OK】 \r\n New Dns Record Is : " + currentInternetIp);
                    } catch (ServerException ex) {
                        logger.Error("Dns Record Update ...... 【Error】 \r\n Server Error >> code : " + ex.ErrorCode + " | Error Message : " + ex.ErrorMessage);
                    } catch (ClientException ex) {
                        logger.Error("Dns Record Update ...... 【Error】 \r\n Client Error >> code : " + ex.ErrorCode + " | Error Message : " + ex.ErrorMessage);
                    }
                }
            }
        }
示例#27
0
        /// <summary>
        /// 更新域名记录
        /// </summary>
        private void updateDomainRecord()
        {
            string[] symbols = new string[1] {
                "."
            };
            string[] data       = fullDomainName.Text.Split(symbols, 30, StringSplitOptions.RemoveEmptyEntries);
            string   domainRR   = data[0];
            string   domainName = data[1] + "." + data[2];

            clientProfile = DefaultProfile.GetProfile("cn-hangzhou", textBox_accessKeyId.Text.ToString(), textBox_accessKeySecret.Text.ToString());
            client        = new DefaultAcsClient(clientProfile);
            UpdateDomainRecordRequest request = new UpdateDomainRecordRequest();

            request.Type     = "A";
            request.RR       = domainRR;
            request.RecordId = textBox_recordId.Text;
            request.TTL      = Convert.ToInt32(textBox_TTL.Text);
            request.Value    = localIP.Text;
            try
            {
                textBox_log.AppendText(System.DateTime.Now.ToString() + " " + "正在将WAN口IP:" + localIP.Text + "与域名" + fullDomainName.Text + "绑定..." + "\r\n");
                UpdateDomainRecordResponse response = client.GetAcsResponse(request);
                if (response.RecordId != null)
                {
                    domainIP.Text = localIP.Text; //更新窗体数据
                    textBox_log.AppendText(System.DateTime.Now.ToString() + " " + "域名绑定IP更新成功!" + "\r\n");
                    if (checkBox_ngrok.Checked == true)
                    {
                        //button_ngrok.Enabled = false;
                        //cfg.SaveAppSetting("ngrokauto", "On");
                        //检测ngrok.exe是否存在
                        if (ngrok.IsExists())
                        {
                            textBox_log.AppendText(System.DateTime.Now.ToString() + " " + "IP地址变化,Ngrok功能重启!本机浏览器打开:http://127.0.0.1:4040 查看运行状态。" + "\r\n");
                            ngrok.Stop();
                            ngrok.Start();
                        }
                        //else
                        //{
                        //textBox_log.AppendText(System.DateTime.Now.ToString() + " " + "Ngrok功能启用,但当前目录没有发现ngrok.exe,请往官网下载自行编译:https://ngrok.com/download" + "\r\n");
                        //}
                    }
                }
                textBox_recordId.Text = response.RecordId;
            }
            //处理错误
            catch (Exception error)
            {
                textBox_log.AppendText(System.DateTime.Now.ToString() + " " + "updateDomainRecord() Exception:  " + error + "\r\n");
            }

            /*
             * catch (ServerException e)
             * {
             *  textBox_log.AppendText(System.DateTime.Now.ToString() + " " + "Server Exception:  " + e.ErrorCode + e.ErrorMessage + "\r\n");
             * }
             * catch (ClientException e)
             * {
             *  textBox_log.AppendText(System.DateTime.Now.ToString() + " " + "Client Exception:  " + e.ErrorCode + e.ErrorMessage + "\r\n");
             * }*/
        }