--- loncom/build/Attic/parse.pl 2001/01/13 17:58:43 1.23 +++ loncom/build/Attic/parse.pl 2001/04/17 14:17:22 1.37 @@ -2,8 +2,19 @@ # Scott Harrison # November 2000 - -# Read in loncapa tags and metagroup tags +# 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. 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; @@ -152,22 +163,22 @@ elsif ($mode eq "BinaryRoot") { open OUT,">BinaryRoot/etc/passwd"; print OUT<>setup_file_list.txt"; @@ -179,6 +190,10 @@ ALL: ALL END close OUT; + `install -o 500 -g 500 -m 0700 -d BinaryRoot/home/www`; + open 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"; @@ -211,6 +226,19 @@ close OUT; } elsif ($mode eq "status") { + $a=&begin_description_page('status'); + print $a; + $a=&make_rpm_description_block('status'); + print $a; + @directories=&determine_directory_structure('status'); + $a=&make_directory_structure_description_block(\@directories,'status'); + print $a; + $a=&make_file_type_ownership_and_permissions_description_block('status'); + print $a; + $a=&make_directory_and_file_structure_description_block(\@directories,'status'); + print $a; + $a=&end_description_page('status'); + print $a; } elsif ($mode eq "update") { } @@ -551,7 +579,9 @@ sub make_files_build_segment { my $description; my @allfiles=keys %{$info{'LOCATION'}{$distribution}}; my $tab="\t"; - my $sources="all: "; + my $sources="# Dynamic Makefile generated by LON-CAPA build process\n\n"; + $sources.="SHELL=\"/bin/sh\"\n\n"; + $sources.="\nall: "; foreach my $d (@$dirs) { # set other values my $dirdescription=$info{'DIRECTORY'}{$distribution}{$d}{'DESCRIPTION'}; @@ -592,9 +622,25 @@ sub make_files_build_segment { $depstat=" alwaysrun"; } $dependencies=~s/\s+/ $sdir/gs; + my @deps=split(/\s+/,$dependencies); + shift @deps; + my $testing=</dev/null; install -o $owner -g $group -m $devchmod \$(SOURCE)/$source \$(TARGET)/$rot END } } @@ -939,7 +992,10 @@ sub end_spec_page { # ------------------------------------------------------- Begin description page sub begin_description_page { - my $description=< LON-CAPA Software Description Page ($distribution, $date) @@ -964,7 +1020,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 @@ -980,7 +1064,10 @@ END # ------------------------------------------------- Make RPM description block sub make_rpm_description_block { - my $description=<Rolled in a RedHat 6.2 RPM, $date

@@ -1001,6 +1088,58 @@ $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; } @@ -1013,7 +1152,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

@@ -1039,8 +1179,12 @@ END $maxcount=$count if $count>$maxcount; delete $diraccount{$d}; } + if ($mode eq 'status') { + $statusheader="Current Status"; + } $description.=< +$statusheader Category Permissions Development
Permissions
@@ -1061,8 +1205,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 @@ -1081,6 +1251,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

@@ -1120,7 +1291,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

@@ -1174,8 +1346,14 @@ END END } if (@files) { + if ($mode eq 'status') { + $statusheader=<Current Status +END + } $description.=< +$statusheader Type File Name Function @@ -1187,6 +1365,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'}; @@ -1219,8 +1398,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]