From 2df5cbe3d982c6cc8a17a51c1ff032861dffe16d Mon Sep 17 00:00:00 2001 From: Philippe Pittoli Date: Mon, 8 May 2023 19:07:20 +0200 Subject: [PATCH] Update RR is working. --- src/client/lib/dnsmanager-client.cr | 7 +++++++ src/client/main.cr | 21 +++++++++++++++------ src/client/parser.cr | 11 +++++++++++ src/storage.cr | 18 +++++++++++++++++- 4 files changed, 50 insertions(+), 7 deletions(-) diff --git a/src/client/lib/dnsmanager-client.cr b/src/client/lib/dnsmanager-client.cr index 7a2694a..6b58fdd 100644 --- a/src/client/lib/dnsmanager-client.cr +++ b/src/client/lib/dnsmanager-client.cr @@ -60,6 +60,13 @@ class DNSManager::Client < IPC parse_message [ Response::Success ], read end + # Update a RR. + def user_rr_update(domain : String, rr : Storage::Zone::ResourceRecord) + request = Request::UpdateRR.new domain, rr + send_now request + parse_message [ Response::Success ], read + end + # Get user domain list. def user_domain_list() request = Request::UserDomains.new diff --git a/src/client/main.cr b/src/client/main.cr index 8634173..42d9f4c 100644 --- a/src/client/main.cr +++ b/src/client/main.cr @@ -45,6 +45,7 @@ class Actions # Zone RR operations. @the_call["user-rr-add-a"] = ->user_rr_add_a + @the_call["user-rr-update-a"] = ->user_rr_update_a @the_call["user-domain-list"] = ->user_domain_list end @@ -136,14 +137,22 @@ class Actions def user_rr_add_a domain, name, ttl, target = Context.args.not_nil! - begin - rr = DNSManager::Storage::Zone::A.new name, ttl.to_u32, target - pp! @dnsmanagerd.user_rr_add domain, rr - rescue e - puts "error for user_rr_add_a: #{e.message}" - end + rr = DNSManager::Storage::Zone::A.new name, ttl.to_u32, target + pp! @dnsmanagerd.user_rr_add domain, rr + rescue e + puts "error for user_rr_add_a: #{e.message}" end + def user_rr_update_a + domain, rrid, name, ttl, target = Context.args.not_nil! + rr = DNSManager::Storage::Zone::A.new name, ttl.to_u32, target + rr.rrid = rrid.to_u32 + pp! @dnsmanagerd.user_rr_update domain, rr + rescue e + puts "error for user_rr_update_a: #{e.message}" + end + + end def main diff --git a/src/client/parser.cr b/src/client/parser.cr index 4fd4e78..7cfefa0 100644 --- a/src/client/parser.cr +++ b/src/client/parser.cr @@ -154,6 +154,17 @@ def parsing_cli(authd_config : Baguette::Configuration::Auth) unrecognized_args_to_context_args.call parser, 4, nil end end + + parser.on("update", "Update a RR.") do + Baguette::Log.info "Update a RR." + parser.banner = "COMMAND: user rr update [A|AAAA|CNAME|MX|SRV|TXT|NS|SOA]" + parser.on("A", "Update an A RR.") do + Baguette::Log.info "update an A RR." + Context.command = "user-rr-update-a" + parser.banner = "COMMAND: user rr update A " + unrecognized_args_to_context_args.call parser, 5, nil + end + end end end diff --git a/src/storage.cr b/src/storage.cr index fe6a8f0..870c8ff 100644 --- a/src/storage.cr +++ b/src/storage.cr @@ -112,6 +112,14 @@ class DNSManager::Storage return Response::NoOwnership.new end + # Test RR validity. + rr.get_errors.tap do |errors| + unless errors.empty? + Baguette::Log.warning "Add RR with errors: #{errors}" + return Response::InvalidZone.new errors + end + end + zone << rr # Update the zone. @@ -143,7 +151,15 @@ class DNSManager::Storage return Response::NoOwnership.new end - zone.resources.map { |x| x.rrid == rr.rrid ? rr : x } + # Test RR validity. + rr.get_errors.tap do |errors| + unless errors.empty? + Baguette::Log.warning "update RR with errors: #{errors}" + return Response::InvalidZone.new errors + end + end + + zone.resources = zone.resources.map { |x| x.rrid == rr.rrid ? rr : x } # Update the zone. zones_by_domain.update_or_create zone.domain, zone