X-Git-Url: http://git.freeside.biz/gitweb/?p=freeside.git;a=blobdiff_plain;f=torrus%2Fbin%2Fcompilexml.in;fp=torrus%2Fbin%2Fcompilexml.in;h=56bbada0a727acd2a24eb6a1358915e55a9f9bf5;hp=0000000000000000000000000000000000000000;hb=74e058c8a010ef6feb539248a550d0bb169c1e94;hpb=35359a73152b3d7a9ad5e3d37faf81f6fedb76e8 diff --git a/torrus/bin/compilexml.in b/torrus/bin/compilexml.in new file mode 100644 index 000000000..56bbada0a --- /dev/null +++ b/torrus/bin/compilexml.in @@ -0,0 +1,207 @@ +#!@PERL@ -w +# Copyright (C) 2002 Stanislav Sinyagin +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# 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. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. + +# $Id: compilexml.in,v 1.1 2010-12-27 00:04:00 ivan Exp $ +# Stanislav Sinyagin + +BEGIN { require '@torrus_config_pl@'; } + +use Getopt::Long; +use strict; + +use Torrus::ConfigTree::XMLCompiler; +use Torrus::SiteConfig; +use Torrus::Log; + +exit(1) if not Torrus::SiteConfig::verify(); + +our @trees; +our $all_trees; +our $no_ds; +our $no_validation; +our $force; + +our $debug; +our $verbose; +our $help_needed; + +my $ok = GetOptions ('tree=s' => \@trees, + 'all' => \$all_trees, + 'nods' => \$no_ds, + 'noval' => \$no_validation, + 'force' => \$force, + 'debug' => \$debug, + 'verbose' => \$verbose, + 'help' => \$help_needed); + +if( not $ok or not (scalar(@trees) or $all_trees) or + $help_needed or scalar(@ARGV) > 0 ) +{ + print STDERR "Usage: $0 --tree=NAME [options...]\n", + "Options:\n", + " --tree=NAME tree name(s) to compile\n", + " --all compile all trees\n", + " --nods compile non-datasource configuration only\n", + " --noval disable parameter validation\n", + " --force force the compiler even if anoother " . + "compiler process is probably running\n", + " --debug set the log level to debug\n", + " --verbose set the log level to info\n", + " --help this help message\n"; + exit 1; +} + +if( $all_trees ) +{ + @trees = Torrus::SiteConfig::listTreeNames(); +} + +if( $debug ) +{ + Torrus::Log::setLevel('debug'); +} +elsif( $verbose ) +{ + Torrus::Log::setLevel('verbose'); +} + + +&Torrus::DB::setSafeSignalHandlers(); + +Verbose(sprintf('Torrus version %s', '@VERSION@')); + +our $global_ok = 1; + +foreach my $tree ( @trees ) +{ + if( not Torrus::SiteConfig::treeExists( $tree ) ) + { + Error("Tree named \"" . $tree . "\" does not exist"); + exit(1); + } + + &Torrus::DB::checkInterrupted(); + + Verbose("Compiling tree: $tree"); + + my $ok = 1; + my $compiler = + new Torrus::ConfigTree::XMLCompiler( -TreeName => $tree, + -NoDSRebuild => $no_ds, + -ForceWriter => $force ); + if( not defined( $compiler ) ) + { + Error('Cannot initialize compiler for tree ' . $tree . '. Exiting'); + Error('If you are sure there are no other compiler processes ' . + 'running, use the --force option'); + $global_ok = 0; + last; + } + + my @xmlFiles = @Torrus::Global::xmlAlwaysIncludeFirst; + push( @xmlFiles, Torrus::SiteConfig::listXmlFiles( $tree ) ); + push( @xmlFiles, @Torrus::Global::xmlAlwaysIncludeLast ); + + foreach my $xmlfile ( @xmlFiles ) + { + if( not $compiler->compile( $xmlfile ) ) + { + Error($xmlfile . ' compiled with errors'); $ok = 0; + } + } + + if( not $ok ) + { + Error("Errors found during XML compilation in the tree named \"" . + $tree . "\""); + $global_ok = 0; + last; + } + + Verbose('Data post-processing...'); + if( not $compiler->postProcess() ) + { + Error('Errors found during post-processing'); + $ok = 0; + } + + if( $no_validation ) + { + Verbose('Skipping data validation...'); + } + else + { + Verbose('Data validation...'); + if( not $compiler->validate() ) + { + Error('Errors found during validation process'); + $ok = 0; + } + } + + &Torrus::DB::checkInterrupted(); + + # Preserve the dynamic tokenset members + if( not $compiler->{'first_time_created'} ) + { + my $oldConfig = new Torrus::ConfigTree( -TreeName => $tree ); + if( defined( $oldConfig ) ) + { + foreach my $ts ( $oldConfig->getTsets() ) + { + if( $compiler->tsetExists( $ts ) ) + { + foreach my $member ( $oldConfig->tsetMembers( $ts ) ) + { + my $origin = $oldConfig->tsetMembers( $ts, $member ); + if( defined( $origin ) and $origin ne 'static' ) + { + my $path = $oldConfig->path($member); + if( $compiler->nodeExists( $path ) ) + { + my $token = $compiler->token( $path ); + $compiler->tsetAddMember + ( $ts, $token, $origin ); + Verbose('Preserved dynamic tokenset member: ' . + $path . ' in ' . $ts); + } + } + } + } + } + } + + undef $oldConfig; + } + + &Torrus::DB::checkInterrupted(); + + $compiler->finalize( $ok ); + undef $compiler; + &Torrus::DB::cleanupEnvironment(); + + $global_ok = $ok ? $global_ok:0; +} + +exit($global_ok ? 0:1); + + +# Local Variables: +# mode: perl +# indent-tabs-mode: nil +# perl-indent-level: 4 +# End: