diff options
author | John Estabrook <jestabro@vyos.io> | 2020-12-30 11:09:40 -0600 |
---|---|---|
committer | Daniil Baturin <daniil@vyos.io> | 2021-01-04 19:42:47 +0200 |
commit | 25a25e45e40d4c8452ccdda8d36f969a0f601d1e (patch) | |
tree | fd2c176eda3ceb4580c0b15ef3e8577b1ee4ee1e /lib | |
parent | 2bf719041fd6646cc1f107f2a8bb641240112b27 (diff) | |
download | vyatta-cfg-25a25e45e40d4c8452ccdda8d36f969a0f601d1e.tar.gz vyatta-cfg-25a25e45e40d4c8452ccdda8d36f969a0f601d1e.zip |
migration: T3161: remove ConfigLoad.pm, all dependents and references
Remove ConfigLoad.pm due to its legacy reference to XorpConfigParser,
all dependent scripts:
vyatta-boot-config-loader
vyatta-config-loader.pl
vyatta-load-config.pl
(rewritten or obviated), and references in logrotate, Makefile.am, and
vyos-router (vyatta-boot-config-loader was kept as a fallback when
initially introducing vyos-boot-config-loader.py).
Diffstat (limited to 'lib')
-rwxr-xr-x | lib/Vyatta/ConfigLoad.pm | 422 |
1 files changed, 0 insertions, 422 deletions
diff --git a/lib/Vyatta/ConfigLoad.pm b/lib/Vyatta/ConfigLoad.pm deleted file mode 100755 index 960240c..0000000 --- a/lib/Vyatta/ConfigLoad.pm +++ /dev/null @@ -1,422 +0,0 @@ -# Author: Vyatta <eng@vyatta.com> -# Date: 2007 -# Description: Perl module for loading configuration. - -# **** License **** -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License version 2 as -# published by the Free Software Foundation. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# This code was originally developed by Vyatta, Inc. -# Portions created by Vyatta are Copyright (C) 2006, 2007, 2008 Vyatta, Inc. -# All Rights Reserved. - -package Vyatta::ConfigLoad; -use strict; - -our @EXPORT = qw(getStartupConfigStatements loadConfigHierarchy getConfigDiff); -use base qw(Exporter); - -use sort 'stable'; -use lib "/opt/vyatta/share/perl5"; -use XorpConfigParser; -use Vyatta::Config; - -my @all_nodes = (); -my @all_naked_nodes = (); - -my @disable_list = (); - - -sub match_regex { - my ($pattern, $str) = @_; - $pattern =~ s/^(.*)$/\^$1\$/; - return ($str =~ m/$pattern/) ? 1 : 0; -} - - -sub applySingleQuote { - my @return = (); - foreach (@_) { - # change all single quotes to "'\''" since we're going to single-quote - # every component of the command - if (/^'(.*)'$/) { - $_ = $1; - } - $_ =~ s/'/'\\''/g; - # single-quote every component of the command - if (/^'.*'$/) { - push @return, $_; - } elsif (/^"(.*)"$/) { - push @return, "'$1'"; - } else { - push @return, "'$_'"; - } - } - return @return; -} - -my @comment_list = (); - -sub enumerate_branch { - my $cur_node = shift; - my @cur_path = @_; - # name not defined at root level - if (defined($cur_node->{'name'})) { - my $name = $cur_node->{'name'}; - if ($name =~ /^\s*(\S+)\s+(\S.*)$/) { - push @cur_path, ($1, $2); - } else { - push @cur_path, $name; - } - } - my $terminal = 0; - if (!defined($cur_node->{'children'})) { - $terminal = 1; - } else { - my $comment; - foreach (@{$cur_node->{'children'}}) { - if (defined($_->{'comment'})) { - $comment = $_->{'comment'}; - } - - if (defined($_->{'name'})) { - if (defined $comment) { - push @comment_list, join(" ", (@cur_path, $_->{'name'}, "\"" . $comment . "\"")); - $comment = undef; - } - else { - #need to check for existance of .comment file here. - push @comment_list, join(" ", (@cur_path, $_->{'name'}, "\"\"")); - } - enumerate_branch($_, @cur_path); - $terminal = 0; - } - - } - } - - if (defined($cur_node->{'disable'})) { - push @disable_list, join(" ",@cur_path); - } - - if ($terminal) { - my $val = $cur_node->{'value'}; - if (defined($val)) { - push @cur_path, $val; - } - push @all_naked_nodes, [ @cur_path ]; - my @qpath = applySingleQuote(@cur_path); - push @all_nodes, [\@qpath, 0]; - } -} - -# $0: config file to load -# return: list of all config statement -sub getStartupConfigStatements { - # clean up the lists first - @all_nodes = (); - @all_naked_nodes = (); - - my $load_cfg = shift; - if (!defined($load_cfg)) { - return (); - } - - my $comments = shift; - - my $xcp = new XorpConfigParser(); - $xcp->parse($load_cfg); - my $root = $xcp->get_node( () ); - if (!defined($root)) { - return (); - } - enumerate_branch($root, ( )); - - if (defined $comments && $comments eq 'true') { - #add comment commands to all nodes - foreach my $c (@comment_list) { - if ($c !~ /\"\"$/) { - my @pth = split(" ",'comment ' . $c); - push @all_nodes, [\@pth, 1]; - } - } - } - my %conf = ( - 'set' => \@all_nodes, - 'deactivate' => \@disable_list, - ); - return %conf; -} - -my %node_order = (); - -# $0: ref of list of parsed naked statements. -# return: hash containing the config hierarchy. -sub generateHierarchy { - my @node_list = @{$_[0]}; - my %hash = (); - %node_order = (); - my $order = 0; - foreach my $node (@node_list) { - my @path = @{$node}; - my $path_str = join ' ', @path; - $node_order{$path_str} = $order; - $order++; - my $cur_ref = \%hash; - foreach (@path) { - if (!defined($cur_ref->{$_})) { - $cur_ref->{$_} = { }; - } - $cur_ref = $cur_ref->{$_}; - } - } - return %hash; -} - -# $0: config file to load. -# return: hash containing the config hierarchy. -sub loadConfigHierarchy { - # clean up the lists first - @all_nodes = (); - @all_naked_nodes = (); - - my $load_cfg = shift; - if (!defined($load_cfg)) { - return (); - } - - #allows loading from arbritary root - my $root_node = shift; - - my $xcp = new XorpConfigParser(); - $xcp->parse($load_cfg); - my $root; - my @root_path; - if (defined($root_node)) { - my $tmp = [split("/",$root_node)]; - $root = $xcp->get_node($tmp); - my @tmp2 = split("/",$root_node); - @root_path = pop(@tmp2); - @root_path = @tmp2; - } - else { - $root = $xcp->get_node( () ); - } - if (!defined($root)) { - return (); - } - enumerate_branch($root, @root_path); - - return generateHierarchy(\@all_naked_nodes); -} - -# $0: ref of hierarchy root. -# $1: display prefix. -sub printHierarchy { - my $cur_ref = shift; - my $prefix = shift; - foreach (sort keys %{$cur_ref}) { - print "$prefix$_"; - if (scalar(keys %{$cur_ref->{$_}}) == 0) { - print " (terminal)\n"; - next; - } else { - print "\n"; - } - printHierarchy($cur_ref->{$_}, "$prefix "); - } -} - -# $0: hash ref representing a "multi:" node. -# $1: array ref representing current config path. -# returns the list of node values sorted by the original order. -sub getSortedMultiValues { - my $nref = $_[0]; - my @npath = @{$_[1]}; - my $path_str = join ' ', @npath; - my @list = (); - foreach (keys %{$nref}) { - my $key = "$path_str $_"; - push @list, [ $_, $node_order{$key} ]; - } - my @slist = sort { ${$a}[1] <=> ${$b}[1] } @list; - @slist = map { ${$_}[0] } @slist; - return @slist; -} - -my $active_cfg = undef; -my $new_cfg_ref = undef; -my @delete_list = (); - -# find specified node's values in active config that have been deleted from -# new config. -# $0: hash ref at the current hierarchy level (new config) -# $1: array ref representing current config path (active config) -sub findDeletedValues { - my $new_ref = $_[0]; - my @active_path = @{$_[1]}; - - $active_cfg->setLevel(join ' ', @active_path); - my ($is_multi, $is_text) = $active_cfg->parseTmpl(); - if ($is_multi) { - # for "multi:" nodes, need to sort the values by the original order. - my @nvals = getSortedMultiValues($new_ref, \@active_path); - if ($is_text) { - @nvals = map { /^"(.*)"$/ ? $1 : $_ }@nvals; - } - my @ovals = $active_cfg->returnOrigValues(''); - my %comp_hash = $active_cfg->compareValueLists(\@ovals, \@nvals); - foreach (@{$comp_hash{'deleted'}}) { - my @plist = applySingleQuote(@active_path, $_); - push @delete_list, [\@plist, 0]; - } - } else { - # do nothing. if a single-value leaf node is deleted, it should have - # been detected at the previous level. since we are already at node.val, - # it can only be "added" or "changed", handled later. - } -} - -# find nodes in active config that have been deleted from new config. -# $0: hash ref at the current hierarchy level (new config) -# $1: array ref representing current config path (active config) -sub findDeletedNodes { - my $new_ref = $_[0]; - my @active_path = @{$_[1]}; - $active_cfg->setLevel(join ' ', @active_path); - if ($active_cfg->isLeafNode()) { - findDeletedValues($new_ref, \@active_path); - return; - } - # not a leaf node - my @active_nodes = $active_cfg->listOrigNodesDA(); - foreach (@active_nodes) { - if (!defined($new_ref->{$_})) { - my @plist = applySingleQuote(@active_path, $_); - push @delete_list, [\@plist, 0]; - } else { - findDeletedNodes($new_ref->{$_}, [ @active_path, $_ ]); - } - } -} - -my @set_list = (); - -# find specified node's values in active config that are set -# (added or changed). -# $0: hash ref at the current hierarchy level (new config) -# $1: array ref representing current config path (active config) -sub findSetValues { - my $new_ref = $_[0]; - my @active_path = @{$_[1]}; - - $active_cfg->setLevel(join ' ', @active_path); - my ($is_multi, $is_text) = $active_cfg->parseTmpl(); - if ($is_multi) { - # for "multi:" nodes, need to sort the values by the original order. - my @nvals = getSortedMultiValues($new_ref, \@active_path); - if ($is_text) { - @nvals = map { /^"(.*)"$/ ? $1 : $_ } @nvals; - } - my @ovals = $active_cfg->returnOrigValues(''); - my %comp_hash = $active_cfg->compareValueLists(\@ovals, \@nvals); - foreach (@{$comp_hash{'added'}}) { - my @plist = applySingleQuote(@active_path, $_); - push @set_list, [\@plist, 0]; - } - } else { - my @nvals = keys %{$new_ref}; - my $nval = $nvals[0]; - if ($is_text) { - $nval =~ s/^"(.*)"$/$1/; - } - my $oval = $active_cfg->returnOrigValue(''); - if (!defined($oval) || ($nval ne $oval)) { - my @plist = applySingleQuote(@active_path, $nval); - push @set_list, [\@plist, 0]; - } - } -} - -# find nodes in new config that are set (added or changed). -# $0: hash ref at the current hierarchy level (new config) -# $1: array ref representing current config path (active config) -sub findSetNodes { - my $new_ref = $_[0]; - my @active_path = @{$_[1]}; - $active_cfg->setLevel(join ' ', @active_path); - my @active_nodes = $active_cfg->listOrigNodes(); - my %active_hash = map { $_ => 1 } @active_nodes; - my $nref = $active_cfg->parseTmplAll(); - if (defined($nref->{type}) and !defined($nref->{tag})) { - # we are at a leaf node. - findSetValues($new_ref, \@active_path); - return; - } - foreach (sort keys %{$new_ref}) { - if (scalar(keys %{$new_ref->{$_}}) == 0) { - # we are at a non-value leaf node. - # check if we need to add this node. - if (!defined($active_hash{$_})) { - my @plist = applySingleQuote(@active_path, $_); - push @set_list, [\@plist, 0]; - } else { - # node already present. do nothing. - } - next; - } - # we recur regardless of whether it's in active. all changes will be - # handled when we reach leaf nodes (above). - findSetNodes($new_ref->{$_}, [ @active_path, $_ ]); - } -} - -# compare the current active config with the specified hierarchy and return -# the "diff". -# $0: hash ref of config hierarchy. -# return: hash containing the diff. -sub getConfigDiff { - $active_cfg = new Vyatta::Config; - $new_cfg_ref = shift; - @set_list = (); -# @disable_list = (); - @delete_list = (); - findDeletedNodes($new_cfg_ref, [ ]); - findSetNodes($new_cfg_ref, [ ]); - - # need to filter out deletions of nodes with default values - my @new_delete_list = (); - foreach my $del (@delete_list) { - my @comps = map { - my $file = $_; - $file =~ s/^'(.*)'$/$1/; - $file; - } @{${$del}[0]}; - - $active_cfg->setLevel(join ' ', @comps); - my ($is_multi, $is_text, $default) = $active_cfg->parseTmpl(); - if (!defined($default)) { - push @new_delete_list, $del; - } - } - - #let's get active disable nodes - my @enable_list = $active_cfg->getAllDeactivated("");; - - my %diff = ( - 'delete' => \@new_delete_list, - 'set' => \@set_list, - 'deactivate' => \@disable_list, - 'activate' => \@enable_list, - 'comment' => \@comment_list, - ); - return %diff; -} - -1; |