#!/usr/bin/perl # Scott Harrison # November 2000 # Read in loncapa tags and metagroup tags # ---------------------------------------------- Read in command line arguments my ($file,$mode)=@ARGV; # ---------------------------------------------------- Read in master data file open IN,"<$file"; my @lines=; close IN; my $info1=join('',@lines); my $info2=$info1; # value to allow for meta data group retrieval # ------------------------------------------------------- Make default settings my $distribution="redhat6.2"; my $date=`date +'%B %e, %Y'`; chop $date; my $buildhost=`hostname`; chop $buildhost; # file category mappings my %fcm=( 'conf' => 'configurable', 'graphic file' => 'graphicfile', 'handler' => 'handler', 'interface file' => 'interfacefile', 'symbolic link' => 'link', 'root script' => 'rootscript', 'script' => 'script', 'setuid script' => 'setuid', 'static conf' => 'static', 'system file' => 'systemfile', ); # ---------------------------------------------------- Parse the marked up data my %info; # big data storage object while ($info1=~/\/isg) { my $keystring=$1; # In the parsing of LON-CAPA tags, remove boundary white-space, # and handle quotation commands. my %hash=map {my ($key,$value)=split(/\=(?!")|\=(?=\s*"[^"]*"[^"]*$)/); $value=~s/^"//; $value=~s/"$//; (uc($key),$value);} split(/\s+(?=\w+\s*\=)/,$keystring); # Handle the different types of commands if (uc($hash{'TYPE'}) eq "OWNERSHIP") { $info{$hash{'TYPE'}}{$hash{'CATEGORY'}}{'CHMOD'}=$hash{'CHMOD'}; $info{$hash{'TYPE'}}{$hash{'CATEGORY'}}{'CHOWN'}=$hash{'CHOWN'}; } elsif (uc($hash{'TYPE'}) eq "DEVOWNERSHIP") { $info{$hash{'TYPE'}}{$hash{'CATEGORY'}}{'CHMOD'}=$hash{'CHMOD'}; $info{$hash{'TYPE'}}{$hash{'CATEGORY'}}{'CHOWN'}=$hash{'CHOWN'}; } elsif (uc($hash{'TYPE'}) eq "RPM") { $hash{'VALUE'}=~s/\\n/\n/g; $info{$hash{'TYPE'}}{$hash{'NAME'}}=$hash{'VALUE'}; } elsif (uc($hash{'TYPE'}) eq "DIRECTORY") { $info{$hash{'TYPE'}}{$hash{'DIST'}}{$hash{'TARGET'}}{'CATEGORY'}= $hash{'CATEGORY'}; $info{$hash{'TYPE'}}{$hash{'DIST'}}{$hash{'TARGET'}}{'DESCRIPTION'}= $hash{'DESCRIPTION'} if $hash{'DESCRIPTION'}; } elsif (uc($hash{'TYPE'}) eq "LOCATION") { $info{$hash{'TYPE'}}{$hash{'DIST'}}{$hash{'TARGET'}}{'CATEGORY'}= $hash{'CATEGORY'}; $info{$hash{'TYPE'}}{$hash{'DIST'}}{$hash{'TARGET'}}{'LINKTO'}= $hash{'LINKTO'}; $info{$hash{'TYPE'}}{$hash{'DIST'}}{$hash{'TARGET'}}{'SOURCE'}= $hash{'SOURCE'}; # get surrounding metagroup information my $ckeystring=$keystring; $ckeystring=~s/(SOURCE\=\"[^"]*)\*/$1\\\*/g; $ckeystring=~s/(TARGET\=\"[^"]*)\*/$1\\\*/g; $info2=~/.*\<(?:metagroup|metasupergroup)\>(.*?)\(.*?)\<\/(?:metagroup|metasupergroup)\>/is; my $data=$1.$2; my @meta=('description','build','dependencies','files','note'); foreach my $m (@meta) { if ($data=~/\<($m)\>(.*?)\<\/$m\>/sgi) { my ($key,$value)=($1,$2); $info{$hash{'TYPE'}}{$hash{'DIST'}}{$hash{'TARGET'}}{uc($key)}= $value; } } } else { warn("WARNING: this tag text will be ignored since it cannot be understood\n---> $keystring\n"); } } my $a; my @directories; if ($mode eq "HTML") { $a=&begin_description_page; print $a; $a=&make_rpm_description_block; print $a; @directories=&determine_directory_structure; $a=&make_directory_structure_description_block(\@directories); print $a; $a=&make_file_type_ownership_and_permissions_description_block; print $a; $a=&make_directory_and_file_structure_description_block(\@directories); print $a; $a=&end_description_page; print $a; } elsif ($mode eq "SPEC") { my $out=$info{'RPM'}{'Name'} . '-' . $info{'RPM'}{'Version'} . '.spec'; open OUT,">$out"; $a=&make_rpm_spec_block; print OUT $a; $a=&make_rpm_build_block; print OUT $a; @directories=&determine_directory_structure; $a=&make_directory_structure_spec_block(\@directories); print OUT $a; $a=&make_directory_and_file_structure_spec_block(\@directories); print OUT $a; $a=&end_spec_page; print OUT $a; close OUT; } elsif ($mode eq "LCMakefile") { @directories=&determine_directory_structure; $a=&make_directory_LCMakefile_segment(\@directories); print $a; $a=&make_files_LCMakefile_segment(\@directories); print $a; $a=&make_links_LCMakefile_segment(\@directories); print $a; } elsif ($mode eq "BinaryRoot") { mkdir "BinaryRoot",0755; open OUT,">Makefile.BinaryRoot"; @directories=&determine_directory_structure; $a=&make_directory_binaryroot_segment(\@directories); print OUT $a; $a=&make_files_binaryroot_segment(\@directories); print OUT $a; $a=&make_links_binaryroot_segment(\@directories); print OUT $a; close OUT; print `make -f Makefile.BinaryRoot TARGET='BinaryRoot' SOURCE='../..' directories`; print `make -f Makefile.BinaryRoot TARGET='BinaryRoot' SOURCE='../..' files`; print `make -f Makefile.BinaryRoot TARGET='BinaryRoot' SOURCE='../..' links`; open OUT,">base_file_list.txt"; $a=&make_file_list(\@directories); print OUT $a; close OUT; } elsif ($mode eq "status") { } elsif ($mode eq "update") { } elsif ($mode eq "configinstall") { @directories=&determine_directory_structure; $a=&make_files_configinstall_segment(\@directories); print $a; $a=&make_files_configpermissions_segment(\@directories); print $a; } elsif ($mode eq "install") { @directories=&determine_directory_structure; $a=&make_directory_install_segment(\@directories); print $a; $a=&make_files_install_segment(\@directories); print $a; $a=&make_links_install_segment(\@directories); print $a; } elsif ($mode eq "build") { @directories=&determine_directory_structure; $a=&make_files_build_segment(\@directories); print $a; } # ------------------------------------------------------ a list of file targets sub make_file_list { my ($dirs)=@_; my $description; my @allfiles=keys %{$info{'LOCATION'}{$distribution}}; foreach my $d (@$dirs) { # set other values $description.=< LON-CAPA Software Description Page ($distribution, $date) LON-CAPA Software Description Page ($distribution, $date)
Michigan State University
Learning Online with CAPA
Contact korte\@lon-capa.org
  • About this file
  • Software Package Description
  • Directory Structure
  • File Type Ownership and Permissions
  • File and Directory Structure
