File Coverage

blib/lib/Unix/Conf/Bind8/Conf.pm
Criterion Covered Total %
statement 45 95 47.3
branch 0 20 0.0
condition 0 8 0.0
subroutine 15 19 78.9
pod n/a
total 60 142 42.2


line stmt bran cond sub pod time code
1             # Bind8 Conf class.
2             #
3             # Copyright Karthik Krishnamurthy
4              
5             =head1 NAME
6              
7             Unix::Conf::Bind8::Conf - Front end for a suite of classes for manipulating
8             a Bind8 style configuration file.
9              
10             =head1 SYNOPSIS
11              
12             my ($conf, $obj, $ret);
13              
14             $conf = Unix::Conf::Bind8->new_conf (
15             FILE => 'named.conf',
16             SECURE_OPEN => '/etc/named.conf',
17             ) or $conf->die ("couldn't create `named.conf'");
18              
19             #
20             # All directives have corrresponding new_*, get_*, delete_*
21             # methods
22             #
23              
24             $obj = $conf->new_zone (
25             NAME => 'extremix.net',
26             TYPE => 'master',
27             FILE => 'db.extremix.net',
28             ) or $obj->die ("couldn't create zone `extremix.net'");
29              
30             # For objects that have a name attribute, name is to
31             # be specified, otherwise no arguments are needed.
32             $obj = $conf->get_zone ('extremix.net')
33             or $obj->die ("couldn't get zone `extremix.net'");
34              
35             $obj = $conf->get_options ()
36             or $obj->die ("couldn't get options");
37              
38             # For objects that have a name attribute, name is to
39             # be specified, otherwise no arguments are needed.
40             $obj = $conf->delete_zone ('extremix.net')
41             or $obj->die ("couldn't delete zone `extremix.net'");
42              
43             $obj = $conf->delete_options ()
44             or $obj->die ("couldn't get options");
45              
46             # directives that have a name attribute, have iterator
47             # methods
48             printf ("Zones defined in %s:\n", $conf->fh ());
49             for my $zone ($conf->zones ()) {
50             printf ("%s\n", $zone->name ();
51             }
52              
53             printf ("Directives defined in %s:\n", $conf->fh ());
54             for my $dir ($conf->directives ()) {
55             print ("$dir\n");
56             }
57              
58             $db = $conf->get_db ('extremix.net')
59             or $db->die ("couldn't get db for `extremix.net'");
60              
61             =head1 DESCRIPTION
62              
63             This class has interfaces for the various class methods of the classes that
64             reside beneath Unix::Conf::Bind8::Conf. This class is an internal class and
65             should not be accessed directly. Methods in this class can be accessed
66             through a Unix::Conf::Bind8::Conf object which is returned by
67             Unix::Conf::Bind8->new_conf ().
68              
69             =head1 METHODS
70              
71             =cut
72              
73             package Unix::Conf::Bind8::Conf;
74              
75 10     10   52 use strict;
  10         15  
  10         355  
76 10     10   46 use warnings;
  10         18  
  10         285  
77              
78 10     10   49 use Unix::Conf;
  10         22  
  10         210  
79 10     10   6311 use Unix::Conf::Bind8::Conf::Comment;
  10         25  
  10         260  
80 10     10   6043 use Unix::Conf::Bind8::Conf::Lib;
  10         29  
  10         1380  
81 10     10   6705 use Unix::Conf::Bind8::Conf::Logging;
  10         33  
  10         305  
82 10     10   9016 use Unix::Conf::Bind8::Conf::Options;
  10         39  
  10         492  
83 10     10   115 use Unix::Conf::Bind8::Conf::Acl;
  10         18  
  10         210  
84 10     10   10314 use Unix::Conf::Bind8::Conf::Zone;
  10         34  
  10         414  
85 10     10   7665 use Unix::Conf::Bind8::Conf::Trustedkeys;
  10         26  
  10         320  
86 10     10   6432 use Unix::Conf::Bind8::Conf::Key;
  10         30  
  10         309  
87 10     10   12087 use Unix::Conf::Bind8::Conf::Controls;
  10         42  
  10         378  
88 10     10   6880 use Unix::Conf::Bind8::Conf::Server;
  10         29  
  10         330  
89 10     10   7697 use Unix::Conf::Bind8::Conf::Include;
  10         31  
  10         1227  
90 10     10   61 use Unix::Conf::Bind8::Conf::Lib;
  10         20  
  10         34472  
91              
92             #
93             # Unix::Conf::Bind8::Conf object
94             # The object is a reference to reference to an anonymous hash.
95             # The anonymous hash is referred to here as CONFDS for conf datastructure.
96             # => {
97             # ROOT => CONFDS of the first Conf object in the tree.
98             # FH
99             # HEAD
100             # TAIL
101             # LOGGING
102             # OPTION
103             # ACL
104             # ZONE
105             # INCLUDE
106             # ALL_LOGGING defined only in a ROOT node
107             # ALL_OPTION defined only in a ROOT node
108             # ALL_ACL defined only in a ROOT node
109             # ALL_ZONE defined only in a ROOT node
110             # ALL_INCLUDE defined only in a ROOT node
111             # ERRORS
112             # DIRTY
113             # }
114             #
115              
116             =over 4
117              
118             =item new ()
119              
120             Arguments
121             FILE => 'path of the configuration file',
122             SECURE_OPEN => 0/1, # default 1 (enabled)
123              
124             Class constructor.
125             Creates a new Unix::Conf::Bind8::Conf object. The constructor parses the
126             Bind8 file specified by FILE and contains subobjects representing various
127             directives like options, logging, zone, acl etc. Direct use of this
128             constructor is deprecated. Use Unix::Conf::Bind8->new_conf () instead.
129             Returns a Unix::Conf::Bind8::Conf object on success, or an Err object on
130             failure.
131              
132             =cut
133              
134             sub new
135             {
136 0     0     my $invocant = shift ();
137 0           my %args = @_;
138 0           my ($new, $conf_fh, $ret);
139              
140             # get and validate arguments
141 0   0       my $conf_path = $args{FILE} || return (Unix::Conf->_err ('new', "FILE not specified"));
142 0 0         my $secure_open = defined ($args{SECURE_OPEN}) ? $args{SECURE_OPEN} : 1;
143 0 0         $conf_fh = Unix::Conf->_open_conf (
144             NAME => $conf_path,
145             SECURE_OPEN => $secure_open,
146             ) or return ($conf_fh);
147              
148 0           my $head = { PREV => undef };
149 0           my $tail = { NEXT => undef };
150 0           $head->{NEXT} = $tail;
151 0           $tail->{PREV} = $head;
152              
153 0           $new = bless (
154             \{
155             DIRTY => 0,
156             ITR => 0,
157             DIRARR => [],
158             HEAD => $head,
159             TAIL => $tail,
160             ERRORS => [],
161             },
162             );
163 0           $$new->{FH} = $conf_fh;
164             # in case no ROOT was passed then we were not called from
165             # Unix::Conf::Bind8::Conf::Include->new (). So set ourself
166             # as ROOT.
167             # NOTE: we set the hashref to which the object (a scalar ref)
168             # points to as the value for ROOT, to solve the circular ref problem
169 0 0         $ret = $new->__root ($args{ROOT} ? $args{ROOT} : $$new) or return ($ret);
    0          
170 0 0         eval { $ret = $new->__parse_conf () } or do {
  0            
171 0 0 0       return ($@) if (ref ($@) && UNIVERSAL::isa ($@, 'Unix::Conf::Err'));
172             # if a run time perl error has been trapped, make it into an Err obj.
173             return (
174 0           Unix::Conf->_err ('new', "Parse of $conf_fh failed because\n$@")
175             );
176             };
177 0           return ($new);
178             }
179              
180             # Class destructor.
181             sub DESTROY
182             {
183 0     0     my $self = $_[0];
184 0           my $dirty = $self->dirty ();
185             #print sprintf ("destructor for conf object (%s:%x)\n", $self->fh (), $self);
186 0           my $file;
187              
188             # make sure we destroy DIRARR (used for iteration first)
189 0           undef ($$self->{DIRARR});
190              
191             # go through the array of directives and create a string representing
192             # the whole file.
193 0           my ($ptr, $tmp, $tws);
194 0           $ptr = $$self->{HEAD}{NEXT};
195 0           $$self->{HEAD}{NEXT} = undef;
196 0   0       while ($ptr && $ptr ne $$self->{TAIL}) {
197 0 0         if ($dirty) {
198 0           $file .= ${$ptr->_rstring ()};
  0            
199 0           $tws = $ptr->_tws ();
200 0 0         $file .= defined ($tws) ? $$tws : "\n";
201             }
202 0           $tmp = $ptr;
203 0           $ptr = $ptr->{NEXT};
204             # remove circular references
205 0           $tmp->{NEXT} = undef;
206 0           $tmp->{PREV} = undef;
207             }
208             # clear TAIL's prev pointer too.
209 0           $ptr->{PREV} = undef;
210              
211             # set the string as the contents of the ConfIO object.
212 0 0         $$self->{FH}->set_scalar (\$file) if ($file);
213             # ensure that we release our own Conf file first.
214 0           undef ($$self->{FH});
215             # then include directives
216 0           undef ($$self->{INCLUDE});
217 0           undef ($$self->{ALL_INCLUDE});
218             # then the rest
219 0           undef (%{$$self});
  0            
220 0           undef ($self);
221             }
222              
223             =item fh ()
224              
225             Object method.
226             Returns the ConfIO object representing the configuration file.
227              
228             =cut
229              
230             sub fh
231             {
232 0     0     my $self = $_[0];
233 0           return ($$self->{FH});
234             }
235              
236             sub dirty
237             {
238 0     0     my ($self, $dirty) = @_;
239              
240 0 0         if (defined ($dirty)) {
241 0           $$self->{DIRTY} = $dirty;
242 0           return (1);
243             }
244 0           return ($$self->{DIRTY});
245             }
246              
247             #
248             # The _add_dir* routines, insert an object into the per Conf hash and the
249             # ALL_* hash which resides in the ROOT Conf.
250              
251             for my $dir qw (zone acl key server include comment) {
252             no strict 'refs';
253              
254             my $_add = "_add_$dir";
255             my $_get = "_get_$dir";
256             my $_del = "_del_$dir";
257             my $new = "new_$dir";
258             my $get = "get_$dir";
259             my $delete = "delete_$dir";
260             my $itr = "${dir}s";
261              
262             *$_add = sub {
263             my $obj = $_[0];
264             my ($root, $parent, $name);
265             $parent = $obj->_parent () or return ($root);
266             $root = $parent->{ROOT};
267             $name = $obj->name () or return ($name);
268             return (Unix::Conf->_err ("$_add", "$dir `$name' already defined"))
269             if ($root->{"ALL_\U$dir\E"}{$name});
270             # store in per Conf hash as well as in the ROOT Conf object
271             $parent->{"\U$dir\E"}{$name} = $root->{"ALL_\U$dir\E"}{$name} = $obj;
272             return (1);
273             };
274              
275             # we get from the ROOT ALL_DIR* hash, so we can get a directive
276             # defined in any Conf file from any Conf object.
277             # maybe it is better to restrict _get_* to directives defined in
278             # that file only.
279             # added later. validation routines in Unix::Conf::Bind8::Conf::Lib
280             # get confds structures and need to validate names defined throughout.
281             # some more thought needed.
282             *$_get = sub {
283             my ($confds, $name) = @_;
284             return (Unix::Conf->_err ("$_get", "$dir `$name' not defined"))
285             unless ($confds->{ROOT}{"ALL_\U$dir\E"}{$name});
286             return ($confds->{ROOT}{"ALL_\U$dir\E"}{$name});
287             };
288              
289             *$_del = sub {
290             my $obj = $_[0];
291             my ($root, $parent, $name);
292             $parent = $obj->_parent () or return ($root);
293             $root = $parent->{ROOT};
294             $name = $obj->name () or return ($name);
295             return (Unix::Conf->_err ("$_del", "$dir `$name' not defined"))
296             unless ($root->{"ALL_\U$dir\E"}{$name});
297             delete ($root->{"ALL_\U$dir\E"}{$name});
298             delete ($parent->{"\U$dir\E"}{$name});
299             return (1);
300             };
301              
302             ##################################################################
303             # PUBLIC INTERFACE #
304             ##################################################################
305              
306             if ($dir eq 'include') {
307             *$new = sub {
308             my $self = shift ();
309              
310             return (Unix::Conf->_err ("$new", "not a class constructor"))
311             unless (ref ($self));
312             my $class = "Unix::Conf::Bind8::Conf::\u$dir";
313             return ($class->new (@_, PARENT => $$self, ROOT => $self->__root ()));
314             };
315             # no real need to create this here.
316             my $get_conf = "get_include_conf";
317             *$get_conf = sub {
318             my ($self, $name) = @_;
319              
320             return (Unix::Conf->_err ("$get_conf", "not a class method"))
321             unless (ref ($self));
322             return (Unix::Conf->_err ("$get_conf", "name not specified"))
323             unless (defined ($name));
324             my $ret;
325             $ret = _get_include ($$self, $name) or return ($ret);
326             return ($ret->conf ());
327             };
328             }
329             else {
330             *$new = sub {
331             my $self = shift ();
332              
333             return (Unix::Conf->_err ("$new", "not a class constructor"))
334             unless (ref ($self));
335             my $class = "Unix::Conf::Bind8::Conf::\u$dir";
336             return ($class->new (@_, PARENT => $$self));
337             };
338             }
339            
340             # no get_ and delete_, iterator methods for comment. at least for now
341             if ($dir ne 'comment') {
342             *$get = sub {
343             my ($self, $name) = @_;
344             return (Unix::Conf->_err ("$get", "not a class constructor"))
345             unless (ref ($self));
346             return (Unix::Conf->_err ("$get", "$dir name not passed"))
347             unless ($name);
348             return (&$_get($$self, $name));
349             };
350              
351             *$delete = sub {
352             my ($self, $name) = @_;
353             return (Unix::Conf->_err ("$delete", "not a class constructor"))
354             unless (ref ($_[0]));
355             return (Unix::Conf->_err ("$delete", "$dir name not passed"))
356             unless ($name);
357             my $obj;
358             $obj = &$_get($$self, $name) or return ($obj);
359             return ($obj->delete ());
360             };
361            
362             *$itr = sub {
363             my ($self, $context) = @_;
364              
365             return (Unix::Conf->_err ("$delete", "not a class constructor"))
366             unless (ref ($self));
367             if ($context && __valid_yesno ($context)) {
368             return (
369             wantarray () ? values (%{$$self->{ROOT}{"ALL_\U$dir\E"}}) :
370             (each (%{$$self->{ROOT}{"ALL_\U$dir\E"}}))[1]
371             );
372             }
373             return (
374             wantarray () ? values (%{$$self->{"\U$dir\E"}}) :
375             (each (%{$$self->{"\U$dir\E"}}))[1]
376             );
377             };
378             }
379             }
380              
381             # directives that do not have names, and hence
382             # defined once only.
383             for my $dir qw (options logging trustedkeys controls) {
384             no strict 'refs';
385              
386             my $_add = "_add_$dir";
387             my $_get = "_get_$dir";
388             my $_del = "_del_$dir";
389             my $new = "new_$dir";
390             my $get = "get_$dir";
391             my $delete = "delete_$dir";
392              
393             *$_add = sub {
394             my $obj = $_[0];
395             my ($root, $parent);
396             $parent = $obj->_parent () or return ($parent);
397             $root = $parent->{ROOT};
398             return (Unix::Conf->_err ("$_add", "`$dir' already defined"))
399             if ($root->{"ALL_\U$dir\E"});
400             $root->{"ALL_\U$dir\E"} = $parent->{"\U$dir\E"} = $obj;
401             return (1);
402             };
403              
404             # we get from the ROOT ALL_DIR* hash, so we can get a directive
405             # defined in any Conf file from any Conf object.
406             # maybe it is better to restrict _get_* to directives defined in
407             # that file only.
408             *$_get = sub {
409             my $confds = $_[0];
410             return (Unix::Conf->_err ("$_get", "`$dir' not defined"))
411             unless ($confds->{ROOT}{"ALL_\U$dir\E"});
412             return ($confds->{ROOT}{"ALL_\U$dir\E"});
413             };
414              
415             $_del = "_del_$dir";
416             *$_del = sub {
417             my $obj = $_[0];
418             my ($root, $parent);
419             $parent = $obj->_parent () or return ($root);
420             $root = $parent->{ROOT};
421             return (Unix::Conf->_err ("$_del", "`$dir' not defined"))
422             unless ($root->{"ALL_\U$dir\E"});
423             delete ($root->{"ALL_\U$dir\E"});
424             delete ($parent->{"\U$dir\E"});
425             return (1);
426             };
427              
428             ##################################################################
429             # PUBLIC INTERFACE #
430             ##################################################################
431              
432             *$new = sub {
433             my $self = shift ();
434              
435             return (Unix::Conf->_err ("$new", "not a class constructor"))
436             unless (ref ($self));
437             my $class = "Unix::Conf::Bind8::Conf::\u$dir";
438             return ($class->new (@_, PARENT => $$self));
439             };
440              
441             *$get = sub {
442             return (Unix::Conf->_err ("$get", "not a class constructor"))
443             unless (ref ($_[0]));
444             return (&$_get(${$_[0]}));
445             };
446              
447             *$delete = sub {
448             my $obj;
449              
450             return (Unix::Conf->_err ("$delete", "not a class constructor"))
451             unless (ref ($_[0]));
452             $obj = &$_get(${$_[0]}) or return ($obj);
453             return ($obj->delete ());
454             };
455             }
456              
457             # ARGUMENTS:
458             # Unix::Conf::Bind8::Conf::Directive subclass instalce
459             # WHERE => ('FIRST'|'LAST'|'BEFORE'|'AFTER')
460             # WARG => Unix::Conf::Bind8::Conf::Directive subclass instance
461             # # in case WHERE =~ /('BEFORE'|'AFTER')/
462             # This routine uses the PARENT ref in an object to insert itself in the
463             # doubly linked list in the parent Unix::Conf::Bind8::Conf object.
464             sub _insert_in_list ($$;$)
465             {
466             my ($obj, $where, $arg) = @_;
467              
468             return (Unix::Conf->_err ("__insert_in_list", "`$obj' not instance of a subclass of Unix::Conf::Bind8::Conf::Directive"))
469             unless (UNIVERSAL::isa ($obj, "Unix::Conf::Bind8::Conf::Directive"));
470             return (Unix::Conf->_err ("__insert_in_list", "`$where', illegal argument"))
471             if ($where !~ /^(FIRST|LAST|BEFORE|AFTER)$/i);
472             my $conf = $obj->_parent ();
473              
474             # now insert the directive in the doubly linked list
475             # insert at the head
476             (uc ($where) eq 'FIRST') && do {
477             $obj->{PREV} = $conf->{HEAD};
478             $obj->{NEXT} = $conf->{HEAD}{NEXT};
479             $conf->{HEAD}{NEXT}{PREV} = $obj;
480             $conf->{HEAD}{NEXT} = $obj;
481             goto END;
482             };
483             # insert at tail
484             (uc ($where) eq 'LAST') && do {
485             $obj->{NEXT} = $conf->{TAIL};
486             $obj->{PREV} = $conf->{TAIL}{PREV};
487             $conf->{TAIL}{PREV}{NEXT} = $obj;
488             $conf->{TAIL}{PREV} = $obj;
489             goto END;
490             };
491              
492             return (Unix::Conf->_err ("__insert_in_list", "$where not an child of Unix::Conf::Bind8::Conf::Directive"))
493             unless (UNIVERSAL::isa ($arg, "Unix::Conf::Bind8::Conf::Directive"));
494             # before $arg
495             (uc ($where) eq 'BEFORE') && do {
496             $obj->{NEXT} = $arg;
497             $obj->{PREV} = $arg->{PREV};
498             $arg->{PREV}{NEXT} = $obj;
499             $arg->{PREV} = $obj;
500             goto END;
501             };
502             # after $arg
503             (uc ($where) eq 'AFTER') && do {
504             $obj->{NEXT} = $arg->{NEXT};
505             $obj->{PREV} = $arg;
506             $arg->{NEXT}{PREV} = $obj;
507             $arg->{NEXT} = $obj;
508             };
509             END:
510             return (1);
511             }
512              
513             # ARGUMENTS
514             # Unix::Conf::Bind8::Conf::Directive subclass object
515             # Delete object from the doubly linked list.
516             sub _delete_from_list ($)
517             {
518             my $obj = $_[0];
519              
520             return (
521             Unix::Conf->_err (
522             "__delete_from_list",
523             "`$obj' not instance of a subclass of Unix::Conf::Bind8::Conf::Directive"
524             )
525             ) unless (UNIVERSAL::isa ($obj, "Unix::Conf::Bind8::Conf::Directive"));
526             $obj->{NEXT}{PREV} = $obj->{PREV};
527             $obj->{PREV}{NEXT} = $obj->{NEXT};
528             return (1);
529             }
530              
531             sub __root
532             {
533             my ($self, $root) = @_;
534              
535             if ($root) {
536             $$self->{ROOT} = $root;
537             return (1);
538             }
539             return (
540             defined ($$self->{ROOT}) ? $$self->{ROOT} :
541             Unix::Conf->_err ('__root', "ROOT not defined")
542             );
543             }
544              
545             =item parse_errors ()
546              
547             Object method.
548             Returns a list of Err objects, created during the parse of the conf file.
549             There represent warnings generated.
550              
551             =cut
552              
553             sub parse_errors
554             {
555             my $self = $_[0];
556             return (@{$$self->{ERRORS}});
557             }
558              
559              
560             # ARGUMENTS:
561             # Unix::Conf::Err obj
562             # called by the parser to push errors messages generated during parsing.
563             sub __add_err
564             {
565             my ($self, $errobj, $lineno) = @_;
566              
567             $errobj = Unix::Conf->_err ('add_err', "argument not passed")
568             unless (defined ($errobj));
569             push (@{$$self->{ERRORS}}, $errobj);
570             }
571              
572             =item directives ()
573              
574             Arguments
575             SCALAR # Optional
576              
577             Object method.
578             Returns defined directives (comments too, if argument is defined). When
579             called in a list context, returns all defined directives. Iterates over
580             defined directives, when called in a scalar method. Returns `undef' at
581             the end of one iteration, and starts over if called again.
582              
583             NOTE: This method returns objects which represent directives. Make sure
584             that the variable holding these objects is undef'ed or goes out of scope
585             before or at the same time as the one holding the invocant. For example
586             if you hold an Include object, while the parent Conf object has been released
587             and then the code tries to create a new Conf object for the same conf file,
588             it will return with an error, because the include file is still open and locked
589             as you hold the Include object.
590              
591             Also this method returns only those directives that are defined in the invocant
592             Conf object and not those in embedded objects.
593              
594             =cut
595              
596             sub directives
597             {
598             my ($self, $nocomment) = @_;
599            
600             # create list of directives only if iterator is at start
601             unless ($$self->{ITR}) {
602             undef (@{$$self->{DIRARR}});
603             for (my $ptr = $$self->{HEAD}{NEXT}; $ptr && $ptr ne $$self->{TAIL}; $ptr = $ptr->{NEXT}) {
604             next if ($nocomment && UNIVERSAL::isa ($ptr, "Unix::Conf::Bind8::Conf::Comment"));
605             push (@{$$self->{DIRARR}}, $ptr);
606             }
607             }
608              
609             if (wantarray ()) {
610             # reset iterator before returning
611             $$self->{ITR} = 0;
612             return (@{$$self->{DIRARR}})
613             }
614             # return undef on completion of one iteration
615             return () if ($$self->{ITR} && !($$self->{ITR} %= scalar (@{$$self->{DIRARR}})));
616             return (${$$self->{DIRARR}}[$$self->{ITR}++]);
617             }
618              
619              
620             =item new_comment ()
621              
622             Arguments
623             # WARG is to be provided only in case WHERE eq 'BEFORE
624             # or WHERE eq 'AFTER'
625              
626             Object method.
627             Creates a Unix::Conf::Bind8::Conf::Comment object, links it in the invocant
628             Conf object and returns it, on success, an Err object otherwise.
629             Such directives are used to hold comments between two directives.
630              
631             =cut
632              
633             =item new_options ()
634              
635             Arguments
636             SUPPORTED-OPTION-NAME-IN-CAPS => value
637             WHERE => 'FIRST'|'LAST'|'BEFORE'|'AFTER'
638             WARG => Unix::Conf::Bind8::Conf::Directive subclass object
639             # WARG is to be provided only in case WHERE eq 'BEFORE
640             # or WHERE eq 'AFTER'
641              
642             Object Method.
643             Refer to Unix::Conf::Bind8::Conf::Options for supported options. The
644             arguments should be same as expected by various the various methods of
645             Unix::Conf::Bind8::Conf::Options.
646             Creates a Unix::Conf::Bind8::Conf::Options object, links it in the invocant
647             Conf object and returns it, on success, an Err object on otherwise.
648              
649             =cut
650            
651             =item get_options ()
652              
653             Object method.
654             Returns the Unix::Conf::Bind8::Conf::Options object if defined (either
655             through a call to new_options or one created when the configuration file
656             is parsed) or Err if none is defined.
657              
658             =cut
659              
660             =item delete_options ()
661              
662             Object method
663             Deletes the defined (either through a call to new_options or one created
664             when the configuration file is parsed) Unix::Conf::Bind8::Conf::Options
665             object.
666             Returns true if a Unix::Conf::Bind8::Conf::Options object is present, an
667             Err object otherwise.
668              
669             =cut
670              
671             =item new_logging ()
672              
673             Arguments
674             CHANNELS => [
675             {
676             NAME => 'channel-name1',
677             OUTPUT => 'value', # syslog|file|null
678             SEVERITY => 'severity', # if OUTPUT eq 'syslog'
679             FILE => 'path', # if OUTPUT eq 'file'
680             'PRINT-TIME' => 'value', # 'yes|no'
681             'PRINT-SEVERITY' => 'value', # 'yes|no'
682             'PRINT-CATEGORY' => 'value', # 'yes|no'
683             },
684             ],
685             CATEGORIES => [
686             [ category1 => [ qw (channel1 channel2) ],
687             [ category2 => [ qw (channel1 channel2) ],
688             ],
689             WHERE => 'FIRST'|'LAST'|'BEFORE'|'AFTER'
690             WARG => Unix::Conf::Bind8::Conf::Directive subclass object
691             # WARG is to be provided only in case WHERE eq 'BEFORE
692             # or WHERE eq 'AFTER'
693              
694             Object method.
695             Creates a new Unix::Conf::Bind8::Conf::Logging object, links it to the invocant
696             Conf object and returns it, on success, an Err object otherwise.
697              
698             =cut
699              
700             =item get_logging ()
701              
702             Object method.
703             Returns the Unix::Conf::Bind8::Logging object if defined (either through a
704             call to new_logging () or one created when parsing the configuration file),
705             an Err object otherwise.
706              
707             =cut
708              
709             =item delete_logging ()
710              
711             Object method.
712             Deletes the Unix::Conf::Bind8::Logging object if defined (either through a
713             call to new_logging () or one created when parsing the configuration file)
714             and returns true, or returns an Err object otherwise.
715              
716             =cut
717              
718             =item new_trustedkeys ()
719              
720             Arguments
721             KEYS => [ domain flags protocol algorithm key ]
722             or
723             KEYS => [ [ domain flags protocol algorithm key ], [..] ]
724             WHERE => 'FIRST'|'LAST'|'BEFORE'|'AFTER'
725             WARG => Unix::Conf::Bind8::Conf::Directive subclass object
726             # WARG is to be provided only in case WHERE eq 'BEFORE
727             # or WHERE eq 'AFTER'
728              
729             Object method.
730             Creates a new Unix::Conf::Bind8::Conf::Trustedkeys object, links it in the
731             invocant Conf object and returns it if successful, an Err object otherwise.
732              
733             =cut
734              
735             =item get_trustedkeys ()
736              
737             Object method.
738             Returns the Unix::Conf::Bind8::Conf::Trustedkeys object if defined (either
739             through a call to new_trustedkeys or one created when the configuration file
740             is parsed) or Err if none is defined.
741              
742             =cut
743              
744             =item delete_trustedkeys ()
745              
746             Object method
747             Deletes the defined (either through a call to new_trustedkeys or one created
748             when the configuration file is parsed) Unix::Conf::Bind8::Conf::Trustedkeys
749             object.
750             Returns true if a Unix::Conf::Bind8::Conf::Trustedkeys object is present, an
751             Err object otherwise.
752              
753             =cut
754              
755             =item new_controls ()
756              
757             Arguments
758             UNIX => [ PATH, PERM, OWNER, GROUP ],
759             INET => [ ADDR, PORT, ALLOW ]
760             WHERE => 'FIRST'|'LAST'|'BEFORE'|'AFTER'
761             WARG => Unix::Conf::Bind8::Conf::Directive subclass object
762             # WARG is to be provided only in case WHERE eq 'BEFORE
763             # or WHERE eq 'AFTER'
764              
765             Object method.
766             ALLOW in INET can either be an Acl object or an anonymous array of elements.
767             Creates a new Unix::Conf::Bind8::Conf::Controls object, links it in the invocant
768             Conf object if successful, and returns it, an Err object otherwise.
769              
770             =cut
771              
772             =item get_controls ()
773              
774             Object method.
775             Returns the Unix::Conf::Bind8::Conf::Controls object if defined (either
776             through a call to new_trustedkeys or one created when the configuration file
777             is parsed) or Err if none is defined.
778              
779             =cut
780              
781             =item delete_controls ()
782              
783             Object method
784             Deletes the defined (either through a call to new_trustedkeys or one created
785             when the configuration file is parsed) Unix::Conf::Bind8::Conf::Controls
786             object.
787             Returns true if a Unix::Conf::Bind8::Conf::Controls object is present, an
788             Err object otherwise.
789              
790             =cut
791              
792             =item new_zone ()
793            
794             Arguments
795             NAME => 'zone-name',
796             CLASS => 'zone-class', # in|hs|hesiod|chaos
797             TYPE => 'zone-type', # master|slave|forward|stub|hint
798             FILE => 'records-file',
799             MASTERS => [ qw (10.0.0.1 10.0.0.2) ],
800             FORWARD => 'value', # yes|no
801             FORWARDERS => [ qw (192.168.1.1 192.168.1.2) ],
802             CHECK-NAMES => 'value' # fail|warn|ignore
803             ALLOW-UPDATE => Unix::Conf::Bind8::Conf::Acl object,
804             ALLOW-QUERY => Unix::Conf::Bind8::Conf::Acl object,
805             ALLOW-TRANSFER=> Unix::Conf::Bind8::Conf::Acl object,
806             NOTIFY => 'value, # yes|no
807             ALSO-NOTIFY => [ qw (10.0.0.3) ],
808             WHERE => 'FIRST'|'LAST'|'BEFORE'|'AFTER'
809             WARG => Unix::Conf::Bind8::Conf::Directive subclass object
810             # WARG is to be provided only in case WHERE eq 'BEFORE
811             # or WHERE eq 'AFTER'
812              
813             Object method.
814             Creates and returns a new Unix::Conf::Bind8::Conf::Zone object, links it
815             in the invocant Conf object, and returns it, on success, an Err
816             object otherwise.
817              
818             =cut
819              
820             =item get_zone ()
821              
822             Arguments
823             'ZONE-NAME',
824              
825             Object method.
826             Returns the Unix::Conf::Bind8::Conf::Zone object representing ZONE-NAME
827             if defined (either through a call to new_zone () or one created when
828             parsing the configuration file), an Err object otherwise.
829              
830             =cut
831              
832             =item delete_zone ()
833              
834             Arguments
835             'ZONE-NAME',
836              
837             Object method.
838             Deletes the Unix::Conf::Bind8::Conf::Zone object representing ZONE-NAME
839             if defined (either through a call to new_zone () or one created when
840             parsing the configuration file) and returns true, or returns an Err
841             object otherwise.
842              
843             =cut
844              
845             =item zones ()
846              
847             Arguments
848             ALL # Optional
849              
850             Object method.
851             Iterates through a list of defined Unix::Conf::Bind8::Conf::Zone objects
852             (either through a call to new_zone () or ones created when parsing the
853             configuration file), returning one at a time when called in scalar context,
854             or a list of all objects when called in list context.
855             Argument ALL can either be 0, no, 1, or yes. When ALL is 1 or 'yes', it
856             returns all defined Zone objects across files. Else only those defined
857             in the invocant are returned.
858              
859             =cut
860              
861             =item new_acl ()
862              
863             Arguments
864             NAME => 'acl-name', # Optional
865             ELEMENTS => [ qw (10.0.0.1 10.0.0.2 192.168.1.0/24) ],
866             WHERE => 'FIRST'|'LAST'|'BEFORE'|'AFTER'
867             WARG => Unix::Conf::Bind8::Conf::Directive subclass object
868             # WARG is to be provided only in case WHERE eq 'BEFORE
869             # or WHERE eq 'AFTER'
870              
871             Object method.
872             Creates a new Unix::Conf::Bind8::Conf::Acl object, links it in the invocant
873             Conf object, on success, an Err object otherwise.
874              
875             =cut
876              
877             =item get_acl ()
878              
879             Arguments
880             'ACL-NAME',
881              
882             Object method.
883             Returns the Unix::Conf::Bind8::Conf::Acl object representing 'ACL-NAME' if
884             defined (either through a call to new_acl or one created when the
885             configuration file is parsed), an Err object otherwise.
886              
887             =cut
888              
889             =item delete_acl ()
890              
891             Arguments
892             'ACL-NAME',
893              
894             Object method.
895             Deletes the Unix::Conf::Bind8::Conf::Acl object representing 'ACL-NAME'
896             if defined (either through a call to new_acl or one created when the
897             configuration file is parsed) and returns true, or returns an Err object
898             otherwise.
899              
900             =cut
901              
902             =item acls ()
903              
904             Arguments
905             ALL # Optional
906              
907             Object method.
908             Iterates through the list of defined Unix::Conf::Bind8::Conf::Acl objects
909             (either through a call to new_acl or ones created when parsing the file,
910             returning an object at a time when called in scalar context, or a list of
911             all objects when called in list context.
912             Argument ALL can either be 0, no, 1, or yes. When ALL is 1 or 'yes', it
913             returns all defined Acl objects across files. Else only those defined
914             in the invocant are returned.
915              
916             =cut
917              
918             =item new_key
919            
920             Arguments
921             NAME => scalar,
922             ALGORITHM => scalar, # number
923             SECRET => scalar, # quoted string
924             WHERE => 'FIRST'|'LAST'|'BEFORE'|'AFTER'
925             WARG => Unix::Conf::Bind8::Conf::Directive subclass object
926             # WARG is to be provided only in case WHERE eq 'BEFORE
927             # or WHERE eq 'AFTER'
928              
929             Object method.
930             Creates a new Unix::Conf::Bind8::Conf::Key object links it in
931             the invocant Conf object and returns it, on success, an Err object
932             on failure.
933              
934             =cut
935              
936             =item get_key ()
937              
938             Arguments
939             'KEY-NAME',
940              
941             Object method.
942             Returns the Unix::Conf::Bind8::Conf::Key object representing 'KEY-NAME' if
943             defined (either through a call to new_key or one created when the
944             configuration file is parsed), an Err object otherwise.
945              
946             =cut
947              
948             =item delete_key ()
949              
950             Arguments
951             'KEY-NAME',
952              
953             Object method.
954             Deletes the Unix::Conf::Bind8::Conf::Key object representing 'KEY-NAME'
955             if defined (either through a call to new_key or one created when the
956             configuration file is parsed) and returns true, or returns an Err object
957             otherwise.
958              
959             =cut
960              
961             =item keys ()
962              
963             Arguments
964             ALL # Optional
965              
966             Object method.
967             Iterates through the list of defined Unix::Conf::Bind8::Conf::Key objects
968             (either through a call to new_key or ones created when parsing the file,
969             returning an object at a time when called in scalar context, or a list of
970             all objects when called in list context.
971             Argument ALL can either be 0, no, 1, or yes. When ALL is 1 or 'yes', it
972             returns all defined Key objects across files. Else only those defined
973             in the invocant are returned.
974              
975             =cut
976              
977              
978             =item new_server ()
979              
980             Arguments
981             NAME => scalar,
982             BOGUS => scalar, # Optional
983             TRANSFERS => scalar, # Optional
984             TRANSFER-FORMAT=> scalar, # Optional
985             KEYS => [elements ], # Optional
986             WHERE => 'FIRST'|'LAST'|'BEFORE'|'AFTER'
987             WARG => Unix::Conf::Bind8::Conf::Directive subclass object
988             # WARG is to be provided only in case WHERE eq 'BEFORE
989             # or WHERE eq 'AFTER'
990            
991             Object method.
992             Creates a new Unix::Conf::Bind8::Conf::Server object, links it in the invocant
993             Conf object and returns it, on success, an Err object otherwise.
994              
995             =cut
996              
997             =item get_server ()
998              
999             Arguments
1000             'SERVER-NAME',
1001              
1002             Object method.
1003             Returns the Unix::Conf::Bind8::Conf::Server object representing 'SERVER-NAME' if
1004             defined (either through a call to new_server or one created when the
1005             configuration file is parsed), an Err object otherwise.
1006              
1007             =cut
1008              
1009             =item delete_server ()
1010              
1011             Arguments
1012             'SERVER-NAME',
1013              
1014             Object method.
1015             Deletes the Unix::Conf::Bind8::Conf::Server object representing 'SERVER-NAME'
1016             if defined (either through a call to new_server or one created when the
1017             configuration file is parsed) and returns true, or returns an Err object
1018             otherwise.
1019              
1020             =cut
1021              
1022             =item servers ()
1023              
1024             Arguments
1025             ALL # Optional
1026              
1027             Object method.
1028             Iterates through the list of defined Unix::Conf::Bind8::Conf::Server objects
1029             (either through a call to new_servers or ones created when parsing the file,
1030             returning an object at a time when called in scalar context, or a list of
1031             all objects when called in list context.
1032             Argument ALL can either be 0, no, 1, or yes. When ALL is 1 or 'yes', it
1033             returns all defined Key objects across files. Else only those defined
1034             in the invocant are returned.
1035              
1036             =cut
1037              
1038             =item new_include ()
1039              
1040             Arguments
1041             FILE => 'path of the configuration file',
1042             SECURE_OPEN => 0/1, # default 1 (enabled)
1043             WHERE => 'FIRST'|'LAST'|'BEFORE'|'AFTER'
1044             WARG => Unix::Conf::Bind8::Conf::Directive subclass object
1045             # WARG is to be provided only in case WHERE eq 'BEFORE
1046             # or WHERE eq 'AFTER'
1047              
1048             Object method.
1049             Creates a new Unix::Conf::Bind8::Conf::Include object which contains an
1050             Unix::Conf::Bind8::Conf object representing FILE, links it in the invocant
1051             Conf object and returns it, on success, an Err object otherwise.
1052              
1053             =cut
1054              
1055             =item get_include ()
1056              
1057             Arguments
1058             'INCLUDE-NAME',
1059              
1060             Object method.
1061             Returns the Unix::Conf::Bind8::Conf::Include object representing INCLUDE-NAME
1062             if defined (either through a call to new_include () or one created when
1063             parsing the configuration file), an Err object otherwise.
1064              
1065             =cut
1066              
1067             =item get_include_conf ()
1068              
1069             Arguments
1070             'INCLUDE-NAME'
1071              
1072             Object method.
1073             Return the Unix::Conf::Bind8::Conf object inside a defined
1074             Unix::Conf::Bind8::Conf::Include of name INCLUDE-NAME.
1075              
1076             =cut
1077              
1078             =item delete_include ()
1079              
1080             Arguments
1081             'INCLUDE-NAME',
1082              
1083             Object method.
1084             Deletes the Unix::Conf::Bind8::Conf::Include object representing INCLUDE-NAME
1085             if defined (either through a call to new_include () or one created when
1086             parsing the configuration file) and returns true, or returns an Err
1087             object otherwise.
1088              
1089             =cut
1090              
1091             =item includes ()
1092              
1093             Arguments
1094             ALL # Optional
1095              
1096             Object method.
1097             Iterates through defined Unix::Conf::Bind8::Conf::Include objects (either
1098             through a call to new_include () or ones created when parsing the
1099             configuration file), returning one at a time when called in scalar context,
1100             or a list of all defined includes when called in list context.
1101             Argument ALL can either be 0, no, 1, or yes. When ALL is 1 or 'yes', it
1102             returns all defined Include objects across files. Else only those defined
1103             in the invocant are returned.
1104              
1105             =cut
1106              
1107             =item get_db ()
1108              
1109             Arguments
1110             'ZONE-NAME',
1111             0/1, # SECURE_OPEN (OPTIONAL). If not specified the value
1112             # for the ConfIO object is taken.
1113              
1114             Object method
1115             Returns a Unix::Conf::Bind8::DB object representing the records file for
1116             zone 'ZONE-NAME' if successful, an Err object otherwise.
1117              
1118             =cut
1119              
1120             sub get_db
1121             {
1122             my ($self, $zone, $secure_open) = @_;
1123             my $ret;
1124              
1125             return (Unix::Conf->_err ('get_db', "not a class method"))
1126             unless (ref ($self));
1127             $secure_open = $self->fh ()->secure_open ()
1128             unless (defined ($secure_open));
1129             $ret = $self->get_zone ($zone) or return ($ret);
1130             return ($ret->get_db ($secure_open));
1131             }
1132              
1133             ################################# PARSER #####################################
1134             # #
1135             require 'Unix/Conf/Bind8/Conf/Parser.pm';
1136             # END #
1137             ################################# PARSER #####################################
1138              
1139             1;
1140             __END__