Annotation of loncom/build/parse.pl, revision 1.33
1.1 harris41 1: #!/usr/bin/perl
2:
3: # Scott Harrison
4: # November 2000
1.33 ! harris41 5: # ...
! 6: # 04/10/2001
1.1 harris41 7:
1.33 ! harris41 8:
! 9: # Read in loncapa tags and metagroup tags. Output various
! 10: # useful files for viewing, compiling, monitoring, updating,
! 11: # and installing.
! 12:
! 13: # This code works well. HOWEVER, I was in a rush when I
! 14: # wrote it. Future plans are that the parsing should be
! 15: # much more event-state based and the input should be
! 16: # more XML-ish. -Scott
1.1 harris41 17:
1.4 harris41 18: # ---------------------------------------------- Read in command line arguments
1.1 harris41 19: my ($file,$mode)=@ARGV;
1.2 harris41 20:
1.4 harris41 21: # ---------------------------------------------------- Read in master data file
1.1 harris41 22: open IN,"<$file";
23: my @lines=<IN>;
24: close IN;
1.5 harris41 25: my $info1=join('',@lines);
26: my $info2=$info1; # value to allow for meta data group retrieval
1.1 harris41 27:
1.4 harris41 28: # ------------------------------------------------------- Make default settings
29: my $distribution="redhat6.2";
30: my $date=`date +'%B %e, %Y'`; chop $date;
31: my $buildhost=`hostname`; chop $buildhost;
1.5 harris41 32: # file category mappings
33: my %fcm=(
34: 'conf' => 'configurable',
35: 'graphic file' => 'graphicfile',
36: 'handler' => 'handler',
37: 'interface file' => 'interfacefile',
38: 'symbolic link' => 'link',
39: 'root script' => 'rootscript',
40: 'script' => 'script',
41: 'setuid script' => 'setuid',
42: 'static conf' => 'static',
43: 'system file' => 'systemfile',
44: );
1.4 harris41 45:
46: # ---------------------------------------------------- Parse the marked up data
47: my %info; # big data storage object
1.5 harris41 48: while ($info1=~/\<loncapa\s+(.*?)\>/isg) {
1.1 harris41 49: my $keystring=$1;
1.4 harris41 50: # In the parsing of LON-CAPA tags, remove boundary white-space,
51: # and handle quotation commands.
1.2 harris41 52: my %hash=map {my ($key,$value)=split(/\=(?!")|\=(?=\s*"[^"]*"[^"]*$)/);
53: $value=~s/^"//;
54: $value=~s/"$//;
55: (uc($key),$value);}
56: split(/\s+(?=\w+\s*\=)/,$keystring);
1.4 harris41 57: # Handle the different types of commands
1.1 harris41 58: if (uc($hash{'TYPE'}) eq "OWNERSHIP") {
59: $info{$hash{'TYPE'}}{$hash{'CATEGORY'}}{'CHMOD'}=$hash{'CHMOD'};
60: $info{$hash{'TYPE'}}{$hash{'CATEGORY'}}{'CHOWN'}=$hash{'CHOWN'};
61: }
62: elsif (uc($hash{'TYPE'}) eq "DEVOWNERSHIP") {
63: $info{$hash{'TYPE'}}{$hash{'CATEGORY'}}{'CHMOD'}=$hash{'CHMOD'};
64: $info{$hash{'TYPE'}}{$hash{'CATEGORY'}}{'CHOWN'}=$hash{'CHOWN'};
65: }
66: elsif (uc($hash{'TYPE'}) eq "RPM") {
67: $hash{'VALUE'}=~s/\\n/\n/g;
68: $info{$hash{'TYPE'}}{$hash{'NAME'}}=$hash{'VALUE'};
69: }
70: elsif (uc($hash{'TYPE'}) eq "DIRECTORY") {
1.4 harris41 71: $info{$hash{'TYPE'}}{$hash{'DIST'}}{$hash{'TARGET'}}{'CATEGORY'}=
72: $hash{'CATEGORY'};
73: $info{$hash{'TYPE'}}{$hash{'DIST'}}{$hash{'TARGET'}}{'DESCRIPTION'}=
74: $hash{'DESCRIPTION'} if $hash{'DESCRIPTION'};
1.1 harris41 75: }
76: elsif (uc($hash{'TYPE'}) eq "LOCATION") {
1.5 harris41 77: $info{$hash{'TYPE'}}{$hash{'DIST'}}{$hash{'TARGET'}}{'CATEGORY'}= $hash{'CATEGORY'};
1.10 harris41 78: $info{$hash{'TYPE'}}{$hash{'DIST'}}{$hash{'TARGET'}}{'LINKTO'}= $hash{'LINKTO'};
1.5 harris41 79: $info{$hash{'TYPE'}}{$hash{'DIST'}}{$hash{'TARGET'}}{'SOURCE'}= $hash{'SOURCE'};
1.1 harris41 80: # get surrounding metagroup information
81: my $ckeystring=$keystring; $ckeystring=~s/(SOURCE\=\"[^"]*)\*/$1\\\*/g;
1.5 harris41 82: $ckeystring=~s/(TARGET\=\"[^"]*)\*/$1\\\*/g;
1.1 harris41 83: $info2=~/.*\<(?:metagroup|metasupergroup)\>(.*?)\<loncapa\s+$ckeystring\>(.*?)\<\/(?:metagroup|metasupergroup)\>/is;
84: my $data=$1.$2;
85: my @meta=('description','build','dependencies','files','note');
86: foreach my $m (@meta) {
87: if ($data=~/\<($m)\>(.*?)\<\/$m\>/sgi) {
88: my ($key,$value)=($1,$2);
1.9 harris41 89: $info{$hash{'TYPE'}}{$hash{'DIST'}}{$hash{'TARGET'}}{uc($key)}=
1.4 harris41 90: $value;
1.1 harris41 91: }
92: }
93: }
94: else {
95: warn("WARNING: this tag text will be ignored since it cannot be understood\n---> $keystring\n");
96: }
97: }
98:
1.10 harris41 99: my $a;
100: my @directories;
101: if ($mode eq "HTML") {
1.4 harris41 102: $a=&begin_description_page;
103: print $a;
104: $a=&make_rpm_description_block;
105: print $a;
106: @directories=&determine_directory_structure;
107: $a=&make_directory_structure_description_block(\@directories);
108: print $a;
1.6 harris41 109: $a=&make_file_type_ownership_and_permissions_description_block;
110: print $a;
1.4 harris41 111: $a=&make_directory_and_file_structure_description_block(\@directories);
112: print $a;
113: $a=&end_description_page;
114: print $a;
115: }
1.10 harris41 116: elsif ($mode eq "SPEC") {
117: my $out=$info{'RPM'}{'Name'} . '-' . $info{'RPM'}{'Version'} . '.spec';
118: open OUT,">$out";
119: $a=&make_rpm_spec_block;
120: print OUT $a;
121: $a=&make_rpm_build_block;
122: print OUT $a;
123: @directories=&determine_directory_structure;
124: $a=&make_directory_structure_spec_block(\@directories);
125: print OUT $a;
126: $a=&make_directory_and_file_structure_spec_block(\@directories);
127: print OUT $a;
128: $a=&end_spec_page;
129: print OUT $a;
130: close OUT;
131: }
132: elsif ($mode eq "LCMakefile") {
133: @directories=&determine_directory_structure;
1.14 harris41 134: $a=&make_directory_LCMakefile_segment(\@directories);
1.10 harris41 135: print $a;
1.14 harris41 136: $a=&make_files_LCMakefile_segment(\@directories);
1.10 harris41 137: print $a;
1.14 harris41 138: $a=&make_links_LCMakefile_segment(\@directories);
1.10 harris41 139: print $a;
140: }
1.11 harris41 141: elsif ($mode eq "BinaryRoot") {
142: mkdir "BinaryRoot",0755;
143: open OUT,">Makefile.BinaryRoot";
144: @directories=&determine_directory_structure;
145: $a=&make_directory_binaryroot_segment(\@directories);
146: print OUT $a;
147: $a=&make_files_binaryroot_segment(\@directories);
148: print OUT $a;
149: $a=&make_links_binaryroot_segment(\@directories);
150: print OUT $a;
151: close OUT;
152: print `make -f Makefile.BinaryRoot TARGET='BinaryRoot' SOURCE='../..' directories`;
153: print `make -f Makefile.BinaryRoot TARGET='BinaryRoot' SOURCE='../..' files`;
154: print `make -f Makefile.BinaryRoot TARGET='BinaryRoot' SOURCE='../..' links`;
155: open OUT,">base_file_list.txt";
156: $a=&make_file_list(\@directories);
157: print OUT $a;
158: close OUT;
1.21 harris41 159: open OUT,">setup_file_list.txt";
160: print OUT "BinaryRoot/etc/passwd\n";
161: close OUT;
162: open OUT,">BinaryRoot/etc/passwd";
163: print OUT<<END;
1.22 harris41 164: root::0:0:root:/root:/bin/bash
1.24 harris41 165: bin:!!:1:1:bin:/bin:
166: daemon:!!:2:2:daemon:/sbin:
167: adm:!!:3:4:adm:/var/adm:
168: lp:!!:4:7:lp:/var/spool/lpd:
169: sync:!!:5:0:sync:/sbin:/bin/sync
170: shutdown:!!:6:0:shutdown:/sbin:/sbin/shutdown
171: halt:!!:7:0:halt:/sbin:/sbin/halt
172: mail:!!:8:12:mail:/var/spool/mail:
173: news:!!:9:13:news:/var/spool/news:
174: uucp:!!:10:14:uucp:/var/spool/uucp:
175: operator:!!:11:0:operator:/root:
176: games:!!:12:100:games:/usr/games:
177: gopher:!!:13:30:gopher:/usr/lib/gopher-data:
178: ftp:!!:14:50:FTP User:/home/ftp:
179: nobody:!!:99:99:Nobody:/:
180: www:!!:500:500:www:/home/www:/bin/bash
1.21 harris41 181: END
182: close OUT;
1.23 harris41 183: open OUT,">>setup_file_list.txt";
184: print OUT "BinaryRoot/etc/hosts.deny\n";
185: close OUT;
186: open OUT,">BinaryRoot/etc/hosts.deny";
187: print OUT<<END;
188: ALL: ALL
189: END
190: close OUT;
191:
1.27 harris41 192: `install -o 500 -g 500 -m 0700 -d BinaryRoot/home/www`;
193: open OUT,">>setup_file_list.txt";
194: print OUT "BinaryRoot/home/www\n";
195: close OUT;
1.23 harris41 196: `install -d BinaryRoot/etc/pam.d`;
197: open OUT,">>setup_file_list.txt";
198: print OUT "BinaryRoot/etc/pam.d/passwd\n";
199: close OUT;
200: open OUT,">BinaryRoot/etc/pam.d/passwd";
201: print OUT<<END;
202: #%PAM-1.0
203: auth required /lib/security/pam_pwdb.so shadow nullok
204: account required /lib/security/pam_pwdb.so
205: password required /lib/security/pam_cracklib.so retry=3
206: password required /lib/security/pam_pwdb.so use_authtok nullok
207: END
208: close OUT;
209: open OUT,">>setup_file_list.txt";
210: print OUT "BinaryRoot/etc/pam.d/login\n";
211: close OUT;
212: open OUT,">BinaryRoot/etc/pam.d/login";
213: print OUT<<END;
214: #%PAM-1.0
215: auth required /lib/security/pam_securetty.so
216: auth required /lib/security/pam_pwdb.so shadow nullok
217: auth required /lib/security/pam_nologin.so
218: account required /lib/security/pam_pwdb.so
219: password required /lib/security/pam_cracklib.so
220: password required /lib/security/pam_pwdb.so nullok use_authtok
221: session required /lib/security/pam_pwdb.so
222: session optional /lib/security/pam_console.so
223: END
224: close OUT;
1.21 harris41 225:
1.11 harris41 226: }
1.10 harris41 227: elsif ($mode eq "status") {
1.25 harris41 228: $a=&begin_description_page('status');
229: print $a;
230: $a=&make_rpm_description_block('status');
231: print $a;
232: @directories=&determine_directory_structure('status');
233: $a=&make_directory_structure_description_block(\@directories,'status');
234: print $a;
235: $a=&make_file_type_ownership_and_permissions_description_block('status');
236: print $a;
237: $a=&make_directory_and_file_structure_description_block(\@directories,'status');
238: print $a;
239: $a=&end_description_page('status');
240: print $a;
1.10 harris41 241: }
242: elsif ($mode eq "update") {
243: }
1.16 harris41 244: elsif ($mode eq "configinstall") {
245: @directories=&determine_directory_structure;
246: $a=&make_files_configinstall_segment(\@directories);
247: print $a;
1.17 harris41 248: $a=&make_files_configpermissions_segment(\@directories);
249: print $a;
1.16 harris41 250: }
1.14 harris41 251: elsif ($mode eq "install") {
252: @directories=&determine_directory_structure;
253: $a=&make_directory_install_segment(\@directories);
254: print $a;
255: $a=&make_files_install_segment(\@directories);
256: print $a;
257: $a=&make_links_install_segment(\@directories);
258: print $a;
1.11 harris41 259: }
1.15 harris41 260: elsif ($mode eq "build") {
261: @directories=&determine_directory_structure;
262: $a=&make_files_build_segment(\@directories);
263: print $a;
264: }
1.11 harris41 265:
266: # ------------------------------------------------------ a list of file targets
267: sub make_file_list {
268: my ($dirs)=@_;
269: my $description;
270: my @allfiles=keys %{$info{'LOCATION'}{$distribution}};
271: foreach my $d (@$dirs) {
272: # set other values
1.19 harris41 273: $description.=<<END;
1.18 harris41 274: BinaryRoot/$d
275: END
1.11 harris41 276: my $dirdescription=$info{'DIRECTORY'}{$distribution}{$d}{'DESCRIPTION'};
277: $dirdescription="(" . $dirdescription . ")" if $dirdescription;
278: # find files that are contained in this directory
279: my @files;
280: my @filesfull;
281: foreach my $f (@allfiles) {
282: if ($f=~/^$d\/([^\/]+)$/) {
283: push @files,$1;
284: push @filesfull,$f;
285: }
286: }
287: # render starting HTML formatting elements
288: if (@files) {
289: }
1.12 harris41 290: my $pwd=`pwd`; chop $pwd;
1.11 harris41 291: if (@files) {
292: foreach my $i (0..$#files) {
293: my $category=$info{'LOCATION'}{$distribution}{$filesfull[$i]}{'CATEGORY'};
294: my $chown=$info{'OWNERSHIP'}{$category}{'CHOWN'};
295: my $chmod=$info{'OWNERSHIP'}{$category}{'CHMOD'};
296: my $devchown=$info{'DEVOWNERSHIP'}{$category}{'CHOWN'};
297: my $devchmod=$info{'DEVOWNERSHIP'}{$category}{'CHMOD'};
298: my $source=$info{'LOCATION'}{$distribution}{$filesfull[$i]}{'SOURCE'};
299: my $rot="/".$filesfull[$i];
300: if ($rot=~/\*/) {
301: $rot=~s/[^\/]+$// if $rot=~/\*/;
302: my $listing=$info{'LOCATION'}{$distribution}{$filesfull[$i]}{'FILES'};
303: chop $listing;
304: my @list=split(/\s+/,$listing);
305: my $rot2;
306: foreach my $l (@list) {
307: $l=~s/^\s*//; $l=~s/\s*$//;
1.12 harris41 308: $rot2.="BinaryRoot$rot$l\n" if length($l);
1.11 harris41 309: }
310: chop $rot2;
311: $rot=$rot2;
1.12 harris41 312: }
313: else {
314: $rot="BinaryRoot$rot";
1.11 harris41 315: }
1.13 harris41 316: if ($category eq "conf") {
317: $rot.=" # config";
318: }
1.11 harris41 319: $description.=<<END;
320: $rot
321: END
322: }
323: }
324: }
325: $description.=<<END;
326:
327: END
328: return $description;
329: }
330:
331: # --------------------------------- Commands to make BinaryRoot directories
332: sub make_directory_binaryroot_segment {
333: my ($dirs)=@_;
334: my $description=<<END;
335: directories:
336: END
337: foreach my $d (@$dirs) {
338: my $category=$info{'DIRECTORY'}{$distribution}{$d}{'CATEGORY'};
339: my $chown=$info{'OWNERSHIP'}{$category}{'CHOWN'};
340: my $chmod=$info{'OWNERSHIP'}{$category}{'CHMOD'};
341: my $devchown=$info{'DEVOWNERSHIP'}{$category}{'CHOWN'};
342: my $devchmod=$info{'DEVOWNERSHIP'}{$category}{'CHMOD'};
1.20 harris41 343: my ($owner,$group)=split(/\:/,$devchown);
1.11 harris41 344: my $own=$devchown; $own=~s/\:/\,/;
345: $description.=<<END;
1.20 harris41 346: \tinstall -o $owner -g $group -m $devchmod -d \$(TARGET)/$d
1.11 harris41 347: END
348: }
349: $description.=<<END;
350:
351: END
352: return $description;
353: }
354:
355: # --------------------------------------- Commands to make BinaryRoot files
356: sub make_files_binaryroot_segment {
357: my ($dirs)=@_;
358: my $description=<<END;
359: files:
360: END
361: my @allfiles=keys %{$info{'LOCATION'}{$distribution}};
362: foreach my $d (@$dirs) {
363: # set other values
364: my $dirdescription=$info{'DIRECTORY'}{$distribution}{$d}{'DESCRIPTION'};
365: $dirdescription="(" . $dirdescription . ")" if $dirdescription;
366: # find files that are contained in this directory
367: my @files;
368: my @filesfull;
369: foreach my $f (@allfiles) {
370: if ($f=~/^$d\/([^\/]+)$/) {
371: push @files,$1;
372: push @filesfull,$f;
373: }
374: }
375: # render starting HTML formatting elements
376: if (@files) {
377: $description.=<<END;
378: \t# $d $dirdescription
379: END
380: }
381: if (@files) {
382: foreach my $i (0..$#files) {
383: my $category=$info{'LOCATION'}{$distribution}{$filesfull[$i]}{'CATEGORY'};
384: my $chown=$info{'OWNERSHIP'}{$category}{'CHOWN'};
385: my $chmod=$info{'OWNERSHIP'}{$category}{'CHMOD'};
386: my $devchown=$info{'DEVOWNERSHIP'}{$category}{'CHOWN'};
387: my $devchmod=$info{'DEVOWNERSHIP'}{$category}{'CHMOD'};
388: my $source=$info{'LOCATION'}{$distribution}{$filesfull[$i]}{'SOURCE'};
389: my $rot=$filesfull[$i];
390: $rot=~s/[^\/]+$/\./ if $rot=~/\*/;
1.20 harris41 391: my ($owner,$group)=split(/\:/,$devchown);
1.11 harris41 392: $description.=<<END if $category ne 'symbolic link';
1.20 harris41 393: \tinstall -o $owner -g $group -m $devchmod \$(SOURCE)/$source \$(TARGET)/$rot
1.11 harris41 394: END
395: }
396: }
397: }
398: $description.=<<END;
399:
400: END
401: return $description;
402: }
403:
404: # ------------------------------ Commands to make BinaryRoot symbolic links
405: sub make_links_binaryroot_segment {
406: my ($dirs)=@_;
407: my $description=<<END;
408: links:
409: END
410: my @allfiles=keys %{$info{'LOCATION'}{$distribution}};
411: foreach my $d (@$dirs) {
412: # find files that are contained in this directory
413: my @files;
414: my @filesfull;
415: foreach my $f (@allfiles) {
416: if ($f=~/^$d\/([^\/]+)$/) {
417: push @files,$1;
418: push @filesfull,$f;
419: }
420: }
421: # render starting HTML formatting elements
422: if (@files) {
423: foreach my $i (0..$#files) {
424: my $category=$info{'LOCATION'}{$distribution}{$filesfull[$i]}{'CATEGORY'};
425: my $linkto=$info{'LOCATION'}{$distribution}{$filesfull[$i]}{'LINKTO'};
426: my $chown=$info{'OWNERSHIP'}{$category}{'CHOWN'};
427: my $chmod=$info{'OWNERSHIP'}{$category}{'CHMOD'};
428: my $devchown=$info{'DEVOWNERSHIP'}{$category}{'CHOWN'};
429: my $devchmod=$info{'DEVOWNERSHIP'}{$category}{'CHMOD'};
430: $description.=<<END if $category eq 'symbolic link';
431: \tln -s /$linkto \$(TARGET)/$filesfull[$i]
432: END
433: }
434: }
435: }
436: $description.=<<END;
437:
438: END
439: return $description;
1.10 harris41 440: }
441:
1.14 harris41 442: # ------ Installation commands for a Makefile used only by a rpm -ba invocation
443: sub make_directory_LCMakefile_segment {
444: my ($dirs)=@_;
445: my $description=<<END;
446: directories:
447: END
448: foreach my $d (@$dirs) {
449: my $category=$info{'DIRECTORY'}{$distribution}{$d}{'CATEGORY'};
450: my $chown=$info{'OWNERSHIP'}{$category}{'CHOWN'};
451: my $chmod=$info{'OWNERSHIP'}{$category}{'CHMOD'};
452: my $devchown=$info{'DEVOWNERSHIP'}{$category}{'CHOWN'};
453: my $devchmod=$info{'DEVOWNERSHIP'}{$category}{'CHMOD'};
454: my $own=$devchown; $own=~s/\:/\,/;
455: $description.=<<END;
456: \tinstall -m $devchmod -d \$(SOURCE)/$d \$(ROOT)/$d
457: END
458: }
459: $description.=<<END;
460:
461: END
462: return $description;
463: }
464:
465: # ------ Installation commands for a Makefile used only by a rpm -ba invocation
466: sub make_files_LCMakefile_segment {
467: my ($dirs)=@_;
468: my $description=<<END;
469: files:
470: END
471: my @allfiles=keys %{$info{'LOCATION'}{$distribution}};
472: foreach my $d (@$dirs) {
473: # set other values
474: my $dirdescription=$info{'DIRECTORY'}{$distribution}{$d}{'DESCRIPTION'};
475: $dirdescription="(" . $dirdescription . ")" if $dirdescription;
476: # find files that are contained in this directory
477: my @files;
478: my @filesfull;
479: foreach my $f (@allfiles) {
480: if ($f=~/^$d\/([^\/]+)$/) {
481: push @files,$1;
482: push @filesfull,$f;
483: }
484: }
485: # render starting HTML formatting elements
486: if (@files) {
487: $description.=<<END;
488: \t# $d $dirdescription
489: END
490: }
491: if (@files) {
492: foreach my $i (0..$#files) {
493: my $category=$info{'LOCATION'}{$distribution}{$filesfull[$i]}{'CATEGORY'};
494: my $chown=$info{'OWNERSHIP'}{$category}{'CHOWN'};
495: my $chmod=$info{'OWNERSHIP'}{$category}{'CHMOD'};
496: my $devchown=$info{'DEVOWNERSHIP'}{$category}{'CHOWN'};
497: my $devchmod=$info{'DEVOWNERSHIP'}{$category}{'CHMOD'};
498: my $rot=$filesfull[$i];
499: $rot=~s/[^\/]+$/\./ if $rot=~/\*/;
500: $description.=<<END if $category ne 'symbolic link';
501: \tinstall -m $devchmod \$(SOURCE)/$filesfull[$i] \$(ROOT)/$rot
502: END
503: }
504: }
505: }
506: $description.=<<END;
507:
508: END
509: return $description;
510: }
511:
512: # ------ Installation commands for a Makefile used only by a rpm -ba invocation
513: sub make_links_LCMakefile_segment {
514: my ($dirs)=@_;
515: my $description=<<END;
516: links:
517: END
518: my @allfiles=keys %{$info{'LOCATION'}{$distribution}};
519: foreach my $d (@$dirs) {
520: # find files that are contained in this directory
521: my @files;
522: my @filesfull;
523: foreach my $f (@allfiles) {
524: if ($f=~/^$d\/([^\/]+)$/) {
525: push @files,$1;
526: push @filesfull,$f;
527: }
528: }
529: # render starting HTML formatting elements
530: if (@files) {
531: foreach my $i (0..$#files) {
532: my $category=$info{'LOCATION'}{$distribution}{$filesfull[$i]}{'CATEGORY'};
533: my $linkto=$info{'LOCATION'}{$distribution}{$filesfull[$i]}{'LINKTO'};
534: my $chown=$info{'OWNERSHIP'}{$category}{'CHOWN'};
535: my $chmod=$info{'OWNERSHIP'}{$category}{'CHMOD'};
536: my $devchown=$info{'DEVOWNERSHIP'}{$category}{'CHOWN'};
537: my $devchmod=$info{'DEVOWNERSHIP'}{$category}{'CHMOD'};
538: $description.=<<END if $category eq 'symbolic link';
539: \tln -s /$linkto \$(ROOT)/$filesfull[$i]
540: END
541: }
542: }
543: }
544: $description.=<<END;
545:
546: END
547: return $description;
548: }
549:
1.10 harris41 550: # --------------------------------- Installation commands to install directories
551: sub make_directory_install_segment {
552: my ($dirs)=@_;
553: my $description=<<END;
554: directories:
555: END
556: foreach my $d (@$dirs) {
557: my $category=$info{'DIRECTORY'}{$distribution}{$d}{'CATEGORY'};
1.14 harris41 558: my $source=$info{'LOCATION'}{$distribution}{$filesfull[$i]}{'SOURCE'};
1.10 harris41 559: my $chown=$info{'OWNERSHIP'}{$category}{'CHOWN'};
560: my $chmod=$info{'OWNERSHIP'}{$category}{'CHMOD'};
561: my $devchown=$info{'DEVOWNERSHIP'}{$category}{'CHOWN'};
562: my $devchmod=$info{'DEVOWNERSHIP'}{$category}{'CHMOD'};
1.16 harris41 563: my ($owner,$group)=split(/\:/,$devchown);
1.10 harris41 564: my $own=$devchown; $own=~s/\:/\,/;
565: $description.=<<END;
1.16 harris41 566: \tinstall -o $owner -g $group -m $devchmod -d \$(TARGET)/$d
1.10 harris41 567: END
568: }
569: $description.=<<END;
570:
571: END
572: return $description;
573: }
574:
1.15 harris41 575: # ------------------------------------------------------ Commands to build files
576: sub make_files_build_segment {
577: my ($dirs)=@_;
578: my $description;
579: my @allfiles=keys %{$info{'LOCATION'}{$distribution}};
580: my $tab="\t";
1.33 ! harris41 581: my $sources="# Dynamic Makefile generated by LON-CAPA build process\n\n";
! 582: $sources.="SHELL=\"/bin/sh\"\n\n";
! 583: $sources.="\nall: ";
1.15 harris41 584: foreach my $d (@$dirs) {
585: # set other values
586: my $dirdescription=$info{'DIRECTORY'}{$distribution}{$d}{'DESCRIPTION'};
587: $dirdescription="(" . $dirdescription . ")" if $dirdescription;
588: # find files that are contained in this directory
589: my @files;
590: my @filesfull;
591: foreach my $f (@allfiles) {
592: if ($f=~/^$d\/([^\/]+)$/) {
593: push @files,$1;
594: push @filesfull,$f;
595: }
596: }
597: if (@files) {
598: foreach my $i (0..$#files) {
599: # if has build information, output appropriate something
600: my $build=$info{'LOCATION'}{$distribution}{$filesfull[$i]}{'BUILD'};
601: my $source=$info{'LOCATION'}{$distribution}{$filesfull[$i]}{'SOURCE'};
602: $build=~s/^\s+//; $build=~s/\s+$//;
603: if ($build) {
604: my $dependencies=$info{'LOCATION'}{$distribution}{$filesfull[$i]}{'DEPENDENCIES'};
605: my $source2=$source;
606: $source2=~s/^[^\/]+\///;
607: $source2="../" . $source2;
608: $sources.="$source2 ";
609: my $directory=$build;
610: $directory=~s/^[^\/]+\///;
611: $directory=~s/([^\/]+)$//;
612: $directory="../" . $directory;
613: my $buildfile=$1;
614: my $sdir=$source;
615: $sdir=~s/^[^\/]+\///;
616: $sdir=~s/([^\/]+)$//;
617: $sdir="../" . $sdir;
618: $dependencies=~s/\s+$//;
619: my $depstat="";
620: if ($dependencies=~s/\s+\[ALWAYS_RUN_BUILD_COMMAND\]//) {
621: $depstat=" alwaysrun";
622: }
623: $dependencies=~s/\s+/ $sdir/gs;
1.33 ! harris41 624: my @deps=split(/\s+/,$dependencies);
! 625: shift @deps;
! 626: my $testing=<<END;
! 627: \@if !(echo "");\\
! 628: then echo "**** LON-CAPA WARNING **** Strange shell. Check your path settings.";\\
! 629: END
! 630: foreach my $d (@deps) {
! 631: $testing.=<<END;
! 632: elif !(test -r $d);\\
! 633: then echo "**** LON-CAPA WARNING **** missing the file: $d";\\
! 634: END
! 635: }
! 636: chop $testing;
1.15 harris41 637: $description.=<<END;
1.33 ! harris41 638: $source2: $depstat
! 639: $testing
! 640: else \\
! 641: ${tab}cd $directory; sh ./$buildfile;\\
! 642: fi
1.15 harris41 643:
644: END
645: }
646: my $category=$info{'LOCATION'}{$distribution}{$filesfull[$i]}{'CATEGORY'};
647: my $source=$info{'LOCATION'}{$distribution}{$filesfull[$i]}{'SOURCE'};
648: my $chown=$info{'OWNERSHIP'}{$category}{'CHOWN'};
649: my $chmod=$info{'OWNERSHIP'}{$category}{'CHMOD'};
650: my $devchown=$info{'DEVOWNERSHIP'}{$category}{'CHOWN'};
651: my $devchmod=$info{'DEVOWNERSHIP'}{$category}{'CHMOD'};
652: my $rot=$filesfull[$i];
653: $rot=~s/[^\/]+$/\./ if $rot=~/\*/;
654: # $description.=<<END if $category ne 'symbolic link';
1.16 harris41 655: #\tinstall -o $owner -g $group -m $devchmod \$(SOURCE)/$source \$(TARGET)/$rot
1.15 harris41 656: #END
657: }
658: }
659: }
660: $description.=<<END;
661: alwaysrun:
662:
663: END
664: $sources.="\n\n";
665: return ($sources . $description);
666: }
667:
1.10 harris41 668: # --------------------------------------- Installation commands to install files
669: sub make_files_install_segment {
670: my ($dirs)=@_;
671: my $description=<<END;
672: files:
673: END
674: my @allfiles=keys %{$info{'LOCATION'}{$distribution}};
675: foreach my $d (@$dirs) {
676: # set other values
677: my $dirdescription=$info{'DIRECTORY'}{$distribution}{$d}{'DESCRIPTION'};
678: $dirdescription="(" . $dirdescription . ")" if $dirdescription;
679: # find files that are contained in this directory
680: my @files;
681: my @filesfull;
682: foreach my $f (@allfiles) {
683: if ($f=~/^$d\/([^\/]+)$/) {
684: push @files,$1;
685: push @filesfull,$f;
686: }
687: }
688: # render starting HTML formatting elements
689: if (@files) {
690: $description.=<<END;
691: \t# $d $dirdescription
692: END
693: }
694: if (@files) {
695: foreach my $i (0..$#files) {
696: my $category=$info{'LOCATION'}{$distribution}{$filesfull[$i]}{'CATEGORY'};
1.14 harris41 697: my $source=$info{'LOCATION'}{$distribution}{$filesfull[$i]}{'SOURCE'};
1.10 harris41 698: my $chown=$info{'OWNERSHIP'}{$category}{'CHOWN'};
699: my $chmod=$info{'OWNERSHIP'}{$category}{'CHMOD'};
700: my $devchown=$info{'DEVOWNERSHIP'}{$category}{'CHOWN'};
701: my $devchmod=$info{'DEVOWNERSHIP'}{$category}{'CHMOD'};
702: my $rot=$filesfull[$i];
703: $rot=~s/[^\/]+$/\./ if $rot=~/\*/;
1.16 harris41 704: my ($owner,$group)=split(/\:/,$devchown);
1.15 harris41 705: if ($category ne 'conf') {
706: $description.=<<END if $category ne 'symbolic link';
1.16 harris41 707: \tinstall -o $owner -g $group -m $devchmod \$(SOURCE)/$source \$(TARGET)/$rot
708: END
709: }
710: }
711: }
712: }
713: $description.=<<END;
714:
715: END
716: return $description;
717: }
718:
719: # ------ Installation commands to install configuration files (and make backups)
720: sub make_files_configinstall_segment {
721: my ($dirs)=@_;
722: my $description=<<END;
723: configfiles:
724: END
725: my @allfiles=keys %{$info{'LOCATION'}{$distribution}};
726: foreach my $d (@$dirs) {
727: # set other values
728: my $dirdescription=$info{'DIRECTORY'}{$distribution}{$d}{'DESCRIPTION'};
729: $dirdescription="(" . $dirdescription . ")" if $dirdescription;
730: # find files that are contained in this directory
731: my @files;
732: my @filesfull;
733: foreach my $f (@allfiles) {
734: if ($f=~/^$d\/([^\/]+)$/) {
735: push @files,$1;
736: push @filesfull,$f;
737: }
738: }
739: # render starting HTML formatting elements
740: if (@files) {
741: $description.=<<END;
742: \t# $d $dirdescription
743: END
744: }
745: if (@files) {
746: foreach my $i (0..$#files) {
747: my $category=$info{'LOCATION'}{$distribution}{$filesfull[$i]}{'CATEGORY'};
748: my $source=$info{'LOCATION'}{$distribution}{$filesfull[$i]}{'SOURCE'};
749: my $chown=$info{'OWNERSHIP'}{$category}{'CHOWN'};
750: my $chmod=$info{'OWNERSHIP'}{$category}{'CHMOD'};
751: my $devchown=$info{'DEVOWNERSHIP'}{$category}{'CHOWN'};
752: my $devchmod=$info{'DEVOWNERSHIP'}{$category}{'CHMOD'};
753: my $rot=$filesfull[$i];
754: $rot=~s/[^\/]+$/\./ if $rot=~/\*/;
755: my ($owner,$group)=split(/\:/,$devchown);
756: if ($category eq 'conf') {
757: $description.=<<END;
1.32 harris41 758: \tcp -p \$(TARGET)/$rot \$(TARGET)/$rot`date +'.\%Y\%m\%d\%H\%M\%S'` 2>/dev/null; install -o $owner -g $group -m $devchmod \$(SOURCE)/$source \$(TARGET)/$rot
1.17 harris41 759: END
760: }
761: }
762: }
763: }
764: $description.=<<END;
765:
766: END
767: return $description;
768: }
769:
770: # ------ Commands to enforce configuration file permissions
771: sub make_files_configpermissions_segment {
772: my ($dirs)=@_;
773: my $description=<<END;
774: configpermissions:
775: END
776: my @allfiles=keys %{$info{'LOCATION'}{$distribution}};
777: foreach my $d (@$dirs) {
778: # set other values
779: my $dirdescription=$info{'DIRECTORY'}{$distribution}{$d}{'DESCRIPTION'};
780: $dirdescription="(" . $dirdescription . ")" if $dirdescription;
781: # find files that are contained in this directory
782: my @files;
783: my @filesfull;
784: foreach my $f (@allfiles) {
785: if ($f=~/^$d\/([^\/]+)$/) {
786: push @files,$1;
787: push @filesfull,$f;
788: }
789: }
790: # render starting HTML formatting elements
791: if (@files) {
792: $description.=<<END;
793: \t# $d $dirdescription
794: END
795: }
796: if (@files) {
797: foreach my $i (0..$#files) {
798: my $category=$info{'LOCATION'}{$distribution}{$filesfull[$i]}{'CATEGORY'};
799: my $source=$info{'LOCATION'}{$distribution}{$filesfull[$i]}{'SOURCE'};
800: my $chown=$info{'OWNERSHIP'}{$category}{'CHOWN'};
801: my $chmod=$info{'OWNERSHIP'}{$category}{'CHMOD'};
802: my $devchown=$info{'DEVOWNERSHIP'}{$category}{'CHOWN'};
803: my $devchmod=$info{'DEVOWNERSHIP'}{$category}{'CHMOD'};
804: my $rot=$filesfull[$i];
805: $rot=~s/[^\/]+$/\./ if $rot=~/\*/;
806: my ($owner,$group)=split(/\:/,$devchown);
807: if ($category eq 'conf') {
808: $description.=<<END;
809: \tchmod $devchmod \$(TARGET)/$rot
810: \tchown $devchown \$(TARGET)/$rot
1.10 harris41 811: END
1.15 harris41 812: }
1.10 harris41 813: }
814: }
815: }
816: $description.=<<END;
817:
818: END
819: return $description;
820: }
821:
822: # ------------------------------ Installation commands to install symbolic links
823: sub make_links_install_segment {
824: my ($dirs)=@_;
825: my $description=<<END;
826: links:
827: END
1.16 harris41 828: chop $description;
829: my $description2;
1.10 harris41 830: my @allfiles=keys %{$info{'LOCATION'}{$distribution}};
831: foreach my $d (@$dirs) {
832: # find files that are contained in this directory
833: my @files;
834: my @filesfull;
835: foreach my $f (@allfiles) {
836: if ($f=~/^$d\/([^\/]+)$/) {
837: push @files,$1;
838: push @filesfull,$f;
839: }
840: }
841: # render starting HTML formatting elements
842: if (@files) {
843: foreach my $i (0..$#files) {
844: my $category=$info{'LOCATION'}{$distribution}{$filesfull[$i]}{'CATEGORY'};
845: my $linkto=$info{'LOCATION'}{$distribution}{$filesfull[$i]}{'LINKTO'};
846: my $chown=$info{'OWNERSHIP'}{$category}{'CHOWN'};
847: my $chmod=$info{'OWNERSHIP'}{$category}{'CHMOD'};
848: my $devchown=$info{'DEVOWNERSHIP'}{$category}{'CHOWN'};
849: my $devchmod=$info{'DEVOWNERSHIP'}{$category}{'CHMOD'};
1.16 harris41 850: if ($category eq 'symbolic link') {
851: $description.=" \$(TARGET)/$filesfull[$i]";
852: $description2.=<<END;
853: \$(TARGET)/$filesfull[$i]:
1.14 harris41 854: \tln -s /$linkto \$(TARGET)/$filesfull[$i]
1.16 harris41 855:
1.10 harris41 856: END
1.16 harris41 857: }
1.10 harris41 858: }
859: }
860: }
861: $description.=<<END;
1.4 harris41 862:
1.10 harris41 863: END
1.16 harris41 864: $description.=$description2;
1.10 harris41 865: return $description;
866: }
867:
868: # --------------------------------------------------------- Make RPM .spec block
869: sub make_rpm_spec_block {
870: my $pwd=`pwd`; chop $pwd;
871: my $buildroot="$pwd/LON-CAPA-BuildRoot";
872: my $source=$info{'RPM'}{'Name'} . "-" . $info{'RPM'}{'Version'} . '.tar.gz';
873: my $description=<<END;
874: Summary: $info{'RPM'}{'Summary'}
875: Name: $info{'RPM'}{'Name'}
876: Version: $info{'RPM'}{'Version'}
877: Release: $info{'RPM'}{'Release'}
878: Vendor: $info{'RPM'}{'Vendor'}
879: BuildRoot: $buildroot
880: Copyright: $info{'RPM'}{'Copyright'}
881: Group: $info{'RPM'}{'Group'}
882: Source: $source
883: AutoReqProv: $info{'RPM'}{'AutoReqProv'}
884: \%description
885: $info{'RPM'}{'description'}
886:
887: END
888: return $description;
889: }
890:
891: # --------------------------------------------------- Make RPM build .spec block
892: sub make_rpm_build_block {
893: my $pwd=`pwd`; chop $pwd;
894: my $buildroot="$pwd/LON-CAPA-BuildRoot";
895: my $sourceroot="$pwd/LON-CAPA-SourceRoot";
896: my $description=<<END;
897:
898: \%prep
899: \%setup
900:
901: \%build
902: rm -Rf "$buildroot"
903:
904: \%install
905: make -f LCMakefile ROOT="\$RPM_BUILD_ROOT" SOURCE="$sourceroot" directories
906: make -f LCMakefile ROOT="\$RPM_BUILD_ROOT" SOURCE="$sourceroot" files
907: make -f LCMakefile ROOT="\$RPM_BUILD_ROOT" SOURCE="$sourceroot" links
908:
909: \%pre
910: $info{'RPM'}{'pre'}
911:
912: \%post
913: \%postun
914:
915: \%files
916: # \%doc README COPYING ChangeLog LICENSE
917: END
918: return $description;
919: }
920:
921: # ------------------------------------- Make directory structure RPM .spec block
922: sub make_directory_structure_spec_block {
923: my ($dirs)=@_;
924: foreach my $d (@$dirs) {
925: my $category=$info{'DIRECTORY'}{$distribution}{$d}{'CATEGORY'};
926: my $chown=$info{'OWNERSHIP'}{$category}{'CHOWN'};
927: my $chmod=$info{'OWNERSHIP'}{$category}{'CHMOD'};
928: my $devchown=$info{'DEVOWNERSHIP'}{$category}{'CHOWN'};
929: my $devchmod=$info{'DEVOWNERSHIP'}{$category}{'CHMOD'};
930: my $own=$devchown; $own=~s/\:/\,/;
931: $description.=<<END;
932: \%dir \%attr($devchmod,$own) /$d
933: END
934: }
935: return $description;
936: }
937:
938: # ---------------------------- Make directory and file structure RPM .spec block
939: sub make_directory_and_file_structure_spec_block {
940: my ($dirs)=@_;
941: my @allfiles=keys %{$info{'LOCATION'}{$distribution}};
942: foreach my $d (@$dirs) {
943: # set other values
944: my $dirdescription=$info{'DIRECTORY'}{$distribution}{$d}{'DESCRIPTION'};
945: $dirdescription="(" . $dirdescription . ")" if $dirdescription;
946: # find files that are contained in this directory
947: my @files;
948: my @filesfull;
949: foreach my $f (@allfiles) {
950: if ($f=~/^$d\/([^\/]+)$/) {
951: push @files,$1;
952: push @filesfull,$f;
953: }
954: }
955: # render starting HTML formatting elements
956: if (@files) {
957: $description.=<<END;
958: # $d $dirdescription
959: END
960: }
961: if (@files) {
962: foreach my $i (0..$#files) {
963: my $category=$info{'LOCATION'}{$distribution}{$filesfull[$i]}{'CATEGORY'};
964: my $chown=$info{'OWNERSHIP'}{$category}{'CHOWN'};
965: my $chmod=$info{'OWNERSHIP'}{$category}{'CHMOD'};
966: my $devchown=$info{'DEVOWNERSHIP'}{$category}{'CHOWN'};
967: my $devchmod=$info{'DEVOWNERSHIP'}{$category}{'CHMOD'};
968: my $own=$devchown; $own=~s/\:/\,/;
969: my $config="";
970: $config="\%config " if $category eq 'conf';
971: $devchmod='-' if $category eq 'symbolic link';
972: $description.=<<END;
973: $config\%attr($devchmod,$own) /$filesfull[$i]
974: END
975: }
976: }
977: }
978: return $description;
979: }
980:
981: # ----------------------------------------------------------- End RPM .spec page
982: sub end_spec_page {
983: }
984:
985: # ------------------------------------------------------- Begin description page
1.4 harris41 986: sub begin_description_page {
1.25 harris41 987: my ($mode)=@_;
988: my $description;
989: unless ($mode eq 'status') {
990: $description=<<END;
1.4 harris41 991: <HTML>
992: <HEAD>
993: <TITLE>LON-CAPA Software Description Page ($distribution, $date)</TITLE>
994: </HEAD>
995: <BODY>
996: <FONT SIZE=+2>LON-CAPA Software Description Page ($distribution, $date)</FONT>
997: <BR>Michigan State University
998: <BR>Learning Online with CAPA
999: <BR>Contact korte\@lon-capa.org
1000: <UL>
1001: <LI>About this file
1002: <LI>Software Package Description
1003: <LI>Directory Structure
1.7 harris41 1004: <LI>File Type Ownership and Permissions
1.4 harris41 1005: <LI>File and Directory Structure
1006: </UL>
1007: <FONT SIZE=+2>About this file</FONT>
1008: <P>
1009: This file is generated dynamically by <TT>parse.pl</TT> as
1010: part of a development compilation process. See
1011: http://install.lon-capa.org/compile/index.html for more
1012: information.
1013: </P>
1014: END
1.25 harris41 1015: }
1016: else {
1017: $description=<<END;
1018: <HTML>
1019: <HEAD>
1020: <TITLE>LON-CAPA Software File System Status Page ($distribution, $date)</TITLE>
1021: </HEAD>
1022: <BODY>
1023: <FONT SIZE=+2>LON-CAPA Software File System Status Page ($distribution, $date)</FONT>
1024: <BR>Michigan State University
1025: <BR>Learning Online with CAPA
1026: <BR>Contact korte\@lon-capa.org
1027: <UL>
1028: <LI>About this file
1029: <LI>Software Package Description
1030: <LI>Directory Structure
1031: <LI>File Type Ownership and Permissions
1032: <LI>File and Directory Structure
1033: </UL>
1034: <FONT SIZE=+2>About this file</FONT>
1035: <P>
1036: This file is generated dynamically by <TT>parse.pl</TT> as
1037: part of a status checking process. See http://install.lon-capa.org/
1038: for more information.
1039: </P>
1040: END
1041: }
1.4 harris41 1042: return $description;
1.25 harris41 1043:
1.4 harris41 1044: }
1045:
1046: # ------------------------------------------------- End description page
1047: sub end_description_page {
1048: my $description=<<END;
1049: <HR>
1.5 harris41 1050: <FONT SIZE=-1>LON-CAPA Software Development Team</FONT>
1.4 harris41 1051: </BODY>
1052: </HTML>
1053: END
1054: return $description;
1055: }
1056:
1057: # ------------------------------------------------- Make RPM description block
1058: sub make_rpm_description_block {
1.25 harris41 1059: my ($mode)=@_;
1060: my $description;
1061: unless ($mode eq 'status') {
1062: $description=<<END;
1.4 harris41 1063: <FONT SIZE=+2>Rolled in a RedHat 6.2 RPM, $date</FONT>
1064: <P>
1065: <TABLE BGCOLOR=#FFFFFF BORDER=0 CELLPADDING=10 CELLSPACING=0>
1066: <TR><TD>
1067: <PRE>
1068: Name : $info{'RPM'}{'Name'}
1069: Version : $info{'RPM'}{'Version'}
1070: Vendor : $info{'RPM'}{'Vendor'}
1071: Release : $info{'RPM'}{'Release'}
1072: Build Host : $buildhost
1073: Group : $info{'RPM'}{'Group'}
1074: License : $info{'RPM'}{'Copyright'}
1075: Summary : $info{'RPM'}{'Summary'}
1076: Description :
1077: $info{'RPM'}{'description'}
1078: </PRE>
1079: </TD></TR>
1080: </TABLE>
1081: </P>
1082: END
1.25 harris41 1083: }
1084: else {
1085: my $exist=`rpm -q LON-CAPA-base 2>/dev/null`;
1086: unless ($exist) {
1087: $description=<<END;
1088: <FONT SIZE=+2>No LON-CAPA RPM on the system, (installed ??????)</FONT>
1089: <P>
1090: <TABLE BGCOLOR=#FFFFFF BORDER=0 CELLPADDING=10 CELLSPACING=0>
1091: <TR><TD>
1092: <FONT SIZE=+3>Error! A LON-CAPA-base RPM
1093: was never installed on this system!</FONT>
1094: </TD></TR>
1095: </TD></TR>
1096: </TABLE>
1097: </P>
1098: END
1099: }
1100: else {
1101: chop $exist;
1102: my $rpmname=`rpm -q --queryformat '%{NAME}' LON-CAPA-base`;
1103: my $rpmversion=`rpm -q --queryformat '%{VERSION}' LON-CAPA-base`;
1104: my $rpmrelease=`rpm -q --queryformat '%{RELEASE}' LON-CAPA-base`;
1105: my $idate=`rpm -q --queryformat '%{INSTALLTIME:date}' LON-CAPA-base`;
1106: my $rpmvendor=`rpm -q --queryformat '%{VENDOR}' LON-CAPA-base`;
1107: my $rpmbuildhost=`rpm -q --queryformat '%{BUILDHOST}' LON-CAPA-base`;
1108: my $rpmgroup=`rpm -q --queryformat '%{GROUP}' LON-CAPA-base`;
1109: my $rpmlicense=`rpm -q --queryformat '%{LICENSE}' LON-CAPA-base`;
1110: my $rpmsummary=`rpm -q --queryformat '%{SUMMARY}' LON-CAPA-base`;
1111: my $rpmdescription=`rpm -q --queryformat '%{DESCRIPTION}' LON-CAPA-base`;
1112: $description=<<END;
1113: <FONT SIZE=+2>Current RedHat RPM on the system, (installed $idate)</FONT>
1114: <P>
1115: <TABLE BGCOLOR=#FFFFFF BORDER=0 CELLPADDING=10 CELLSPACING=0>
1116: <TR><TD>
1117: <PRE>
1118: Name : $rpmname
1119: Version : $rpmversion
1120: Vendor : $rpmvendor
1121: Release : $rpmrelease
1122: Build Host : $rpmbuildhost
1123: Group : $rpmgroup
1124: License : $rpmlicense
1125: Summary : $rpmsummary
1126: Description :
1127: $rpmdescription
1128: </PRE>
1129: </TD></TR>
1130: </TABLE>
1131: </P>
1132: END
1133: }
1134: }
1.4 harris41 1135: return $description;
1136: }
1137:
1138: # ----------------------------------------------- Determine directory structure
1139: sub determine_directory_structure {
1140: my @directories=keys %{$info{'DIRECTORY'}{$distribution}};
1141: return (sort @directories);
1142: }
1.1 harris41 1143:
1.4 harris41 1144:
1145: # ---------------------------------- Make directory structure description block
1146: sub make_directory_structure_description_block {
1.25 harris41 1147: my ($dirs,$mode)=@_;
1148: my $dirstatus; my $statusheader;
1.4 harris41 1149: my $description=<<END;
1150: <FONT SIZE=+2>Directory Structure Description, $date</FONT>
1151: <P>
1.9 harris41 1152: The directory structure description below shows only those
1153: directories which either contain LON-CAPA specific files
1154: or normally do not exist on a RedHat Linux system (and
1155: must be generated to allow proper placement of files
1156: during LON-CAPA run-time operation).
1157: </P>
1158: <P>
1.4 harris41 1159: <TABLE BORDER=1 CELLPADDING=3 CELLSPACING=0>
1160: END
1161: my $maxcount=0;
1.8 harris41 1162: my @allfiles=keys %{$info{'LOCATION'}{$distribution}};
1163: my %diraccount; # hash to track which directories are accounted for
1164: foreach my $file (@allfiles) {
1165: $file=~/^(.*)\/([^\/]+)$/;
1166: $diraccount{$1}=1;
1167: }
1.4 harris41 1168: foreach my $d (@$dirs) {
1169: my (@matches)=($d=~/\//g);
1170: my $count=scalar(@matches);
1171: $maxcount=$count if $count>$maxcount;
1.8 harris41 1172: delete $diraccount{$d};
1.4 harris41 1173: }
1.25 harris41 1174: if ($mode eq 'status') {
1175: $statusheader="<TH ALIGN=LEFT BGCOLOR=#FFFFFF>Current Status</TH>";
1176: }
1.4 harris41 1177: $description.=<<END;
1178: <TR>
1.25 harris41 1179: $statusheader
1.4 harris41 1180: <TH ALIGN=LEFT BGCOLOR=#FFFFFF>Category</TH>
1181: <TH ALIGN=LEFT BGCOLOR=#FFFFFF>Permissions</TH>
1182: <TH ALIGN=LEFT BGCOLOR=#FFFFFF><FONT COLOR=#FF0000>Development<BR>Permissions</FONT></TH>
1183: END
1184: $description.="<TH ALIGN=LEFT BGCOLOR=#FFFFFF COLSPAN=".($maxcount+1).">Directory Path</TH>\n";
1.8 harris41 1185: if (keys %diraccount) {
1186: $description.= "<TR><TD ALIGN=LEFT BGCOLOR=#FFFFFF COLSPAN=".($maxcount+4)."><I><PRE>Directories that are unaccounted for: \n";
1187: foreach my $d (keys %diraccount) {
1188: $description.="$d\n";
1189: }
1190: $description.="</PRE></I></TH></TR>\n";
1191: }
1.4 harris41 1192: foreach my $d (@$dirs) {
1193: my $dtable=$d;
1194: $dtable=~s/\//\<\/TD\>\<TD\>/g;
1195: my $category=$info{'DIRECTORY'}{$distribution}{$d}{'CATEGORY'};
1196: my $chown=$info{'OWNERSHIP'}{$category}{'CHOWN'};
1197: my $chmod=$info{'OWNERSHIP'}{$category}{'CHMOD'};
1198: my $devchown=$info{'DEVOWNERSHIP'}{$category}{'CHOWN'};
1199: my $devchmod=$info{'DEVOWNERSHIP'}{$category}{'CHMOD'};
1.25 harris41 1200: if ($mode eq 'status') {
1201: my $ds=`find /$d -type d -prune -printf "\%m\t\%u\t\%g" 2>/dev/null`;
1202: unless ($ds) {
1203: $dirstatus='<TD BGCOLOR=#FFFFFF><B><U>MISSING</U></B></TD>';
1204: }
1205: else {
1206: my @dss=split(/\t/,$ds);
1207: my $dssz=$dss[0];
1208: $dssz="0" . $dss[0] if length($dss[0])<4;
1209: $dss[0]=$dssz;
1210: $ds="$dss[0] $dss[1]:$dss[2]";
1211: if ($ds eq "$chmod $chown" && $ds eq "$devchmod $devchown") {
1212: $dirstatus='<TD BGCOLOR=#FFFFFF>runtime+development</TD>';
1213: }
1214: elsif ($ds eq "$chmod $chown") {
1215: $dirstatus='<TD BGCOLOR=#FFFFFF>runtime</TD>';
1216: }
1217: elsif ($ds eq "$devchmod $devchown") {
1218: $dirstatus='<TD BGCOLOR=#FFFFFF>development</TD>';
1219: }
1220: else {
1221: $dirstatus="<TD BGCOLOR=#FFFFFF><B><U>ERROR</U></B><BR>$ds</TD>";
1222: }
1223: }
1224: }
1.4 harris41 1225: $description.=<<END;
1226: <TR>
1.25 harris41 1227: $dirstatus
1.4 harris41 1228: <TD BGCOLOR=#FFFFFF>$category</TD>
1229: <TD BGCOLOR=#FFFFFF><TT>$chmod $chown</TT></TD>
1230: <TD BGCOLOR=#FFFFFF><FONT COLOR=#FF0000><TT>$devchmod $devchown</TT></FONT></TD>
1231: <TD>
1232: $dtable
1233: </TD>
1234: </TR>
1235: END
1236: }
1237: $description.=<<END;
1238: </TABLE>
1239: </P>
1240: END
1241: return $description;
1242: }
1243:
1.6 harris41 1244: # ------------------- Make file type ownership and permissions description block
1245: sub make_file_type_ownership_and_permissions_description_block {
1.25 harris41 1246: my ($mode)=@_;
1.6 harris41 1247: my $description=<<END;
1248: <FONT SIZE=+2>File Type Ownership and Permissions Descriptions, $date</FONT>
1249: <P>
1250: This table shows what permissions and ownership settings correspond
1251: to each kind of file type.
1252: </P>
1253: <P>
1254: <TABLE BORDER=1 CELLPADDING=5 WIDTH=60%>
1255: <TR>
1256: <TH ALIGN=LEFT BGCOLOR=#FFFFFF>Icon</TH>
1257: <TH ALIGN=LEFT BGCOLOR=#FFFFFF>Type</TH>
1258: <TH ALIGN=LEFT BGCOLOR=#FFFFFF>Permissions</TH>
1259: <TH ALIGN=LEFT BGCOLOR=#FFFFFF>Development Permissions</TH>
1260: </TR>
1261: END
1262: foreach my $type (keys %{$info{'OWNERSHIP'}}) {
1263: if (defined($fcm{$type})) {
1264: my $chmod=$info{'OWNERSHIP'}{$type}{'CHMOD'};
1265: my $chown=$info{'OWNERSHIP'}{$type}{'CHOWN'};
1266: my $devchmod=$info{'DEVOWNERSHIP'}{$type}{'CHMOD'};
1267: my $devchown=$info{'DEVOWNERSHIP'}{$type}{'CHOWN'};
1268: $description.=<<END;
1269: <TR>
1270: <TD><IMG SRC="$fcm{$type}.gif" ALT="$type"></TD>
1271: <TD>$type</TD>
1272: <TD><TT>$chmod $chown</TT></TD>
1273: <TD><TT>$devchmod $devchown</TT></TD>
1274: </TR>
1275: END
1276: }
1277: }
1278: $description.=<<END;
1279: </TABLE>
1280: </P>
1281: END
1282: }
1283:
1.4 harris41 1284: # ------------------------- Make directory and file structure description block
1285: sub make_directory_and_file_structure_description_block {
1.25 harris41 1286: my ($dirs,$mode)=@_;
1287: my $statusheader; my $filestatus;
1.4 harris41 1288: my $description=<<END;
1289: <FONT SIZE=+2>Directory and File Structure Description, $date</FONT>
1.6 harris41 1290: <P>
1291: The icons on the left column correspond to the file type
1292: specified in the second column. The last column "Notes" shows compilation,
1.7 harris41 1293: dependency, and configuration information. The CVS location
1294: shows the location of the binary source file (if applicable) needed to
1295: be copied to the target. If the binary source file is not at
1296: the specified location, then the text is shown in
1297: <FONT COLOR=#FF0000>red</FONT>.
1.6 harris41 1298: </P>
1.4 harris41 1299: <P>
1.9 harris41 1300: <TABLE BORDER=1 CELLPADDING=5 WIDTH=500>
1.4 harris41 1301: END
1302: my $counter=0;
1303: my @colorindex=("#80FF80","#80FFFF","#FFFF80");
1.5 harris41 1304: my @allfiles=keys %{$info{'LOCATION'}{$distribution}};
1.4 harris41 1305: foreach my $d (@$dirs) {
1306: # set color
1307: my $color=$colorindex[$counter%3];
1308: # set other values
1309: my $dirdescription=$info{'DIRECTORY'}{$distribution}{$d}{'DESCRIPTION'};
1310: $dirdescription="(" . $dirdescription . ")" if $dirdescription;
1311: # find subdirectories that are contained in this directory
1312: my @subdirs;
1313: foreach my $d2 (@$dirs) {
1.5 harris41 1314: if ($d2=~/^$d\/([^\/]+)$/) {
1.4 harris41 1315: push @subdirs,$1;
1316: }
1317: }
1318: # find files that are contained in this directory
1319: my @files;
1.5 harris41 1320: my @filesfull;
1.4 harris41 1321: foreach my $f (@allfiles) {
1.5 harris41 1322: if ($f=~/^$d\/([^\/]+)$/) {
1.4 harris41 1323: push @files,$1;
1.5 harris41 1324: push @filesfull,$f;
1.4 harris41 1325: }
1326: }
1327: # render starting HTML formatting elements
1328: if (@subdirs || @files) {
1329: my $subdirstring="<BR>* Relevant subdirectories: " . join(", ",@subdirs) if @subdirs;
1330: $description.=<<END;
1.5 harris41 1331: <TR><TD BGCOLOR=#000000 COLSPAN=6><FONT COLOR=$color><IMG SRC="directory.gif" ALT="directory">DIRECTORY -- $d $dirdescription
1332: $subdirstring</FONT></TD></TR>
1.4 harris41 1333: END
1334: }
1335: else {
1336: $description.=<<END;
1.5 harris41 1337: <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 1338: END
1339: }
1340: if (@files) {
1.25 harris41 1341: if ($mode eq 'status') {
1342: $statusheader=<<END;
1343: <TH BGCOLOR=$color ALIGN=LEFT>Current Status</TH>
1344: END
1345: }
1.4 harris41 1346: $description.=<<END;
1347: <TR>
1.25 harris41 1348: $statusheader
1.5 harris41 1349: <TH BGCOLOR=$color ALIGN=LEFT COLSPAN=2>Type</TH>
1350: <TH BGCOLOR=$color ALIGN=LEFT>File Name</TH>
1351: <TH BGCOLOR=$color ALIGN=LEFT>Function</TH>
1352: <TH BGCOLOR=$color ALIGN=LEFT>CVS Location</TH>
1353: <TH BGCOLOR=$color ALIGN=LEFT>Notes</TH>
1.4 harris41 1354: </TR>
1355: END
1.5 harris41 1356: foreach my $i (0..$#files) {
1357: my $category=$info{'LOCATION'}{$distribution}{$filesfull[$i]}{'CATEGORY'};
1358: my $fdescription=$info{'LOCATION'}{$distribution}{$filesfull[$i]}{'DESCRIPTION'};
1359: my $source=$info{'LOCATION'}{$distribution}{$filesfull[$i]}{'SOURCE'};
1.28 harris41 1360: my $source2=$info{'LOCATION'}{$distribution}{$filesfull[$i]}{'SOURCE'};
1.9 harris41 1361: my $note=$info{'LOCATION'}{$distribution}{$filesfull[$i]}{'NOTE'};
1362: $note.="<BR>" if $note;
1363: my $listing=$info{'LOCATION'}{$distribution}{$filesfull[$i]}{'FILES'};
1364: my @E=split(/\s+/,$listing);
1365: $source=~/(.*)\/[^\/]+$/;
1366: my $sd=$1;
1367: my $eflag=0;
1368: foreach my $e (@E) {
1369: unless (-e "../../$sd/$e") {
1370: $e="<FONT COLOR=#FF0000>$e</FONT>";
1371: $eflag=1;
1372: }
1373: }
1374: $listing=join("\n",@E);
1375: $listing="<B>listing</B><BR><FONT SIZE=-2>$listing</FONT>" if $listing;
1376: $listing.="<BR>" if $listing;
1377: my $build=$info{'LOCATION'}{$distribution}{$filesfull[$i]}{'BUILD'};
1378: $build="<B>build</B><BR>$build" if $build;
1379: $build.="<BR>" if $build;
1380: my $dependencies=$info{'LOCATION'}{$distribution}{$filesfull[$i]}{'DEPENDENCIES'};
1381: $dependencies="<B>dependencies</B><BR>$dependencies" if $dependencies;
1382: $dependencies.="<BR>" if $dependencies;
1.7 harris41 1383: unless (-e "../../$source") {
1384: $source=~/([^\/]+)$/;
1385: my $s=$1;
1.9 harris41 1386: if ($source!~/\*/) {
1387: $source="<FONT COLOR=#FF0000>$source</FONT>";
1388: }
1389: elsif ($eflag) {
1390: $source="<FONT COLOR=#FF0000>$source</FONT>";
1391: }
1.7 harris41 1392: }
1.28 harris41 1393: my $checksum;
1394: my $checksum_source;
1395: my $checksum_target;
1.25 harris41 1396: if ($mode eq 'status') {
1397: $filestatus='';
1398: my $fs;
1399: my $listing2=$info{'LOCATION'}{$distribution}{$filesfull[$i]}{'FILES'};
1400: my @E=split(/\s+/,$listing2); shift @E;
1401: if (@E) {
1402: $fs=`find /$filesfull[$i] -prune -printf "\%m\t\%u\t\%g\n" 2>/dev/null | wc -l`; chop $fs;
1403: if ($fs!=(@E+0)) {
1404: $ecount=(@E+0);
1405: $estuff=join(",",@E);
1406: $filestatus="<TD BGCOLOR=#FFFFFF><B><U>ERROR. SOME FILES ARE MISSING</U></B></TD>";
1407: }
1408: $fs=`find /$filesfull[$i] -prune -printf "\%m\t\%u\t\%g\n" 2>/dev/null | sort | uniq | wc -l`; chop $fs;
1409: if ($fs!=1) {
1410: $filestatus='<TD BGCOLOR=#FFFFFF><B><U>ERROR. THERE ARE MULTIPLE OWNERSHIPS/PERMISSIONS WHEN ALL THESE FILES SHOULD HAVE THE SAME CONFIGURATION</U></B></TD>';
1411: }
1412: else {
1413: $fs=`find /$filesfull[$i] -prune -printf "\%m\t\%u\t\%g\n" 2>/dev/null | sort | uniq`; chop $fs;
1414: }
1415: }
1416: else {
1417: $fs=`find /$filesfull[$i] -prune -printf "\%m\t\%u\t\%g" 2>/dev/null`;
1.28 harris41 1418: if (-f "/$filesfull[$i]" && !(-l "/$filesfull[$i]")) {
1419: $checksum_source=`md5sum ../../$source2 | cut -d ' ' -f1`;
1420: chop $checksum_source;
1421: $checksum_target=`md5sum /$filesfull[$i] | cut -d ' ' -f1`;
1422: chop $checksum_target;
1.29 harris41 1423: # warn ("CS: $checksum_source, CT: $checksum_target\n");
1.28 harris41 1424: unless ($checksum_source eq $checksum_target) {
1425: $checksum="<BR><B><U>CHECKSUM DIFFERENCE</U></B>";
1426: }
1427: }
1.25 harris41 1428: }
1429: my $fsl=`find /$filesfull[$i] -type l -prune -printf "\%m\t\%u\t\%g" 2>/dev/null`;
1430: unless ($fs || $filestatus) {
1431: $filestatus='<TD BGCOLOR=#FFFFFF><B><U>MISSING</U></B></TD>';
1432: }
1433: elsif (!$filestatus) {
1434:
1435: $chmod=$info{'OWNERSHIP'}{$category}{'CHMOD'};
1436: $chown=$info{'OWNERSHIP'}{$category}{'CHOWN'};
1437: $devchmod=$info{'DEVOWNERSHIP'}{$category}{'CHMOD'};
1438: $devchown=$info{'DEVOWNERSHIP'}{$category}{'CHOWN'};
1439:
1440: my @fss=split(/\t/,$fs);
1441: my $fssz=$fss[0];
1442: $fssz="0" . $fss[0] if length($fss[0])<4;
1443: $fss[0]=$fssz;
1444: $fs="$fss[0] $fss[1]:$fss[2]";
1445: $s=' ';
1446: if ($fsl) {
1447: $fs="$fss[1]:$fss[2]";
1448: $s='';
1449: }
1450: if ($fs eq "$chmod$s$chown" && $fs eq "$devchmod$s$devchown") {
1.28 harris41 1451: $filestatus="<TD BGCOLOR=#FFFFFF>runtime+development$checksum</TD>";
1.25 harris41 1452: }
1453: elsif ($fs eq "$chmod$s$chown") {
1.28 harris41 1454: $filestatus="<TD BGCOLOR=#FFFFFF>runtime$checksum</TD>";
1.25 harris41 1455: }
1456: elsif ($fs eq "$devchmod$s$devchown") {
1.28 harris41 1457: $filestatus="<TD BGCOLOR=#FFFFFF>development$checksum</TD>";
1.25 harris41 1458: }
1459: else {
1460: $filestatus="<TD BGCOLOR=#FFFFFF><B><U>ERROR</U></B><BR>$fs</TD>";
1461: }
1462: }
1463: }
1.5 harris41 1464: $description.=<<END;
1465: <TR>
1.25 harris41 1466: $filestatus
1.5 harris41 1467: <TD BGCOLOR=#A0A0A0><IMG SRC="$fcm{$category}.gif" ALT="$category"></TD>
1468: <TD BGCOLOR=$color>$category</TD>
1469: <TD BGCOLOR=$color>$files[$i]</TD>
1470: <TD BGCOLOR=$color>$fdescription </TD>
1471: <TD BGCOLOR=$color>$source</TD>
1.9 harris41 1472: <TD BGCOLOR=$color>$note$listing$build$dependencies </TD>
1.4 harris41 1473: </TR>
1474: END
1.5 harris41 1475: }
1476: }
1.4 harris41 1477: $counter++;
1478: }
1479: $description.=<<END;
1480: </TABLE>
1481: </P>
1482: END
1483: return $description;
1484: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>