Exemple #1
0
        static void Main(string[] args)
        {
            var configHandler = new AppConfigHandler();
            var config        = configHandler.GetConfig();
            var ipChecker     = config.IPChecker;
            var route53Client = new AmazonRoute53Client(config.Route53AccessKey, config.Route53SecretKey, RegionEndpoint.EUWest1);
            var dnsUpdater    = new DnsUpdater(route53Client);

            HostFactory.Run(x =>
            {
                x.Service <IScheduledTaskService>(s =>
                {
                    s.ConstructUsing(name => new DnsUpdateService(new SchedulerRegistry(new ScheduledTaskWorker(dnsUpdater, ipChecker, config.DomainList))));
                    s.WhenStarted(tc => tc.Start());
                    s.WhenStopped(tc => tc.Stop());
                });

                x.RunAsLocalSystem();

                x.SetDisplayName("DynDns53 Service");
                x.SetServiceName("DynDns53");
                x.SetDescription("Updates AWS Route53 records with the current external IP of the system");

                x.StartAutomatically();

                x.EnableServiceRecovery(s =>
                {
                    s.RestartService(1);
                    s.RestartService(2);
                    s.RestartService(5);
                });
            });
        }
        public async Task StartUpdate()
        {
            var ipChecker = IPCheckerHelper.CreateIPChecker(this.config.IPChecker);
            var dynDns53  = new DnsUpdater(route53Client);

            while (true)
            {
                try
                {
                    logger.Info("Getting public IP...");
                    var ipAddress = await ipChecker.GetExternalIpAsync();

                    logger.Info($"Current public IP: {ipAddress}");

                    logger.Info("Updating DNS...");
                    await dynDns53.UpdateAllAsync(ipAddress, this.config.DomainList);

                    logger.Info($"Update completed. Waiting for {this.config.UpdateInterval} seconds");

                    SendHeartbeat();
                }
                catch (Exception ex)
                {
                    logger.Error($"Exception: {ex.Message}");
                }

                System.Threading.Thread.Sleep(this.config.UpdateInterval.Value * 1000);
            }
        }
Exemple #3
0
        private void InitConfig()
        {
            AddLog("Loading configuration values...");

            _configHandler = new AppConfigHandler();
            _config        = _configHandler.GetConfig();
            _ipChecker     = _config.IPChecker;

            var _amazonClient = new AmazonRoute53Client(_config.Route53AccessKey, _config.Route53SecretKey, RegionEndpoint.USEast1);

            _dnsUpdater = new DnsUpdater(_amazonClient);

            AddLog($"Found {_config.DomainList.Count} domain(s)");
            foreach (HostedDomainInfo domainInfo in _config.DomainList)
            {
                AddLog($"{domainInfo.DomainName}");
            }

            if (_timer != null)
            {
                // Stop to avoid multiple timer_Tick invocations
                _timer.Stop();
            }

            int interval = _config.UpdateInterval;

            _timer          = new System.Windows.Threading.DispatcherTimer();
            _timer.Tick    += timer_Tick;
            _timer.Interval = new TimeSpan(0, 0, interval);
            _timer.Start();

            AddLog($"Time set to update domains every {interval} seconds");

            SetAutoStart();
        }
Exemple #4
0
        public async Task UpdateDns_SingleDomainCorrectNewIp_ShouldUpdateTheDnsWithCorrectIp()
        {
            // Arrange
            string currentExternalIp = "1.2.3.4";
            string currentRecordedIp = "5.6.7.8";
            string subdomain         = "test.example.com";
            string zoneId            = "ABCD123456";
            var    domain            = new HostedDomainInfo()
            {
                ZoneId     = zoneId,
                DomainName = subdomain
            };

            var mockAmazonClient = new Mock <IAmazonRoute53>();

            mockAmazonClient.Setup(m => m.ListResourceRecordSetsAsync(It.IsAny <ListResourceRecordSetsRequest>(), CancellationToken.None))
            .ReturnsAsync(new ListResourceRecordSetsResponse()
            {
                ResourceRecordSets = new List <ResourceRecordSet>()
                {
                    new ResourceRecordSet()
                    {
                        Name            = subdomain,
                        ResourceRecords = new List <ResourceRecord>()
                        {
                            new ResourceRecord()
                            {
                                Value = currentRecordedIp
                            }
                        }
                    }
                }
            });

            var dnsUpdater = new DnsUpdater(mockAmazonClient.Object);

            // Act
            await dnsUpdater.UpdateSingleAsync(currentExternalIp, domain);

            // Assert
            mockAmazonClient.Verify(m => m.ChangeResourceRecordSetsAsync(It.Is <ChangeResourceRecordSetsRequest>(c => c.ChangeBatch.Changes.Count == 1), CancellationToken.None), Times.Once);
            mockAmazonClient.Verify(m => m.ChangeResourceRecordSetsAsync(It.Is <ChangeResourceRecordSetsRequest>(c => c.ChangeBatch.Changes.First().ResourceRecordSet.ResourceRecords.First().Value == currentExternalIp), CancellationToken.None), Times.Once);
        }
