File:  [LON-CAPA] / loncom / build / Attic / parse.pl
Revision 1.24: download - view: text, annotated - select for diffs
Tue Jan 16 15:48:45 2001 UTC (23 years, 4 months ago) by harris41
Branches: MAIN
CVS tags: HEAD
more fixes to improve a proper de-shadow installation -Scott

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

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