From 6995cfa7587a67828f9a80045b9a8026180d04aa Mon Sep 17 00:00:00 2001 From: Pieter Lexis Date: Tue, 31 Oct 2017 13:53:40 +0100 Subject: [PATCH] pdnsutil: Add add-meta function Closes #5853 --- docs/manpages/pdnsutil.1.rst | 6 +++- pdns/pdnsutil.cc | 58 ++++++++++++++++++++++++++---------- 2 files changed, 47 insertions(+), 17 deletions(-) diff --git a/docs/manpages/pdnsutil.1.rst b/docs/manpages/pdnsutil.1.rst index 6cc19d116c61..876fb17f7f37 100644 --- a/docs/manpages/pdnsutil.1.rst +++ b/docs/manpages/pdnsutil.1.rst @@ -198,7 +198,11 @@ set-kind *ZONE* *KIND* Change the kind of *ZONE* to *KIND* (master, slave, native). set-account *ZONE* *ACCOUNT* Change the account (owner) of *ZONE* to *ACCOUNT*. -set-meta *ZONE* *ATTRIBUTE* [*VALUE*] +add-meta *ZONE* *ATTRIBUTE* *VALUE* [*VALUE*]... + Append *VALUE* to the existing *ATTRIBUTE* metadata for *ZONE*. + Will return an error if *ATTRIBUTE* does not support multiple values, use + **set-meta** for these values. +set-meta *ZONE* *ATTRIBUTE* [*VALUE*]... Set domainmetadata *ATTRIBUTE* for *ZONE* to *VALUE*. An empty value clears it. set-presigned *ZONE* diff --git a/pdns/pdnsutil.cc b/pdns/pdnsutil.cc index 50e7d7600b1b..db00cd6e8d24 100644 --- a/pdns/pdnsutil.cc +++ b/pdns/pdnsutil.cc @@ -1787,6 +1787,32 @@ void testSchema(DNSSECKeeper& dk, const DNSName& zone) cout<<"End of tests, please remove "<& values, bool clobber) { + UeberBackend B("default"); + DomainInfo di; + + if (!B.getDomainInfo(zone, di)) { + cerr << "Invalid zone '" << zone << "'" << endl; + return 1; + } + + vector all_metadata; + + if (!clobber) { + B.getDomainMetadata(zone, kind, all_metadata); + } + + all_metadata.insert(all_metadata.end(), values.begin(), values.end()); + + if (!B.setDomainMetadata(zone, kind, all_metadata)) { + cerr << "Unable to set meta for '" << zone << "'" << endl; + return 1; + } + + cout << "Set '" << zone << "' meta " << kind << " = " << boost::join(all_metadata, ", ") << endl; + return 0; +} + int main(int argc, char** argv) try { @@ -1896,6 +1922,8 @@ try cout<<"set-publish-cdnskey ZONE Enable sending CDNSKEY responses for ZONE"< meta(cmds.begin() + 3, cmds.end()); - - DomainInfo di; - if (!B.getDomainInfo(zone, di)){ - cerr << "No such zone in the database" << endl; - return false; - } - - if (!B.setDomainMetadata(zone, kind, meta)) { - cerr << "Unable to set meta for '" << zone << "'" << endl; - return 1; - } else { - cout << "Set '" << zone << "' meta " << kind << " = " << boost::join(meta, ", ") << endl; + static vector multiMetaWhitelist = {"ALLOW-AXFR-FROM", "ALLOW-DNSUPDATE-FROM", + "ALSO-NOTIFY", "TSIG-ALLOW-AXFR", "TSIG-ALLOW-DNSUPDATE", "GSS-ALLOW-AXFR-PRINCIPAL", + "PUBLISH-CDS"}; + bool clobber = true; + if (cmds[0] == "add-meta") { + clobber = false; + if (find(multiMetaWhitelist.begin(), multiMetaWhitelist.end(), kind) == multiMetaWhitelist.end() && kind.find("X-") != 0) { + cerr<<"Refusing to add metadata to single-value metadata "< meta(cmds.begin() + 3, cmds.end()); + return addOrSetMeta(zone, kind, meta, clobber); } else if (cmds[0]=="hsm") { #ifdef HAVE_P11KIT1 UeberBackend B("default");