@shabircse@all I seek your guidance and assistance on this.
<html lang="en">
<head>
<meta charset="utf-8">
<title>BigFix Patch Installation Status Report</title>
<style>
* { box-sizing: border-box; }
body { margin: 0; padding: 41px 0; background: #edf2f7; color: #20242a; font: 11px Arial, Helvetica, sans-serif; }
.report { width: 94.5%; margin: 0 auto; background: #fff; border: 1px solid #cbd5e1; box-shadow: 0 2px 10px rgba(15, 23, 42, .08); }
.hero { padding: 24px 24px 43px; text-align: center; border-bottom: 5px solid #0878d1; }
.brand { display: inline-block; margin-bottom: 14px; padding: 8px 20px; background: #0878d1; color: #fff; font-size: 14px; font-weight: 700; }
h1 { margin: 0; font-size: 24px; line-height: 1.15; letter-spacing: .2px; }
.section-title { padding: 12px 16px; background: #f1f5f9; border-bottom: 1px solid #cbd5e1; font-size: 15px; font-weight: 700; }
.table-wrap { overflow-x: auto; }
table { width: 100%; border-collapse: collapse; }
th { padding: 8px; background: #16449b; color: #fff; font-size: 11px; line-height: 1.2; text-align: left; white-space: nowrap; }
td { padding: 7px 8px; border-right: 1px solid #dbe2ea; border-bottom: 1px solid #dbe2ea; font-size: 11px; line-height: 1.25; vertical-align: top; }
tbody tr:nth-child(even) { background: #f8fafc; }
tbody tr:hover { background: #eaf4ff; }
th:nth-child(1) { min-width: 330px; }
th:nth-child(2) { min-width: 155px; }
th:nth-child(3) { min-width: 135px; }
th:nth-child(5), th:nth-child(6), th:nth-child(7) { min-width: 150px; }
th:nth-child(8) { min-width: 220px; }
.footer { padding: 12px 16px; background: #fff8e7; color: #5b6470; border-top: 1px solid #edd79d; font-size: 11px; }
</style>
</head>
<body>
<main class="report">
<header class="hero">
<div class="brand">BigFix</div>
<h1>Patch Installation Status Report</h1>
</header>
<div class="section-title">Patch Result Details</div>
<div class="table-wrap">
<table>
<thead>
<tr>
<th>Fixlet / Patch Name</th>
<th>Computer Name</th>
<th>IP Address</th>
<th>Severity</th>
<th>Release Date</th>
<th>First Relevant</th>
<th>Last Non-Relevant</th>
<th> </th>
<th>Status</th>
</tr>
</thead>
<tbody>
<?relevance
concatenation of trs of
(
td of (item 0 of it)
& td of (item 1 of it)
& td of (item 2 of it)
& td of (item 3 of it)
& td of (item 4 of it)
& td of (item 5 of it)
& td of (item 6 of it)
& td of (item 7 of it)
& td of (item 8 of it)
)
of
(
name of fixlet of it,
name of computer of it,
concatenation "; " of (ip addresses of computer of it as string),
source severity of fixlet of it | "",
source release date of fixlet of it as string | "",
first became relevant of it as string | "",
last became nonrelevant of it as string | "",
"",
(if relevant flag of it then "Not Installed" else "Installed")
)
of
(
results (item 0 of it, elements of item 1 of it)
whose (relevant flag of it or remediated flag of it)
)
of
(
elements of item 0 of it,
item 1 of it
)
of
(
set of subscribed computers of bes sites whose
(
name of it = "Enterprise Security"
or name of it = "Updates for Windows Applications"
or name of it = "Updates for Windows Applications Extended"
or name of it = "Patches for RHEL 7"
or name of it = "Patches for RHEL 8"
or name of it = "Patches for RHEL 8 additional channels"
or name of it = "Patches for RHEL 9"
or name of it = "Patches for RHEL 9 additional channels"
),
set of bes fixlets whose
(
name of site of it = "Enterprise Security"
or name of site of it = "Updates for Windows Applications"
or name of site of it = "Updates for Windows Applications Extended"
or name of site of it = "Patches for RHEL 7"
or name of site of it = "Patches for RHEL 8"
or name of site of it = "Patches for RHEL 8 additional channels"
or name of site of it = "Patches for RHEL 9"
or name of site of it = "Patches for RHEL 9 additional channels"
)
)
?>
</tbody>
</table>
</div>
<footer class="footer">Generated by BigFix Web Reports • This is an automated report. Please do not reply.</footer>
</main>
</body>
</html>
//Report Sample:
I have updated your original query and simplified quite a bit of the Relevance, so it should perform better. However, there is still a fundamental scalability concern here.
The query is potentially dealing with a very large number of Fixlet × computer results. If you run this across thousands of endpoints and multiple patch sites, the amount of data can become huge. Generating all of that dynamically inside Web Reports will therefore always have some performance cost, regardless of how much we optimize the Relevance itself.
For this type of reporting, I would probably take a slightly different approach.
One option would be to collect the required data through the BigFix REST API on a scheduled basis and maintain a local cache. For example, refresh the cache every 30/60 minutes, or whatever interval makes sense for your reporting requirement. Reports can then be generated from the cached data rather than executing the same expensive query every time.
You could also use that cached dataset to generate an Excel report and automatically email it to the required stakeholders on a schedule.
Another approach, especially if you want an interactive dashboard, would be to build a lightweight PowerShell/.NET-based web application. The website could read from the same cached dataset rather than continuously querying BigFix. Pages, filtering, searching, exporting, etc. would then be extremely fast because most user interaction would be against already-collected data.
The architecture could be something like:
BigFix REST API → Scheduled data collection → Local cache → Web dashboard / Excel reports → Stakeholders
The cache can simply be replaced/refreshed after the configured interval.
I would prefer this architecture for a large environment because Web Reports is still dynamically evaluating the underlying Session Relevance when the report is executed/refreshed. If the query is expensive and returns a very large result set, you also have the additional overhead of generating, transferring and rendering a very large HTML table in the browser.
So although optimizing the Relevance definitely helps, there is a point where query optimization alone cannot solve the problem, reducing how often you query BigFix and reusing the collected data becomes much more effective.
Of course, if this is only being run against a relatively small number of computers/results, keeping it inside Web Reports may be perfectly fine.
@swanand1216 I’ve updated the Custom Report using a more efficient set-based Relevance approach, and the performance improvement is significant.
In my test environment, the previous Relevance took approximately 20 seconds to evaluate. After restructuring it to create scoped computer and Fixlet sets once and then retrieve only the relevant/remediated results, the evaluation time decreased to approximately 1 second.
Hi Khurava ji,
Can we able to add some columns fields like
Cve Numbers, patch release date and remediated date and computer name (Host Name).
Please help me on this relevance.
Thank you
CVE ID column has been added. The Patch Release Date, Remediation Date, and Computer Name columns are already included. Simply import it and validate the data.
<head>
<meta charset="utf-8">
<title>BigFix Patch Installation Status Report</title>
<style>
* { box-sizing: border-box; }
body { margin: 0; padding: 41px 0; background: #edf2f7; color: #20242a; font: 11px Arial, Helvetica, sans-serif; }
.report { width: 94.5%; margin: 0 auto; background: #fff; border: 1px solid #cbd5e1; box-shadow: 0 2px 10px rgba(15, 23, 42, .08); }
.hero { padding: 24px 24px 43px; text-align: center; border-bottom: 5px solid #0878d1; }
.brand { display: inline-block; margin-bottom: 14px; padding: 8px 20px; background: #0878d1; color: #fff; font-size: 14px; font-weight: 700; }
h1 { margin: 0; font-size: 24px; line-height: 1.15; letter-spacing: .2px; }
.section-title { padding: 12px 16px; background: #f1f5f9; border-bottom: 1px solid #cbd5e1; font-size: 15px; font-weight: 700; }
.table-wrap { overflow-x: auto; }
table { width: 100%; border-collapse: collapse; }
th { padding: 8px; background: #16449b; color: #fff; font-size: 11px; line-height: 1.2; text-align: left; white-space: nowrap; }
td { padding: 7px 8px; border-right: 1px solid #dbe2ea; border-bottom: 1px solid #dbe2ea; font-size: 11px; line-height: 1.25; vertical-align: top; }
tbody tr:nth-child(even) { background: #f8fafc; }
tbody tr:hover { background: #eaf4ff; }
th:nth-child(1) { min-width: 330px; }
th:nth-child(2) { min-width: 155px; }
th:nth-child(3) { min-width: 135px; }
th:nth-child(5), th:nth-child(6), th:nth-child(7) { min-width: 150px; }
th:nth-child(8) { min-width: 220px; }
.footer { padding: 12px 16px; background: #fff8e7; color: #5b6470; border-top: 1px solid #edd79d; font-size: 11px; }
</style>
</head>
<body>
<main class="report">
<header class="hero">
<div class="brand">BigFix</div>
<h1>Patch Installation Status Report</h1>
</header>
<div class="section-title">Patch Result Details</div>
<div class="table-wrap">
<table>
<thead>
<tr>
<th>Fixlet / Patch Name</th>
<th>Computer Name</th>
<th>IP Address</th>
<th>Severity</th>
<th>Release Date</th>
<th>First Relevant</th>
<th>Last Non-Relevant</th>
<th>CVE IDs</th>
<th>Status</th>
</tr>
</thead>
<tbody>
<?relevance
concatenation of trs of
(
td of (item 0 of it)
& td of (item 1 of it)
& td of (item 2 of it)
& td of (item 3 of it)
& td of (item 4 of it)
& td of (item 5 of it)
& td of (item 6 of it)
& td of (item 7 of it)
& td of (item 8 of it)
)
of
(
name of fixlet of it,
name of computer of it,
concatenation "; " of (ip addresses of computer of it as string),
source severity of fixlet of it | "",
source release date of fixlet of it as string | "",
first became relevant of it as string | "",
last became nonrelevant of it as string | "",
concatenation ", " of (cve id list of fixlet of it) | "",
(if relevant flag of it then "Not Installed" else "Installed")
)
of
(
results of
(
bes fixlets whose
(
(
name of site of it = "Enterprise Security"
or name of site of it = "Updates for Windows Applications"
or name of site of it = "Updates for Windows Applications Extended"
or name of site of it = "Patches for RHEL 7"
or name of site of it = "Patches for RHEL 8"
or name of site of it = "Patches for RHEL 8 additional channels"
or name of site of it = "Patches for RHEL 9"
or name of site of it = "Patches for RHEL 9 additional channels"
)
)
)
)
?>
</tbody>
</table>
</div>
<footer class="footer">Generated by BigFix Web Reports • This is an automated report. Please do not reply.</footer>
</main>
</body>
</html>````
@vk.khurava Thanks for the helpful context. We will definitely look into the BigFix REST API next. If you have any brief introductory articles or guides handy, please feel free to share them so we can get up to speed.
There are many REST API examples available on the BigFix Forum. A quick search should return several useful discussions, however, you can start with the following resources:
@vk.khurava Could you please walk us through the details in the screenshots you shared earlier? If there is any download link available, feel free to share that as well.
This is a custom reporting portal built using PowerShell and .NET. In the background, multiple BigFix REST API queries collect the required data and build a small offline cache, which is refreshed on a configurable schedule. The portal then uses this cache to provide faster dashboards, searches, filters, and exports without repeatedly querying BigFix for every page request.
I would not recommend starting by building the complete portal immediately. First, clearly define your reporting requirements and identify the exact data you need. Then proceed step by step, learn the BigFix REST API, develop and test smaller relevance queries, understand their performance at scale, and gradually combine the working components into a solution that meets your requirements.
The portal is a custom implementation with several moving parts, some of which are specific to my organization, so I don’t currently have a public download package available.


