Annotation of loncom/build/parse.pl, revision 1.17

1.1       harris41    1: #!/usr/bin/perl
                      2: 
                      3: # Scott Harrison
                      4: # November 2000
                      5: 
1.2       harris41    6: # Read in loncapa tags and metagroup tags
1.1       harris41    7: 
1.4       harris41    8: # ---------------------------------------------- Read in command line arguments
1.1       harris41    9: my ($file,$mode)=@ARGV;
1.2       harris41   10: 
1.4       harris41   11: # ---------------------------------------------------- Read in master data file
1.1       harris41   12: open IN,"<$file";
                     13: my @lines=<IN>;
                     14: close IN;
1.5       harris41   15: my $info1=join('',@lines);
                     16: my $info2=$info1; # value to allow for meta data group retrieval
1.1       harris41   17: 
1.4       harris41   18: # ------------------------------------------------------- Make default settings
                     19: my $distribution="redhat6.2";
                     20: my $date=`date +'%B %e, %Y'`; chop $date;
                     21: my $buildhost=`hostname`; chop $buildhost;
1.5       harris41   22: # file category mappings
                     23: my %fcm=(
                     24: 	 'conf' => 'configurable',
                     25: 	 'graphic file' => 'graphicfile',
                     26: 	 'handler' => 'handler',
                     27: 	 'interface file' => 'interfacefile',
                     28: 	 'symbolic link' => 'link',
                     29: 	 'root script' => 'rootscript',
                     30: 	 'script' => 'script',
                     31: 	 'setuid script' => 'setuid',
                     32: 	 'static conf' => 'static',
                     33: 	 'system file' => 'systemfile',
                     34: 	 );
1.4       harris41   35: 
                     36: # ---------------------------------------------------- Parse the marked up data
                     37: my %info; # big data storage object
