Exemplo n.º 1
0
        private static void CreateHostedZone(IAmazonRoute53 r53Client, string domainName)
        {
            var zoneRequest = new CreateHostedZoneRequest
            {
                Name            = domainName,
                CallerReference = "testingss"
            };

            var zoneResponse = r53Client.CreateHostedZone(zoneRequest);
            var recordSet    = new ResourceRecordSet
            {
                Name            = domainName,
                TTL             = 60,
                Type            = RRType.A,
                ResourceRecords = new List <ResourceRecord> {
                    new ResourceRecord {
                        Value = IpAddress
                    }
                }
            };

            var change1 = new Change
            {
                ResourceRecordSet = recordSet,
                Action            = ChangeAction.CREATE
            };

            var changeBatch = new ChangeBatch
            {
                Changes = new List <Change> {
                    change1
                }
            };

            var recordsetRequest = new ChangeResourceRecordSetsRequest
            {
                HostedZoneId = zoneResponse.HostedZone.Id,
                ChangeBatch  = changeBatch
            };

            var recordsetResponse = r53Client.ChangeResourceRecordSets(recordsetRequest);
            var changeRequest     = new GetChangeRequest
            {
                Id = recordsetResponse.ChangeInfo.Id
            };

            Console.WriteLine(changeRequest);
        }
Exemplo n.º 2
0
        private async Task WaitChangesPropagation(ChangeInfo changeInfo)
        {
            if (changeInfo.Status == ChangeStatus.INSYNC)
            {
                return;
            }

            _log.Information("Waiting for DNS changes propagation");

            var changeRequest = new GetChangeRequest(changeInfo.Id);

            while ((await _route53Client.GetChangeAsync(changeRequest)).ChangeInfo.Status == ChangeStatus.PENDING)
            {
                await Task.Delay(2000);
            }
        }
Exemplo n.º 3
0
        private void WaitChangesPropagation(ChangeInfo changeInfo)
        {
            if (changeInfo.Status == ChangeStatus.INSYNC)
            {
                return;
            }

            _log.Information("Waiting for DNS changes propagation");

            var changeRequest = new GetChangeRequest(changeInfo.Id);

            while (_route53Client.GetChange(changeRequest).ChangeInfo.Status == ChangeStatus.PENDING)
            {
                Thread.Sleep(TimeSpan.FromSeconds(5d));
            }
        }
Exemplo n.º 4
0
        private async Task <bool> ApplyDnsChange(HostedZone zone, ResourceRecordSet recordSet, ChangeAction action)
        {
            // prepare change
            var changeDetails = new Change()
            {
                ResourceRecordSet = recordSet,
                Action            = action
            };

            var changeBatch = new ChangeBatch()
            {
                Changes = new List <Change> {
                    changeDetails
                }
            };

            // Update the zone's resource record sets
            var recordsetRequest = new ChangeResourceRecordSetsRequest()
            {
                HostedZoneId = zone.Id,
                ChangeBatch  = changeBatch
            };

            _log?.Debug($"Route53 :: ApplyDnsChange : ChangeResourceRecordSetsAsync: {JsonConvert.SerializeObject(recordsetRequest.ChangeBatch)} ");

            var recordsetResponse = await _route53Client.ChangeResourceRecordSetsAsync(recordsetRequest);

            _log?.Debug($"Route53 :: ApplyDnsChange : ChangeResourceRecordSetsAsync Response: {JsonConvert.SerializeObject(recordsetResponse)} ");

            // Monitor the change status
            var changeRequest = new GetChangeRequest()
            {
                Id = recordsetResponse.ChangeInfo.Id
            };

            while (ChangeStatus.PENDING == (await _route53Client.GetChangeAsync(changeRequest)).ChangeInfo.Status)
            {
                System.Diagnostics.Debug.WriteLine("DNS change is pending.");
                await Task.Delay(1500);
            }

            _log?.Information("DNS change completed.");

            return(true);
        }
Exemplo n.º 5
0
        public static async Task <ChangeStatus> WaitForStatusAync(this ChangeInfo info, Credentials credentials)
        {
            var client = credentials.CreateClient();

            var changeRequest = new GetChangeRequest {
                Id = info.Id
            };

            ChangeStatus currentStatus;

            while ((currentStatus = (await client.GetChangeAsync(changeRequest)).ChangeInfo.Status) == ChangeStatus.PENDING)
            {
                Console.WriteLine("Change is pending.");
                await Task.Delay(500);
            }

            return(currentStatus);
        }
