/** * @brief Output(): * Requires:\n filter: optional filter to apply\n item1: uploadtree_pk of the column 1 tree\n item2: uploadtree_pk of the column 2 tree\n freeze: column number (1 or 2) to freeze */ function Output() { if ($this->State != PLUGIN_STATE_READY) { return 0; } $uTime = microtime(true); $V = ""; /**/ $UpdCache = GetParm("updcache", PARM_INTEGER); /* Remove "updcache" from the GET args and set $this->UpdCache * This way all the url's based on the input args won't be * polluted with updcache * Use Traceback_parm_keep to ensure that all parameters are in order */ $CacheKey = "?mod=" . $this->Name . Traceback_parm_keep(array("item1", "item2", "filter", "col", "freeze", "itemf")); if ($UpdCache) { $UpdCache = $_GET['updcache']; $_SERVER['REQUEST_URI'] = preg_replace("/&updcache=[0-9]*/", "", $_SERVER['REQUEST_URI']); unset($_GET['updcache']); $V = ReportCachePurgeByKey($CacheKey); } else { $V = ReportCacheGet($CacheKey); } /**/ if (empty($V)) { $filter = GetParm("filter", PARM_STRING); if (empty($filter)) { $filter = "none"; } $FreezeCol = GetParm("freeze", PARM_INTEGER); // which column to freeze? 1 or 2 or null $ClickedCol = GetParm("col", PARM_INTEGER); // which column was clicked on? 1 or 2 or null $ItemFrozen = GetParm("itemf", PARM_INTEGER); // frozen item or null $in_uploadtree_pk1 = GetParm("item1", PARM_INTEGER); $in_uploadtree_pk2 = GetParm("item2", PARM_INTEGER); if (empty($in_uploadtree_pk1) || empty($in_uploadtree_pk2)) { Fatal("Bad input parameters. Both item1 and item2 must be specified.", __FILE__, __LINE__); } /* If you click on a item in a frozen column, then you are a dope so ignore $ItemFrozen */ if ($FreezeCol == $ClickedCol) { $ItemFrozen = 0; $FreezeCol = 0; } /* Check item1 upload permission */ $Item1Row = GetSingleRec("uploadtree", "WHERE uploadtree_pk = {$in_uploadtree_pk1}"); $UploadPerm = GetUploadPerm($Item1Row['upload_fk']); if ($UploadPerm < PERM_READ) { $text = _("Permission Denied"); echo "<h2>{$text} item 1<h2>"; return; } /* Check item2 upload permission */ $Item2Row = GetSingleRec("uploadtree", "WHERE uploadtree_pk = {$in_uploadtree_pk2}"); $UploadPerm = GetUploadPerm($Item2Row['upload_fk']); if ($UploadPerm < PERM_READ) { $text = _("Permission Denied"); echo "<h2>{$text} item 2<h2>"; return; } $uploadtree_pk1 = $in_uploadtree_pk1; $uploadtree_pk2 = $in_uploadtree_pk2; if ($FreezeCol == 1) { $uploadtree_pk1 = $ItemFrozen; } else { if ($FreezeCol == 2) { $uploadtree_pk2 = $ItemFrozen; } } $newURL = Traceback_dir() . "?mod=" . $this->Name . "&item1={$uploadtree_pk1}&item2={$uploadtree_pk2}"; if (!empty($filter)) { $newURL .= "&filter={$filter}"; } // rewrite page with new uploadtree_pks */ if ($uploadtree_pk1 != $in_uploadtree_pk1 || $uploadtree_pk2 != $in_uploadtree_pk2) { print <<<JSOUT <script type="text/javascript"> window.location.assign('{$newURL}'); </script> JSOUT; } $TreeInfo1 = $this->GetTreeInfo($uploadtree_pk1); $TreeInfo2 = $this->GetTreeInfo($uploadtree_pk2); $ErrText = _("No license data for tree %d. Use Jobs > Agents to schedule a license scan."); $ErrMsg = ''; if ($TreeInfo1['agent_pk'] == 0) { $ErrMsg = sprintf($ErrText, 1); } else { if ($TreeInfo2['agent_pk'] == 0) { $ErrMsg = sprintf($ErrText, 2); } else { $BucketDefArray = initBucketDefArray($TreeInfo1['bucketpool_pk']); /* Get list of children */ $Children1 = GetNonArtifactChildren($uploadtree_pk1); $Children2 = GetNonArtifactChildren($uploadtree_pk2); /* Add fuzzyname to children */ FuzzyName($Children1); // add fuzzyname to children FuzzyName($Children2); // add fuzzyname to children /* add element licstr to children */ $this->AddBucketStr($TreeInfo1, $Children1, $BucketDefArray); $this->AddBucketStr($TreeInfo2, $Children2, $BucketDefArray); /* Master array of children, aligned. */ $Master = MakeMaster($Children1, $Children2); /* add linkurl to children */ FileList($Master, $TreeInfo1['agent_pk'], $TreeInfo2['agent_pk'], $filter, $this, $uploadtree_pk1, $uploadtree_pk2); /* Apply filter */ $this->FilterChildren($filter, $Master, $BucketDefArray); } } switch ($this->OutputType) { case "XML": break; case "HTML": if ($ErrMsg) { $V .= $ErrMsg; } else { $V .= $this->HTMLout($Master, $uploadtree_pk1, $uploadtree_pk2, $in_uploadtree_pk1, $in_uploadtree_pk2, $filter, $TreeInfo1, $TreeInfo2, $BucketDefArray); } break; case "Text": break; default: } $Cached = false; } else { $Cached = true; } if (!$this->OutputToStdout) { return $V; } print "{$V}"; $Time = microtime(true) - $uTime; // convert usecs to secs $text = _("Elapsed time: %.2f seconds"); printf("<small>{$text}</small>", $Time); /**/ if ($Cached) { $text = _("cached"); $text1 = _("Update"); echo " <i>{$text}</i> <a href=\"{$_SERVER['REQUEST_URI']}&updcache=1\"> {$text1} </a>"; } else { // Cache Report if this took longer than 1/2 second if ($Time > 0.5) { ReportCachePut($CacheKey, $V); } } /**/ return; }
/** * \brief Given an $Uploadtree_pk, display: \n * (1) The histogram for the directory BY bucket. \n * (2) The file listing for the directory. */ function ShowUploadHist($Uploadtree_pk, $Uri) { global $PG_CONN; $VF = ""; // return values for file listing $VLic = ""; // return values for output $V = ""; // total return value $UniqueTagArray = array(); global $Plugins; $ModLicView =& $Plugins[plugin_find_id("view-license")]; /******* Get Bucket names and counts ******/ /* Find lft and rgt bounds for this $Uploadtree_pk */ $sql = "SELECT lft,rgt,upload_fk FROM {$this->uploadtree_tablename}\n WHERE uploadtree_pk = {$Uploadtree_pk}"; $result = pg_query($PG_CONN, $sql); DBCheckResult($result, $sql, __FILE__, __LINE__); if (pg_num_rows($result) < 1) { pg_free_result($result); $text = _("Invalid URL, nonexistant item"); return "<h2>{$text} {$Uploadtree_pk}</h2>"; } $row = pg_fetch_assoc($result); $lft = $row["lft"]; $rgt = $row["rgt"]; $upload_pk = $row["upload_fk"]; pg_free_result($result); /* Get the ars_pk of the scan to display, also the select list */ $ars_pk = GetArrayVal("ars", $_GET); $BucketSelect = SelectBucketDataset($upload_pk, $ars_pk, "selectbdata", "onchange=\"addArsGo('newds','selectbdata');\""); if ($ars_pk == 0) { /* No bucket data for this upload */ return $BucketSelect; } /* Get scan keys */ $sql = "select agent_fk, nomosagent_fk, bucketpool_fk from bucket_ars where ars_pk={$ars_pk}"; $result = pg_query($PG_CONN, $sql); DBCheckResult($result, $sql, __FILE__, __LINE__); $row = pg_fetch_assoc($result); $bucketagent_pk = $row["agent_fk"]; $nomosagent_pk = $row["nomosagent_fk"]; $bucketpool_pk = $row["bucketpool_fk"]; pg_free_result($result); /* Create bucketDefArray as individual query this is MUCH faster than incorporating it with a join in the following queries. */ $bucketDefArray = initBucketDefArray($bucketpool_pk); /*select all the buckets for entire tree for this bucketpool */ $sql = "SELECT distinct(bucket_fk) as bucket_pk,\n count(bucket_fk) as bucketcount, bucket_reportorder\n from bucket_file, bucket_def,\n (SELECT distinct(pfile_fk) as PF from {$this->uploadtree_tablename} \n where upload_fk={$upload_pk} \n and ((ufile_mode & (1<<28))=0)\n and ((ufile_mode & (1<<29))=0)\n and {$this->uploadtree_tablename}.lft BETWEEN {$lft} and {$rgt}) as SS\n where PF=pfile_fk and agent_fk={$bucketagent_pk} \n and bucket_file.nomosagent_fk={$nomosagent_pk}\n and bucket_pk=bucket_fk\n and bucketpool_fk={$bucketpool_pk}\n group by bucket_fk,bucket_reportorder\n order by bucket_reportorder asc"; $result = pg_query($PG_CONN, $sql); DBCheckResult($result, $sql, __FILE__, __LINE__); $historows = pg_fetch_all($result); pg_free_result($result); /* Show dataset list */ if (!empty($BucketSelect)) { $action = Traceback_uri() . "?mod=bucketbrowser&upload={$upload_pk}&item={$Uploadtree_pk}"; $VLic .= "<script type='text/javascript'>\nfunction addArsGo(formid, selectid ) \n{\nvar selectobj = document.getElementById(selectid);\nvar ars_pk = selectobj.options[selectobj.selectedIndex].value;\ndocument.getElementById(formid).action='{$action}'+'&ars='+ars_pk;\ndocument.getElementById(formid).submit();\nreturn;\n}\n</script>"; /* form to select new dataset (ars_pk) */ $VLic .= "<form action='{$action}' id='newds' method='POST'>\n"; $VLic .= $BucketSelect; $VLic .= "</form>"; } $sql = "select bucketpool_name, version from bucketpool where bucketpool_pk={$bucketpool_pk}"; $result = pg_query($PG_CONN, $sql); DBCheckResult($result, $sql, __FILE__, __LINE__); $row = pg_fetch_assoc($result); $bucketpool_name = $row['bucketpool_name']; $bucketpool_version = $row['version']; pg_free_result($result); /* Write bucket histogram to $VLic */ $bucketcount = 0; $Uniquebucketcount = 0; $NoLicFound = 0; if (is_array($historows)) { $text = _("Bucket Pool"); $VLic .= "{$text}: {$bucketpool_name} v{$bucketpool_version}<br>"; $VLic .= "<table border=1 width='100%'>\n"; $text = _("Count"); $VLic .= "<tr><th width='10%'>{$text}</th>"; $text = _("Files"); $VLic .= "<th width='10%'>{$text}</th>"; $text = _("Bucket"); $VLic .= "<th align='left'>{$text}</th></tr>\n"; foreach ($historows as $bucketrow) { $Uniquebucketcount++; $bucket_pk = $bucketrow['bucket_pk']; $bucketcount = $bucketrow['bucketcount']; $bucket_name = $bucketDefArray[$bucket_pk]['bucket_name']; $bucket_color = $bucketDefArray[$bucket_pk]['bucket_color']; /* Count */ $VLic .= "<tr><td align='right' style='background-color:{$bucket_color}'>{$bucketcount}</td>"; /* Show */ $VLic .= "<td align='center'><a href='"; $VLic .= Traceback_uri(); $text = _("Show"); $VLic .= "?mod=list_bucket_files&bapk={$bucketagent_pk}&item={$Uploadtree_pk}&bpk={$bucket_pk}&bp={$bucketpool_pk}&napk={$nomosagent_pk}" . "'>{$text}</a></td>"; /* Bucket name */ $VLic .= "<td align='left'>"; $VLic .= "<a id='{$bucket_pk}' onclick='FileColor_Get(\"" . Traceback_uri() . "?mod=ajax_filebucket&bapk={$bucketagent_pk}&item={$Uploadtree_pk}&bucket_pk={$bucket_pk}\")'"; $VLic .= ">{$bucket_name} </a>"; /* Allow users to tag an entire bucket */ /* Future, maybe v 2.1 $TagHref = "<a href=" . Traceback_uri() . "?mod=bucketbrowser&upload=$upload_pk&item=$Uploadtree_pk&bapk=$bucketagent_pk&bpk=$bucket_pk&bp=$bucketpool_pk&napk=$nomosagent_pk&tagbucket=1>Tag</a>"; $VLic .= " [$TagHref]"; */ $VLic .= "</td>"; $VLic .= "</tr>\n"; // if ($row['bucket_name'] == "No Buckets Found") $NoLicFound = $row['bucketcount']; } $VLic .= "</table>\n"; $VLic .= "<p>\n"; $text = _("Unique buckets"); $VLic .= "{$text}: {$Uniquebucketcount}<br>\n"; } /******* File Listing ************/ /* Get ALL the items under this Uploadtree_pk */ $Children = GetNonArtifactChildren($Uploadtree_pk, $this->uploadtree_tablename); if (count($Children) == 0) { $sql = "SELECT * FROM {$this->uploadtree_tablename} WHERE uploadtree_pk = '{$Uploadtree_pk}'"; $result = pg_query($PG_CONN, $sql); DBCheckResult($result, $sql, __FILE__, __LINE__); $row = pg_fetch_assoc($result); pg_free_result($result); if (empty($row) || IsDir($row['ufile_mode'])) { return; } // $ModLicView = &$Plugins[plugin_find_id("view-license")]; // return($ModLicView->Output() ); } $ChildCount = 0; $Childbucketcount = 0; /* Countd disabled until we know we need them $NumSrcPackages = 0; $NumBinPackages = 0; $NumBinNoSrcPackages = 0; */ /* get mimetypes for packages */ $MimetypeArray = GetPkgMimetypes(); $VF .= "<table border=0>"; foreach ($Children as $C) { if (empty($C)) { continue; } /* update package counts */ /* This is an expensive count. Comment out until we know we really need it IncrSrcBinCounts($C, $MimetypeArray, $NumSrcPackages, $NumBinPackages, $NumBinNoSrcPackages); */ $IsDir = Isdir($C['ufile_mode']); $IsContainer = Iscontainer($C['ufile_mode']); /* Determine the hyperlink for non-containers to view-license */ if (!empty($C['pfile_fk']) && !empty($ModLicView)) { $LinkUri = Traceback_uri(); $LinkUri .= "?mod=view-license&napk={$nomosagent_pk}&bapk={$bucketagent_pk}&upload={$upload_pk}&item={$C['uploadtree_pk']}"; } else { $LinkUri = NULL; } /* Determine link for containers */ if (Iscontainer($C['ufile_mode'])) { $uploadtree_pk = DirGetNonArtifact($C['uploadtree_pk'], $this->uploadtree_tablename); $tmpuri = "?mod=" . $this->Name . Traceback_parm_keep(array("upload", "folder", "ars")); $LicUri = "{$tmpuri}&item=" . $uploadtree_pk; } else { $LicUri = NULL; } /* Populate the output ($VF) - file list */ /* id of each element is its uploadtree_pk */ $VF .= "<tr><td id='{$C['uploadtree_pk']}' align='left'>"; $HasHref = 0; $HasBold = 0; if ($IsContainer) { $VF .= "<a href='{$LicUri}'>"; $HasHref = 1; $VF .= "<b>"; $HasBold = 1; } else { if (!empty($LinkUri)) { $VF .= "<a href='{$LinkUri}'>"; $HasHref = 1; } } $VF .= $C['ufile_name']; if ($IsDir) { $VF .= "/"; } if ($HasBold) { $VF .= "</b>"; } if ($HasHref) { $VF .= "</a>"; } /* print buckets */ $VF .= "<br>"; $VF .= "<span style='position:relative;left:1em'>"; /* get color coded string of bucket names */ $VF .= GetFileBuckets_string($nomosagent_pk, $bucketagent_pk, $C['uploadtree_pk'], $bucketDefArray, ",", True); $VF .= "</span>"; $VF .= "</td><td valign='top'>"; /* display item links */ $VF .= FileListLinks($C['upload_fk'], $C['uploadtree_pk'], $nomosagent_pk, $C['pfile_fk'], True, $UniqueTagArray, $this->uploadtree_tablename); $VF .= "</td>"; $VF .= "</tr>\n"; $ChildCount++; } $VF .= "</table>\n"; $V .= ActiveHTTPscript("FileColor"); /* Add javascript for color highlighting This is the response script needed by ActiveHTTPscript responseText is bucket_pk',' followed by a comma seperated list of uploadtree_pk's */ $script = "\n <script type=\"text/javascript\" charset=\"utf-8\">\n var Lastutpks=''; /* save last list of uploadtree_pk's */\n var Lastbupk=''; /* save last bucket_pk */\n var color = '#4bfe78';\n function FileColor_Reply()\n {\n if ((FileColor.readyState==4) && (FileColor.status==200))\n {\n /* remove previous highlighting */\n var numpks = Lastutpks.length;\n if (numpks > 0) document.getElementById(Lastbupk).style.backgroundColor='white';\n while (numpks)\n {\n document.getElementById(Lastutpks[--numpks]).style.backgroundColor='white';\n }\n\n utpklist = FileColor.responseText.split(',');\n Lastbupk = utpklist.shift();\n numpks = utpklist.length;\n Lastutpks = utpklist;\n\n /* apply new highlighting */\n elt = document.getElementById(Lastbupk);\n if (elt != null) elt.style.backgroundColor=color;\n while (numpks)\n {\n document.getElementById(utpklist[--numpks]).style.backgroundColor=color;\n }\n }\n return;\n }\n </script>\n "; $V .= $script; /* Display source, binary, and binary missing source package counts */ /* Counts disabled above until we know we need these $VLic .= "<ul>"; $text = _("source packages"); $VLic .= "<li> $NumSrcPackages $text"; $text = _("binary packages"); $VLic .= "<li> $NumBinPackages $text"; $text = _("binary packages with no source package"); $VLic .= "<li> $NumBinNoSrcPackages $text"; $VLic .= "</ul>"; */ /* Combine VF and VLic */ $V .= "<table border=0 width='100%'>\n"; $V .= "<tr><td valign='top' width='50%'>{$VLic}</td><td valign='top'>{$VF}</td></tr>\n"; $V .= "</table>\n"; $V .= "<hr />\n"; return $V; }
public function htmlContent() { $filter = GetParm("filter", PARM_STRING); if (empty($filter)) { $filter = "none"; } $FreezeCol = GetParm("freeze", PARM_INTEGER); // which column to freeze? 1 or 2 or null $ClickedCol = GetParm("col", PARM_INTEGER); // which column was clicked on? 1 or 2 or null $ItemFrozen = GetParm("itemf", PARM_INTEGER); // frozen item or null $in_uploadtree_pk1 = GetParm("item1", PARM_INTEGER); $in_uploadtree_pk2 = GetParm("item2", PARM_INTEGER); if (empty($in_uploadtree_pk1) || empty($in_uploadtree_pk2)) { Fatal("Bad input parameters. Both item1 and item2 must be specified.", __FILE__, __LINE__); } /* If you click on a item in a frozen column, then you are a dope so ignore $ItemFrozen */ if ($FreezeCol == $ClickedCol) { $ItemFrozen = 0; $FreezeCol = 0; } /* @var $uploadDao UploadDao */ $uploadDao = $GLOBALS['container']->get('dao.upload'); /* Check item1 upload permission */ $Item1Row = $uploadDao->getUploadEntry($in_uploadtree_pk1); if (!$uploadDao->isAccessible($Item1Row['upload_fk'], Auth::getGroupId())) { $text = _("Permission Denied"); return "<h2>{$text} item 1</h2>"; } /* Check item2 upload permission */ $Item2Row = $uploadDao->getUploadEntry($in_uploadtree_pk2); if (!$uploadDao->isAccessible($Item2Row['upload_fk'], Auth::getGroupId())) { $text = _("Permission Denied"); return "<h2>{$text} item 2</h2>"; } $uploadtree_pk1 = $in_uploadtree_pk1; $uploadtree_pk2 = $in_uploadtree_pk2; if ($FreezeCol == 1) { $uploadtree_pk1 = $ItemFrozen; } else { if ($FreezeCol == 2) { $uploadtree_pk2 = $ItemFrozen; } } $newURL = Traceback_dir() . "?mod=" . $this->Name . "&item1={$uploadtree_pk1}&item2={$uploadtree_pk2}"; if (!empty($filter)) { $newURL .= "&filter={$filter}"; } // rewrite page with new uploadtree_pks */ if ($uploadtree_pk1 != $in_uploadtree_pk1 || $uploadtree_pk2 != $in_uploadtree_pk2) { print <<<JSOUT <script type="text/javascript"> window.location.assign('{$newURL}'); </script> JSOUT; } $TreeInfo1 = $this->GetTreeInfo($uploadtree_pk1); $TreeInfo2 = $this->GetTreeInfo($uploadtree_pk2); $ErrText = _("No license data for tree %d. Use Jobs > Agents to schedule a license scan."); $ErrMsg = ''; if ($TreeInfo1['agent_pk'] == 0) { $ErrMsg = sprintf($ErrText, 1); } else { if ($TreeInfo2['agent_pk'] == 0) { $ErrMsg = sprintf($ErrText, 2); } else { $BucketDefArray1 = initBucketDefArray($TreeInfo1['bucketpool_pk']); $BucketDefArray2 = initBucketDefArray($TreeInfo2['bucketpool_pk']); $BucketDefArray = $BucketDefArray1 + $BucketDefArray2; /* Get list of children */ $Children1 = GetNonArtifactChildren($uploadtree_pk1); $Children2 = GetNonArtifactChildren($uploadtree_pk2); /* Add fuzzyname to children */ FuzzyName($Children1); // add fuzzyname to children FuzzyName($Children2); // add fuzzyname to children /* add element licstr to children */ $this->AddBucketStr($TreeInfo1, $Children1, $BucketDefArray); $this->AddBucketStr($TreeInfo2, $Children2, $BucketDefArray); /* Master array of children, aligned. */ $Master = MakeMaster($Children1, $Children2); /* add linkurl to children */ FileList($Master, $TreeInfo1['agent_pk'], $TreeInfo2['agent_pk'], $filter, $this, $uploadtree_pk1, $uploadtree_pk2); /* Apply filter */ $this->FilterChildren($filter, $Master, $BucketDefArray); } } if ($this->OutputType == 'HTML') { if ($ErrMsg) { $V .= $ErrMsg; } else { $V .= $this->HTMLout($Master, $uploadtree_pk1, $uploadtree_pk2, $in_uploadtree_pk1, $in_uploadtree_pk2, $filter, $TreeInfo1, $TreeInfo2, $BucketDefArray); } } return $V; }