#!/usr/bin/perl # IBM(c) 2007 EPL license http://www.eclipse.org/legal/epl-v10.html # First builds the xCAT summary man page from Synopsis of each man page. # Then converts all of the pod man pages into html (including links to each other) # We assume that this script is run in the xCAT-client-2.0 dir, so everything is # done relative to that. use strict; #use lib '.'; use Pod::Man; use Pod::Html; my $poddir = 'pods'; my $mandir = 'share/man'; my $htmldir = 'share/doc'; my @pods = getPodList($poddir); #foreach (@pods) { print "$_\n"; } exit; # Build the cmd overview page. writesummarypage("$poddir/man1/xcat.1.pod", @pods); push @pods, "$poddir/man1/xcat.1.pod"; # Build the man page for each pod. #mkdir($mandir) or die "Error: could not create $mandir.\n"; print "Converting PODs to man pages...\n"; foreach my $podfile (@pods) { my $manfile = $podfile; $manfile =~ s/^$poddir/$mandir/; # change the beginning of the path $manfile =~ s/\.pod$//; # change the ending my $mdir = $manfile; $mdir =~ s|/[^/]*$||; # get rid of the basename part if (system("mkdir -p $mdir")) { die "Error: could not create $mdir.\n"; } my ($section) = $podfile =~ /\.(\d+)\.pod$/; convertpod2man($podfile, $manfile, $section); } #TODO: to enable linking between the cmd man pages and the db man pages, need to: # grep thru the cmd pods searching for references (L<>) to any section 5 man page # if that pod does not exist, create a minimal one that will satisfy pod2html # keep track of all dummy pods created # convert all original pod pages # remove the dummy pods # Build the html page for each pod. #mkdir($htmldir) or die "Error: could not create $htmldir.\n"; print "Converting PODs to HTML pages...\n"; foreach my $podfile (@pods) { my $htmlfile = $podfile; $htmlfile =~ s/^$poddir/$htmldir/; # change the beginning of the path $htmlfile =~ s/\.pod$/\.html/; # change the ending my $hdir = $htmlfile; $hdir =~ s|/[^/]*$||; # get rid of the basename part if (system("mkdir -p $hdir")) { die "Error: could not create $hdir.\n"; } convertpod2html($podfile, $htmlfile, $poddir, $htmldir); } exit; # Recursively get the list of pod man page files. sub getPodList { my $poddir = shift; my @files; # 1st get toplevel dir listing opendir(DIR, $poddir) or die "Error: could not read $poddir.\n"; my @topdir = grep !/^\./, readdir(DIR); close(DIR); # Now go thru each subdir (these are man1, man3, etc.) foreach my $mandir (@topdir) { opendir(DIR, "$poddir/$mandir") or die "Error: could not read $poddir/$mandir.\n"; my @dir = grep !/^\./, readdir(DIR); close(DIR); foreach my $file (@dir) { push @files, "$poddir/$mandir/$file"; } } return sort @files; } # Create the xcat man page that gives a summary description of each xcat cmd. sub writesummarypage { my $file = shift; # relative path file name of the man page # the rest of @_ contains the pod files that describe each cmd open(FILE, ">$file") or die "Error: could not open $file for writing.\n"; print FILE <<'EOS1'; =head1 NAME B - extreme Cluster Administration Tool. =head1 DESCRIPTION Extreme Cluster Administration Toolkit (xCAT). xCAT is a scalable distributed computing management and provisioning tool that provides a unified interface for hardware control, discovery, and OS diskful/diskfree deployment. =head1 XCAT DATABASE All of the cluster configuration information is in the xCAT database. See B for descriptions of every table in the database. =head1 XCAT COMMANDS What follows is a short description of each xCAT command. To get more information about a particular command, see its man page. =over 12 EOS1 # extract the summary for each cmd from its man page foreach my $manpage (@_) { my ($sectionnum) = $manpage =~ /\.(\d+)\.pod$/; # Suck in the whole file, then we will parse it. open(MANPAGE, "$manpage") or die "Error: could not open $manpage for reading.\n"; my @contents = ; my $wholemanpage = join('', @contents); close(MANPAGE); # This regex matches: optional space, =head1, space, title, space, cmd, space, description, newline my ($cmd, $description) = $wholemanpage =~ /^\s*=head1\s+\S+\s+(\S+)\s+(.+?)\n/si; if (!defined($cmd)) { print "Warning: $manpage is not in a recognized structure. It will be ignored.\n"; next; } if (!defined($description)) { print "Warning: $manpage does not have a description for $cmd. It will be ignored.\n"; next; } $cmd =~ s/^.<(.+)>$/$1/; # if the cmd name has pod formatting around it, strip it off $description =~ s/^-\s*//; # if the description has a leading hypen, strip it off print FILE "\n=item L<$cmd($sectionnum)|$cmd.$sectionnum>\n\n".$description."\n"; } print FILE <<"EOS3"; =back EOS3 close FILE; } # Create the html page for one pod. sub convertpod2html { my ($podfile, $htmlfile, $poddir, $htmldir) = @_; #TODO: use --css= and --title= to make the pages look better pod2html($podfile, "--outfile=$htmlfile", "--podpath=man1:man3:man5:man8", "--podroot=$poddir", "--htmldir=$htmldir", "--recurse", "--cachedir=/tmp", ); } # Create the man page for one pod. sub convertpod2man { my ($podfile, $manfile, $section) = @_; my $parser = Pod::Man->new(section => $section); $parser->parse_from_file($podfile, $manfile); }