Exemplo n.º 6
0
        //https://docs.aws.amazon.com/sdk-for-net/v2/developer-guide/route53-apis-intro.html
        public static void UpdateRecord()
        {
            //TODO: Better exception handling overall in the method
            SimpleLogging.WriteToLog("Time to check for update to public IP", true);
            SimpleLogging.WriteToLog("Last public IP was " + lastIP, true);
            string publicIP = GetPublicIP(ServiceConfig.GetPublicIPTries);

            SimpleLogging.WriteToLog("Current public IP is " + publicIP, true);

            if (publicIP == "")
            {
                SimpleLogging.WriteToLog("Failed to check for new public IP");
                return;
            }

            if (publicIP == lastIP)
            {
                if (ServiceConfig.WriteLogsOnlyIfIPChanged)
                {
                    SimpleLogging.WipePendingLogData();
                }
                else
                {
                    SimpleLogging.WriteToLog("Public IP address has not changed" + Environment.NewLine);
                }
                return;
            }
            SimpleLogging.WriteToLog("Contacting AWS to update public IP");
            lastIP = publicIP;

            //TODO: Better exception handling when these values aren't working
            //TODO: Confirm all users can use the APSoutheast2 endpoint
            var route53Client = new AmazonRoute53Client(ServiceConfig.AwsAccessKeyId, ServiceConfig.AwsSecretAccessKey, RegionEndpoint.APSoutheast2);

            SimpleLogging.WriteToLog("Successfully authenticated to AWS");

            var recordSet = new ResourceRecordSet()
            {
                Name            = ServiceConfig.DomainName,
                TTL             = 60,
                Type            = RRType.A, //TODO: Update so can do IPv6 records also where required
                ResourceRecords = new List <ResourceRecord>
                {
                    new ResourceRecord {
                        Value = publicIP
                    }
                }
            };

            var changeBatch = new ChangeBatch()
            {
                Changes = new List <Change>
                {
                    new Change()
                    {
                        ResourceRecordSet = recordSet,
                        Action            = ChangeAction.UPSERT
                    }
                }
            };

            var recordsetRequest = new ChangeResourceRecordSetsRequest()
            {
                HostedZoneId = ServiceConfig.HostedZoneId,
                ChangeBatch  = changeBatch
            };

            var recordsetResponse = route53Client.ChangeResourceRecordSets(recordsetRequest);

            SimpleLogging.WriteToLog("Succesfully submitted update request to AWS");

            var changeRequest = new GetChangeRequest()
            {
                Id = recordsetResponse.ChangeInfo.Id
            };

            while (ChangeStatus.PENDING == route53Client.GetChange(changeRequest).ChangeInfo.Status)
            {
                SimpleLogging.WriteToLog("Waiting for change to be INSYNC");
                Thread.Sleep(ServiceConfig.AWSGetChangeSleepTime);
            }

            SimpleLogging.WriteToLog("Succesfully updated IP address to " + publicIP + Environment.NewLine);
        }
