--- loncom/build/Attic/parse.pl 2000/12/10 04:15:23 1.9 +++ loncom/build/Attic/parse.pl 2001/05/30 17:42:28 1.41 @@ -2,8 +2,19 @@ # Scott Harrison # November 2000 +# 12/5/2000,12/7,12/8,12/9,12/10,12/11,12/12,12/13,12/14,12/21 Scott Harrison +# 1/8/2001,1/10/2001,1/13/2001,1/16/2001,1/18/2001,1/23/2001 Scott Harrison +# 2/26/2001,2/27/2001,3/5/2001,4/10/2001,4/11,2001,4/13,2001 Scott Harrison +# 4/17/2001 Scott Harrison -# Read in loncapa tags and metagroup tags +# Read in loncapa tags and metagroup tags. Output various +# useful files for viewing, compiling, monitoring, updating, +# and installing. + +# This code works well. HOWEVER, I was in a rush when I +# wrote it. Future plans are that the parsing should be +# much more event-state based and the input should be +# more XML-ish. -Scott # ---------------------------------------------- Read in command line arguments my ($file,$mode)=@ARGV; @@ -65,6 +76,7 @@ while ($info1=~/\/isg) } 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; @@ -85,8 +97,9 @@ while ($info1=~/\/isg) } } -if ($mode eq "ALL" || $mode eq "HTML") { - my $a; +my $a; +my @directories; +if ($mode eq "HTML") { $a=&begin_description_page; print $a; $a=&make_rpm_description_block; @@ -101,10 +114,917 @@ if ($mode eq "ALL" || $mode eq "HTML") { $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; + open OUT,">setup_file_list.txt"; + print OUT "BinaryRoot/etc/passwd\n"; + close OUT; + open OUT,">BinaryRoot/etc/passwd"; + print OUT<>setup_file_list.txt"; + print OUT "BinaryRoot/etc/group\n"; + close OUT; + open OUT,">BinaryRoot/etc/group"; + print OUT<>setup_file_list.txt"; + print OUT "BinaryRoot/etc/hosts.deny\n"; + close OUT; + open OUT,">BinaryRoot/etc/hosts.deny"; + print OUT<>setup_file_list.txt"; + print OUT "BinaryRoot/home/www\n"; + close OUT; + `install -d BinaryRoot/etc/pam.d`; + open OUT,">>setup_file_list.txt"; + print OUT "BinaryRoot/etc/pam.d/passwd\n"; + close OUT; + open OUT,">BinaryRoot/etc/pam.d/passwd"; + print OUT<>setup_file_list.txt"; + print OUT "BinaryRoot/etc/pam.d/login\n"; + close OUT; + open OUT,">BinaryRoot/etc/pam.d/login"; + print OUT</dev/null; install -o $owner -g $group -m $devchmod \$(SOURCE)/$source \$(TARGET)/$rot +END + } + } + } + } + $description.=< LON-CAPA Software Description Page ($distribution, $date) @@ -129,7 +1049,35 @@ http://install.lon-capa.org/compile/inde information.

END +} + else { + $description=< + +LON-CAPA Software File System Status Page ($distribution, $date) + + +LON-CAPA Software File System Status 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 status checking process. See http://install.lon-capa.org/ +for more information. +

+END + } return $description; + } # ------------------------------------------------- End description page @@ -145,7 +1093,10 @@ END # ------------------------------------------------- Make RPM description block sub make_rpm_description_block { - my $description=<Rolled in a RedHat 6.2 RPM, $date

@@ -160,13 +1111,64 @@ Group : $info{'RPM'}{'Group'} License : $info{'RPM'}{'Copyright'} Summary : $info{'RPM'}{'Summary'} Description : -
 $info{'RPM'}{'description'}
 