About this file

This file is generated dynamically by parse.pl as part of a development compilation process. See http://install.lon-capa.org/compile/index.html for more information.

END return $description; } # ------------------------------------------------- End description page sub end_description_page { my $description=< LON-CAPA Software Development Team END return $description; } # ------------------------------------------------- Make RPM description block sub make_rpm_description_block { my $description=<Rolled in a RedHat 6.2 RPM, $date

Name        : $info{'RPM'}{'Name'}
Version     : $info{'RPM'}{'Version'}
Vendor      : $info{'RPM'}{'Vendor'} 
Release     : $info{'RPM'}{'Release'}                             
Build Host  : $buildhost
Group       : $info{'RPM'}{'Group'}
License     : $info{'RPM'}{'Copyright'}
Summary     : $info{'RPM'}{'Summary'}
Description : 
$info{'RPM'}{'description'}

END return $description; } # ----------------------------------------------- Determine directory structure sub determine_directory_structure { my @directories=keys %{$info{'DIRECTORY'}{$distribution}}; return (sort @directories); } # ---------------------------------- Make directory structure description block sub make_directory_structure_description_block { my ($dirs)=@_; my $description=<Directory Structure Description, $date

The directory structure description below shows only those directories which either contain LON-CAPA specific files or normally do not exist on a RedHat Linux system (and must be generated to allow proper placement of files during LON-CAPA run-time operation).

END my $maxcount=0; my @allfiles=keys %{$info{'LOCATION'}{$distribution}}; my %diraccount; # hash to track which directories are accounted for foreach my $file (@allfiles) { $file=~/^(.*)\/([^\/]+)$/; $diraccount{$1}=1; } foreach my $d (@$dirs) { my (@matches)=($d=~/\//g); my $count=scalar(@matches); $maxcount=$count if $count>$maxcount; delete $diraccount{$d}; } $description.=< END $description.="\n"; if (keys %diraccount) { $description.= "\n"; } foreach my $d (@$dirs) { my $dtable=$d; $dtable=~s/\//\<\/TD\>\/g; my $category=$info{'DIRECTORY'}{$distribution}{$d}{'CATEGORY'}; my $chown=$info{'OWNERSHIP'}{$category}{'CHOWN'}; my $chmod=$info{'OWNERSHIP'}{$category}{'CHMOD'}; my $devchown=$info{'DEVOWNERSHIP'}{$category}{'CHOWN'}; my $devchmod=$info{'DEVOWNERSHIP'}{$category}{'CHMOD'}; $description.=< END } $description.=<

