# INVinfo.ctl: Defines Common Installation/Inventory Macros # $Id: INVinfo.ctl,v 1.7 2015/10/27 17:06:03 RDA Exp $ # ARCS: $Header: /home/cvs/cvs/RDA_8/src/scripting/lib/collect/RDA/INVinfo.ctl,v 1.7 2015/10/27 17:06:03 RDA Exp $ # # Change History # 20151027 KRA Extend 'Interim Patches' detection on OFM 12c. =head1 NAME RDA:INVinfo - Defines Common Installation/Inventory Macros =head1 DESCRIPTION This persistent submodule regroups common installation/inventory macros. The following macro is available: =cut # Make the module persistent and share macros keep $KEEP_BLOCK,@SHARE_MACROS var @SHARE_MACROS = ('inventory_details') =head2 S This macro reports the inventory details. When the flag is set, it adds the file or directory list for the interim patches. =cut macro inventory_details {var ($dir,$flg) = @arg import $TOP if ?testFile('fr',catFile($dir,'ContentsXML','comps.xml')) {var $inv = xmlLoadFile(last) var $flt = isFiltered() macro fmt_date {if match($arg[0],'^(\d{4})\.(\w{3})\.(\d{2})(.*)$') {var ($yea,$mon,$day,$tim) = (last) return concat($day,'-',$mon,'-',$yea,replace($tim,' ',' ',true)) } return $arg[0] } macro fmt_file {var ($dir,$fil) = @arg if and($dir,$fil) return catFile($dir,$fil) if $dir return $dir return $fil } macro fmt_version return replace($arg[0],'\.','.',true) # Explore the top level products var ($cnt,$dis,%all,%top_dsc,%top_set,%top_ver) = (0,false) if ?testDir('d',catDir($dir,'distributions')) {loop $fil (grepDir(lastDir(),'\.xml$','np')) {var $inv = xmlLoadFile($fil) loop $xml (xmlFind($inv,'distribution')) {var $nam = xmlValue($xml,'name') var $ver = xmlValue($xml,'version') var $dsc = nvl(xmlValue($xml,'external-name'),\ xmlValue($xml,'external-shortname')) var $all{uc($dsc)} = $nam var $top_dsc{$nam} = $dsc var $top_ver{$nam} = cond($flt,fmt_version($ver),$ver) } } var $dis = true } else {loop $xml (xmlFind($inv,'PRD_LIST/TL_LIST/COMP')) {var $nam = xmlValue($xml,'NAME') var $ver = xmlValue($xml,'VER') var $dsc = xmlData(xmlFind($xml,'EXT_NAME')) var $key = uc($dsc) var $all{$key} = join('"',$all{$key},$nam) var $top_dsc{$nam} = $dsc var $top_ver{$nam} = cond($flt,fmt_version($ver),$ver) } # Explore the patchsets loop $xml (xmlFind($inv,'PRD_LIST/TL_LIST/PATCHSET')) {var $nam = xmlValue($xml,'NAME') var $ver = xmlValue($xml,'VER') var $dsc = xmlData(xmlFind($xml,'EXT_NAME')) if $flt var $ver = fmt_version($ver) if missing($top_dsc{$nam}) {var $key = uc($dsc) var $all{$key} = join('"',$all{$key},$nam) var $top_dsc{$nam} = $dsc } var $top_set{$nam} = join(', ',$top_set{$nam},$ver) incr $cnt var $dsc[$cnt] = $dsc var $ver[$cnt] = $ver var $tim[$cnt] = xmlValue($xml,'INSTALL_TIME') } } # Report top level products write '---+ Top Level Products' prefix write '|*Name*|*Version*|*PatchSet(s)*|' loop $key (keys(%all)) {loop $nam (split('"',$all{$key})) write '|',encode($top_dsc{$nam}),'|',$top_ver{$nam},' |',\ nvl($top_set{$nam},"''<none>''"),' |' } if !hasOutput(true) write 'There are no top level products found in Oracle Home inventory.%BR%' write $TOP # Explore the installed products and the patches var ($cmp,%all,%prd_dsc,%prd_set,%prd_ver) = (catDir($dir,'Components')) loop $xml (xmlFind($inv,'PRD_LIST/COMP_LIST/COMP')) {var $nam = xmlValue($xml,'NAME') var $ver = xmlValue($xml,'VER') var $dsc = xmlData(xmlFind($xml,'EXT_NAME')) if $flt var $ver = fmt_version($ver) var $key = uc($dsc) call push($all{$key},$nam) var $prd_dsc{$nam} = $dsc var $prd_ver{$nam} = $ver var $cmp = undef } if ?testDir('d',$cmp) {loop $pth (grepDir($cmp,'^compDef\.xml$','dr')) {next !grepFile($pth,'^'),\ ' |',join('%BR%',keys(%cmp)),' |' } } else {prefix {write '---+ Interim Patches' if $flg write '|*Patch*|*Base Bug(s)*|*Installed on*|*File/Directory List*|' else write '|*Patch*|*Base Bug(s)*|*Installed on*|' } loop $xml (xmlFind($inv,'PRD_LIST/ONEOFF_LIST/ONEOFF')) {var (@bug,%bug,%fil) = () if grepDir(catDir($dir,'oneoffs',xmlValue($xml,'REF_ID'),'etc','config'),\ '^inventory(\.xml)?$','fip') {var ($fil) = last loop $det (xmlFind($xml,'BUG_LIST/BUG')) {var $bug = xmlData($det) var ($dsc) = grepFile($fil,concat('