END +} + else { + my $exist=`rpm -q LON-CAPA-base 2>/dev/null`; + unless ($exist) { + $description=<No LON-CAPA RPM on the system, (installed ??????) +

+ + + +
+Error! A LON-CAPA-base RPM +was never installed on this system! +
+

+END + } + else { + chop $exist; + my $rpmname=`rpm -q --queryformat '%{NAME}' LON-CAPA-base`; + my $rpmversion=`rpm -q --queryformat '%{VERSION}' LON-CAPA-base`; + my $rpmrelease=`rpm -q --queryformat '%{RELEASE}' LON-CAPA-base`; + my $idate=`rpm -q --queryformat '%{INSTALLTIME:date}' LON-CAPA-base`; + my $rpmvendor=`rpm -q --queryformat '%{VENDOR}' LON-CAPA-base`; + my $rpmbuildhost=`rpm -q --queryformat '%{BUILDHOST}' LON-CAPA-base`; + my $rpmgroup=`rpm -q --queryformat '%{GROUP}' LON-CAPA-base`; + my $rpmlicense=`rpm -q --queryformat '%{LICENSE}' LON-CAPA-base`; + my $rpmsummary=`rpm -q --queryformat '%{SUMMARY}' LON-CAPA-base`; + my $rpmdescription=`rpm -q --queryformat '%{DESCRIPTION}' LON-CAPA-base`; + $description=<Current RedHat RPM on the system, (installed $idate) +

+ + +
+
+Name        : $rpmname
+Version     : $rpmversion
+Vendor      : $rpmvendor
+Release     : $rpmrelease
+Build Host  : $rpmbuildhost
+Group       : $rpmgroup
+License     : $rpmlicense
+Summary     : $rpmsummary
+Description : 
+$rpmdescription
+
+
+

+END +} + } return $description; } @@ -179,7 +1181,8 @@ sub determine_directory_structure { # ---------------------------------- Make directory structure description block sub make_directory_structure_description_block { - my ($dirs)=@_; + my ($dirs,$mode)=@_; + my $dirstatus; my $statusheader; my $description=<Directory Structure Description, $date

@@ -205,8 +1208,12 @@ END $maxcount=$count if $count>$maxcount; delete $diraccount{$d}; } + if ($mode eq 'status') { + $statusheader="Current Status"; + } $description.=< +$statusheader Category Permissions Development
Permissions
@@ -227,8 +1234,34 @@ END my $chmod=$info{'OWNERSHIP'}{$category}{'CHMOD'}; my $devchown=$info{'DEVOWNERSHIP'}{$category}{'CHOWN'}; my $devchmod=$info{'DEVOWNERSHIP'}{$category}{'CHMOD'}; + if ($mode eq 'status') { + my $ds=`find /$d -type d -prune -printf "\%m\t\%u\t\%g" 2>/dev/null`; + unless ($ds) { + $dirstatus='MISSING'; + } + else { + my @dss=split(/\t/,$ds); + my $dssz=$dss[0]; + $dssz="0" . $dss[0] if length($dss[0])<4; + $dss[0]=$dssz; + $ds="$dss[0] $dss[1]:$dss[2]"; + if ($ds eq "$chmod $chown" && $ds eq "$devchmod $devchown") { + $dirstatus='runtime+development'; + } + elsif ($ds eq "$chmod $chown") { + $dirstatus='runtime'; + } + elsif ($ds eq "$devchmod $devchown") { + $dirstatus='development'; + } + else { + $dirstatus="ERROR
$ds"; + } + } + } $description.=< +$dirstatus $category $chmod $chown $devchmod $devchown @@ -247,6 +1280,7 @@ END # ------------------- Make file type ownership and permissions description block sub make_file_type_ownership_and_permissions_description_block { + my ($mode)=@_; my $description=<File Type Ownership and Permissions Descriptions, $date

@@ -286,7 +1320,8 @@ END # ------------------------- Make directory and file structure description block sub make_directory_and_file_structure_description_block { - my ($dirs)=@_; + my ($dirs,$mode)=@_; + my $statusheader; my $filestatus; my $description=<Directory and File Structure Description, $date

@@ -340,8 +1375,14 @@ END END } if (@files) { + if ($mode eq 'status') { + $statusheader=<Current Status +END + } $description.=< +$statusheader Type File Name Function @@ -353,6 +1394,7 @@ END 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 $source2=$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'}; @@ -385,8 +1427,80 @@ END $source="$source"; } } + my $checksum; + my $checksum_source; + my $checksum_target; + if ($mode eq 'status') { + $filestatus=''; + my $fs; + my $listing2=$info{'LOCATION'}{$distribution}{$filesfull[$i]}{'FILES'}; + my @E=split(/\s+/,$listing2); shift @E; + if (@E) { + $fs=`find /$filesfull[$i] -prune -printf "\%m\t\%u\t\%g\n" 2>/dev/null | wc -l`; chop $fs; + if ($fs!=(@E+0)) { + $ecount=(@E+0); + $estuff=join(",",@E); + $filestatus="ERROR. SOME FILES ARE MISSING"; + } + $fs=`find /$filesfull[$i] -prune -printf "\%m\t\%u\t\%g\n" 2>/dev/null | sort | uniq | wc -l`; chop $fs; + if ($fs!=1) { + $filestatus='ERROR. THERE ARE MULTIPLE OWNERSHIPS/PERMISSIONS WHEN ALL THESE FILES SHOULD HAVE THE SAME CONFIGURATION'; + } + else { + $fs=`find /$filesfull[$i] -prune -printf "\%m\t\%u\t\%g\n" 2>/dev/null | sort | uniq`; chop $fs; + } + } + else { + $fs=`find /$filesfull[$i] -prune -printf "\%m\t\%u\t\%g" 2>/dev/null`; + if (-f "/$filesfull[$i]" && !(-l "/$filesfull[$i]")) { + $checksum_source=`md5sum ../../$source2 | cut -d ' ' -f1`; + chop $checksum_source; + $checksum_target=`md5sum /$filesfull[$i] | cut -d ' ' -f1`; + chop $checksum_target; +# warn ("CS: $checksum_source, CT: $checksum_target\n"); + unless ($checksum_source eq $checksum_target) { + $checksum="
CHECKSUM DIFFERENCE"; + } + } + } + my $fsl=`find /$filesfull[$i] -type l -prune -printf "\%m\t\%u\t\%g" 2>/dev/null`; + unless ($fs || $filestatus) { + $filestatus='MISSING'; + } + elsif (!$filestatus) { + + $chmod=$info{'OWNERSHIP'}{$category}{'CHMOD'}; + $chown=$info{'OWNERSHIP'}{$category}{'CHOWN'}; + $devchmod=$info{'DEVOWNERSHIP'}{$category}{'CHMOD'}; + $devchown=$info{'DEVOWNERSHIP'}{$category}{'CHOWN'}; + + my @fss=split(/\t/,$fs); + my $fssz=$fss[0]; + $fssz="0" . $fss[0] if length($fss[0])<4; + $fss[0]=$fssz; + $fs="$fss[0] $fss[1]:$fss[2]"; + $s=' '; + if ($fsl) { + $fs="$fss[1]:$fss[2]"; + $s=''; + } + if ($fs eq "$chmod$s$chown" && $fs eq "$devchmod$s$devchown") { + $filestatus="runtime+development$checksum"; + } + elsif ($fs eq "$chmod$s$chown") { + $filestatus="runtime$checksum"; + } + elsif ($fs eq "$devchmod$s$devchown") { + $filestatus="development$checksum"; + } + else { + $filestatus="ERROR
$fs"; + } + } + } $description.=< +$filestatus $category $category $files[$i]