1.5       harris41   38: while ($info1=~/\<loncapa\s+(.*?)\>/isg) {
1.1       harris41   39:     my $keystring=$1;
1.4       harris41   40:     # In the parsing of LON-CAPA tags, remove boundary white-space,
                     41:     # and handle quotation commands.
1.2       harris41   42:     my %hash=map {my ($key,$value)=split(/\=(?!")|\=(?=\s*"[^"]*"[^"]*$)/);
                     43:                                    $value=~s/^"//;
                     44:  				   $value=~s/"$//;
                     45:                                    (uc($key),$value);}
                     46:              split(/\s+(?=\w+\s*\=)/,$keystring);
1.4       harris41   47:     # Handle the different types of commands
1.1       harris41   48:     if (uc($hash{'TYPE'}) eq "OWNERSHIP") {
                     49:         $info{$hash{'TYPE'}}{$hash{'CATEGORY'}}{'CHMOD'}=$hash{'CHMOD'};
                     50:         $info{$hash{'TYPE'}}{$hash{'CATEGORY'}}{'CHOWN'}=$hash{'CHOWN'};
                     51:     }
                     52:     elsif (uc($hash{'TYPE'}) eq "DEVOWNERSHIP") {
                     53:         $info{$hash{'TYPE'}}{$hash{'CATEGORY'}}{'CHMOD'}=$hash{'CHMOD'};
                     54:         $info{$hash{'TYPE'}}{$hash{'CATEGORY'}}{'CHOWN'}=$hash{'CHOWN'};
                     55:     }
                     56:     elsif (uc($hash{'TYPE'}) eq "RPM") {
                     57:         $hash{'VALUE'}=~s/\\n/\n/g;
                     58:         $info{$hash{'TYPE'}}{$hash{'NAME'}}=$hash{'VALUE'};
                     59:     }
                     60:     elsif (uc($hash{'TYPE'}) eq "DIRECTORY") {
1.4       harris41   61:         $info{$hash{'TYPE'}}{$hash{'DIST'}}{$hash{'TARGET'}}{'CATEGORY'}=
                     62:                                                        $hash{'CATEGORY'};
                     63:         $info{$hash{'TYPE'}}{$hash{'DIST'}}{$hash{'TARGET'}}{'DESCRIPTION'}=
                     64:                                $hash{'DESCRIPTION'} if $hash{'DESCRIPTION'};
1.1       harris41   65:     }
                     66:     elsif (uc($hash{'TYPE'}) eq "LOCATION") {
1.5       harris41   67:         $info{$hash{'TYPE'}}{$hash{'DIST'}}{$hash{'TARGET'}}{'CATEGORY'}=                               $hash{'CATEGORY'};
1.10      harris41   68:         $info{$hash{'TYPE'}}{$hash{'DIST'}}{$hash{'TARGET'}}{'LINKTO'}=                               $hash{'LINKTO'};
1.5       harris41   69:         $info{$hash{'TYPE'}}{$hash{'DIST'}}{$hash{'TARGET'}}{'SOURCE'}=                                               $hash{'SOURCE'};
1.1       harris41   70:         # get surrounding metagroup information
                     71:         my $ckeystring=$keystring; $ckeystring=~s/(SOURCE\=\"[^"]*)\*/$1\\\*/g;
1.5       harris41   72:         $ckeystring=~s/(TARGET\=\"[^"]*)\*/$1\\\*/g;
1.1       harris41   73:         $info2=~/.*\<(?:metagroup|metasupergroup)\>(.*?)\<loncapa\s+$ckeystring\>(.*?)\<\/(?:metagroup|metasupergroup)\>/is;
                     74: 	my $data=$1.$2;
                     75:         my @meta=('description','build','dependencies','files','note');
                     76:         foreach my $m (@meta) {
                     77: 	    if ($data=~/\<($m)\>(.*?)\<\/$m\>/sgi) {
                     78: 		my ($key,$value)=($1,$2);
1.9       harris41   79: 		$info{$hash{'TYPE'}}{$hash{'DIST'}}{$hash{'TARGET'}}{uc($key)}=
1.4       harris41   80: 		                                                    $value;
1.1       harris41   81: 	    }
                     82:         }
                     83:     }
                     84:     else {
                     85:         warn("WARNING: this tag text will be ignored since it cannot be understood\n---> $keystring\n");
                     86:     }
                     87: }
                     88: 
1.10      harris41   89: my $a;
                     90: my @directories;
                     91: if ($mode eq "HTML") {
1.4       harris41   92:     $a=&begin_description_page;
                     93:     print $a;
                     94:     $a=&make_rpm_description_block;
                     95:     print $a;
                     96:     @directories=&determine_directory_structure;
                     97:     $a=&make_directory_structure_description_block(\@directories);
                     98:     print $a;
1.6       harris41   99:     $a=&make_file_type_ownership_and_permissions_description_block;
                    100:     print $a;
1.4       harris41  101:     $a=&make_directory_and_file_structure_description_block(\@directories);
                    102:     print $a;
                    103:     $a=&end_description_page;
                    104:     print $a;
                    105: }
1.10      harris41  106: elsif ($mode eq "SPEC") {
                    107:     my $out=$info{'RPM'}{'Name'} . '-' . $info{'RPM'}{'Version'} . '.spec';
                    108:     open OUT,">$out";
                    109:     $a=&make_rpm_spec_block;
                    110:     print OUT $a;
                    111:     $a=&make_rpm_build_block;
                    112:     print OUT $a;
                    113:     @directories=&determine_directory_structure;
                    114:     $a=&make_directory_structure_spec_block(\@directories);
                    115:     print OUT $a;
                    116:     $a=&make_directory_and_file_structure_spec_block(\@directories);
                    117:     print OUT $a;
                    118:     $a=&end_spec_page;
                    119:     print OUT $a;
                    120:     close OUT;
                    121: }
                    122: elsif ($mode eq "LCMakefile") {
                    123:     @directories=&determine_directory_structure;
1.14      harris41  124:     $a=&make_directory_LCMakefile_segment(\@directories);
1.10      harris41  125:     print $a;
1.14      harris41  126:     $a=&make_files_LCMakefile_segment(\@directories);
1.10      harris41  127:     print $a;
1.14      harris41  128:     $a=&make_links_LCMakefile_segment(\@directories);
1.10      harris41  129:     print $a;
                    130: }
1.11      harris41  131: elsif ($mode eq "BinaryRoot") {
                    132:     mkdir "BinaryRoot",0755;
                    133:     open OUT,">Makefile.BinaryRoot";
                    134:     @directories=&determine_directory_structure;
                    135:     $a=&make_directory_binaryroot_segment(\@directories);
                    136:     print OUT $a;
                    137:     $a=&make_files_binaryroot_segment(\@directories);
                    138:     print OUT $a;
                    139:     $a=&make_links_binaryroot_segment(\@directories);
                    140:     print OUT $a;
                    141:     close OUT;
                    142:     print `make -f Makefile.BinaryRoot TARGET='BinaryRoot' SOURCE='../..' directories`;
                    143:     print `make -f Makefile.BinaryRoot TARGET='BinaryRoot' SOURCE='../..' files`;
                    144:     print `make -f Makefile.BinaryRoot TARGET='BinaryRoot' SOURCE='../..' links`;
                    145:     open OUT,">base_file_list.txt";
                    146:     $a=&make_file_list(\@directories);
                    147:     print OUT $a;
                    148:     close OUT;
                    149:     
                    150: }
1.10      harris41  151: elsif ($mode eq "status") {
                    152: }
                    153: elsif ($mode eq "update") {
                    154: }
1.16      harris41  155: elsif ($mode eq "configinstall") {
                    156:     @directories=&determine_directory_structure;
                    157:     $a=&make_files_configinstall_segment(\@directories);
                    158:     print $a;
1.17    ! harris41  159:     $a=&make_files_configpermissions_segment(\@directories);
        !           160:     print $a;
1.16      harris41  161: }
1.14      harris41  162: elsif ($mode eq "install") {
                    163:     @directories=&determine_directory_structure;
                    164:     $a=&make_directory_install_segment(\@directories);
                    165:     print $a;
                    166:     $a=&make_files_install_segment(\@directories);
                    167:     print $a;
                    168:     $a=&make_links_install_segment(\@directories);
                    169:     print $a;
1.11      harris41  170: }
1.15      harris41  171: elsif ($mode eq "build") {
                    172:     @directories=&determine_directory_structure;
                    173:     $a=&make_files_build_segment(\@directories);
                    174:     print $a;
                    175: }
1.11      harris41  176: 
                    177: # ------------------------------------------------------ a list of file targets
                    178: sub make_file_list {
                    179:     my ($dirs)=@_;
                    180:     my $description;
                    181:     my @allfiles=keys %{$info{'LOCATION'}{$distribution}};
                    182:     foreach my $d (@$dirs) {
                    183: 	# set other values
                    184: 	my $dirdescription=$info{'DIRECTORY'}{$distribution}{$d}{'DESCRIPTION'};
                    185: 	$dirdescription="(" . $dirdescription . ")" if $dirdescription;
                    186: 	# find files that are contained in this directory
                    187: 	my @files;
                    188: 	my @filesfull;
                    189: 	foreach my $f (@allfiles) {
                    190: 	    if ($f=~/^$d\/([^\/]+)$/) {
                    191: 		push @files,$1;
                    192: 		push @filesfull,$f;
                    193: 	    }
                    194: 	}
                    195: 	# render starting HTML formatting elements
                    196: 	if (@files) {
                    197:         }
1.12      harris41  198: 	my $pwd=`pwd`; chop $pwd;
1.11      harris41  199: 	if (@files) {
                    200:             foreach my $i (0..$#files) {
                    201: 		my $category=$info{'LOCATION'}{$distribution}{$filesfull[$i]}{'CATEGORY'};
                    202: 		my $chown=$info{'OWNERSHIP'}{$category}{'CHOWN'};
                    203: 		my $chmod=$info{'OWNERSHIP'}{$category}{'CHMOD'};
                    204: 		my $devchown=$info{'DEVOWNERSHIP'}{$category}{'CHOWN'};
                    205: 		my $devchmod=$info{'DEVOWNERSHIP'}{$category}{'CHMOD'};
                    206: 		my $source=$info{'LOCATION'}{$distribution}{$filesfull[$i]}{'SOURCE'};
                    207: 		my $rot="/".$filesfull[$i];
                    208: 		if ($rot=~/\*/) {
                    209: 		    $rot=~s/[^\/]+$// if $rot=~/\*/;
                    210: 		    my $listing=$info{'LOCATION'}{$distribution}{$filesfull[$i]}{'FILES'};
                    211: 		    chop $listing;
                    212: 		    my @list=split(/\s+/,$listing);
                    213: 		    my $rot2;
                    214: 		    foreach my $l (@list) {
                    215: 			$l=~s/^\s*//; $l=~s/\s*$//;
1.12      harris41  216: 			$rot2.="BinaryRoot$rot$l\n" if length($l);
1.11      harris41  217: 		    }
                    218: 		    chop $rot2;
                    219: 		    $rot=$rot2;
1.12      harris41  220: 		}
                    221: 		else {
                    222: 		    $rot="BinaryRoot$rot";
1.11      harris41  223: 		}
1.13      harris41  224: 		if ($category eq "conf") {
                    225: 		    $rot.=" # config";
                    226: 		}
1.11      harris41  227: 		$description.=<<END;
                    228: $rot
                    229: END
                    230: 	    }
                    231: 	}
                    232:     }
                    233:     $description.=<<END;
                    234: 
                    235: END
                    236:     return $description;
                    237: }
                    238: 
                    239: # --------------------------------- Commands to make BinaryRoot directories
                    240: sub make_directory_binaryroot_segment {
                    241:     my ($dirs)=@_;
                    242:     my $description=<<END;
                    243: directories:
                    244: END
                    245:     foreach my $d (@$dirs) {
                    246: 	my $category=$info{'DIRECTORY'}{$distribution}{$d}{'CATEGORY'};
                    247: 	my $chown=$info{'OWNERSHIP'}{$category}{'CHOWN'};
                    248: 	my $chmod=$info{'OWNERSHIP'}{$category}{'CHMOD'};
                    249: 	my $devchown=$info{'DEVOWNERSHIP'}{$category}{'CHOWN'};
                    250: 	my $devchmod=$info{'DEVOWNERSHIP'}{$category}{'CHMOD'};
                    251: 	my $own=$devchown; $own=~s/\:/\,/;
                    252: 	$description.=<<END;
                    253: \tinstall -m $devchmod -d \$(TARGET)/$d
                    254: END
                    255:     }
                    256:     $description.=<<END;
                    257: 
                    258: END
                    259:     return $description;
                    260: }
                    261: 
                    262: # --------------------------------------- Commands to make BinaryRoot files
                    263: sub make_files_binaryroot_segment {
                    264:     my ($dirs)=@_;
                    265:     my $description=<<END;
                    266: files:
                    267: END
                    268:     my @allfiles=keys %{$info{'LOCATION'}{$distribution}};
                    269:     foreach my $d (@$dirs) {
                    270: 	# set other values
                    271: 	my $dirdescription=$info{'DIRECTORY'}{$distribution}{$d}{'DESCRIPTION'};
                    272: 	$dirdescription="(" . $dirdescription . ")" if $dirdescription;
                    273: 	# find files that are contained in this directory
                    274: 	my @files;
                    275: 	my @filesfull;
                    276: 	foreach my $f (@allfiles) {
                    277: 	    if ($f=~/^$d\/([^\/]+)$/) {
                    278: 		push @files,$1;
                    279: 		push @filesfull,$f;
                    280: 	    }
                    281: 	}
                    282: 	# render starting HTML formatting elements
                    283: 	if (@files) {
                    284: 	    $description.=<<END;
                    285: \t# $d $dirdescription
                    286: END
                    287:         }
                    288: 	if (@files) {
                    289:             foreach my $i (0..$#files) {
                    290: 		my $category=$info{'LOCATION'}{$distribution}{$filesfull[$i]}{'CATEGORY'};
                    291: 		my $chown=$info{'OWNERSHIP'}{$category}{'CHOWN'};
                    292: 		my $chmod=$info{'OWNERSHIP'}{$category}{'CHMOD'};
                    293: 		my $devchown=$info{'DEVOWNERSHIP'}{$category}{'CHOWN'};
                    294: 		my $devchmod=$info{'DEVOWNERSHIP'}{$category}{'CHMOD'};
                    295: 		my $source=$info{'LOCATION'}{$distribution}{$filesfull[$i]}{'SOURCE'};
                    296: 		my $rot=$filesfull[$i];
                    297: 		$rot=~s/[^\/]+$/\./ if $rot=~/\*/;
                    298: 		$description.=<<END if $category ne 'symbolic link';
                    299: \tinstall -m $devchmod \$(SOURCE)/$source \$(TARGET)/$rot
                    300: END
                    301: 	    }
                    302: 	}
                    303:     }
                    304:     $description.=<<END;
                    305: 
                    306: END
                    307:     return $description;
                    308: }
                    309: 
                    310: # ------------------------------ Commands to make BinaryRoot symbolic links
                    311: sub make_links_binaryroot_segment {
                    312:     my ($dirs)=@_;
                    313:     my $description=<<END;
                    314: links:
                    315: END
                    316:     my @allfiles=keys %{$info{'LOCATION'}{$distribution}};
                    317:     foreach my $d (@$dirs) {
                    318: 	# find files that are contained in this directory
                    319: 	my @files;
                    320: 	my @filesfull;
                    321: 	foreach my $f (@allfiles) {
                    322: 	    if ($f=~/^$d\/([^\/]+)$/) {
                    323: 		push @files,$1;
                    324: 		push @filesfull,$f;
                    325: 	    }
                    326: 	}
                    327: 	# render starting HTML formatting elements
                    328: 	if (@files) {
                    329:             foreach my $i (0..$#files) {
                    330: 		my $category=$info{'LOCATION'}{$distribution}{$filesfull[$i]}{'CATEGORY'};
                    331: 		my $linkto=$info{'LOCATION'}{$distribution}{$filesfull[$i]}{'LINKTO'};
                    332: 		my $chown=$info{'OWNERSHIP'}{$category}{'CHOWN'};
                    333: 		my $chmod=$info{'OWNERSHIP'}{$category}{'CHMOD'};
                    334: 		my $devchown=$info{'DEVOWNERSHIP'}{$category}{'CHOWN'};
                    335: 		my $devchmod=$info{'DEVOWNERSHIP'}{$category}{'CHMOD'};
                    336: 		$description.=<<END if $category eq 'symbolic link';
                    337: \tln -s /$linkto \$(TARGET)/$filesfull[$i]
                    338: END
                    339: 	    }
                    340: 	}
                    341:     }
                    342:     $description.=<<END;
                    343: 
                    344: END
                    345:     return $description;
1.10      harris41  346: }
                    347: 
1.14      harris41  348: # ------ Installation commands for a Makefile used only by a rpm -ba invocation
                    349: sub make_directory_LCMakefile_segment {
                    350:     my ($dirs)=@_;
                    351:     my $description=<<END;
                    352: directories:
                    353: END
                    354:     foreach my $d (@$dirs) {
                    355: 	my $category=$info{'DIRECTORY'}{$distribution}{$d}{'CATEGORY'};
                    356: 	my $chown=$info{'OWNERSHIP'}{$category}{'CHOWN'};
                    357: 	my $chmod=$info{'OWNERSHIP'}{$category}{'CHMOD'};
                    358: 	my $devchown=$info{'DEVOWNERSHIP'}{$category}{'CHOWN'};
                    359: 	my $devchmod=$info{'DEVOWNERSHIP'}{$category}{'CHMOD'};
                    360: 	my $own=$devchown; $own=~s/\:/\,/;
                    361: 	$description.=<<END;
                    362: \tinstall -m $devchmod -d \$(SOURCE)/$d \$(ROOT)/$d
                    363: END
                    364:     }
                    365:     $description.=<<END;
                    366: 
                    367: END
                    368:     return $description;
                    369: }
                    370: 
                    371: # ------ Installation commands for a Makefile used only by a rpm -ba invocation
                    372: sub make_files_LCMakefile_segment {
                    373:     my ($dirs)=@_;
                    374:     my $description=<<END;
                    375: files:
                    376: END
                    377:     my @allfiles=keys %{$info{'LOCATION'}{$distribution}};
                    378:     foreach my $d (@$dirs) {
                    379: 	# set other values
                    380: 	my $dirdescription=$info{'DIRECTORY'}{$distribution}{$d}{'DESCRIPTION'};
                    381: 	$dirdescription="(" . $dirdescription . ")" if $dirdescription;
                    382: 	# find files that are contained in this directory
                    383: 	my @files;
                    384: 	my @filesfull;
                    385: 	foreach my $f (@allfiles) {
                    386: 	    if ($f=~/^$d\/([^\/]+)$/) {
                    387: 		push @files,$1;
                    388: 		push @filesfull,$f;
                    389: 	    }
                    390: 	}
                    391: 	# render starting HTML formatting elements
                    392: 	if (@files) {
                    393: 	    $description.=<<END;
                    394: \t# $d $dirdescription
                    395: END
                    396:         }
                    397: 	if (@files) {
                    398:             foreach my $i (0..$#files) {
                    399: 		my $category=$info{'LOCATION'}{$distribution}{$filesfull[$i]}{'CATEGORY'};
                    400: 		my $chown=$info{'OWNERSHIP'}{$category}{'CHOWN'};
                    401: 		my $chmod=$info{'OWNERSHIP'}{$category}{'CHMOD'};
                    402: 		my $devchown=$info{'DEVOWNERSHIP'}{$category}{'CHOWN'};
                    403: 		my $devchmod=$info{'DEVOWNERSHIP'}{$category}{'CHMOD'};
                    404: 		my $rot=$filesfull[$i];
                    405: 		$rot=~s/[^\/]+$/\./ if $rot=~/\*/;
                    406: 		$description.=<<END if $category ne 'symbolic link';
                    407: \tinstall -m $devchmod \$(SOURCE)/$filesfull[$i] \$(ROOT)/$rot
                    408: END
                    409: 	    }
                    410: 	}
                    411:     }
                    412:     $description.=<<END;
                    413: 
                    414: END
                    415:     return $description;
                    416: }
                    417: 
                    418: # ------ Installation commands for a Makefile used only by a rpm -ba invocation
                    419: sub make_links_LCMakefile_segment {
                    420:     my ($dirs)=@_;
                    421:     my $description=<<END;
                    422: links:
                    423: END
                    424:     my @allfiles=keys %{$info{'LOCATION'}{$distribution}};
                    425:     foreach my $d (@$dirs) {
                    426: 	# find files that are contained in this directory
                    427: 	my @files;
                    428: 	my @filesfull;
                    429: 	foreach my $f (@allfiles) {
                    430: 	    if ($f=~/^$d\/([^\/]+)$/) {
                    431: 		push @files,$1;
                    432: 		push @filesfull,$f;
                    433: 	    }
                    434: 	}
                    435: 	# render starting HTML formatting elements
                    436: 	if (@files) {
                    437:             foreach my $i (0..$#files) {
                    438: 		my $category=$info{'LOCATION'}{$distribution}{$filesfull[$i]}{'CATEGORY'};
                    439: 		my $linkto=$info{'LOCATION'}{$distribution}{$filesfull[$i]}{'LINKTO'};
                    440: 		my $chown=$info{'OWNERSHIP'}{$category}{'CHOWN'};
                    441: 		my $chmod=$info{'OWNERSHIP'}{$category}{'CHMOD'};
                    442: 		my $devchown=$info{'DEVOWNERSHIP'}{$category}{'CHOWN'};
                    443: 		my $devchmod=$info{'DEVOWNERSHIP'}{$category}{'CHMOD'};
                    444: 		$description.=<<END if $category eq 'symbolic link';
                    445: \tln -s /$linkto \$(ROOT)/$filesfull[$i]
                    446: END
                    447: 	    }
                    448: 	}
                    449:     }
                    450:     $description.=<<END;
                    451: 
                    452: END
                    453:     return $description;
                    454: }
                    455: 
1.10      harris41  456: # --------------------------------- Installation commands to install directories
                    457: sub make_directory_install_segment {
                    458:     my ($dirs)=@_;
                    459:     my $description=<<END;
                    460: directories:
                    461: END
                    462:     foreach my $d (@$dirs) {
                    463: 	my $category=$info{'DIRECTORY'}{$distribution}{$d}{'CATEGORY'};
1.14      harris41  464: 	my $source=$info{'LOCATION'}{$distribution}{$filesfull[$i]}{'SOURCE'};
1.10      harris41  465: 	my $chown=$info{'OWNERSHIP'}{$category}{'CHOWN'};
                    466: 	my $chmod=$info{'OWNERSHIP'}{$category}{'CHMOD'};
                    467: 	my $devchown=$info{'DEVOWNERSHIP'}{$category}{'CHOWN'};
                    468: 	my $devchmod=$info{'DEVOWNERSHIP'}{$category}{'CHMOD'};
1.16      harris41  469: 	my ($owner,$group)=split(/\:/,$devchown);
1.10      harris41  470: 	my $own=$devchown; $own=~s/\:/\,/;
                    471: 	$description.=<<END;
1.16      harris41  472: \tinstall -o $owner -g $group -m $devchmod -d \$(TARGET)/$d
1.10      harris41  473: END
                    474:     }
                    475:     $description.=<<END;
                    476: 
                    477: END
                    478:     return $description;
                    479: }
                    480: 
1.15      harris41  481: # ------------------------------------------------------ Commands to build files
                    482: sub make_files_build_segment {
                    483:     my ($dirs)=@_;
                    484:     my $description;
                    485:     my @allfiles=keys %{$info{'LOCATION'}{$distribution}};
                    486:     my $tab="\t";
                    487:     my $sources="all: ";
                    488:     foreach my $d (@$dirs) {
                    489: 	# set other values
                    490: 	my $dirdescription=$info{'DIRECTORY'}{$distribution}{$d}{'DESCRIPTION'};
                    491: 	$dirdescription="(" . $dirdescription . ")" if $dirdescription;
                    492: 	# find files that are contained in this directory
                    493: 	my @files;
                    494: 	my @filesfull;
                    495: 	foreach my $f (@allfiles) {
                    496: 	    if ($f=~/^$d\/([^\/]+)$/) {
                    497: 		push @files,$1;
                    498: 		push @filesfull,$f;
                    499: 	    }
                    500: 	}
                    501: 	if (@files) {
                    502:             foreach my $i (0..$#files) {
                    503: 		# if has build information, output appropriate something
                    504: 		my $build=$info{'LOCATION'}{$distribution}{$filesfull[$i]}{'BUILD'};
                    505: 		my $source=$info{'LOCATION'}{$distribution}{$filesfull[$i]}{'SOURCE'};
                    506: 		$build=~s/^\s+//; $build=~s/\s+$//;
                    507: 		if ($build) {
                    508: 		    my $dependencies=$info{'LOCATION'}{$distribution}{$filesfull[$i]}{'DEPENDENCIES'};
                    509: 		    my $source2=$source;
                    510: 		    $source2=~s/^[^\/]+\///;
                    511:  		    $source2="../" . $source2;
                    512: 		    $sources.="$source2 ";
                    513: 		    my $directory=$build;
                    514: 		    $directory=~s/^[^\/]+\///;
                    515: 		    $directory=~s/([^\/]+)$//;
                    516:  		    $directory="../" . $directory;
                    517: 		    my $buildfile=$1;
                    518: 		    my $sdir=$source;
                    519: 		    $sdir=~s/^[^\/]+\///;
                    520: 		    $sdir=~s/([^\/]+)$//;
                    521:  		    $sdir="../" . $sdir;
                    522: 		    $dependencies=~s/\s+$//;
                    523: 		    my $depstat="";
                    524: 		    if ($dependencies=~s/\s+\[ALWAYS_RUN_BUILD_COMMAND\]//) {
                    525: 			$depstat=" alwaysrun";
                    526: 		    }
                    527: 		    $dependencies=~s/\s+/ $sdir/gs;
                    528: 		    $description.=<<END;
                    529: $source2: $dependencies$depstat
                    530: ${tab}cd $directory; sh ./$buildfile
                    531: 
                    532: END
                    533: 		}
                    534: 		my $category=$info{'LOCATION'}{$distribution}{$filesfull[$i]}{'CATEGORY'};
                    535: 		my $source=$info{'LOCATION'}{$distribution}{$filesfull[$i]}{'SOURCE'};
                    536: 		my $chown=$info{'OWNERSHIP'}{$category}{'CHOWN'};
                    537: 		my $chmod=$info{'OWNERSHIP'}{$category}{'CHMOD'};
                    538: 		my $devchown=$info{'DEVOWNERSHIP'}{$category}{'CHOWN'};
                    539: 		my $devchmod=$info{'DEVOWNERSHIP'}{$category}{'CHMOD'};
                    540: 		my $rot=$filesfull[$i];
                    541: 		$rot=~s/[^\/]+$/\./ if $rot=~/\*/;
                    542: #		$description.=<<END if $category ne 'symbolic link';
1.16      harris41  543: #\tinstall -o $owner -g $group -m $devchmod \$(SOURCE)/$source \$(TARGET)/$rot
1.15      harris41  544: #END
                    545: 	    }
                    546: 	}
                    547:     }
                    548:     $description.=<<END;
                    549: alwaysrun:
                    550: 
                    551: END
                    552:     $sources.="\n\n";
                    553:     return ($sources . $description);
                    554: }
                    555: 
1.10      harris41  556: # --------------------------------------- Installation commands to install files
                    557: sub make_files_install_segment {
                    558:     my ($dirs)=@_;
                    559:     my $description=<<END;
                    560: files:
                    561: END
                    562:     my @allfiles=keys %{$info{'LOCATION'}{$distribution}};
                    563:     foreach my $d (@$dirs) {
                    564: 	# set other values
                    565: 	my $dirdescription=$info{'DIRECTORY'}{$distribution}{$d}{'DESCRIPTION'};
                    566: 	$dirdescription="(" . $dirdescription . ")" if $dirdescription;
                    567: 	# find files that are contained in this directory
                    568: 	my @files;
                    569: 	my @filesfull;
                    570: 	foreach my $f (@allfiles) {
                    571: 	    if ($f=~/^$d\/([^\/]+)$/) {
                    572: 		push @files,$1;
                    573: 		push @filesfull,$f;
                    574: 	    }
                    575: 	}
                    576: 	# render starting HTML formatting elements
                    577: 	if (@files) {
                    578: 	    $description.=<<END;
                    579: \t# $d $dirdescription
                    580: END
                    581:         }
                    582: 	if (@files) {
                    583:             foreach my $i (0..$#files) {
                    584: 		my $category=$info{'LOCATION'}{$distribution}{$filesfull[$i]}{'CATEGORY'};
1.14      harris41  585: 		my $source=$info{'LOCATION'}{$distribution}{$filesfull[$i]}{'SOURCE'};
1.10      harris41  586: 		my $chown=$info{'OWNERSHIP'}{$category}{'CHOWN'};
                    587: 		my $chmod=$info{'OWNERSHIP'}{$category}{'CHMOD'};
                    588: 		my $devchown=$info{'DEVOWNERSHIP'}{$category}{'CHOWN'};
                    589: 		my $devchmod=$info{'DEVOWNERSHIP'}{$category}{'CHMOD'};
                    590: 		my $rot=$filesfull[$i];
                    591: 		$rot=~s/[^\/]+$/\./ if $rot=~/\*/;
1.16      harris41  592: 		my ($owner,$group)=split(/\:/,$devchown);
1.15      harris41  593: 		if ($category ne 'conf') {
                    594: 		    $description.=<<END if $category ne 'symbolic link';
1.16      harris41  595: \tinstall -o $owner -g $group -m $devchmod \$(SOURCE)/$source \$(TARGET)/$rot
                    596: END
                    597:                 }
                    598: 	    }
                    599: 	}
                    600:     }
                    601:     $description.=<<END;
                    602: 
                    603: END
                    604:     return $description;
                    605: }
                    606: 
                    607: # ------ Installation commands to install configuration files (and make backups)
                    608: sub make_files_configinstall_segment {
                    609:     my ($dirs)=@_;
                    610:     my $description=<<END;
                    611: configfiles:
                    612: END
                    613:     my @allfiles=keys %{$info{'LOCATION'}{$distribution}};
                    614:     foreach my $d (@$dirs) {
                    615: 	# set other values
                    616: 	my $dirdescription=$info{'DIRECTORY'}{$distribution}{$d}{'DESCRIPTION'};
                    617: 	$dirdescription="(" . $dirdescription . ")" if $dirdescription;
                    618: 	# find files that are contained in this directory
                    619: 	my @files;
                    620: 	my @filesfull;
                    621: 	foreach my $f (@allfiles) {
                    622: 	    if ($f=~/^$d\/([^\/]+)$/) {
                    623: 		push @files,$1;
                    624: 		push @filesfull,$f;
                    625: 	    }
                    626: 	}
                    627: 	# render starting HTML formatting elements
                    628: 	if (@files) {
                    629: 	    $description.=<<END;
                    630: \t# $d $dirdescription
                    631: END
                    632:         }
                    633: 	if (@files) {
                    634:             foreach my $i (0..$#files) {
                    635: 		my $category=$info{'LOCATION'}{$distribution}{$filesfull[$i]}{'CATEGORY'};
                    636: 		my $source=$info{'LOCATION'}{$distribution}{$filesfull[$i]}{'SOURCE'};
                    637: 		my $chown=$info{'OWNERSHIP'}{$category}{'CHOWN'};
                    638: 		my $chmod=$info{'OWNERSHIP'}{$category}{'CHMOD'};
                    639: 		my $devchown=$info{'DEVOWNERSHIP'}{$category}{'CHOWN'};
                    640: 		my $devchmod=$info{'DEVOWNERSHIP'}{$category}{'CHMOD'};
                    641: 		my $rot=$filesfull[$i];
                    642: 		$rot=~s/[^\/]+$/\./ if $rot=~/\*/;
                    643: 		my ($owner,$group)=split(/\:/,$devchown);
                    644: 		if ($category eq 'conf') {
                    645: 		    $description.=<<END;
                    646: \tinstall -b -S `date +'.\%Y\%m\%d\%H\%M\%S'` -o $owner -g $group -m $devchmod \$(SOURCE)/$source \$(TARGET)/$rot
1.17    ! harris41  647: END
        !           648:                 }
        !           649: 	    }
        !           650: 	}
        !           651:     }
        !           652:     $description.=<<END;
        !           653: 
        !           654: END
        !           655:     return $description;
        !           656: }
        !           657: 
        !           658: # ------ Commands to enforce configuration file permissions
        !           659: sub make_files_configpermissions_segment {
        !           660:     my ($dirs)=@_;
        !           661:     my $description=<<END;
        !           662: configpermissions:
        !           663: END
        !           664:     my @allfiles=keys %{$info{'LOCATION'}{$distribution}};
        !           665:     foreach my $d (@$dirs) {
        !           666: 	# set other values
        !           667: 	my $dirdescription=$info{'DIRECTORY'}{$distribution}{$d}{'DESCRIPTION'};
        !           668: 	$dirdescription="(" . $dirdescription . ")" if $dirdescription;
        !           669: 	# find files that are contained in this directory
        !           670: 	my @files;
        !           671: 	my @filesfull;
        !           672: 	foreach my $f (@allfiles) {
        !           673: 	    if ($f=~/^$d\/([^\/]+)$/) {
        !           674: 		push @files,$1;
        !           675: 		push @filesfull,$f;
        !           676: 	    }
        !           677: 	}
        !           678: 	# render starting HTML formatting elements
        !           679: 	if (@files) {
        !           680: 	    $description.=<<END;
        !           681: \t# $d $dirdescription
        !           682: END
        !           683:         }
        !           684: 	if (@files) {
        !           685:             foreach my $i (0..$#files) {
        !           686: 		my $category=$info{'LOCATION'}{$distribution}{$filesfull[$i]}{'CATEGORY'};
        !           687: 		my $source=$info{'LOCATION'}{$distribution}{$filesfull[$i]}{'SOURCE'};
        !           688: 		my $chown=$info{'OWNERSHIP'}{$category}{'CHOWN'};
        !           689: 		my $chmod=$info{'OWNERSHIP'}{$category}{'CHMOD'};
        !           690: 		my $devchown=$info{'DEVOWNERSHIP'}{$category}{'CHOWN'};
        !           691: 		my $devchmod=$info{'DEVOWNERSHIP'}{$category}{'CHMOD'};
        !           692: 		my $rot=$filesfull[$i];
        !           693: 		$rot=~s/[^\/]+$/\./ if $rot=~/\*/;
        !           694: 		my ($owner,$group)=split(/\:/,$devchown);
        !           695: 		if ($category eq 'conf') {
        !           696: 		    $description.=<<END;
        !           697: \tchmod $devchmod \$(TARGET)/$rot
        !           698: \tchown $devchown \$(TARGET)/$rot
1.10      harris41  699: END
1.15      harris41  700:                 }
1.10      harris41  701: 	    }
                    702: 	}
                    703:     }
                    704:     $description.=<<END;
                    705: 
                    706: END
                    707:     return $description;
                    708: }
                    709: 
                    710: # ------------------------------ Installation commands to install symbolic links
                    711: sub make_links_install_segment {
                    712:     my ($dirs)=@_;
                    713:     my $description=<<END;
                    714: links:
                    715: END
1.16      harris41  716:     chop $description;
                    717:     my $description2;
1.10      harris41  718:     my @allfiles=keys %{$info{'LOCATION'}{$distribution}};
                    719:     foreach my $d (@$dirs) {
                    720: 	# find files that are contained in this directory
                    721: 	my @files;
                    722: 	my @filesfull;
                    723: 	foreach my $f (@allfiles) {
                    724: 	    if ($f=~/^$d\/([^\/]+)$/) {
                    725: 		push @files,$1;
                    726: 		push @filesfull,$f;
                    727: 	    }
                    728: 	}
                    729: 	# render starting HTML formatting elements
                    730: 	if (@files) {
                    731:             foreach my $i (0..$#files) {
                    732: 		my $category=$info{'LOCATION'}{$distribution}{$filesfull[$i]}{'CATEGORY'};
                    733: 		my $linkto=$info{'LOCATION'}{$distribution}{$filesfull[$i]}{'LINKTO'};
                    734: 		my $chown=$info{'OWNERSHIP'}{$category}{'CHOWN'};
                    735: 		my $chmod=$info{'OWNERSHIP'}{$category}{'CHMOD'};
                    736: 		my $devchown=$info{'DEVOWNERSHIP'}{$category}{'CHOWN'};
                    737: 		my $devchmod=$info{'DEVOWNERSHIP'}{$category}{'CHMOD'};
1.16      harris41  738: 		if ($category eq 'symbolic link') {
                    739: 		    $description.=" \$(TARGET)/$filesfull[$i]";
                    740: 		    $description2.=<<END;
                    741: \$(TARGET)/$filesfull[$i]:
1.14      harris41  742: \tln -s /$linkto \$(TARGET)/$filesfull[$i]
1.16      harris41  743: 
1.10      harris41  744: END
1.16      harris41  745:                 }
1.10      harris41  746: 	    }
                    747: 	}
                    748:     }
                    749:     $description.=<<END;
1.4       harris41  750: 
1.10      harris41  751: END
1.16      harris41  752:     $description.=$description2;
1.10      harris41  753:     return $description;
                    754: }
                    755: 
                    756: # --------------------------------------------------------- Make RPM .spec block
                    757: sub make_rpm_spec_block {
                    758:     my $pwd=`pwd`; chop $pwd;
                    759:     my $buildroot="$pwd/LON-CAPA-BuildRoot";
                    760:     my $source=$info{'RPM'}{'Name'} . "-" . $info{'RPM'}{'Version'} . '.tar.gz';
                    761:     my $description=<<END;
                    762: Summary: $info{'RPM'}{'Summary'}
                    763: Name: $info{'RPM'}{'Name'}
                    764: Version: $info{'RPM'}{'Version'}
                    765: Release: $info{'RPM'}{'Release'}
                    766: Vendor: $info{'RPM'}{'Vendor'} 
                    767: BuildRoot: $buildroot
                    768: Copyright: $info{'RPM'}{'Copyright'}
                    769: Group: $info{'RPM'}{'Group'}
                    770: Source: $source
                    771: AutoReqProv: $info{'RPM'}{'AutoReqProv'}
                    772: \%description
                    773: $info{'RPM'}{'description'}
                    774: 
                    775: END
                    776:     return $description;
                    777: }
                    778: 
                    779: # --------------------------------------------------- Make RPM build .spec block
                    780: sub make_rpm_build_block {
                    781:     my $pwd=`pwd`; chop $pwd;
                    782:     my $buildroot="$pwd/LON-CAPA-BuildRoot";
                    783:     my $sourceroot="$pwd/LON-CAPA-SourceRoot";
                    784:     my $description=<<END;
                    785: 
                    786: \%prep
                    787: \%setup
                    788: 
                    789: \%build
                    790: rm -Rf "$buildroot"
                    791: 
                    792: \%install
                    793: make -f LCMakefile ROOT="\$RPM_BUILD_ROOT" SOURCE="$sourceroot" directories
                    794: make -f LCMakefile ROOT="\$RPM_BUILD_ROOT" SOURCE="$sourceroot" files
                    795: make -f LCMakefile ROOT="\$RPM_BUILD_ROOT" SOURCE="$sourceroot" links
                    796: 
                    797: \%pre
                    798: $info{'RPM'}{'pre'}
                    799: 
                    800: \%post
                    801: \%postun
                    802: 
                    803: \%files
                    804: # \%doc README COPYING ChangeLog LICENSE
                    805: END
                    806:     return $description;
                    807: }
                    808: 
                    809: # ------------------------------------- Make directory structure RPM .spec block
                    810: sub make_directory_structure_spec_block {
                    811:     my ($dirs)=@_;
                    812:     foreach my $d (@$dirs) {
                    813: 	my $category=$info{'DIRECTORY'}{$distribution}{$d}{'CATEGORY'};
                    814: 	my $chown=$info{'OWNERSHIP'}{$category}{'CHOWN'};
                    815: 	my $chmod=$info{'OWNERSHIP'}{$category}{'CHMOD'};
                    816: 	my $devchown=$info{'DEVOWNERSHIP'}{$category}{'CHOWN'};
                    817: 	my $devchmod=$info{'DEVOWNERSHIP'}{$category}{'CHMOD'};
                    818: 	my $own=$devchown; $own=~s/\:/\,/;
                    819: 	$description.=<<END;
                    820: \%dir \%attr($devchmod,$own) /$d
                    821: END
                    822:     }
                    823:     return $description;
                    824: }
                    825: 
                    826: # ---------------------------- Make directory and file structure RPM .spec block
                    827: sub make_directory_and_file_structure_spec_block {
                    828:     my ($dirs)=@_;
                    829:     my @allfiles=keys %{$info{'LOCATION'}{$distribution}};
                    830:     foreach my $d (@$dirs) {
                    831: 	# set other values
                    832: 	my $dirdescription=$info{'DIRECTORY'}{$distribution}{$d}{'DESCRIPTION'};
                    833: 	$dirdescription="(" . $dirdescription . ")" if $dirdescription;
                    834: 	# find files that are contained in this directory
                    835: 	my @files;
                    836: 	my @filesfull;
                    837: 	foreach my $f (@allfiles) {
                    838: 	    if ($f=~/^$d\/([^\/]+)$/) {
                    839: 		push @files,$1;
                    840: 		push @filesfull,$f;
                    841: 	    }
                    842: 	}
                    843: 	# render starting HTML formatting elements
                    844: 	if (@files) {
                    845: 	    $description.=<<END;
                    846: # $d $dirdescription
                    847: END
                    848:         }
                    849: 	if (@files) {
                    850:             foreach my $i (0..$#files) {
                    851: 		my $category=$info{'LOCATION'}{$distribution}{$filesfull[$i]}{'CATEGORY'};
                    852: 		my $chown=$info{'OWNERSHIP'}{$category}{'CHOWN'};
                    853: 		my $chmod=$info{'OWNERSHIP'}{$category}{'CHMOD'};
                    854: 		my $devchown=$info{'DEVOWNERSHIP'}{$category}{'CHOWN'};
                    855: 		my $devchmod=$info{'DEVOWNERSHIP'}{$category}{'CHMOD'};
                    856: 		my $own=$devchown; $own=~s/\:/\,/;
                    857: 		my $config="";
                    858: 		$config="\%config " if $category eq 'conf';
                    859: 		$devchmod='-' if $category eq 'symbolic link';
                    860: 		$description.=<<END;
                    861: $config\%attr($devchmod,$own) /$filesfull[$i]
                    862: END
                    863: 	    }
                    864: 	}
                    865:     }
                    866:     return $description;
                    867: }
                    868: 
                    869: # ----------------------------------------------------------- End RPM .spec page
                    870: sub end_spec_page {
                    871: }
                    872: 
                    873: # ------------------------------------------------------- Begin description page
1.4       harris41  874: sub begin_description_page {
                    875:     my $description=<<END;
                    876: <HTML>
                    877: <HEAD>
                    878: <TITLE>LON-CAPA Software Description Page ($distribution, $date)</TITLE>
                    879: </HEAD>
                    880: <BODY>
                    881: <FONT SIZE=+2>LON-CAPA Software Description Page ($distribution, $date)</FONT>
                    882: <BR>Michigan State University
                    883: <BR>Learning Online with CAPA
                    884: <BR>Contact korte\@lon-capa.org
                    885: <UL>
                    886: <LI>About this file
                    887: <LI>Software Package Description
                    888: <LI>Directory Structure
1.7       harris41  889: <LI>File Type Ownership and Permissions
1.4       harris41  890: <LI>File and Directory Structure
                    891: </UL>
                    892: <FONT SIZE=+2>About this file</FONT>
                    893: <P>
                    894: This file is generated dynamically by <TT>parse.pl</TT> as
                    895: part of a development compilation process.  See 
                    896: http://install.lon-capa.org/compile/index.html for more
                    897: information.
                    898: </P>
                    899: END
                    900:     return $description;
                    901: }
                    902: 
                    903: # ------------------------------------------------- End description page
                    904: sub end_description_page {
                    905:     my $description=<<END;
                    906: <HR>
1.5       harris41  907: <FONT SIZE=-1>LON-CAPA Software Development Team</FONT>
1.4       harris41  908: </BODY>
                    909: </HTML>
                    910: END
                    911:     return $description;
                    912: }
                    913: 
                    914: # ------------------------------------------------- Make RPM description block
                    915: sub make_rpm_description_block {
                    916:     my $description=<<END;
                    917: <FONT SIZE=+2>Rolled in a RedHat 6.2 RPM, $date</FONT>
                    918: <P>
                    919: <TABLE BGCOLOR=#FFFFFF BORDER=0 CELLPADDING=10 CELLSPACING=0>
                    920: <TR><TD>
                    921: <PRE>
                    922: Name        : $info{'RPM'}{'Name'}
                    923: Version     : $info{'RPM'}{'Version'}
                    924: Vendor      : $info{'RPM'}{'Vendor'} 
                    925: Release     : $info{'RPM'}{'Release'}                             
                    926: Build Host  : $buildhost
                    927: Group       : $info{'RPM'}{'Group'}
                    928: License     : $info{'RPM'}{'Copyright'}
                    929: Summary     : $info{'RPM'}{'Summary'}
                    930: Description : 
                    931: $info{'RPM'}{'description'}
                    932: </PRE>
                    933: </TD></TR>
                    934: </TABLE>
                    935: </P>
                    936: END
                    937:     return $description;
                    938: }
                    939: 
                    940: # ----------------------------------------------- Determine directory structure
                    941: sub determine_directory_structure {
                    942:     my @directories=keys %{$info{'DIRECTORY'}{$distribution}};
                    943:     return (sort @directories);
                    944: }
1.1       harris41  945: 
1.4       harris41  946: 
                    947: # ---------------------------------- Make directory structure description block
                    948: sub make_directory_structure_description_block {
                    949:     my ($dirs)=@_;
                    950:     my $description=<<END;
                    951: <FONT SIZE=+2>Directory Structure Description, $date</FONT>
                    952: <P>
1.9       harris41  953: The directory structure description below shows only those
                    954: directories which either contain LON-CAPA specific files
                    955: or normally do not exist on a RedHat Linux system (and
                    956: must be generated to allow proper placement of files
                    957: during LON-CAPA run-time operation).
                    958: </P>
                    959: <P>
1.4       harris41  960: <TABLE BORDER=1 CELLPADDING=3 CELLSPACING=0>
                    961: END
                    962:     my $maxcount=0;
1.8       harris41  963:     my @allfiles=keys %{$info{'LOCATION'}{$distribution}};
                    964:     my %diraccount; # hash to track which directories are accounted for
                    965:     foreach my $file (@allfiles) {
                    966: 	$file=~/^(.*)\/([^\/]+)$/;
                    967: 	$diraccount{$1}=1;
                    968:     }
1.4       harris41  969:     foreach my $d (@$dirs) {
                    970:         my (@matches)=($d=~/\//g);
                    971: 	my $count=scalar(@matches);
                    972: 	$maxcount=$count if $count>$maxcount;
1.8       harris41  973: 	delete $diraccount{$d};
1.4       harris41  974:     }
                    975:     $description.=<<END;
                    976: <TR>
                    977: <TH ALIGN=LEFT BGCOLOR=#FFFFFF>Category</TH>
                    978: <TH ALIGN=LEFT BGCOLOR=#FFFFFF>Permissions</TH>
                    979: <TH ALIGN=LEFT BGCOLOR=#FFFFFF><FONT COLOR=#FF0000>Development<BR>Permissions</FONT></TH>
                    980: END
                    981:     $description.="<TH ALIGN=LEFT BGCOLOR=#FFFFFF COLSPAN=".($maxcount+1).">Directory Path</TH>\n";
1.8       harris41  982:     if (keys %diraccount) {
                    983: 	$description.= "<TR><TD ALIGN=LEFT BGCOLOR=#FFFFFF COLSPAN=".($maxcount+4)."><I><PRE>Directories that are unaccounted for: \n";
                    984: 	foreach my $d (keys %diraccount) {
                    985: 	    $description.="$d\n";
                    986: 	}
                    987: 	$description.="</PRE></I></TH></TR>\n";
                    988:     }
1.4       harris41  989:     foreach my $d (@$dirs) {
                    990: 	my $dtable=$d;
                    991: 	$dtable=~s/\//\<\/TD\>\<TD\>/g;
                    992: 	my $category=$info{'DIRECTORY'}{$distribution}{$d}{'CATEGORY'};
                    993: 	my $chown=$info{'OWNERSHIP'}{$category}{'CHOWN'};
                    994: 	my $chmod=$info{'OWNERSHIP'}{$category}{'CHMOD'};
                    995: 	my $devchown=$info{'DEVOWNERSHIP'}{$category}{'CHOWN'};
                    996: 	my $devchmod=$info{'DEVOWNERSHIP'}{$category}{'CHMOD'};
                    997: 	$description.=<<END;
                    998: <TR>
                    999: <TD BGCOLOR=#FFFFFF>$category</TD>
                   1000: <TD BGCOLOR=#FFFFFF><TT>$chmod $chown</TT></TD>
                   1001: <TD BGCOLOR=#FFFFFF><FONT COLOR=#FF0000><TT>$devchmod $devchown</TT></FONT></TD>
                   1002: <TD>
                   1003: $dtable
                   1004: </TD>
                   1005: </TR>
                   1006: END
                   1007:     }
                   1008:     $description.=<<END;
                   1009: </TABLE>
                   1010: </P>
                   1011: END
                   1012:     return $description;
                   1013: }
                   1014: 
1.6       harris41 1015: # ------------------- Make file type ownership and permissions description block
                   1016: sub make_file_type_ownership_and_permissions_description_block {
                   1017:     my $description=<<END;
                   1018: <FONT SIZE=+2>File Type Ownership and Permissions Descriptions, $date</FONT>
                   1019: <P>
                   1020: This table shows what permissions and ownership settings correspond
                   1021: to each kind of file type.
                   1022: </P>
                   1023: <P>
                   1024: <TABLE BORDER=1 CELLPADDING=5 WIDTH=60%>
                   1025: <TR>
                   1026: <TH ALIGN=LEFT BGCOLOR=#FFFFFF>Icon</TH>
                   1027: <TH ALIGN=LEFT BGCOLOR=#FFFFFF>Type</TH>
                   1028: <TH ALIGN=LEFT BGCOLOR=#FFFFFF>Permissions</TH>
                   1029: <TH ALIGN=LEFT BGCOLOR=#FFFFFF>Development Permissions</TH>
                   1030: </TR>
                   1031: END
                   1032:     foreach my $type (keys %{$info{'OWNERSHIP'}}) {
                   1033: 	if (defined($fcm{$type})) {
                   1034: 	    my $chmod=$info{'OWNERSHIP'}{$type}{'CHMOD'};
                   1035: 	    my $chown=$info{'OWNERSHIP'}{$type}{'CHOWN'};
                   1036: 	    my $devchmod=$info{'DEVOWNERSHIP'}{$type}{'CHMOD'};
                   1037: 	    my $devchown=$info{'DEVOWNERSHIP'}{$type}{'CHOWN'};
                   1038: 	    $description.=<<END;
                   1039: <TR>
                   1040: <TD><IMG SRC="$fcm{$type}.gif" ALT="$type"></TD>
                   1041: <TD>$type</TD>
                   1042: <TD><TT>$chmod $chown</TT></TD>
                   1043: <TD><TT>$devchmod $devchown</TT></TD>
                   1044: </TR>
                   1045: END
                   1046:         }
                   1047:     }
                   1048:     $description.=<<END;
                   1049: </TABLE>
                   1050: </P>
                   1051: END
                   1052: }
                   1053: 
1.4       harris41 1054: # ------------------------- Make directory and file structure description block
                   1055: sub make_directory_and_file_structure_description_block {
                   1056:     my ($dirs)=@_;
                   1057:     my $description=<<END;
                   1058: <FONT SIZE=+2>Directory and File Structure Description, $date</FONT>
1.6       harris41 1059: <P>
                   1060: The icons on the left column correspond to the file type
                   1061: specified in the second column.  The last column "Notes" shows compilation,
1.7       harris41 1062: dependency, and configuration information.  The CVS location
                   1063: shows the location of the binary source file (if applicable) needed to
                   1064: be copied to the target.  If the binary source file is not at
                   1065: the specified location, then the text is shown in 
                   1066: <FONT COLOR=#FF0000>red</FONT>.
1.6       harris41 1067: </P>
1.4       harris41 1068: <P>
1.9       harris41 1069: <TABLE BORDER=1 CELLPADDING=5 WIDTH=500>
1.4       harris41 1070: END
                   1071:     my $counter=0;
                   1072:     my @colorindex=("#80FF80","#80FFFF","#FFFF80");
1.5       harris41 1073:     my @allfiles=keys %{$info{'LOCATION'}{$distribution}};
1.4       harris41 1074:     foreach my $d (@$dirs) {
                   1075: 	# set color
                   1076: 	my $color=$colorindex[$counter%3];
                   1077: 	# set other values
                   1078: 	my $dirdescription=$info{'DIRECTORY'}{$distribution}{$d}{'DESCRIPTION'};
                   1079: 	$dirdescription="(" . $dirdescription . ")" if $dirdescription;
                   1080: 	# find subdirectories that are contained in this directory
                   1081: 	my @subdirs;
                   1082: 	foreach my $d2 (@$dirs) {
1.5       harris41 1083: 	    if ($d2=~/^$d\/([^\/]+)$/) {
1.4       harris41 1084: 		push @subdirs,$1;
                   1085: 	    }
                   1086: 	}
                   1087: 	# find files that are contained in this directory
                   1088: 	my @files;
1.5       harris41 1089: 	my @filesfull;
1.4       harris41 1090: 	foreach my $f (@allfiles) {
1.5       harris41 1091: 	    if ($f=~/^$d\/([^\/]+)$/) {
1.4       harris41 1092: 		push @files,$1;
1.5       harris41 1093: 		push @filesfull,$f;
1.4       harris41 1094: 	    }
                   1095: 	}
                   1096: 	# render starting HTML formatting elements
                   1097: 	if (@subdirs || @files) {
                   1098: 	    my $subdirstring="<BR>* Relevant subdirectories: " . join(", ",@subdirs) if @subdirs;
                   1099: 	    $description.=<<END;
1.5       harris41 1100: <TR><TD BGCOLOR=#000000 COLSPAN=6><FONT COLOR=$color><IMG SRC="directory.gif" ALT="directory">DIRECTORY -- $d $dirdescription
                   1101: $subdirstring</FONT></TD></TR>
1.4       harris41 1102: END
                   1103:         }
                   1104: 	else {
                   1105: 	    $description.=<<END;
1.5       harris41 1106: <TR><TD BGCOLOR=#000000 COLSPAN=6><FONT COLOR=$color><IMG SRC="emptydirectory.gif" ALT="empty directory">EMPTY DIRECTORY - $d $dirdescription</FONT></TD></TR>
1.4       harris41 1107: END
                   1108:         }
                   1109: 	if (@files) {
                   1110: 	    $description.=<<END;
                   1111: <TR>
1.5       harris41 1112: <TH BGCOLOR=$color ALIGN=LEFT COLSPAN=2>Type</TH>
                   1113: <TH BGCOLOR=$color ALIGN=LEFT>File Name</TH>
                   1114: <TH BGCOLOR=$color ALIGN=LEFT>Function</TH>
                   1115: <TH BGCOLOR=$color ALIGN=LEFT>CVS Location</TH>
                   1116: <TH BGCOLOR=$color ALIGN=LEFT>Notes</TH>
1.4       harris41 1117: </TR>
                   1118: END
1.5       harris41 1119:             foreach my $i (0..$#files) {
                   1120: 		my $category=$info{'LOCATION'}{$distribution}{$filesfull[$i]}{'CATEGORY'};
                   1121: 		my $fdescription=$info{'LOCATION'}{$distribution}{$filesfull[$i]}{'DESCRIPTION'};
                   1122: 		my $source=$info{'LOCATION'}{$distribution}{$filesfull[$i]}{'SOURCE'};
1.9       harris41 1123: 		my $note=$info{'LOCATION'}{$distribution}{$filesfull[$i]}{'NOTE'};
                   1124: 		$note.="<BR>" if $note;
                   1125: 		my $listing=$info{'LOCATION'}{$distribution}{$filesfull[$i]}{'FILES'};
                   1126: 		my @E=split(/\s+/,$listing);
                   1127: 		$source=~/(.*)\/[^\/]+$/;
                   1128: 		my $sd=$1;
                   1129: 		my $eflag=0;
                   1130: 		foreach my $e (@E) {
                   1131: 		    unless (-e "../../$sd/$e") {
                   1132: 			$e="<FONT COLOR=#FF0000>$e</FONT>";
                   1133: 			$eflag=1;
                   1134: 		    }
                   1135: 		}
                   1136: 		$listing=join("\n",@E);
                   1137: 		$listing="<B>listing</B><BR><FONT SIZE=-2>$listing</FONT>" if $listing;
                   1138: 		$listing.="<BR>" if $listing;
                   1139: 		my $build=$info{'LOCATION'}{$distribution}{$filesfull[$i]}{'BUILD'};
                   1140: 		$build="<B>build</B><BR>$build" if $build;
                   1141: 		$build.="<BR>" if $build;
                   1142: 		my $dependencies=$info{'LOCATION'}{$distribution}{$filesfull[$i]}{'DEPENDENCIES'};
                   1143: 		$dependencies="<B>dependencies</B><BR>$dependencies" if $dependencies;
                   1144: 		$dependencies.="<BR>" if $dependencies;
1.7       harris41 1145: 		unless (-e "../../$source") {
                   1146: 		    $source=~/([^\/]+)$/;
                   1147: 		    my $s=$1;
1.9       harris41 1148: 		    if ($source!~/\*/) {
                   1149: 			$source="<FONT COLOR=#FF0000>$source</FONT>";
                   1150: 		    }
                   1151: 		    elsif ($eflag) {
                   1152: 			$source="<FONT COLOR=#FF0000>$source</FONT>";
                   1153: 		    }
1.7       harris41 1154: 		}
1.5       harris41 1155: 		$description.=<<END;
                   1156: <TR>
                   1157: <TD BGCOLOR=#A0A0A0><IMG SRC="$fcm{$category}.gif" ALT="$category"></TD>
                   1158: <TD BGCOLOR=$color>$category</TD>
                   1159: <TD BGCOLOR=$color>$files[$i]</TD>
                   1160: <TD BGCOLOR=$color>$fdescription&nbsp;</TD>
                   1161: <TD BGCOLOR=$color>$source</TD>
1.9       harris41 1162: <TD BGCOLOR=$color>$note$listing$build$dependencies&nbsp;</TD>
1.4       harris41 1163: </TR>
                   1164: END
1.5       harris41 1165: 	    }
                   1166: 	}
1.4       harris41 1167: 	$counter++;
                   1168:     }
                   1169:     $description.=<<END;
                   1170: </TABLE>
                   1171: </P>
                   1172: END
                   1173:     return $description;
                   1174: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>