diff options
-rwxr-xr-x | lib/Vyatta/Config.pm | 26 | ||||
-rwxr-xr-x | lib/Vyatta/ConfigLoad.pm | 9 | ||||
-rwxr-xr-x | lib/Vyatta/ConfigOutput.pm | 8 | ||||
-rwxr-xr-x | scripts/vyatta-cfg-cmd-wrapper | 8 | ||||
-rwxr-xr-x | scripts/vyatta-config-loader.pl | 11 | ||||
-rw-r--r-- | src/commit2.c | 22 |
6 files changed, 63 insertions, 21 deletions
diff --git a/lib/Vyatta/Config.pm b/lib/Vyatta/Config.pm index 8de3aba..82d835f 100755 --- a/lib/Vyatta/Config.pm +++ b/lib/Vyatta/Config.pm @@ -532,6 +532,7 @@ sub getDeactivated { my ($self, $node) = @_; if (!defined $node) { + $node = $self->{_level}; } # let's setup the filepath for the change_dir @@ -634,7 +635,7 @@ sub isAdded { # node name is the hash key. node status is the hash value. # node status can be one of deleted, added, changed, or static sub listNodeStatus { - my ($self, $path) = @_; + my ($self, $path, $disable) = @_; my @nodes = (); my %nodehash = (); @@ -647,15 +648,20 @@ sub listNodeStatus { @nodes = (); @nodes = $self->listNodes($path); foreach my $node (@nodes) { - if ($node =~ /.+/) { - my $nodepath = $node; - $nodepath = "$path $node" if ($path); - #print "DEBUG Vyatta::Config->listNodeStatus(): node $node\n"; - # No deleted nodes -- added, changed, ot static only. - if ($self->isAdded($nodepath)) { $nodehash{$node} = "added"; } - elsif ($self->isChanged($nodepath)) { $nodehash{$node} = "changed"; } - else { $nodehash{$node} = "static"; } - } + if ($node =~ /.+/) { + my $status = undef; + if (!defined $disable) { + ($status,undef) = $self->getDeactivated($self->{_level}." ".$node); + } + my $nodepath = $node; + $nodepath = "$path $node" if ($path); + #print "DEBUG Vyatta::Config->listNodeStatus(): node $node\n"; + # No deleted nodes -- added, changed, ot static only. + if (defined $status && $status eq 'local') { $nodehash{$node} = "deleted"; } + elsif ($self->isAdded($nodepath)) { $nodehash{$node} = "added"; } + elsif ($self->isChanged($nodepath)) { $nodehash{$node} = "changed"; } + else { $nodehash{$node} = "static"; } + } } return %nodehash; diff --git a/lib/Vyatta/ConfigLoad.pm b/lib/Vyatta/ConfigLoad.pm index 54befc6..28e932e 100755 --- a/lib/Vyatta/ConfigLoad.pm +++ b/lib/Vyatta/ConfigLoad.pm @@ -87,13 +87,16 @@ sub enumerate_branch { push @cur_path, $val; } if (defined $cur_node->{'disable'}) { - push @all_naked_nodes, [ '!', @cur_path ]; + push @all_naked_nodes, [ '!', @cur_path ]; + my @qpath = applySingleQuote(@cur_path); + unshift(@qpath,'!'); + push @all_nodes, [\@qpath, 0]; } else { push @all_naked_nodes, [ @cur_path ]; + my @qpath = applySingleQuote(@cur_path); + push @all_nodes, [\@qpath, 0]; } - my @qpath = applySingleQuote(@cur_path); - push @all_nodes, [\@qpath, 0]; } } diff --git a/lib/Vyatta/ConfigOutput.pm b/lib/Vyatta/ConfigOutput.pm index fd377d7..caa9356 100755 --- a/lib/Vyatta/ConfigOutput.pm +++ b/lib/Vyatta/ConfigOutput.pm @@ -138,7 +138,7 @@ sub displayValues { } } - my %cnodes = $config->listNodeStatus(); + my %cnodes = $config->listNodeStatus(undef,'true'); my @cnames = sort keys %cnodes; if (defined($simple_show)) { @@ -298,7 +298,7 @@ sub displayChildren { } $config->setLevel(join ' ', (@cur_path, $child)); - my %cnodes = $config->listNodeStatus(); + my %cnodes = $config->listNodeStatus(undef,'true'); my @cnames = sort keys %cnodes; #if node.val exists and ct == 0 w/o def or ct ==1 w/ def @@ -345,7 +345,7 @@ sub displayChildren { $dis, "$prefix "); } else { $config->setLevel(join ' ', (@cur_path, $child, $cname)); - my %ccnodes = $config->listNodeStatus(); + my %ccnodes = $config->listNodeStatus(undef,'true'); displayChildren(\%ccnodes, [ @cur_path, $child, $cname ], $dis, "$prefix "); } @@ -387,7 +387,7 @@ sub displayChildren { sub outputNewConfig { $config = new Vyatta::Config; $config->setLevel(join ' ', @_); - my %rnodes = $config->listNodeStatus(); + my %rnodes = $config->listNodeStatus(undef,'true'); if (scalar(keys %rnodes) > 0) { my @rn = keys %rnodes; diff --git a/scripts/vyatta-cfg-cmd-wrapper b/scripts/vyatta-cfg-cmd-wrapper index 93acd4f..3b2f040 100755 --- a/scripts/vyatta-cfg-cmd-wrapper +++ b/scripts/vyatta-cfg-cmd-wrapper @@ -212,6 +212,14 @@ case "$1" in /opt/vyatta/sbin/my_delete "${@:2}" RET_STATUS=$? ;; + deactivate) + /opt/vyatta/sbin/vyatta-activate-config.pl deactivate "${@:2}" + RET_STATUS=$? + ;; + activate) + /opt/vyatta/sbin/vyatta-activate-config.pl activate "${@:2}" + RET_STATUS=$? + ;; commit) # debug file /tmp/bar should be deleted before release /opt/vyatta/sbin/my_commit -a >> /tmp/bar diff --git a/scripts/vyatta-config-loader.pl b/scripts/vyatta-config-loader.pl index 61eafa5..7a3df2b 100755 --- a/scripts/vyatta-config-loader.pl +++ b/scripts/vyatta-config-loader.pl @@ -70,7 +70,16 @@ my $ret = 0; my $rank; #not used foreach (@all_nodes) { my ($path_ref, $rank) = @$_; - my $cmd = "$CWRAPPER set " . (join ' ', @$path_ref); + + my @pr = @$path_ref; + if (@pr[0] eq '!') { + @pr = @pr[1..$#pr]; + my $deactivate_cmd = "$CWRAPPER deactivate " . (join ' ', @pr) . " 1>/dev/null"; + system("$deactivate_cmd"); + #ignore these errors due to nesting warnings. + } + + my $cmd = "$CWRAPPER set " . (join ' ', @pr); # this debug file should be deleted before release system("echo [$cmd] >> /tmp/foo"); $ret = system("$cmd"); diff --git a/src/commit2.c b/src/commit2.c index af01598..97c3b26 100644 --- a/src/commit2.c +++ b/src/commit2.c @@ -704,11 +704,27 @@ sort_func(GNode *node, gpointer data, boolean priority_mode) } } + //FIRST LET'S COMPUTE THE DEACTIVATE->ACTIVATE OVERRIDE + struct Data *d = &((struct VyattaNode*)gp)->_data; + NODE_OPERATION op = d->_operation; + if (d->_disable_op != K_NO_DISABLE_OP) { + if (!(d->_disable_op & K_LOCAL_DISABLE_OP) && (d->_disable_op & K_ACTIVE_DISABLE_OP)) { + //node will be activated on commit + //LET'S SPOOF the operation... convert it to CREATE + op = K_CREATE_OP; + } + else if ((d->_disable_op & K_LOCAL_DISABLE_OP) && !(d->_disable_op & K_ACTIVE_DISABLE_OP)) { + //node will be deactivated on commit + //LET'S SPOOF the operation... convert it to DELETE + op = K_DEL_OP; + } + } + //change action state of node according to enclosing behavior if ((G_NODE_IS_ROOT(node) == FALSE) && (((struct VyattaNode*)gp)->_data._disable_op != K_NO_DISABLE_OP) || //added to support enclosing behavior of activated/deactivated nodes - ((IS_SET_OR_CREATE(((struct VyattaNode*)gp)->_data._operation)) || - (IS_DELETE(((struct VyattaNode*)gp)->_data._operation))) && + ((IS_SET_OR_CREATE(op)) || + (IS_DELETE(op))) && (IS_NOOP(((struct VyattaNode*)(node->parent->data))->_data._operation))) { //first check if there is enclosing behavior @@ -734,7 +750,7 @@ sort_func(GNode *node, gpointer data, boolean priority_mode) vtw_def def = ((struct VyattaNode*)(n->data))->_config._def; ((struct VyattaNode*)(n->data))->_data._operation = ((struct VyattaNode*)gp)->_data._operation; //DON'T set active when only in disable state... - if (((struct VyattaNode*)gp)->_data._disable_op == K_NO_DISABLE_OP) { + if (((struct VyattaNode*)(n->data))->_data._disable_op == K_NO_DISABLE_OP) { ((struct VyattaNode*)(n->data))->_data._operation |= K_ACTIVE_OP; } if (def.actions[end_act].vtw_list_head || def.actions[begin_act].vtw_list_head) { |