END return $description; } # ------------------- Make file type ownership and permissions description block sub make_file_type_ownership_and_permissions_description_block { my $description=<File Type Ownership and Permissions Descriptions, $date

This table shows what permissions and ownership settings correspond to each kind of file type.

Category Permissions Development
Permissions
Directory Path
Directories that are unaccounted for: \n";
	foreach my $d (keys %diraccount) {
	    $description.="$d\n";
	}
	$description.="
$category $chmod $chown $devchmod $devchown $dtable
END foreach my $type (keys %{$info{'OWNERSHIP'}}) { if (defined($fcm{$type})) { my $chmod=$info{'OWNERSHIP'}{$type}{'CHMOD'}; my $chown=$info{'OWNERSHIP'}{$type}{'CHOWN'}; my $devchmod=$info{'DEVOWNERSHIP'}{$type}{'CHMOD'}; my $devchown=$info{'DEVOWNERSHIP'}{$type}{'CHOWN'}; $description.=< END } } $description.=<

END } # ------------------------- Make directory and file structure description block sub make_directory_and_file_structure_description_block { my ($dirs)=@_; my $description=<Directory and File Structure Description, $date

The icons on the left column correspond to the file type specified in the second column. The last column "Notes" shows compilation, dependency, and configuration information. The CVS location shows the location of the binary source file (if applicable) needed to be copied to the target. If the binary source file is not at the specified location, then the text is shown in red.

Icon Type Permissions Development Permissions
$type $type $chmod $chown $devchmod $devchown
END my $counter=0; my @colorindex=("#80FF80","#80FFFF","#FFFF80"); my @allfiles=keys %{$info{'LOCATION'}{$distribution}}; foreach my $d (@$dirs) { # set color my $color=$colorindex[$counter%3]; # set other values my $dirdescription=$info{'DIRECTORY'}{$distribution}{$d}{'DESCRIPTION'}; $dirdescription="(" . $dirdescription . ")" if $dirdescription; # find subdirectories that are contained in this directory my @subdirs; foreach my $d2 (@$dirs) { if ($d2=~/^$d\/([^\/]+)$/) { push @subdirs,$1; } } # find files that are contained in this directory my @files; my @filesfull; foreach my $f (@allfiles) { if ($f=~/^$d\/([^\/]+)$/) { push @files,$1; push @filesfull,$f; } } # render starting HTML formatting elements if (@subdirs || @files) { my $subdirstring="
* Relevant subdirectories: " . join(", ",@subdirs) if @subdirs; $description.=< END } else { $description.=< END } if (@files) { $description.=< END foreach my $i (0..$#files) { my $category=$info{'LOCATION'}{$distribution}{$filesfull[$i]}{'CATEGORY'}; my $fdescription=$info{'LOCATION'}{$distribution}{$filesfull[$i]}{'DESCRIPTION'}; my $source=$info{'LOCATION'}{$distribution}{$filesfull[$i]}{'SOURCE'}; my $note=$info{'LOCATION'}{$distribution}{$filesfull[$i]}{'NOTE'}; $note.="
" if $note; my $listing=$info{'LOCATION'}{$distribution}{$filesfull[$i]}{'FILES'}; my @E=split(/\s+/,$listing); $source=~/(.*)\/[^\/]+$/; my $sd=$1; my $eflag=0; foreach my $e (@E) { unless (-e "../../$sd/$e") { $e="$e"; $eflag=1; } } $listing=join("\n",@E); $listing="listing
$listing" if $listing; $listing.="
" if $listing; my $build=$info{'LOCATION'}{$distribution}{$filesfull[$i]}{'BUILD'}; $build="build
$build" if $build; $build.="
" if $build; my $dependencies=$info{'LOCATION'}{$distribution}{$filesfull[$i]}{'DEPENDENCIES'}; $dependencies="dependencies
$dependencies" if $dependencies; $dependencies.="
" if $dependencies; unless (-e "../../$source") { $source=~/([^\/]+)$/; my $s=$1; if ($source!~/\*/) { $source="$source"; } elsif ($eflag) { $source="$source"; } } $description.=< END } } $counter++; } $description.=<

END return $description; }
directoryDIRECTORY -- $d $dirdescription $subdirstring
empty directoryEMPTY DIRECTORY - $d $dirdescription
Type File Name Function CVS Location Notes
$category $category $files[$i] $fdescription  $source $note$listing$build$dependencies