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); } }
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(); }
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); }
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); }
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); }