Exemple #5
0
        public async Task UpdateDns_SingleDomainCorrectExistingIp_ShowuldNotCallAwsClient()
        {
            // Arrange
            string currentExternalIp = "1.2.3.4";
            string currentRecordedIp = "1.2.3.4";
            string subdomain         = "test.example.com";
            string zoneId            = "ABCD123456";
            var    domain            = new HostedDomainInfo()
            {
                ZoneId     = zoneId,
                DomainName = subdomain
            };

            var mockAmazonClient = new Mock <IAmazonRoute53>();

            mockAmazonClient.Setup(m => m.ListResourceRecordSetsAsync(It.IsAny <ListResourceRecordSetsRequest>(), CancellationToken.None))
            .ReturnsAsync(new ListResourceRecordSetsResponse()
            {
                ResourceRecordSets = new List <ResourceRecordSet>()
                {
                    new ResourceRecordSet()
                    {
                        Name            = subdomain,
                        ResourceRecords = new List <ResourceRecord>()
                        {
                            new ResourceRecord()
                            {
                                Value = currentRecordedIp
                            }
                        }
                    }
                }
            });

            var dnsUpdater = new DnsUpdater(mockAmazonClient.Object);

            // Act
            await dnsUpdater.UpdateSingleAsync(currentExternalIp, domain);

            // Assert
            mockAmazonClient.Verify(m => m.ChangeResourceRecordSetsAsync(It.IsAny <ChangeResourceRecordSetsRequest>(), CancellationToken.None), Times.Never);
        }
Exemple #6
0
        public async Task UpdateDns_MultipleDomainsCorrectExistingIp_ShowuldNotCallAwsClient()
        {
            // Arrange
            string currentExternalIp = "1.2.3.4";
            string currentRecordedIp = "1.2.3.4";
            var    subDomainList     = new List <string>()
            {
                "subdomain1.example.com", "subdomain2.example.com"
            };
            string zoneId     = "ABCDEFGHI";
            var    domainList = new List <HostedDomainInfo>()
            {
                new HostedDomainInfo()
                {
                    DomainName = subDomainList[0], ZoneId = zoneId
                },
                new HostedDomainInfo()
                {
                    DomainName = subDomainList[1], ZoneId = zoneId
                }
            };

            var mockAmazonClient = new Mock <IAmazonRoute53>();

            mockAmazonClient.Setup(m => m.ListResourceRecordSetsAsync(It.IsAny <ListResourceRecordSetsRequest>(), CancellationToken.None))
            .ReturnsAsync(new ListResourceRecordSetsResponse()
            {
                ResourceRecordSets = new List <ResourceRecordSet>()
                {
                    new ResourceRecordSet()
                    {
                        Name            = subDomainList[0],
                        ResourceRecords = new List <ResourceRecord>()
                        {
                            new ResourceRecord()
                            {
                                Value = currentRecordedIp
                            }
                        }
                    },
                    new ResourceRecordSet()
                    {
                        Name            = subDomainList[1],
                        ResourceRecords = new List <ResourceRecord>()
                        {
                            new ResourceRecord()
                            {
                                Value = currentRecordedIp
                            }
                        }
                    }
                }
            });

            var dnsUpdater = new DnsUpdater(mockAmazonClient.Object);

            // Act
            await dnsUpdater.UpdateAllAsync(currentExternalIp, domainList);

            // Assert
            mockAmazonClient.Verify(m => m.ChangeResourceRecordSetsAsync(It.Is <ChangeResourceRecordSetsRequest>(c => c.ChangeBatch.Changes.Count == 1), CancellationToken.None), Times.Never);
            mockAmazonClient.Verify(m => m.ChangeResourceRecordSetsAsync(It.Is <ChangeResourceRecordSetsRequest>(c => c.ChangeBatch.Changes.First().ResourceRecordSet.ResourceRecords.First().Value == currentExternalIp), CancellationToken.None), Times.Never);
        }