From 61b23e381113c3bdc933565dd986259c99983658 Mon Sep 17 00:00:00 2001 From: Ralph Dolmans Date: Wed, 30 Nov 2016 11:22:29 +0000 Subject: [PATCH] - Added local-zones and local-data bulk addition and removal functionality in unbound-control (local_zones, local_zones_remove, local_datas and local_datas_remove). - iana portlist update git-svn-id: file:///svn/unbound/trunk@3941 be551aaa-1e26-0410-a405-d3ace91eadb9 --- daemon/remote.c | 153 +++++++++++++++++++++++++++---- doc/Changelog | 6 ++ doc/unbound-control.8.in | 16 ++++ smallapp/unbound-control.c | 16 ++++ testdata/09-unbound-control.tpkg | Bin 7028 -> 7433 bytes util/iana_ports.inc | 1 + 6 files changed, 175 insertions(+), 17 deletions(-) diff --git a/daemon/remote.c b/daemon/remote.c index bbd0cff20..c303ce4ea 100644 --- a/daemon/remote.c +++ b/daemon/remote.c @@ -1128,8 +1128,8 @@ find_arg2(SSL* ssl, char* arg, char** arg2) } /** Add a new zone */ -static void -do_zone_add(SSL* ssl, struct local_zones* zones, char* arg) +static int +perform_zone_add(SSL* ssl, struct local_zones* zones, char* arg) { uint8_t* nm; int nmlabs; @@ -1138,13 +1138,13 @@ do_zone_add(SSL* ssl, struct local_zones* zones, char* arg) enum localzone_type t; struct local_zone* z; if(!find_arg2(ssl, arg, &arg2)) - return; + return 0; if(!parse_arg_name(ssl, arg, &nm, &nmlen, &nmlabs)) - return; + return 0; if(!local_zone_str2type(arg2, &t)) { ssl_printf(ssl, "error not a zone type. %s\n", arg2); free(nm); - return; + return 0; } lock_rw_wrlock(&zones->lock); if((z=local_zones_find(zones, nm, nmlen, @@ -1155,29 +1155,56 @@ do_zone_add(SSL* ssl, struct local_zones* zones, char* arg) lock_rw_unlock(&z->lock); free(nm); lock_rw_unlock(&zones->lock); - send_ok(ssl); - return; + return 1; } if(!local_zones_add_zone(zones, nm, nmlen, nmlabs, LDNS_RR_CLASS_IN, t)) { lock_rw_unlock(&zones->lock); ssl_printf(ssl, "error out of memory\n"); - return; + return 0; } lock_rw_unlock(&zones->lock); + return 1; +} + +/** Do the local_zone command */ +static void +do_zone_add(SSL* ssl, struct local_zones* zones, char* arg) +{ + if(!perform_zone_add(ssl, zones, arg)) + return; send_ok(ssl); } -/** Remove a zone */ +/** Do the local_zones command */ static void -do_zone_remove(SSL* ssl, struct local_zones* zones, char* arg) +do_zones_add(SSL* ssl, struct local_zones* zones) +{ + char buf[2048]; + int num = 0; + while(ssl_read_line(ssl, buf, sizeof(buf))) { + if(buf[0] == 0x04 && buf[1] == 0) + break; /* end of transmission */ + if(!perform_zone_add(ssl, zones, buf)) { + if(!ssl_printf(ssl, "error for input line: %s\n", buf)) + return; + } + else + num++; + } + (void)ssl_printf(ssl, "added %d zones\n", num); +} + +/** Remove a zone */ +static int +perform_zone_remove(SSL* ssl, struct local_zones* zones, char* arg) { uint8_t* nm; int nmlabs; size_t nmlen; struct local_zone* z; if(!parse_arg_name(ssl, arg, &nm, &nmlen, &nmlabs)) - return; + return 0; lock_rw_wrlock(&zones->lock); if((z=local_zones_find(zones, nm, nmlen, nmlabs, LDNS_RR_CLASS_IN))) { @@ -1186,35 +1213,119 @@ do_zone_remove(SSL* ssl, struct local_zones* zones, char* arg) } lock_rw_unlock(&zones->lock); free(nm); + return 1; +} + +/** Do the local_zone_remove command */ +static void +do_zone_remove(SSL* ssl, struct local_zones* zones, char* arg) +{ + if(!perform_zone_remove(ssl, zones, arg)) + return; send_ok(ssl); } +/** Do the local_zones_remove command */ +static void +do_zones_remove(SSL* ssl, struct local_zones* zones) +{ + char buf[2048]; + int num = 0; + while(ssl_read_line(ssl, buf, sizeof(buf))) { + if(buf[0] == 0x04 && buf[1] == 0) + break; /* end of transmission */ + if(!perform_zone_remove(ssl, zones, buf)) { + if(!ssl_printf(ssl, "error for input line: %s\n", buf)) + return; + } + else + num++; + } + (void)ssl_printf(ssl, "removed %d zones\n", num); +} + /** Add new RR data */ -static void -do_data_add(SSL* ssl, struct local_zones* zones, char* arg) +static int +perform_data_add(SSL* ssl, struct local_zones* zones, char* arg) { if(!local_zones_add_RR(zones, arg)) { ssl_printf(ssl,"error in syntax or out of memory, %s\n", arg); - return; + return 0; } + return 1; +} + +/** Do the local_data command */ +static void +do_data_add(SSL* ssl, struct local_zones* zones, char* arg) +{ + if(!perform_data_add(ssl, zones, arg)) + return; send_ok(ssl); } -/** Remove RR data */ +/** Do the local_datas command */ static void -do_data_remove(SSL* ssl, struct local_zones* zones, char* arg) +do_datas_add(SSL* ssl, struct local_zones* zones) +{ + char buf[2048]; + int num = 0; + while(ssl_read_line(ssl, buf, sizeof(buf))) { + if(buf[0] == 0x04 && buf[1] == 0) + break; /* end of transmission */ + if(!perform_data_add(ssl, zones, buf)) { + if(!ssl_printf(ssl, "error for input line: %s\n", buf)) + return; + } + else + num++; + } + (void)ssl_printf(ssl, "added %d datas\n", num); +} + +/** Remove RR data */ +static int +perform_data_remove(SSL* ssl, struct local_zones* zones, char* arg) { uint8_t* nm; int nmlabs; size_t nmlen; if(!parse_arg_name(ssl, arg, &nm, &nmlen, &nmlabs)) - return; + return 0; local_zones_del_data(zones, nm, nmlen, nmlabs, LDNS_RR_CLASS_IN); free(nm); + return 1; +} + +/** Do the local_data_remove command */ +static void +do_data_remove(SSL* ssl, struct local_zones* zones, char* arg) +{ + if(!perform_data_remove(ssl, zones, arg)) + return; send_ok(ssl); } +/** Do the local_datas_remove command */ +static void +do_datas_remove(SSL* ssl, struct local_zones* zones) +{ + char buf[2048]; + int num = 0; + while(ssl_read_line(ssl, buf, sizeof(buf))) { + if(buf[0] == 0x04 && buf[1] == 0) + break; /* end of transmission */ + if(!perform_data_remove(ssl, zones, buf)) { + if(!ssl_printf(ssl, "error for input line: %s\n", buf)) + return; + } + else + num++; + } + (void)ssl_printf(ssl, "removed %d datas\n", num); +} + /** Add a new zone to view */ static void do_view_zone_add(SSL* ssl, struct worker* worker, char* arg) @@ -2624,12 +2735,20 @@ execute_cmd(struct daemon_remote* rc, SSL* ssl, char* cmd, do_verbosity(ssl, skipwhite(p+9)); } else if(cmdcmp(p, "local_zone_remove", 17)) { do_zone_remove(ssl, worker->daemon->local_zones, skipwhite(p+17)); + } else if(cmdcmp(p, "local_zones_remove", 18)) { + do_zones_remove(ssl, worker->daemon->local_zones); } else if(cmdcmp(p, "local_zone", 10)) { do_zone_add(ssl, worker->daemon->local_zones, skipwhite(p+10)); + } else if(cmdcmp(p, "local_zones", 11)) { + do_zones_add(ssl, worker->daemon->local_zones); } else if(cmdcmp(p, "local_data_remove", 17)) { do_data_remove(ssl, worker->daemon->local_zones, skipwhite(p+17)); + } else if(cmdcmp(p, "local_datas_remove", 18)) { + do_datas_remove(ssl, worker->daemon->local_zones); } else if(cmdcmp(p, "local_data", 10)) { do_data_add(ssl, worker->daemon->local_zones, skipwhite(p+10)); + } else if(cmdcmp(p, "local_datas", 11)) { + do_datas_add(ssl, worker->daemon->local_zones); } else if(cmdcmp(p, "view_local_zone_remove", 22)) { do_view_zone_remove(ssl, worker, skipwhite(p+22)); } else if(cmdcmp(p, "view_local_zone", 15)) { diff --git a/doc/Changelog b/doc/Changelog index f1bbdfa96..d6989c54f 100644 --- a/doc/Changelog +++ b/doc/Changelog @@ -1,3 +1,9 @@ +30 November 2016: Ralph + - Added local-zones and local-data bulk addition and removal + functionality in unbound-control (local_zones, local_zones_remove, + local_datas and local_datas_remove). + - iana portlist update + 29 November 2016: Wouter - version 1.6.0 is in the development branch. - braces in view.c around lock statements. diff --git a/doc/unbound-control.8.in b/doc/unbound-control.8.in index f5e36df2c..a5f74ead0 100644 --- a/doc/unbound-control.8.in +++ b/doc/unbound-control.8.in @@ -99,6 +99,22 @@ but if the name has become an empty nonterminal (there is still data in domain names below the removed name), NOERROR nodata answers are the result for that name. .TP +.B local_zones +Add local zones read from stdin of unbound\-control. Input is read per line, +with name space type on a line. For bulk additions. +.TP +.B local_zones_remove +Remove local zones read from stdin of unbound\-control. Input is one name per +line. For bulk removals. +.TP +.B local_datas +Add local data RRs read from stdin of unbound\-control. Input is one RR per +line. For bulk additions. +.TP +.B local_datas_remove +Remove local data RRs read from stdin of unbound\-control. Input is one name per +line. For bulk removals. +.TP .B dump_cache The contents of the cache is printed in a text format to stdout. You can redirect it to a file to store the cache in a file. diff --git a/smallapp/unbound-control.c b/smallapp/unbound-control.c index 3734447cf..20a7c1649 100644 --- a/smallapp/unbound-control.c +++ b/smallapp/unbound-control.c @@ -303,6 +303,15 @@ send_file(SSL* ssl, FILE* in, char* buf, size_t sz) } } +/** send end-of-file marker to server */ +static void +send_eof(SSL* ssl) +{ + char e[] = {0x04, 0x0a}; + if(SSL_write(ssl, e, (int)sizeof(e)) <= 0) + ssl_err("could not SSL_write end-of-file marker"); +} + /** send command and display result */ static int go_cmd(SSL* ssl, int quiet, int argc, char* argv[]) @@ -328,6 +337,13 @@ go_cmd(SSL* ssl, int quiet, int argc, char* argv[]) if(argc == 1 && strcmp(argv[0], "load_cache") == 0) { send_file(ssl, stdin, buf, sizeof(buf)); } + else if(argc == 1 && (strcmp(argv[0], "local_zones") == 0 || + strcmp(argv[0], "local_zones_remove") == 0 || + strcmp(argv[0], "local_datas") == 0 || + strcmp(argv[0], "local_datas_remove") == 0)) { + send_file(ssl, stdin, buf, sizeof(buf)); + send_eof(ssl); + } while(1) { ERR_clear_error(); diff --git a/testdata/09-unbound-control.tpkg b/testdata/09-unbound-control.tpkg index 62b2097bde5c8471a7f2ded12a34e5d6e8e25f35..d5b11b77f0446d6bc5c44f07cea43d03a999e9b3 100644 GIT binary patch literal 7433 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 H0H6Q><)y{r literal 7028 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׀j%Lc`JLfaKFPk?H@A7T^mJ^ z{|MXh$$_coPLe!7Ebyr)Yq@>taJXLwpa^i)N{wuDV&V0l(y0gV`)f1&J#58AV4q0P zH0eXVUk|U-IJ|!{|4YZ#=g8sV>6gJSkk89FU9YGgKCSg73-SZS{~Gh{<|5M{FyHJV zOiuA0%K)9bYkr-QP8e?iCTJ`uk~?@0#3x@Ko_yvgs=M*w)cDgw<|FR!5OBB%3)~3s zB4+wXl;QFgULC;%uJIF23;mf? zJX-z_BImy2{9H2bm;0)|XcU*gfsd1mjg4mqx8vkFvF$kdno2PP)AjBaPVE;0!!QUA zr#c+F3DuXEWoGd+hSX;T;U9j0^YrjD0{>J$;eY-NzdK`Gr!*Syk3WKsb_~4%b^Bm7 zhp&(e)gf{)_RHVVv$nXqjGc+7P1Ks!#IfOnlm7!Q4X@r#0^NU;1x~#Z0zyuz;auVd zdo=tBHUR;Cje7d<6Z8hq`sSn05!cMvz)2dPIP!20o~qBTV@QvXcUK@;UZWJrzkU9e z-F=??kZsrp4 zRCO7rzEkgKy}6OiW0-aK&zSd!fAcB%Z*FLOa}p%@f4Q4>mz8%ayI<2yk<+?TSBboy zGkOU;@BZ(X-2r>~`~T23_Im&Ko4^b2f8j!VknOPoK@&-$Qz6=B^0XxytS}XiEeazz z%iuf2ig34bK>BkA!i`F`c13`eL8+zYuwKg!4V&KdTMc=E*E|3hGNL>mYAIZj;@n-vIY|sO7*(KFZX@NXWdmKGs zjR>(bD4S)LjwP9-9oKdi3XEljQO~ZH{=&z`EGqPKW5-vOvq_DhH?8k~S-aGw3w5{% zHmV0L7-O7vG;hAoCn09gqAaic$$C0pS;4r!qt@(PDW(R?H7wo8iIORHjvp~c9G~%V zR^rfl(aU1L)vE7*p}noxU!)^T3zGG0U{Z=R>K5*HlCRn;PA6S6k7SLGO=K74!x@zs zh6J%nI4BE_R`G>DCAVm!=~){Oi{SyhMz zN##y-^6sWGJC0h)E6e!6>|0R*(ra(&85qC2N&ABNpE{r0#&6Gm48hUs`HuqCPLikhKjE+Uf4&Jk zKL1nauXOtR-duN`{6lI)b{u}FuXw^ZbQuNx`Q7CF2|B5QQ_>GV+@`_}82#}_=<-(R z{d^4MU;CzaE57`8I)QVqqt|6VwtDmFaooGTxcv4|nOdM=z~>)B;U``Mc9ea%e#0a5 zPT~~pgU)NZqMZW7H+^{Qnn0AnzuY+Jrzp_hp|b}4`Q5)=QdB3LKRnX6(C|-h4_kZg z^@|8Ipmnbt`1`DNx@7#HzqY==!^7`e-{0h4Utm39-1PV&_mVLuoXdn7@1GBmcZ$$` zJdJ$AyffO(ac9%8d^fFA?%XoCjQqh@_GQrTmx~z24bLvtfscHi%zhy8m0&?|-w&RvKH|9=Yef!u?-G`1JlSNGp3=ekpgCxA%X?xA%WpbZcTHVuf@j zi@mkXAU#&w^)%7MIhC(_!7xNmVK}zysn>5ShhF-+^80TqhhF-+^80TqhhF-+^7~{# z-D|qKOh4IM!`+hTEa-W*i`^MYNsXi4_7G!VD2TOKzaYF)1#4k02v zCY#yXBsAb(+p|#bHPE?|7*v2KdQX<9g~SKdPApn}+Aax8K+@rURn5m)cd}b<`w-br zhaEOmk;ZaA?JvBdEgB3f_4dQXlF)Ys-d7KMK0iwH0ny)#(q7dOUhe__IpCSU|MNv_ zz;pHgd-~ahF^*;x_^yiB1|5_3B(w{53|7%6i zOMkBDasA&Dm_=x){X%e=!lL@K&2lxc^|+F{n|0Mo;+%+A%GNSb){c+(NWuwuigqEI zCzEW8jg#J3^g69c8SlC|Gw2T*1JasDZj9hDu?p>SsAxx{3KEn+k1af%=E9Ee^DN|z zD0j^2__S^3lzd>@DYdud-C<4{fj!3AyyOs9J$ge%j<*e+Su@t|RsX-jE4;!hyuvHI S!YlmWg#QJC^xND3cmM#HbtG8; diff --git a/util/iana_ports.inc b/util/iana_ports.inc index 19878a615..9bf65ef8f 100644 --- a/util/iana_ports.inc +++ b/util/iana_ports.inc @@ -4501,6 +4501,7 @@ 6626, 6627, 6628, +6629, 6633, 6634, 6635,