Exemplo n.º 7
0
        static void Main(string[] args)
        {
            const string awsId  = "AKIAJBEJGQLMJAGQV6YQ";
            const string awsKey = "lzM+9nJXLTNauQgz15SIyQD1QzWe/4+UcPzOEEPw";

            const string domainName = "www.example.org";

            //[1] Create an Amazon Route 53 client object
            var route53Client = AWSClientFactory.CreateAmazonRoute53Client(awsId, awsKey);

            //[2] Create a hosted zone
            var zoneRequest = new CreateHostedZoneRequest {
                Name            = domainName,
                CallerReference = "my_change_request"
            };

            var zoneResponse = route53Client.CreateHostedZone(zoneRequest);

            //[3] Create a resource record set change batch
            var recordSet = new ResourceRecordSet {
                Name            = domainName,
                TTL             = 60,
                Type            = RRType.A,
                ResourceRecords = new List <ResourceRecord> {
                    new ResourceRecord {
                        Value = "192.0.2.235"
                    }
                }
            };

            var change1 = new Change {
                ResourceRecordSet = recordSet,
                Action            = ChangeAction.CREATE
            };

            var changeBatch = new ChangeBatch {
                Changes = new List <Change> {
                    change1
                }
            };

            //[4] Update the zone's resource record sets
            var recordsetRequest = new ChangeResourceRecordSetsRequest {
                HostedZoneId = zoneResponse.HostedZone.Id,
                ChangeBatch  = changeBatch
            };

            var recordsetResponse = route53Client.ChangeResourceRecordSets(recordsetRequest);

            //[5] Monitor the change status
            var changeRequest = new GetChangeRequest {
                Id = recordsetResponse.ChangeInfo.Id
            };

            while (route53Client.GetChange(changeRequest).ChangeInfo.Status == ChangeStatus.PENDING)
            {
                Console.WriteLine("Change is pending.");
                Thread.Sleep(15000);
            }

            Console.WriteLine("Change is complete.");
            Console.ReadKey();
        }
        protected override async Task DeleteAsync(string recordName, string recordType, string recordValue)
        {
            _logger.LogDebug("Starting deletion of {RecordType} {RecordName} with value {RecordValue}", recordType, recordName, recordValue);

            var zone = await FindHostedZoneAsync(recordName);

            if (zone == null)
            {
                _logger.LogDebug("No zone was found");
                return;
            }

            if (recordType == TxtRecordType)
            {
                recordValue = NormalizeTxtValue(recordValue);
            }

            var recordSets = await FindRecordSetsAsync(zone, recordName, recordType);

            var changeBatch = new ChangeBatch();

            if (!recordSets.Any())
            {
                _logger.LogInformation("No DNS records matching {RecordType} {RecordName} were found to delete in zone {Zone}", recordType, recordName, zone.Name);
                return;
            }

            foreach (var recordSet in recordSets)
            {
                if (!recordSet.ResourceRecords.Any(x => x.Value != recordValue))
                {
                    _logger.LogDebug("Will delete record {RecordType} {RecordName}", recordType, recordName);
                    changeBatch.Changes.Add(new Change()
                    {
                        Action = ChangeAction.DELETE, ResourceRecordSet = recordSet
                    });
                }
                else
                {
                    recordSet.ResourceRecords.RemoveAll(x => x.Value == recordValue);

                    _logger.LogDebug("Will retain remaining answers for {RecordType} {RecordName}", recordType, recordName);
                    changeBatch.Changes.Add(new Change()
                    {
                        Action = ChangeAction.UPSERT, ResourceRecordSet = recordSet
                    });
                }
            }

            _logger.LogInformation("Deleting or modifying {Count} DNS records matching {RecordType} {RecordName} with value {RecordValue} in zone {Zone}", changeBatch.Changes.Count, recordType, recordName, recordValue, zone.Name);

            var deleteResponse = await _route53Client.ChangeResourceRecordSetsAsync(
                new ChangeResourceRecordSetsRequest()
            {
                ChangeBatch  = changeBatch,
                HostedZoneId = zone.Id
            });

            var changeRequest = new GetChangeRequest
            {
                Id = deleteResponse.ChangeInfo.Id
            };

            while ((await _route53Client.GetChangeAsync(changeRequest)).ChangeInfo.Status == ChangeStatus.PENDING)
            {
                _logger.LogDebug("Deletion or modification of {RecordType} {RecordName} is pending. Checking for status update in {StatusPollIntervalSeconds} seconds.", recordType, recordName, StatusPollIntervalSeconds);
                Thread.Sleep(TimeSpan.FromSeconds(StatusPollIntervalSeconds));
            }
        }
        private async Task <bool> IsChangePendingAsync(GetChangeRequest changeRequest)
        {
            var changeReponse = await _route53Client.GetChangeAsync(changeRequest);

            return(changeReponse.ChangeInfo.Status == ChangeStatus.PENDING);
        }
        protected override async Task PersistAsync(string recordName, string recordType, string recordValue)
        {
            _logger.LogDebug("Starting creation or update of {RecordType} {RecordName} with value {RecordValue}", recordType, recordName, recordValue);

            var zone = await FindHostedZoneAsync(recordName);

            if (zone == null)
            {
                _logger.LogDebug("No zone was found");
                return;
            }

            if (recordType == TxtRecordType)
            {
                recordValue = NormalizeTxtValue(recordValue);
            }

            var existingRecordSets = await FindRecordSetsAsync(zone, recordName, recordType);

            var existingRecordSet = existingRecordSets.FirstOrDefault();

            var recordSet = existingRecordSet ?? new ResourceRecordSet
            {
                Name            = recordName,
                TTL             = 60,
                Type            = RRType.FindValue(recordType),
                ResourceRecords = new List <ResourceRecord>()
            };

            if (recordSet.ResourceRecords.Any(x => x.Value == recordValue))
            {
                _logger.LogDebug("Record {RecordType} {RecordName} with value {RecordValue} already exists", recordType, recordName, recordValue);
                return;
            }

            recordSet.ResourceRecords.Add(new ResourceRecord {
                Value = recordValue
            });

            var change1 = new Change
            {
                ResourceRecordSet = recordSet,
                Action            = ChangeAction.UPSERT
            };

            var changeBatch = new ChangeBatch
            {
                Changes = new List <Change> {
                    change1
                }
            };

            var recordsetRequest = new ChangeResourceRecordSetsRequest
            {
                HostedZoneId = zone.Id,
                ChangeBatch  = changeBatch
            };

            _logger.LogInformation("Creating or updating DNS record {RecordType} {RecordName}", recordType, recordName);

            var upsertResponse = await _route53Client.ChangeResourceRecordSetsAsync(
                new ChangeResourceRecordSetsRequest()
            {
                ChangeBatch  = changeBatch,
                HostedZoneId = zone.Id
            });

            var changeRequest = new GetChangeRequest
            {
                Id = upsertResponse.ChangeInfo.Id
            };

            while (await IsChangePendingAsync(changeRequest))
            {
                _logger.LogDebug("Creation/update of {RecordType} {RecordName} with value {RecordValue} is pending. Checking for status update in {StatusPollIntervalSeconds} seconds.", recordType, recordName, recordValue, StatusPollIntervalSeconds);
                Thread.Sleep(TimeSpan.FromSeconds(StatusPollIntervalSeconds));
            }
        }
        public void SaveClients()
        {
            //Output
            Output($"MCS: Starting Save Clients");

            string dataText = "";

            //Validate
            if (Clients == null || !Clients.Any())
            {
                //Output
                Output($"MCS: Had no Clients.");

                //Will update with an empty string - no clients
            }
            else
            {
                //Output
                Output($"MCS: Found {Clients.Count} Clients.");

                //1) Serialize to JSON text
                dataText = JsonConvert.SerializeObject(Clients);

                //2) Prepare the string (encrypt, compress)
                //Encrypt and Compress
                dataText = dataText.CompressThenEncrypt(Config.MultiClientSettings.Route53.EncryptionPassword);
            }

            //Add quotation marks
            dataText = "\"" + dataText + "\"";

            //3) Update to R53
            //New the Route 53 Client
            AmazonRoute53Client r53Client =
                new AmazonRoute53Client(
                    Config.BaseSettings.AWSAccessKeyID,
                    Config.BaseSettings.AWSSecretAccessKey,
                    new AmazonRoute53Config
            {
                RegionEndpoint = RegionEndpoint
            });

            //New the Change Record to push
            Change change =
                new Change
            {
                Action            = ChangeAction.UPSERT, //Insert or Update
                ResourceRecordSet =
                    new ResourceRecordSet
                {
                    Name            = Config.MultiClientSettings.Route53.Name,
                    TTL             = 300,
                    Type            = RRType.TXT,
                    ResourceRecords = new List <ResourceRecord> {
                        new ResourceRecord(dataText)
                    }
                }
            };

            //New the Change Request
            ChangeResourceRecordSetsRequest recordSetsRequest =
                new ChangeResourceRecordSetsRequest
            {
                HostedZoneId = Config.MultiClientSettings.Route53.R53ZoneId,
                ChangeBatch  = new ChangeBatch(new List <Change> {
                    change
                })
            };

            //Submitting the Change Request to the API and receiving back the ID
            ChangeResourceRecordSetsResponse recordSetResponse =
                r53Client
                .ChangeResourceRecordSetsAsync(recordSetsRequest)
                .GetAwaiter()
                .GetResult();

            //The ID of the response
            string changeId = recordSetResponse.ChangeInfo.Id;

            //Output
            Output($"MCS-R53: Change ID \"{changeId}\": ChangeRequest was submitted.");

            //Enquire with R53 the status of the change (R53 updates can be VERY slow business)
            GetChangeRequest changeRequest =
                new GetChangeRequest
            {
                Id = changeId
            };

            while (r53Client.GetChangeAsync(changeRequest).GetAwaiter().GetResult().ChangeInfo.Status == ChangeStatus.PENDING)
            {
                //Output
                Output($"MCS-R53: Change ID \"{changeId}\": Change is still pending. (Can take a while.)");

                //Wait
                Thread.Sleep(10 * 1000); //Wait ten seconds
            }

            //Output DONE
            Output($"MCS-R53: Change ID \"{changeId}\": Change IN SYNC. Done.");
            Output($"MCS: Completed Save of {Clients.Count} Clients");
        }
        /// <summary>
        /// Run a single item
        /// </summary>
        /// <param name="item">The item to run</param>
        public void RunItem(Route53Host item)
        {
            //Output
            Output($"R53: Starting item: {item}, new IP address: {IpState.NewIP}");

            //New the Route 53 Client
            AmazonRoute53Client r53Client =
                new AmazonRoute53Client(
                    Config.BaseSettings.AWSAccessKeyID,
                    Config.BaseSettings.AWSSecretAccessKey,
                    new AmazonRoute53Config {
                RegionEndpoint = RegionEndpoint
            });

            //New the Change Record to push
            Change change =
                new Change
            {
                Action            = ChangeAction.UPSERT, //Insert or Update
                ResourceRecordSet =
                    new ResourceRecordSet
                {
                    Name            = item.Name,
                    TTL             = item.TTL,
                    Type            = RRType.A,
                    ResourceRecords = new List <ResourceRecord> {
                        new ResourceRecord(IpState.NewIP)
                    }
                }
            };

            //New the Change Request
            ChangeResourceRecordSetsRequest recordSetsRequest =
                new ChangeResourceRecordSetsRequest
            {
                HostedZoneId = item.ZoneId,
                ChangeBatch  = new ChangeBatch(new List <Change> {
                    change
                })
            };

            //Submitting the Change Request to the API and receiving back the ID
            ChangeResourceRecordSetsResponse recordSetResponse = r53Client.ChangeResourceRecordSetsAsync(recordSetsRequest).GetAwaiter().GetResult();

            //The ID of the response
            string changeId = recordSetResponse.ChangeInfo.Id;

            //Output
            Output($"R53: Change ID \"{changeId}\": ChangeRequest was submitted.");

            //Enquire with R53 the status of the change (R53 updates can be VERY slow business)
            GetChangeRequest changeRequest =
                new GetChangeRequest
            {
                Id = changeId
            };

            while (r53Client.GetChangeAsync(changeRequest).GetAwaiter().GetResult().ChangeInfo.Status == ChangeStatus.PENDING)
            {
                //Output
                Output($"R53: Change ID \"{changeId}\": Change is still pending. (Can take a while.)");

                //Wait
                Thread.Sleep(10 * 1000); //Wait ten seconds
            }

            //Output DONE
            Output($"R53: Change ID \"{changeId}\": Change IN SYNC. Done.");
        }
