Beispiel #1
0
        /// <summary>
        /// 从阿里云获取域名记录recordId
        /// </summary>
        /// <returns></returns>
        private bool getRecordId()
        {
            if (textBox_accessKeyId.Text.ToString() == null || textBox_accessKeySecret.Text.ToString() == null || fullDomainName.Text.ToString() == null || textBox_TTL.Text.ToString() == null || textBox_newSeconds.Text.ToString() == null)
            {
                textBox_log.AppendText(System.DateTime.Now.ToString() + " " + "请检查设置,不能为空!" + "\r\n");
                return(false);
            }
            clientProfile = DefaultProfile.GetProfile("cn-hangzhou", textBox_accessKeyId.Text.ToString(), textBox_accessKeySecret.Text.ToString());
            client        = new DefaultAcsClient(clientProfile);
            DescribeSubDomainRecordsRequest request = new DescribeSubDomainRecordsRequest();

            request.SubDomain = fullDomainName.Text;
            try
            {
                DescribeSubDomainRecordsResponse response = client.GetAcsResponse(request);
                List <Record> list = response.DomainRecords;

                if (list.Count == 0) //当不存在域名记录时,添加一个
                {
                    textBox_log.AppendText(System.DateTime.Now.ToString() + " " + "阿里云DNS服务访问成功,但没有找到对应域名记录,请添加域名后重试!" + "\r\n");
                    return(false);
                }
                else
                {
                    int i = 0;
                    foreach (Record record in list) //当存在域名记录时,返回域名记录信息
                    {
                        i++;
                        textBox_log.AppendText(System.DateTime.Now.ToString() + " " + "阿里云DNS服务返回RecordId:" + i.ToString() + " RecordId:" + record.RecordId + "\r\n");
                        textBox_recordId.Text = record.RecordId;
                        cfg.SaveAppSetting("RecordID", record.RecordId.ToString());
                        globalRR.Text                  = record.RR;
                        globalDomainType.Text          = record.Type;
                        globalValue.Text               = domainIP.Text = record.Value;
                        label_TTL.Text                 = Convert.ToString(record.TTL);
                        label_DomainIpStatus.Text      = "已绑定";
                        label_DomainIpStatus.ForeColor = System.Drawing.Color.FromArgb(0, 0, 0, 255);
                    }
                    return(true);
                }
            }
            catch (ServerException e)
            {
                textBox_log.AppendText(System.DateTime.Now.ToString() + " " + "Server Exception:  " + e.ErrorCode + e.ErrorMessage + "\r\n");
                return(false);
            }
            catch (ClientException e)
            {
                textBox_log.AppendText(System.DateTime.Now.ToString() + " " + "Client Exception:  " + e.ErrorCode + e.ErrorMessage + "\r\n");
                return(false);
            }
            //处理错误

            /*
             * catch (Exception error)
             * {
             *  textBox_log.AppendText(System.DateTime.Now.ToString() + " " + "updateDomainRecord() Exception:  " + error + "\r\n");
             *  return false;
             * }*/
        }
Beispiel #2
0
        private bool setRecordId()
        {
            DescribeSubDomainRecordsRequest request = new DescribeSubDomainRecordsRequest();

            request.SubDomain = fullDomainName.Text;
            try
            {
                DescribeSubDomainRecordsResponse response = client.GetAcsResponse(request);
                List <Record> list = response.DomainRecords;

                if (list.Count == 0)
                {
                    addDomainRecord();
                    return(false);
                }

                int i = 0;

                foreach (Record record in list)
                {
                    i++;
                    MessageBox.Show("Record" + i.ToString());
                    recordId.Text         = record.RecordId;
                    globalRR.Text         = record.RR;
                    globalDomainType.Text = record.Type;
                    globalValue.Text      = record.Value;
                }
                return(true);
            }
            //处理错误
            catch (ServerException e)
            {
                MessageBox.Show(e.ErrorCode + e.ErrorMessage);

                return(false);
            }
            catch (ClientException e)
            {
                MessageBox.Show(e.ErrorCode + e.ErrorMessage);

                return(false);
            }
        }
