#!/usr/bin/perl # # Copyright (C) 2001 Christopher White. All rights reserved. This # program is free software; you can redistribute it and/or modify it # under the same terms as perl itself. # use HPUX::LVM; use HPUX::Ioscan; use HPUX::FS; use CGI qw/:standard :html3/; $debug=0; $debug5=0; $debug6=0; $debug8=0; $debug9=0; $tablecnt=0; $maxentries=0; $tableentries=0; $tableentries_save=0; $query=new CGI; $sub_system = $query->param('p_hpsystem'); $sub_type = $query->param('p_type'); $sub_fshighlight = $query->param('p_filesystemhl'); $sub_rtype = $query->param('p_rtype'); $sub_post = $query->param('p_post') || "0"; $sub_loc_data = $query->param('p_loc_data') || '/tmp/lvminfo.dat'; $sub_post_data = $query->param('p_post_data') || '/tmp/postout.ps'; $sub_show_empty = $query->param('p_show_empty') || 'no'; $sub_extended_disk_info = $query->param('p_edi') || 'no'; $sub_persist = $query->param('p_persist') || 'new'; # Cgi setup stuff #setup some custom html variables $html_border =0; $html_cellheadercolor ="003366"; $html_cellcolor ="CCCCCC"; $html_font ="Helvetica"; $html_headerfontcolor ="FFFFFF"; $html_fontsize ="1"; $html_cellfontcolor ="000000"; $|=1; $myjavascript=<'); pop.document.write('

HP LVM Disk Info

'); pop.document.write('

Please Wait... While This Page Loads

