diff options
Diffstat (limited to 'lib/Config/HAProxy/Node/Section.pm')
-rw-r--r-- | lib/Config/HAProxy/Node/Section.pm | 153 |
1 files changed, 152 insertions, 1 deletions
diff --git a/lib/Config/HAProxy/Node/Section.pm b/lib/Config/HAProxy/Node/Section.pm index c332155..3ef1cf0 100644 --- a/lib/Config/HAProxy/Node/Section.pm +++ b/lib/Config/HAProxy/Node/Section.pm | |||
@@ -4,6 +4,18 @@ use warnings; | |||
4 | use parent 'Config::HAProxy::Node'; | 4 | use parent 'Config::HAProxy::Node'; |
5 | use Carp; | 5 | use Carp; |
6 | 6 | ||
7 | =head1 NAME | ||
8 | |||
9 | Config::HAProxy::Node::Section - HAProxy configuration section | ||
10 | |||
11 | =head1 DESCRIPTION | ||
12 | |||
13 | Objects of this class represent a C<section> in the HAProxy configuration file. | ||
14 | A section is a statement that can contain sub-statements. The following | ||
15 | statements form sections: B<global>, B<defaults>, B<frontend>, and B<backend>. | ||
16 | |||
17 | =cut | ||
18 | |||
7 | sub new { | 19 | sub new { |
8 | my $class = shift; | 20 | my $class = shift; |
9 | my $self = $class->SUPER::new(@_); | 21 | my $self = $class->SUPER::new(@_); |
@@ -11,8 +23,51 @@ sub new { | |||
11 | return $self; | 23 | return $self; |
12 | } | 24 | } |
13 | 25 | ||
26 | =head1 ATTRIBUTES | ||
27 | |||
28 | =head2 is_section | ||
29 | |||
30 | Always true. | ||
31 | |||
32 | =cut | ||
33 | |||
14 | sub is_section { 1 } | 34 | sub is_section { 1 } |
15 | 35 | ||
36 | =head1 METHODS | ||
37 | |||
38 | =head2 kw | ||
39 | |||
40 | Returns the configuration keyword. | ||
41 | |||
42 | =head2 argv | ||
43 | |||
44 | Returns the list of arguments to the configuration keyword. | ||
45 | |||
46 | =head2 arg | ||
47 | |||
48 | $s = $node->arg($n) | ||
49 | |||
50 | Returns the B<$n>th argument. | ||
51 | |||
52 | =head2 orig | ||
53 | |||
54 | Returns original line as it appeared in the configuration file. | ||
55 | |||
56 | =head2 locus | ||
57 | |||
58 | Returns the location of this statement in the configuration file (the | ||
59 | B<Text::Locus> object). | ||
60 | |||
61 | =head2 append_node | ||
62 | |||
63 | $section->append_node(@nodes); | ||
64 | |||
65 | Takes a list of objects of B<Config::HAProxy::Node> derived classes as | ||
66 | arguments. Adds these objects after the last node in the subtree in this | ||
67 | section. | ||
68 | |||
69 | =cut | ||
70 | |||
16 | sub append_node { | 71 | sub append_node { |
17 | my $self = shift; | 72 | my $self = shift; |
18 | my $n = @{$self->{_tree}}; | 73 | my $n = @{$self->{_tree}}; |
@@ -24,6 +79,15 @@ sub append_node { | |||
24 | } @_; | 79 | } @_; |
25 | } | 80 | } |
26 | 81 | ||
82 | =head2 append_node_nonempty | ||
83 | |||
84 | $section->append_node_nonempty(@nodes); | ||
85 | |||
86 | Same as B<append_node>, but adds new nodes after the last non-empty | ||
87 | node in the subtree. | ||
88 | |||
89 | =cut | ||
90 | |||
27 | sub append_node_nonempty { | 91 | sub append_node_nonempty { |
28 | my $self = shift; | 92 | my $self = shift; |
29 | my $n = $#{$self->{_tree}}; | 93 | my $n = $#{$self->{_tree}}; |
@@ -32,7 +96,15 @@ sub append_node_nonempty { | |||
32 | } | 96 | } |
33 | $self->insert_node($n+1, @_); | 97 | $self->insert_node($n+1, @_); |
34 | } | 98 | } |
35 | 99 | ||
100 | =head2 insert_node | ||
101 | |||
102 | $section->insert_node($idx, @nodes); | ||
103 | |||
104 | Inserts B<@nodes> after subnode in position B<$idx> (0-based). | ||
105 | |||
106 | =cut | ||
107 | |||
36 | sub insert_node { | 108 | sub insert_node { |
37 | my $self = shift; | 109 | my $self = shift; |
38 | my $n = shift; | 110 | my $n = shift; |
@@ -48,6 +120,14 @@ sub insert_node { | |||
48 | } | 120 | } |
49 | } | 121 | } |
50 | 122 | ||
123 | =head2 delete_node | ||
124 | |||
125 | $section->delete_node($i); | ||
126 | |||
127 | Deletes B<$i>th subnode from the B<$section>. | ||
128 | |||
129 | =cut | ||
130 | |||
51 | sub delete_node { | 131 | sub delete_node { |
52 | my ($self, $n) = @_; | 132 | my ($self, $n) = @_; |
53 | splice @{$self->{_tree}}, $n, 1; | 133 | splice @{$self->{_tree}}, $n, 1; |
@@ -57,6 +137,18 @@ sub delete_node { | |||
57 | $self->root->mark_dirty; | 137 | $self->root->mark_dirty; |
58 | } | 138 | } |
59 | 139 | ||
140 | =head2 tree | ||
141 | |||
142 | @nodes = $section->tree; | ||
143 | |||
144 | Returns subnodes as a list of B<Config::HAProxy::Node> derived objects. | ||
145 | |||
146 | $node = $section->tree($i); | ||
147 | |||
148 | Returns B<$i>th subnode from the B<$section>. | ||
149 | |||
150 | =cut | ||
151 | |||
60 | sub tree { | 152 | sub tree { |
61 | my ($self, $n) = @_; | 153 | my ($self, $n) = @_; |
62 | if ($n) { | 154 | if ($n) { |
@@ -66,6 +158,15 @@ sub tree { | |||
66 | return @{shift->{_tree}} | 158 | return @{shift->{_tree}} |
67 | }; | 159 | }; |
68 | 160 | ||
161 | =head2 ends_in_empty | ||
162 | |||
163 | $bool = $section->ends_in_empty | ||
164 | |||
165 | Returns true if the last node in the list of sub-nodes in B<$section> is | ||
166 | an empty node. | ||
167 | |||
168 | =cut | ||
169 | |||
69 | sub ends_in_empty { | 170 | sub ends_in_empty { |
70 | my $self = shift; | 171 | my $self = shift; |
71 | while ($self->is_section) { | 172 | while ($self->is_section) { |
@@ -110,6 +211,50 @@ my %match = ( | |||
110 | } | 211 | } |
111 | ); | 212 | ); |
112 | 213 | ||
214 | =head2 select | ||
215 | |||
216 | @nodes = $section->select(%cond); | ||
217 | |||
218 | Returns nodes from B<$section> that match conditions in B<%cond>. Valid | ||
219 | conditions are: | ||
220 | |||
221 | =over 4 | ||
222 | |||
223 | =item B<name =E<gt>> I<$s> | ||
224 | |||
225 | Node matches if its keyword (B<kw>) equals I<$s>. | ||
226 | |||
227 | =item B<arg =E<gt>> B<{ n =E<gt>> I<$n>, B<v> =E<gt> I<$s> B<}> | ||
228 | |||
229 | Node mathches if its I<$n>th argument equals I<$s>. | ||
230 | |||
231 | =item B<section =E<gt>> I<$bool> | ||
232 | |||
233 | Node matches if it is (or is not, if I<$bool> is false) a section. | ||
234 | |||
235 | =item B<statement =E<gt>> I<$bool> | ||
236 | |||
237 | Node matches if it is (not) a simple statement. | ||
238 | |||
239 | =item B<comment =E<gt>> I<$bool> | ||
240 | |||
241 | Node matches if it is (not) a comment. | ||
242 | |||
243 | =back | ||
244 | |||
245 | Multiple conditions are checked in the order of their appearance in the | ||
246 | argument list and are joined by the short-circuit logical C<and>. | ||
247 | |||
248 | For example, to return all B<frontend> statements: | ||
249 | |||
250 | @fe = $section->select(name => 'frontend'); | ||
251 | |||
252 | To return the frontend named C<in>: | ||
253 | |||
254 | ($fe) = $section->select( name => 'frontend', | ||
255 | arg => { n => 0, v => 'in' } ); | ||
256 | |||
257 | =cut | ||
113 | 258 | ||
114 | sub select { | 259 | sub select { |
115 | my $self = shift; | 260 | my $self = shift; |
@@ -138,6 +283,12 @@ sub _test_node { | |||
138 | return 1; | 283 | return 1; |
139 | } | 284 | } |
140 | 285 | ||
286 | =head1 SEE ALSO | ||
287 | |||
288 | B<Config::HAProxy::Node>, B<Config::HAProxy>, B<Text::Locus>. | ||
289 | |||
290 | =cut | ||
291 | |||
141 | 1; | 292 | 1; |
142 | 293 | ||
143 | 294 | ||