Beispiel #3
0
        /// <summary>
        /// 获取子域名的所有解析记录
        /// </summary>
        /// <param name="domain"></param>
        /// <returns></returns>
        public override List <DomainRecord> DescribeSubDomainRecords(string domain)
        {
            var request = new DescribeSubDomainRecordsRequest()
            {
                SubDomain  = domain,
                PageNumber = 1,
                PageSize   = 500,
            };

            try
            {
                var response = client.GetAcsResponse(request);
                if (response == null || response.HttpResponse.Content == null || response.HttpResponse.Content.Length == 0)
                {
                    throw new Exception("Describe subDomain records result is null.");
                }
                string  result     = Encoding.UTF8.GetString(response.HttpResponse.Content);
                JObject jObject    = JObject.Parse(result);
                var     recordsObj = jObject["DomainRecords"]["Record"];
                if (recordsObj == null)
                {
                    throw new Exception("Can not fins records result from json object.");
                }
                List <DomainRecord> records = recordsObj.ToObject <List <DomainRecord> >();
                return(records);
            }
            catch (ServerException e)
            {
                throw new Exception($"Aliyun server error. {e.Message}");
            }
            catch (ClientException e)
            {
                if (e.ErrorCode.Equals("InvalidDomainName.NoExist", StringComparison.OrdinalIgnoreCase))
                {
                    return(new List <DomainRecord>());
                }
                else
                {
                    throw new Exception($"Reuqest client error. errcode is {e.ErrorCode}, {e.Message}");
                }
            }
        }
Beispiel #4
0
        /// <summary>
        /// 获取某子域名A记录的解析值
        /// </summary>
        /// <param name="SubDomain"></param>
        /// <returns></returns>
        public string GetSubDomainARecord(string SubDomain)
        {
            var request = new DescribeSubDomainRecordsRequest()
            {
                SubDomain  = SubDomain,
                PageNumber = 1,
                PageSize   = 1,
                Type       = @"A"
            };

            try
            {
                var response = client.GetAcsResponse(request);
                return(response.DomainRecords[0].Value);
            }
            catch
            {
                return(string.Empty);
            }
        }
Beispiel #5
0
        /// <summary>
        /// 获取已经存在的记录。
        /// </summary>
        /// <param name="domain">域名或子域名</param>
        /// <returns>记录的集合,获取失败时返回null。</returns>
        private IList <Record> GetRecords(string domain)
        {
            List <Record> records = new List <Record>();

            try
            {
                var  client     = GetNewClient();
                long pageNumber = 1;
                ParseSubDomainAndLine(domain, out string subDomain, out string line);
                do
                {
                    DescribeSubDomainRecordsRequest request = new DescribeSubDomainRecordsRequest
                    {
                        SubDomain  = subDomain,
                        PageSize   = _pageSize,
                        PageNumber = pageNumber,
                        Line       = line
                    };

                    var response = client.GetAcsResponse(request);
                    records.AddRange(response.DomainRecords);
                    if (response.TotalCount <= records.Count)
                    {
                        break;
                    }
                    else
                    {
                        ++pageNumber;
                    }
                } while (true);
                Log.Print($"成功获取{ domain }的所有记录,共{ records.Count }条。");
            }
            catch (Exception e)
            {
                Log.Print($"获取{ domain }的所有记录时出现异常:{ e }");
                return(null);
            }

            return(records);
        }
Beispiel #6
0
        static void Main(string[] args)
        {
            currentIp = GetIp();
            if (currentIp == null)
            {
                Log(string.Format("获取外网IP地址失败"));
            }
            else
            {
                foreach (var domain in domains)
                {
                    currentDomain = domain;
                    var request = new DescribeSubDomainRecordsRequest();
                    request.SubDomain = domain.Trim();
                    var response = Client.GetAcsResponse(request);
                    var records  = response.DomainRecords;
                    if (records.Count == 0)
                    {
                        Log(string.Format("{0} 暂无解析", currentDomain));
                        AddRecord();
                    }
                    else
                    {
                        var record = records[0];
                        Log(string.Format("{0} 解析值为 {1}", currentDomain, record.Value));


                        if (currentIp == record.Value)
                        {
                            Log(string.Format("{0} 无须更新", currentDomain));
                        }
                        else
                        {
                            UpdateRecord(record);
                        }
                    }
                }
            }
        }
Beispiel #7
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;
                }
            }
        }