#!/usr/local/bin/perl -w use strict; use XML::LibXML; use lib '/usr/local/mpiwg/archive_devel'; use MPIWGStor; # make output unbuffered $|=1; # program version my $version = "0.2 (27.6.2006 ROC)"; my $help = "use: changemeta [options] dir options: -debug show debugging info -dry-run simulate, dont'do anything -access=free set free access tag (use access=mpiwg for restricted access) "; logger("INFO", "changemeta $version"); ####################################################### # internal parameters # # read command line parameters my $args = MPIWGStor::parseargs; if (! scalar(%$args)) { print $help, "\n"; exit 1; } # debug level $debug = (exists $$args{'debug'}) ? $$args{'debug'} : 0; # simulate action only my $dry_run = (exists $$args{'dry-run'}) ? $$args{'dry-run'} : 0; logger('DEBUG', "dry-run: $dry_run"); # access type my $access_type = (exists $$args{'access'}) ? $$args{'access'} : ""; logger('DEBUG', "access: $access_type"); # index.meta namespace (not really implemented!) my $namespace = ""; my $xml_changed = 0; my $errcnt = 0; my $warncnt = 0; ####################################################### # check parameters that were passed to the program # my $docdir = $$args{'path'}; if (! $docdir) { logger("ABORT", "no document directory given!"); exit 1; } # strip double slashes $docdir = sstrip($docdir, 1); if (! -d $docdir) { logger("ABORT", "document directory \'$docdir\' doesn't exist!"); exit 1; } ####################################################### # subroutines # # # sets access tag to given access_type # removes access tag if access_type is empty # sub change_access { my ($access_type, $index_root) = @_; my $parent_tag = $index_root->findnodes('//meta/access-conditions')->get_node(1); if ($parent_tag) { my $access_tag = $parent_tag->findnodes('access')->get_node(1); # remove access tag if it exists if ($access_tag) { $parent_tag->removeChild($access_tag); } } else { $parent_tag = create_element_path('meta/access-conditions', $index_root, $namespace); } # add new access tag (if $access_Type is not empty) if ($access_type eq "free") { create_element_path('access@type=free', $parent_tag, $namespace); } elsif (length $access_type > 0) { my $acc_tag = create_element_path('access@type=institution', $parent_tag, $namespace); create_text_path('name', $access_type, $acc_tag, $namespace); } $xml_changed++ } ####################################################### # Main # my $index_doc; my $index_root; # load index.meta file if (-f "$docdir/index.meta") { ($index_doc, $index_root) = read_xml("$docdir/index.meta"); } else { logger("ABORT", "index file \'$docdir/index.meta\' doesn't exist!"); exit 1; } if ($access_type) { change_access($access_type, $index_root); } logger("INFO", "$warncnt warnings"); logger("INFO", "$errcnt errors"); if ($errcnt > 0) { logger("ABORT", "there were errors!"); exit 1; } elsif ($xml_changed) { # write new index.meta file if ($dry_run) { logger('DEBUG', "would write $docdir/index.meta"); logger('DEBUG', $index_doc->toString(1)); } else { write_xml($index_doc, "$docdir/index.meta"); } logger("DONE", "changed index file successfully!"); } else { logger("DONE", "didn't change index file"); }