rectify-all-zones' afterwards.
set-kind *ZONE* *KIND*
Change the kind of *ZONE* to *KIND* (primary, secondary, native).
+set-options-json *ZONE* *JSON*
+ Change the options of *ZONE* to *JSON*
+set-option *ZONE* [*producer*|*consumer*] [*coo*|*unique*|*group*] *VALUE* [*VALUE* ...]
+ Set or remove an option for *ZONE*. Providing an empty value removes an option.
+set-catalog *ZONE* *CATALOG*
+ Change the catalog of *ZONE* to *CATALOG*
set-account *ZONE* *ACCOUNT*
Change the account (owner) of *ZONE* to *ACCOUNT*.
add-meta *ZONE* *ATTRIBUTE* *VALUE* [*VALUE*]...
return ret;
}
-static int setZoneOptions(const DNSName& zone, const string& options)
+static int setZoneOptionsJson(const DNSName& zone, const string& options)
{
UeberBackend B("default");
DomainInfo di;
return EXIT_SUCCESS;
}
+static int setZoneOption(const DNSName& zone, const string& type, const string& option, const set<string>& values)
+{
+ UeberBackend B("default");
+ DomainInfo di;
+ CatalogInfo ci;
+
+ if (!B.getDomainInfo(zone, di)) {
+ cerr << "No such zone " << zone << " in the database" << endl;
+ return EXIT_FAILURE;
+ }
+
+ CatalogInfo::CatalogType ctype;
+ if (type == "producer") {
+ ctype = CatalogInfo::CatalogType::Producer;
+ }
+ else {
+ ctype = CatalogInfo::CatalogType::Consumer;
+ }
+
+ ci.fromJson(di.options, ctype);
+
+ if (option == "coo") {
+ ci.d_coo = (!values.empty() ? DNSName(*values.begin()) : DNSName());
+ }
+ else if (option == "unique") {
+ ci.d_unique = (!values.empty() ? DNSName(*values.begin()) : DNSName());
+ }
+ else if (option == "group") {
+ ci.d_group = values;
+ }
+
+ if (!di.backend->setOptions(zone, ci.toJson())) {
+ cerr << "Could not find backend willing to accept new zone configuration" << endl;
+ return EXIT_FAILURE;
+ }
+
+ return EXIT_SUCCESS;
+}
+
static int setZoneCatalog(const DNSName& zone, const DNSName& catalog)
{
UeberBackend B("default");
cout << "secure-all-zones [increase-serial] Secure all zones without keys" << endl;
cout << "secure-zone ZONE [ZONE ..] Add DNSSEC to zone ZONE" << endl;
cout << "set-kind ZONE KIND Change the kind of ZONE to KIND (primary, secondary, native)" << endl;
- cout << "set-options ZONE OPTIONS Change the options of ZONE to OPTIONS" << endl;
+ cout << "set-options-json ZONE JSON Change the options of ZONE to JSON" << endl;
+ cout << "set-option ZONE Set or remove an option for ZONE Providing an empty value removes an option" << endl;
+ cout << " [producer|consumer]" << endl;
+ cout << " [coo|unique|group] VALUE" << endl;
+ cout << " [VALUE ...]" << endl;
cout << "set-catalog ZONE CATALOG Change the catalog of ZONE to CATALOG" << endl;
cout << "set-account ZONE ACCOUNT Change the account (owner) of ZONE to ACCOUNT" << endl;
cout << "set-nsec3 ZONE ['PARAMS' [narrow]] Enable NSEC3 with PARAMS. Optionally narrow" << endl;
auto kind = DomainInfo::stringToKind(cmds.at(2));
return setZoneKind(zone, kind);
}
- else if (cmds.at(0) == "set-options") {
+ else if (cmds.at(0) == "set-options-json") {
if (cmds.size() != 3) {
- cerr << "Syntax: pdnsutil set-options ZONE OPTIONS" << endl;
- return 0;
+ cerr << "Syntax: pdnsutil set-options ZONE VALUE" << endl;
+ return EXIT_FAILURE;
}
+
// Verify json
if (!cmds.at(2).empty()) {
std::string err;
return EXIT_FAILURE;
}
}
+
+ DNSName zone(cmds.at(1));
+
+ return setZoneOptionsJson(zone, cmds.at(2));
+ }
+ else if (cmds.at(0) == "set-option") {
+ if (cmds.size() < 5 || (cmds.size() > 5 && (cmds.at(3) != "group"))) {
+ cerr << "Syntax: pdnsutil set-option ZONE [producer|consumer] [coo|unique|group] VALUE [VALUE ...]1" << endl;
+ return EXIT_FAILURE;
+ }
+
+ if ((cmds.at(2) != "producer" && cmds.at(2) != "consumer") || (cmds.at(3) != "coo" && cmds.at(3) != "unique" && cmds.at(3) != "group")) {
+ cerr << "Syntax: pdnsutil set-option ZONE [producer|consumer] [coo|unique|group] VALUE [VALUE ...]" << endl;
+ return EXIT_FAILURE;
+ }
+
DNSName zone(cmds.at(1));
- return setZoneOptions(zone, cmds.at(2));
+ set<string> values;
+ for (unsigned int n = 4; n < cmds.size(); ++n) {
+ if (!cmds.at(n).empty()) {
+ values.insert(cmds.at(n));
+ }
+ }
+
+ return setZoneOption(zone, cmds.at(2), cmds.at(3), values);
}
else if (cmds.at(0) == "set-catalog") {
if (cmds.size() != 3) {
$PDNSUTIL --config-dir=. --config-name=gmysql load-zone catalog.invalid zones/catalog.invalid
$PDNSUTIL --config-dir=. --config-name=gmysql set-kind catalog.invalid producer
- $PDNSUTIL --config-dir=. --config-name=gmysql set-options test.com '{"producer":{"coo":"other-catalog.invalid","unique":"123"}}'
- $PDNSUTIL --config-dir=. --config-name=gmysql set-options tsig.com '{"producer":{"group":["pdns-group-x","pdns-group-y"]}}'
+ $PDNSUTIL --config-dir=. --config-name=gmysql set-option test.com producer coo other-catalog.invalid
+ $PDNSUTIL --config-dir=. --config-name=gmysql set-option test.com producer unique 123
+ $PDNSUTIL --config-dir=. --config-name=gmysql set-option tsig.com producer group pdns-group-x pdns-group-y
fi
gsql_master gmysql dyndns
if [ "$zone" = "test.com" ]; then
$PDNSUTIL --config-dir=. --config-name=gmysql2 create-secondary-zone $zone 127.0.0.1:$port
$PDNSUTIL --config-dir=. --config-name=gmysql2 set-catalog $zone other-catalog.invalid
- $PDNSUTIL --config-dir=. --config-name=gmysql2 set-options $zone '{"consumer":{"coo":"catalog.invalid","unique":"42"}}'
+ $PDNSUTIL --config-dir=. --config-name=gmysql2 set-option $zone consumer coo catalog.invalid
+ $PDNSUTIL --config-dir=. --config-name=gmysql2 set-option $zone consumer unique 42
fi
if [ "$zone" = "tsig.com" ]; then
$PDNSUTIL --config-dir=. --config-name=gmysql2 create-secondary-zone $zone 127.0.0.2:$port
$PDNSUTIL --config-dir=. --config-name=gmysql2 set-catalog $zone catalog.invalid
- $PDNSUTIL --config-dir=. --config-name=gmysql2 set-options $zone "{\"consumer\":{\"unique\":\"$($SAXFR 127.0.0.1 $port catalog.invalid | grep $zone | grep PTR | cut -d'.' -f1)\"}}"
+ $PDNSUTIL --config-dir=. --config-name=gmysql2 set-option $zone consumer unique $($SAXFR 127.0.0.1 $port catalog.invalid | grep $zone | grep PTR | cut -d'.' -f1)
$PDNSUTIL --config-dir=. --config-name=gmysql2 import-tsig-key test $ALGORITHM $KEY
$PDNSUTIL --config-dir=. --config-name=gmysql2 activate-tsig-key tsig.com test secondary
fi
if [ "$zone" = "stest.com" ]; then
$PDNSUTIL --config-dir=. --config-name=gmysql2 create-secondary-zone $zone 127.0.0.1:$port
$PDNSUTIL --config-dir=. --config-name=gmysql2 set-catalog $zone other-catalog.invalid
- $PDNSUTIL --config-dir=. --config-name=gmysql2 set-options $zone "{\"consumer\":{\"coo\":\"catalog.invalid\",\"unique\":\"$($SAXFR 127.0.0.1 $port catalog.invalid | grep $zone | grep PTR | cut -d'.' -f1)\"}}"
+ $PDNSUTIL --config-dir=. --config-name=gmysql2 set-option $zone consumer coo catalog.invalid
+ $PDNSUTIL --config-dir=. --config-name=gmysql2 set-option $zone consumer unique $($SAXFR 127.0.0.1 $port catalog.invalid | grep $zone | grep PTR | cut -d'.' -f1)
if [[ $skipreasons != *nolua* ]]; then
$PDNSUTIL --config-dir=. --config-name=gmysql2 set-meta stest.com AXFR-SOURCE 127.0.0.2
fi
if [ "$zone" = "wtest.com" ]; then
$PDNSUTIL --config-dir=. --config-name=gmysql2 create-secondary-zone $zone 127.0.0.1:$port
$PDNSUTIL --config-dir=. --config-name=gmysql2 set-catalog $zone catalog.invalid
- $PDNSUTIL --config-dir=. --config-name=gmysql2 set-options $zone '{"consumer":{"unique":"42"}}'
+ $PDNSUTIL --config-dir=. --config-name=gmysql2 set-option $zone consumer unique 42
fi
if [ "$zone" = "." ]; then
$PDNSUTIL --config-dir=. --config-name=gmysql2 create-secondary-zone $zone 127.0.0.1:$port
$PDNSUTIL --config-dir=. --config-name=lmdb load-zone catalog.invalid zones/catalog.invalid
$PDNSUTIL --config-dir=. --config-name=lmdb set-kind catalog.invalid producer
- $PDNSUTIL --config-dir=. --config-name=lmdb set-options test.com '{"producer":{"coo":"other-catalog.invalid","unique":"123"}}'
- $PDNSUTIL --config-dir=. --config-name=lmdb set-options tsig.com '{"producer":{"group":["pdns-group-x","pdns-group-y"]}}'
+ $PDNSUTIL --config-dir=. --config-name=lmdb set-options-json test.com '{"producer":{"coo":"other-catalog.invalid","unique":"123"}}'
+ $PDNSUTIL --config-dir=. --config-name=lmdb set-options-json tsig.com '{"producer":{"group":["pdns-group-x","pdns-group-y"]}}'
fi
$RUNWRAPPER $PDNS --daemon=no --local-address=$address --local-port=$port --config-dir=. \
if [ "$zone" = "test.com" ]; then
$PDNSUTIL --config-dir=. --config-name=lmdb2 create-secondary-zone $zone 127.0.0.1:$port
$PDNSUTIL --config-dir=. --config-name=lmdb2 set-catalog $zone other-catalog.invalid
- $PDNSUTIL --config-dir=. --config-name=lmdb2 set-options $zone '{"consumer":{"coo":"catalog.invalid","unique":"42"}}'
+ $PDNSUTIL --config-dir=. --config-name=lmdb2 set-options-json $zone '{"consumer":{"coo":"catalog.invalid","unique":"42"}}'
fi
if [ "$zone" = "tsig.com" ]; then
$PDNSUTIL --config-dir=. --config-name=lmdb2 create-secondary-zone $zone 127.0.0.2:$port
$PDNSUTIL --config-dir=. --config-name=lmdb2 set-catalog $zone catalog.invalid
- $PDNSUTIL --config-dir=. --config-name=lmdb2 set-options $zone "{\"consumer\":{\"unique\":\"$($SAXFR 127.0.0.1 $port catalog.invalid | grep $zone | grep PTR | cut -d'.' -f1)\"}}"
+ $PDNSUTIL --config-dir=. --config-name=lmdb2 set-options-json $zone "{\"consumer\":{\"unique\":\"$($SAXFR 127.0.0.1 $port catalog.invalid | grep $zone | grep PTR | cut -d'.' -f1)\"}}"
$PDNSUTIL --config-dir=. --config-name=lmdb2 import-tsig-key test $ALGORITHM $KEY
$PDNSUTIL --config-dir=. --config-name=lmdb2 activate-tsig-key tsig.com test secondary
fi
if [ "$zone" = "stest.com" ]; then
$PDNSUTIL --config-dir=. --config-name=lmdb2 create-secondary-zone $zone 127.0.0.1:$port
$PDNSUTIL --config-dir=. --config-name=lmdb2 set-catalog $zone other-catalog.invalid
- $PDNSUTIL --config-dir=. --config-name=lmdb2 set-options $zone "{\"consumer\":{\"coo\":\"catalog.invalid\",\"unique\":\"$($SAXFR 127.0.0.1 $port catalog.invalid | grep $zone | grep PTR | cut -d'.' -f1)\"}}"
+ $PDNSUTIL --config-dir=. --config-name=lmdb2 set-options-json $zone "{\"consumer\":{\"coo\":\"catalog.invalid\",\"unique\":\"$($SAXFR 127.0.0.1 $port catalog.invalid | grep $zone | grep PTR | cut -d'.' -f1)\"}}"
if [[ $skipreasons != *nolua* ]]; then
$PDNSUTIL --config-dir=. --config-name=lmdb2 set-meta stest.com AXFR-SOURCE 127.0.0.2
fi
if [ "$zone" = "wtest.com" ]; then
$PDNSUTIL --config-dir=. --config-name=lmdb2 create-secondary-zone $zone 127.0.0.1:$port
$PDNSUTIL --config-dir=. --config-name=lmdb2 set-catalog $zone catalog.invalid
- $PDNSUTIL --config-dir=. --config-name=lmdb2 set-options $zone '{"consumer":{"unique":"42"}}'
+ $PDNSUTIL --config-dir=. --config-name=lmdb2 set-options-json $zone '{"consumer":{"unique":"42"}}'
fi
if [ "$zone" = "." ]; then
$PDNSUTIL --config-dir=. --config-name=lmdb2 create-secondary-zone $zone 127.0.0.1:$port