'); pop.document.write('
This Window Will Close Itself...
'); pop.document.write(''); //--> END $mystyle=< END #check for postscript output option #shit if sub_post=1 then do it. if ( $sub_post ) { open (POSTOUT, ">$sub_post_data") or die "Unable to open postfile\n"; &postscript_setup; } # start the html and put up a please wait javascript print header(); print start_html(-title=>"Disk Layout of $sub_system",-style=>{-code=>$mystyle}, -script=>$myjavascript); # Create data structures my $lvminfo_data = new HPUX::LVM( target_type =>"local", persistance =>"$sub_persist", datafile =>"$sub_loc_data", access_prog =>"$sub_rtype", access_system =>"$sub_system", access_user =>"root" ); print "<\BR><\BR>"; my $ioscan_data = new HPUX::Ioscan( target_type =>"local", persistance =>"$sub_persist", access_prog =>"$sub_rtype", access_system =>"$sub_system", access_user =>"root", extended_disk_info =>"$sub_extended_disk_info", access_speed =>"slow" ); print "<\BR><\BR>"; my $fsinfo_data = new HPUX::FS( target_type =>"local", persistance =>"$sub_persist", access_prog =>"$sub_rtype", access_system =>"$sub_system", access_user =>"root" ); print "<\BR><\BR>"; #sample data structure traverse methods #$junkme1 = $lvminfo_data->traverse(); #$junkme2 = $ioscan_data->traverse(); #$junkme3 = $fsinfo_data->traverse(); #Get a hash of all the pvlinks (if any) my $hashref = $lvminfo_data->get_all_pvlinks; print "Alternate Link Hash Ref is: $hashref\n" if $debug8; my %linkhash = %$hashref; #End of alternate link hash generation print "Get Controllers!\n" if $debug; $arref = $ioscan_data->get_disk_controllers(); # start main table thats gonna hold tables in its cells # using raw HTML to create main table. $buffouttable_final=''; CONTRLOOP: foreach $contr ( @$arref ) { $maxentries=0; print "Controller: $contr\n" if $debug; $instance = $ioscan_data->get_instance_number( hwpath => $contr ); $instance_desc = $ioscan_data->get_description( hwpath => $contr ); print "Instance: $instance\n" if $debug; print "Get Disks in controller $contr\n" if $debug; $arref2 = $ioscan_data->get_all_disks_on_controller ( controller =>"$contr" ); if ( scalar(@$arref2) eq 0 and $sub_show_empty eq "no") { print "No Devices on controller!\n" if $debug; next CONTRLOOP; } if ($sub_post) { $post_tablecnt=0; print POSTOUT "\($contr Inst: $instance\) DoRowTitle\n"; } $buffouttable_final=$buffouttable_final.''; @rows=(); @rows_good=(); @headers=( "LVOL", "MNTPT", "EXT" ); # push @rows_good, th({ -bgcolor=>$html_cellheadercolor, class=>'smallcontenthead' }, \@headers); # adding some kind of device file sort order here: foreach $dsk ( @{ $arref2 } ) { # # Adding diskinfo option here # if ( $sub_extended_disk_info eq "yes" ) { $disk_size = $ioscan_data->get_device_diskinfo( device_name => $dsk, attribute => size, ) || "N/A"; print "disk_size: $disk_size\n" if $debug; } # # End of diskinfo option # $buffouttable_final=$buffouttable_final.''; if ($sub_post) { # rewind to start of row $post_backup = $post_tablecnt*200; print POSTOUT "%Move to next row plus 4 row lengths\n"; print POSTOUT "cellh 4 mul 0 pretranslate\n"; print POSTOUT "cellh 4 mul 0 pretranslate\n"; print POSTOUT "0 negtotaltranslate pretranslate\n"; print POSTOUT "/totaltranslate 0 def","\n"; print POSTOUT "/negtotaltranslate 0 def","\n"; print POSTOUT "/maxlength 0 def","\n"; print POSTOUT "/negmaxlength 0 def","\n"; } print "MaxEntries: $maxentries
\n" if $debug; } print $buffouttable_final,'
'.$contr.'
Inst: '.$instance.'
Desc:'.$instance_desc.'
'; push @rows_good, th({ -bgcolor=>$html_cellheadercolor, class=>'smallcontenthead' }, \@headers); print "disk: $dsk\n" if $debug; $getlvoldata = $lvminfo_data->get_disk_lvol_data( device_name => "$dsk" ); @check_keys = keys %$getlvoldata; print "Check_keys is: @check_keys\n" if $debug5; print "scalar check_keys is:".scalar(@check_keys)."\n" if $debug5; %disklvoldata = %$getlvoldata; #alternative AUTOLOAD call (Kinda confusing, use the provided get methods) # $total_pe_on_pv = $lvminfo_data->get_Total_PE( # volume_group => $lv_vg, # vg_sub_cat => Physical_Vols, # vg_sub_cat_pv=> $dsk, # ) || "\ "; @checklvols = (sort keys %disklvoldata); print "Number of lvols: ",scalar(@checklvols),"\n" if $debug; if ( scalar(@checklvols) < 1 ) { $total_pe_on_pv = "\ "; } foreach $lvol ( sort keys %disklvoldata ) { $tableentries++; $lv_vg = $disklvoldata{$lvol}->{vg_on_pv}; $total_pe_on_pv = $lvminfo_data->get_vg_physicalvol_attr( volume_group => "$lv_vg", device_name => "$dsk", attribute => "Total_PE" ); $stripes_on_lv = $lvminfo_data->get_vg_lvol_attr_lvdisplay( volume_group => "$lv_vg", logical_vol => "$lvol", attribute => "Stripes" ); print "Total PE On PV=$total_pe_on_pv\n" if $debug; print "Volume Group: $lv_vg\n" if $debug; $lvolshow = $lv_vg.'/'.$lvol; print "Logical Vol: $lvol\n" if $debug; push @rows, $lvolshow; $mntpt = $fsinfo_data->get_filesystem_attr( filesystem => "$lvolshow", attribute => 'directory' ); if ( $stripes_on_lv gt 0 ) { #If stripes then do something useful $ordered_stripes_arr_ref = $lvminfo_data->get_vg_lvol_stripeorder( volume_group => "$lv_vg", logical_vol => "$lvol" ); @ordered_stripes = @$ordered_stripes_arr_ref; $stripe_index=0; for ($i = 0; $i< @ordered_stripes ; $i++ ) { print "Ordered_stripes: $ordered_stripes[$i]\n
" if $debug9; print "dsk: $dsk\n
" if $debug9; if ( $ordered_stripes[$i] eq $dsk ) { $stripe_index=$i+1; } } $mntpt=$mntpt.'(Stripe '.$stripe_index.' of '.scalar(@ordered_stripes); } if ( $mntpt eq "$sub_fshighlight" && $sub_fshighlight ne "" ) { $mntpt = ''.$mntpt.''; } push @rows, $mntpt; print " le_on_pv: $disklvoldata{$lvol}->{le_on_pv}\n" if $debug; push @rows, $disklvoldata{$lvol}->{pe_on_pv}; print " pe_on_pv: $disklvoldata{$lvol}->{pe_on_pv}\n" if $debug; $used_by_lv = $disklvoldata{$lvol}->{pe_on_pv}; $used_pe = $used_pe + $disklvoldata{$lvol}->{pe_on_pv}; push @rows_good, td({-bgcolor=>$html_cellcolor, -class=>'smallcontent'}, \@rows); if ($sub_post) { $tablecnt++; $psbuff=$psbuff."\($rows[0]\) \($rows[1]\) \($rows[2]\) DoShadeRow\n"; $psbufflen=$psbufflen."\($rows[0]\) check_length \($rows[1]\) check_length \($rows[2]\) check_length\n"; } @rows=(); } #Count the number of rows in each disk and keep track of it so we can translate the postscript # later the max number for that collumn. $tableentries_save = $tableentries; if ($maxentries < $tableentries) { print "TAbleEntries is: $tableentries
\n" if $debug; $maxentries = $tableentries; print "Maxentries is now!: $maxentries
\n" if $debug; } $tableentries=0; @total_line = ( "Total", "\ ","$total_pe_on_pv" ); $free_pe_on_pv = $total_pe_on_pv - $used_pe; $used_pe=""; @free_line = ( "Free" , "\ ","$free_pe_on_pv" ); push @rows_good,td({ -bgcolor=>$html_cellheadercolor, -class=>'smallcontenthead'}, \@total_line); push @rows_good,td({ -bgcolor=>$html_cellheadercolor, -class=>'smallcontenthead'}, \@free_line); if ($sub_post and $tableentries_save) { # $psbuff=$psbuff."\($total_pe_on_pv\) \($free_pe_on_pv\ ) DoTotalandFree ".($tableentries_save+4)." check_ywrap\n"; $psbuff=$psbuff."\($total_pe_on_pv\) \($free_pe_on_pv\ ) DoTotalandFree \n"; $psbuff=$psbuff."/maxlength 0 def\n"; $psbuff=$psbuff."/negmaxlength 0 def\n"; $psbuff=$psbuff."\n"; $psbuff=$psbuff."tablewidth totalrowwidthcalc\n"; $psbuff=$psbuff."0 tablewidth htablepad add pretranslate \n"; print "tableEntries_save is: $tableentries_save
\n" if $debug; $psbuff=$psbuff."cellh \-".($tableentries_save+2)." mul 0 pretranslate\n"; $psbuff=$psbuff."check_xwrap\n"; #temp add $psbuff=$psbuff.($tableentries_save+4)." check_ywrap\n"; # $psbuff=$psbuff."0 negtotaltranslate translate\n"; # $psbuff=$psbuff."/totaltranslate 0 def","\n"; # $psbuff=$psbuff."/negtotaltranslate 0 def","\n"; # $psbuff=$psbuff."/maxlength 0 def","\n"; # $psbuff=$psbuff."/negmaxlength 0 def","\n"; $post_tablecnt++; } # Add alternate links to disk $disk_n_alt = $lvminfo_data->get_vg_alternate_links( volume_group => $lv_vg, device_name => $dsk ); print "disk_n_alt is:$disk_n_alt\n" if $debug5; print "disk_n_alt value is:@$disk_n_alt\n" if $debug5; @disk_n_alt_conv = @$disk_n_alt; $ps_disk_n_alt_good=$dsk; if ($disk_n_alt_conv[0] ne "None" and $disk_n_alt_conv[0] ne "NotDefined" ) { print "Alternate links found!\n" if $debug5; $ps_disk_n_alt_good=$dsk."LINK DATA"; $disk_n_alt_good = $dsk.'
'.join('(link)
', @disk_n_alt_conv).'(link)
'; } else { print "No alternate links found!\n" if $debug5; $disk_n_alt_good=$dsk; } if (scalar(@check_keys) == 0 ) { $psbuff = "\(\) \( $ps_disk_n_alt_good \) MakeHeaderalt\n".$psbuff; print "No LVM found on this\n" if $debug5; print "Adding 1 to maxentries
\n" if $debug; print "Makeing tableenties_save 1
\n" if $debug; $maxentries++; $tableentries_save=1; # # If no LVM Found change the headings to device info type headings # shift @rows_good; @headers=( "Class", "Driver", "Description" ); $myhwpath = $ioscan_data->get_device_hwpath( device_name => $dsk ); print "Myhwpath = $myhwpath\n" if $debug6; $myclass = $ioscan_data->get_class( hwpath => $myhwpath ); $mydriver = $ioscan_data->get_driver( hwpath => $myhwpath ); $mydesc = $ioscan_data->get_description( hwpath => $myhwpath ); unshift @rows_good, th({ -bgcolor=>$html_cellheadercolor, class=>'smallcontenthead' }, \@headers); pop @rows_good; pop @rows_good; push @rows_good, td({-bgcolor=>$html_cellcolor, -class=>'smallcontent'}, [ $myclass, $mydriver, $mydesc ]); if ($disk_size ne "" && $sub_extended_disk_info ne "yes" ) { $disk_n_alt_good = $disk_n_alt_good.'
NOT IN LVM
'; } else { $disk_n_alt_good = $disk_n_alt_good.'
NOT IN LVM
'; } #Add Disk Alternate Link Check Here foreach $keyme ( sort keys %linkhash ) { print "Key: $keyme\n" if $debug8; $cntr=0; foreach $valueme ( @{ $linkhash{$keyme} } ) { $cntr++; if (length($valueme) < 1) { print "Value less than 1\n
" if $debug8; print "Value is:",length($valueme),"
\n" if $debug8; } print "Value: $valueme
\n" if $debug8; print "disk_n_alt_good: $disk_n_alt_good
\n" if $debug8; if ( $disk_n_alt_good =~ /$valuemeLink No. $cntr of $keyme"; } } } $psbuff=$psbuff."\($myclass\) \($mydriver\) \($mydesc\) DoShadeRow\n"; $psbufflen=$psbufflen."\($myclass\) check_length \($mydriver\) check_length \($mydesc\) check_length\n"; $psbuff=$psbuff."/maxcellwidth maxlength def\n"; $psbuff=$psbuff."/negmaxcellwidth maxcellwidth -1 mul def\n"; $psbuff=$psbuff."/tablewidth maxcellwidth 3 mul def\n"; $psbuff=$psbuff."/negtablewidth maxcellwidth -3 mul def\n"; # $psbuff=$psbuff."\(NA\) \(NA\ ) DoTotalandFree ".($tableentries_save+4)." check_ywrap\n"; $psbuff=$psbuff."\(NA\) \(NA\ ) DoTotalandFree \n"; $psbuff=$psbuff."/maxlength 0 def\n"; $psbuff=$psbuff."/negmaxlength 0 def\n"; $psbuff=$psbuff."tablewidth totalrowwidthcalc\n"; $psbuff=$psbuff."0 tablewidth htablepad add pretranslate\n"; print "Just added ending stuff to non lvm table
\n" if $debug; $psbuff=$psbuff."cellh \-".($tableentries_save+2)." mul 0 pretranslate\n"; #temp add $psbuff=$psbuff.($tableentries_save+4)." check_ywrap\n"; $psbuff=$psbuff."\n"; $psbuff=$psbuff."\n"; $psbuff=$psbuff."\n"; print POSTOUT $psbufflen; print POSTOUT $psbuff; $psbufflen=""; } else { if ($sub_post) { #Dont need to check title length # $psbufflen = $psbufflen."\($disk_n_alt_good \) check_length\n"; print POSTOUT $psbufflen; print POSTOUT "/maxcellwidth maxlength def","\n"; print POSTOUT "/negmaxcellwidth maxcellwidth -1 mul def","\n"; print POSTOUT "/tablewidth maxcellwidth 3 mul def","\n"; print POSTOUT "/negtablewidth maxcellwidth -3 mul def","\n"; print POSTOUT "","\n"; $psbufflen=""; } $psbuff = "\(\) \( $disk_n_alt_good \) MakeHeader\n".$psbuff; print POSTOUT $psbuff; } # # add the Size header # if ( $sub_extended_disk_info eq "yes" ) { $disk_n_alt_good=$disk_n_alt_good.'
Size:'.$disk_size; } # # end of adding size header # #set it back @headers=( "LVOL", "MNTPT", "EXT" ); $buffouttable_single = table({-border=>$html_border,-width=>'25%', -class=>'smallcontent'}, caption({-bgcolor=>$html_cellcolor, -class=>'smallcontent' },$disk_n_alt_good), Tr(\@rows_good) ); @rows=(); @rows_good=(); $psbuff=""; $buffouttable_final = $buffouttable_final.$buffouttable_single.'
'; } $buffouttable_final = $buffouttable_final.'
'; print end_html(); if ( $sub_post ) { print POSTOUT "showpage\n"; close POSTFILE; } sub postscript_setup { print POSTOUT "%","\n"; print POSTOUT "%------------defines--statics","\n"; print POSTOUT "%","\n"; print POSTOUT "%These values can be changed to whatever your prefrence","\n"; print POSTOUT "%","\n"; print POSTOUT "%height of font","\n"; print POSTOUT "/fonth 4 def","\n"; print POSTOUT "%global left margin","\n"; print POSTOUT "0 20 translate","\n"; print POSTOUT "%space between font and top/bottom of cell","\n"; print POSTOUT "/fontpad 2 def","\n"; print POSTOUT "%defines start of total row translation","\n"; print POSTOUT "/totaltranslate 0 def","\n"; print POSTOUT "/negtotaltranslate 0 def","\n"; print POSTOUT "%amount of pading between tables","\n"; print POSTOUT "/htablepad 4 def","\n"; print POSTOUT "%amount of points for whole sheet width lanscape","\n"; print POSTOUT "/widthofsheet 792 def"; print POSTOUT "%amount of points for whole sheet length tall","\n"; print POSTOUT "/lengthofsheet 612 def","\n"; print POSTOUT "%amount of padding between rows","\n"; print POSTOUT "/vtablepad 4 def","\n"; print POSTOUT "%left margin","\n"; print POSTOUT "/leftmargin 10 def","\n"; print POSTOUT "/rightmargin 10 def","\n"; print POSTOUT "%left side buffer between cell start and value","\n"; print POSTOUT "/lbuffstr 2 def","\n"; print POSTOUT "/maxlength 0 def","\n"; print POSTOUT "%pre translate variables","\n"; print POSTOUT "/xmove 0 def","\n"; print POSTOUT "/ymove 0 def","\n"; print POSTOUT "/totalxmove 0 def","\n"; print POSTOUT "/totalymove 0 def","\n"; print POSTOUT "%","\n"; print POSTOUT "%------------procedures","\n"; print POSTOUT "%","\n"; print POSTOUT "%Check add string lengths so we can base them all on the longest","\n"; print POSTOUT "/check_length {","\n"; print POSTOUT " stringwidth exch /newlen exch def newlen maxlength gt {%if","\n"; print POSTOUT " /maxlength newlen def","\n"; print POSTOUT " /negmaxlength newlen -1 mul def","\n"; print POSTOUT " } if","\n"; print POSTOUT " } def","\n"; print POSTOUT "/check_xwrap {","\n"; print POSTOUT " totalxmove 500 gt {%if","\n"; print POSTOUT " /xmove 0 def","\n"; print POSTOUT " /ymove 0 def","\n"; print POSTOUT " /totalxmove 0 def","\n"; print POSTOUT " /totalymove 0 def","\n"; print POSTOUT " /totaltranslate 0 def","\n"; print POSTOUT " /negtotaltranslate 0 def","\n"; #added 20 translate so each page starts futher down print POSTOUT " showpage 20 0 translate","\n"; print POSTOUT " } if","\n"; print POSTOUT " }def","\n"; print POSTOUT "%pre pretranslate to keep track of x","\n"; print POSTOUT "/pretranslate {","\n"; print POSTOUT " /ymove exch def","\n"; print POSTOUT " /xmove exch def","\n"; print POSTOUT " /totalymove totalymove ymove add def","\n"; print POSTOUT " /totalxmove totalxmove xmove add def","\n"; print POSTOUT " xmove ymove translate","\n"; print POSTOUT " } def","\n"; print POSTOUT "%keep track of total table width (including the padding between them) as","\n"; print POSTOUT "% add them all up as we go so we know how much to translate back to the","\n"; print POSTOUT "% start.","\n"; print POSTOUT "/totalrowwidthcalc {%def","\n"; print POSTOUT " htablepad add totaltranslate add /totaltranslate exch def ","\n"; print POSTOUT " /negtotaltranslate totaltranslate -1 mul def ","\n"; print POSTOUT " } def","\n"; print POSTOUT "\n"; print POSTOUT "%Check to see how far over we can go before wrapping","\n"; print POSTOUT "/check_ywrap {","\n"; print POSTOUT " /curr_xtrans exch def","\n"; print POSTOUT " /curr_xtrans curr_xtrans cellh mul cellh add def","\n"; print POSTOUT " widthofsheet 200 sub totaltranslate lt {%if","\n"; print POSTOUT " 0 negtotaltranslate pretranslate","\n"; print POSTOUT " curr_xtrans 0 pretranslate","\n"; print POSTOUT " /totaltranslate 0 def","\n"; print POSTOUT " /negtotaltranslate 0 def","\n"; # add a spacer print POSTOUT "(CONTINUED ROW) check_length","\n"; #print POSTOUT "() (CONTINUED ROW) MakeHeader","cellh 0 pretranslate\n"; print POSTOUT "cellh 0 pretranslate\n"; #print POSTOUT "(CONTINUED ROW) (CONTINUED ROW) (CONTRINUED ROW) DoShadeRow","cellh 0 pretranslate\n"; print POSTOUT "cellh 0 pretranslate\n"; print POSTOUT "/maxcellwidth maxlength def ","\n"; print POSTOUT "/negmaxcellwidth maxcellwidth -1 mul def ","\n"; print POSTOUT "/tablewidth maxcellwidth 3 mul def ","\n"; print POSTOUT "/negtablewidth maxcellwidth -3 mul def ","\n"; #print POSTOUT "(NA) (NA) DoTotalandFree ","cellh 0 pretranslate cellh 0 pretranslate\n"; print POSTOUT "cellh 0 pretranslate cellh 0 pretranslate\n"; print POSTOUT "/maxlength 0 def ","\n"; print POSTOUT "/negmaxlength 0 def ","\n"; print POSTOUT "tablewidth totalrowwidthcalc ","\n"; print POSTOUT "0 tablewidth htablepad add pretranslate ","\n"; print POSTOUT "cellh -3 mul 0 pretranslate ","\n"; print POSTOUT "check_xwrap","\n"; #end of spacer print POSTOUT " } if","\n"; print POSTOUT " } def","\n"; print POSTOUT "%","\n"; print POSTOUT "%------------defines--formula-based","\n"; print POSTOUT "%","\n"; print POSTOUT "","\n"; print POSTOUT "% Define the Font","\n"; print POSTOUT "/HelveticaBold findfont fonth scalefont setfont","\n"; print POSTOUT "%width of cell (will vary depening on maximum string width","\n"; print POSTOUT "/cellw maxlength def %not used yet","\n"; print POSTOUT "%cell height total","\n"; print POSTOUT "/cellh fontpad 2 mul fonth add def","\n"; print POSTOUT "/negcellh cellh -1 mul def","\n"; print POSTOUT "%starting point (bottom left corner point xy pos) of string in cell","\n"; print POSTOUT "/cellstrstart cellh fontpad sub def","\n"; print POSTOUT "/negcellstrstart cellstrstart -1 mul def","\n"; print POSTOUT "/headstringstart cellstrstart def","\n"; print POSTOUT "%","\n"; print POSTOUT "%------------drawing procs","\n"; print POSTOUT "%","\n"; print POSTOUT "/DoRowTitle {","\n"; print POSTOUT " 0 0 moveto show /HelveticaBold findfont fonth scalefont setfont","\n"; print POSTOUT " } bind def","\n"; print POSTOUT "","\n"; print POSTOUT "/DoTableTitle {","\n"; print POSTOUT " /titleval exch def","\n"; #print POSTOUT " 0 cellh moveto 90 rotate titleval show -90 rotate","\n"; print POSTOUT " cellh cellh moveto fonth fonth rmoveto fonth -1.5 mul 0 rmoveto 90 rotate titleval show -90 rotate","\n"; print POSTOUT " } def","\n"; print POSTOUT " ","\n"; print POSTOUT "/DoCell {","\n"; print POSTOUT " /value exch def","\n"; print POSTOUT "%skip over title","\n"; print POSTOUT "%cellh accomodates the title","\n"; print POSTOUT " rightmargin leftmargin moveto","\n"; print POSTOUT " 0 maxlength rlineto cellh 0 rlineto 0 negmaxlength rlineto negcellh 0 rlineto fill stroke","\n"; print POSTOUT " rightmargin cellstrstart add leftmargin moveto","\n"; print POSTOUT " 90 rotate 1 setgray value show -90 rotate 0 setgray","\n"; print POSTOUT " 0 maxlength pretranslate","\n"; print POSTOUT " } def","\n"; print POSTOUT "","\n"; print POSTOUT "/MakeHeaderalt{ ","\n"; print POSTOUT " /devicefileprimary exch def","\n"; print POSTOUT " /devicefilealternate exch def ","\n"; print POSTOUT " devicefileprimary DoTableTitle","\n"; print POSTOUT " (Class) DoCell","\n"; print POSTOUT " (Driver) DoCell","\n"; print POSTOUT " (Description) DoCell","\n"; print POSTOUT " 0 negmaxlength pretranslate","\n"; print POSTOUT " 0 negmaxlength pretranslate","\n"; print POSTOUT " 0 negmaxlength pretranslate","\n"; print POSTOUT " %translate down 1 row to start regular rows","\n"; print POSTOUT " cellh 0 pretranslate","\n"; print POSTOUT " } bind def","\n"; print POSTOUT "","\n"; print POSTOUT "/MakeHeader{ ","\n"; print POSTOUT " /devicefileprimary exch def","\n"; print POSTOUT " /devicefilealternate exch def ","\n"; print POSTOUT " devicefileprimary DoTableTitle","\n"; print POSTOUT " (LVOL) DoCell","\n"; print POSTOUT " (Mount Point) DoCell","\n"; print POSTOUT " (Extents) DoCell","\n"; print POSTOUT " 0 negmaxlength pretranslate","\n"; print POSTOUT " 0 negmaxlength pretranslate","\n"; print POSTOUT " 0 negmaxlength pretranslate","\n"; print POSTOUT " %translate down 1 row to start regular rows","\n"; print POSTOUT " cellh 0 pretranslate","\n"; print POSTOUT " } bind def","\n"; print POSTOUT "","\n"; print POSTOUT "/DoTotalandFree {","\n"; print POSTOUT " /freedisk exch def","\n"; print POSTOUT " /totaldisk exch def","\n"; print POSTOUT " (Total) DoCell","\n"; print POSTOUT " () DoCell","\n"; print POSTOUT " totaldisk DoCell","\n"; print POSTOUT " %translate down 1 row","\n"; print POSTOUT " cellh 0 pretranslate","\n"; print POSTOUT " 0 negmaxlength pretranslate","\n"; print POSTOUT " 0 negmaxlength pretranslate","\n"; print POSTOUT " 0 negmaxlength pretranslate","\n"; print POSTOUT " (Free) DoCell","\n"; print POSTOUT " () DoCell","\n"; print POSTOUT " freedisk DoCell","\n"; print POSTOUT " 0 negmaxlength pretranslate","\n"; print POSTOUT " 0 negmaxlength pretranslate","\n"; print POSTOUT " 0 negmaxlength pretranslate","\n"; print POSTOUT " } def","\n"; print POSTOUT "/DoRow {","\n"; print POSTOUT " /extents exch def","\n"; print POSTOUT " /filesystem exch def","\n"; print POSTOUT " /logicalvol exch def","\n"; print POSTOUT "%skip the title and header","\n"; print POSTOUT " rightmargin leftmargin moveto","\n"; print POSTOUT " cellstrstart 0 rmoveto 90 rotate logicalvol show -90 rotate","\n"; print POSTOUT " negcellstrstart 0 rmoveto","\n"; print POSTOUT " 0 maxlength pretranslate","\n"; print POSTOUT " rightmargin leftmargin moveto","\n"; print POSTOUT " cellstrstart 0 rmoveto 90 rotate filesystem show -90 rotate","\n"; print POSTOUT " negcellstrstart 0 rmoveto","\n"; print POSTOUT " 0 maxlength pretranslate","\n"; print POSTOUT " rightmargin leftmargin moveto","\n"; print POSTOUT " cellstrstart 0 rmoveto 90 rotate extents show -90 rotate","\n"; print POSTOUT " negcellstrstart 0 rmoveto","\n"; print POSTOUT " %translate down 1 row","\n"; print POSTOUT " 0 negmaxlength pretranslate","\n"; print POSTOUT " 0 negmaxlength pretranslate","\n"; print POSTOUT " cellh 0 pretranslate","\n"; print POSTOUT " } def","\n"; print POSTOUT "/DoShadeRow {","\n"; print POSTOUT " /extents exch def","\n"; print POSTOUT " /filesystem exch def","\n"; print POSTOUT " /logicalvol exch def","\n"; print POSTOUT "%skip the title and header","\n"; print POSTOUT " rightmargin leftmargin moveto","\n"; print POSTOUT " cellstrstart 0 rmoveto 0 maxlength 2 sub rlineto cellh -1 mul -4 sub 0 rlineto 0 maxlength -1 mul 2 add rlineto cellstrstart 0 rlineto .8 setgray fill stroke 0 setgray","\n"; print POSTOUT " rightmargin leftmargin moveto","\n"; print POSTOUT " cellstrstart 0 rmoveto 90 rotate logicalvol show -90 rotate","\n"; print POSTOUT " negcellstrstart 0 rmoveto","\n"; print POSTOUT " 0 maxlength pretranslate","\n"; print POSTOUT " rightmargin leftmargin moveto","\n"; print POSTOUT " cellstrstart 0 rmoveto 0 maxlength 2 sub rlineto cellh -1 mul -4 sub 0 rlineto 0 maxlength -1 mul 2 add rlineto cellstrstart 0 rlineto .8 setgray fill stroke 0 setgray","\n"; print POSTOUT " rightmargin leftmargin moveto","\n"; print POSTOUT " cellstrstart 0 rmoveto 90 rotate filesystem show -90 rotate","\n"; print POSTOUT " negcellstrstart 0 rmoveto","\n"; print POSTOUT " 0 maxlength pretranslate","\n"; print POSTOUT " rightmargin leftmargin moveto","\n"; print POSTOUT " cellstrstart 0 rmoveto 0 maxlength 2 sub rlineto cellh -1 mul -4 sub 0 rlineto 0 maxlength -1 mul 2 add rlineto cellstrstart 0 rlineto .8 setgray fill stroke 0 setgray","\n"; print POSTOUT " rightmargin leftmargin moveto","\n"; print POSTOUT " cellstrstart 0 rmoveto 90 rotate extents show -90 rotate","\n"; print POSTOUT " negcellstrstart 0 rmoveto","\n"; print POSTOUT " %translate down 1 row","\n"; print POSTOUT " 0 negmaxlength pretranslate","\n"; print POSTOUT " 0 negmaxlength pretranslate","\n"; print POSTOUT " cellh 0 pretranslate","\n"; print POSTOUT " } def","\n"; print POSTOUT "","\n"; print POSTOUT "","\n"; print POSTOUT "","\n"; }