Exemplo n.º 13
0
 public virtual Task <GetChangeResponse> GetChangeAsync(GetChangeRequest request, CancellationToken cancellationToken = default(CancellationToken))
 {
     throw new NotImplementedException();
 }
Exemplo n.º 14
0
        public static void Route53CreateAdd(string[] args)
        {
            #region Route53CreateAdd
            string domainName = "www.example.org";

            IAmazonRoute53 route53Client = new AmazonRoute53Client();

            CreateHostedZoneRequest zoneRequest = new CreateHostedZoneRequest
            {
                Name            = domainName,
                CallerReference = "my_change_request"
            };

            CreateHostedZoneResponse zoneResponse = route53Client.CreateHostedZone(zoneRequest);

            ResourceRecordSet recordSet = new ResourceRecordSet
            {
                Name            = domainName,
                TTL             = 60,
                Type            = RRType.A,
                ResourceRecords = new List <ResourceRecord> {
                    new ResourceRecord {
                        Value = "192.0.2.235"
                    }
                }
            };

            Change change1 = new Change
            {
                ResourceRecordSet = recordSet,
                Action            = ChangeAction.CREATE
            };

            ChangeBatch changeBatch = new ChangeBatch
            {
                Changes = new List <Change> {
                    change1
                }
            };

            ChangeResourceRecordSetsRequest recordsetRequest = new ChangeResourceRecordSetsRequest
            {
                HostedZoneId = zoneResponse.HostedZone.Id,
                ChangeBatch  = changeBatch
            };

            ChangeResourceRecordSetsResponse recordsetResponse = route53Client.ChangeResourceRecordSets(recordsetRequest);

            GetChangeRequest changeRequest = new GetChangeRequest
            {
                Id = recordsetResponse.ChangeInfo.Id
            };

            while (route53Client.GetChange(changeRequest).ChangeInfo.Status == ChangeStatus.PENDING)
            {
                Console.WriteLine("Change is pending.");
                Thread.Sleep(TimeSpan.FromSeconds(15));
            }
            #endregion

            Console.WriteLine("Change is complete.");
            Console.ReadKey();
        }