<% '============================================================================= ' FILE: displayprinter.asp ' PURPOSE: Display detailed printer information with edit capability ' SECURITY: Parameterized queries, HTML encoding, input validation ' UPDATED: 2025-10-27 - Migrated to secure patterns '============================================================================= %> <% theme = Request.Cookies("theme") IF theme = "" THEN theme="bg-theme1" END IF '============================================================================= ' SECURITY: Validate printerid parameter '============================================================================= Dim printerid printerid = GetSafeInteger("QS", "printerid", 0, 1, 999999) IF printerid = 0 THEN objConn.Close Response.Redirect("default.asp") Response.End END IF '============================================================================= ' SECURITY: Use parameterized query to prevent SQL injection ' NOTE: Explicitly select printers.maptop and printers.mapleft (not from machines) '============================================================================= strSQL = "SELECT machines.*, models.*, vendors.*, printers.*, " &_ "printers.maptop AS printer_maptop, printers.mapleft AS printer_mapleft " &_ "FROM machines,models,vendors,printers WHERE " &_ "printers.machineid=machines.machineid AND "&_ "printers.modelid=models.modelnumberid AND "&_ "models.vendorid=vendors.vendorid AND "&_ "printers.printerid=?" set rs = ExecuteParameterizedQuery(objConn, strSQL, Array(printerid)) ' Check if printer exists If rs.EOF Then rs.Close Set rs = Nothing objConn.Close Response.Redirect("default.asp") Response.End End If Dim machineid machineid = rs("machineid") %>
" alt="Card image cap">
" alt="profile-image" class="profile">
<%=Server.HTMLEncode(rs("vendor") & "")%>

" title="Click to Access Support Docs" target="_blank"><%=Server.HTMLEncode(rs("modelnumber") & "")%>

Print QR Code
Configuration

Vendor:

Model:

Serial:

Location:

IP:

FQDN:

PIN:

Driver:

CSF Name:

Windows Name:

<% Dim vendorVal, modelVal, serialVal, machineVal, ipVal, fqdnVal, pinVal, csfVal, winNameVal ' Get values and default to N/A if empty vendorVal = rs("vendor") & "" If vendorVal = "" Then vendorVal = "N/A" modelVal = rs("modelnumber") & "" If modelVal = "" Then modelVal = "N/A" serialVal = rs("serialnumber") & "" If serialVal = "" Then serialVal = "N/A" machineVal = rs("machinenumber") & "" If machineVal = "" Then machineVal = "N/A" ipVal = rs("ipaddress") & "" If ipVal = "" Then ipVal = "N/A" fqdnVal = rs("fqdn") & "" If fqdnVal = "" Then fqdnVal = "N/A" pinVal = rs("printerpin") & "" If pinVal = "" Then pinVal = "N/A" csfVal = rs("printercsfname") & "" If csfVal = "" Then csfVal = "N/A" winNameVal = rs("printerwindowsname") & "" If winNameVal = "" Then winNameVal = "N/A" %>

<%=Server.HTMLEncode(vendorVal)%>

<% If modelVal <> "N/A" And rs("documentationpath") & "" <> "" Then Response.Write("" & Server.HTMLEncode(modelVal) & "") Else Response.Write(Server.HTMLEncode(modelVal)) End If %>

<%=Server.HTMLEncode(serialVal)%>

<% If machineVal <> "N/A" Then %> <%=Server.HTMLEncode(machineVal)%> <% Else Response.Write("N/A") End If %>

<% If ipVal <> "N/A" Then Response.Write("" & Server.HTMLEncode(ipVal) & "") Else Response.Write("N/A") End If %>

<% If fqdnVal <> "N/A" And fqdnVal <> "" Then Response.Write("" & Server.HTMLEncode(fqdnVal) & "") Else Response.Write("N/A") End If %>

<%=Server.HTMLEncode(pinVal)%>

<% ' Driver download - use icon link to maintain alignment IF rs("installpath") & "" <> "" THEN response.write (" Specific Installer") ELSE response.write (" Universal Installer") END IF %>

<%=Server.HTMLEncode(csfVal)%>

<%=Server.HTMLEncode(winNameVal)%>

<% ' Get Zabbix data for this printer (cached) - now includes all supplies Dim printerIP, cachedData, zabbixConnected, pingStatus, suppliesJSON Dim statusBadge, statusIcon, statusColor printerIP = rs("ipaddress") ' Get all supplies data (toner, ink, drums, maintenance kits, etc.) ' Returns array: [zabbixConnected, pingStatus, suppliesJSON] cachedData = GetAllPrinterSuppliesCached(printerIP) ' Extract data from array zabbixConnected = cachedData(0) pingStatus = cachedData(1) suppliesJSON = cachedData(2) %>
Supply Status <% ' Display printer online/offline status badge If pingStatus = "1" Then Response.Write(" Online") ElseIf pingStatus = "0" Then Response.Write(" Offline") Else Response.Write(" Unknown") End If %>
<% If zabbixConnected <> "1" Then ' Show error details If zabbixConnected = "" Then Response.Write("
Unable to connect to Zabbix monitoring server (empty response)
") Else Response.Write("
Zabbix Connection Error:
" & Server.HTMLEncode(zabbixConnected) & "
") End If ElseIf suppliesJSON = "" Or IsNull(suppliesJSON) Then Response.Write("
No supply data available for this printer in Zabbix (IP: " & printerIP & ")
") Else ' Parse the JSON data for all supply items Dim itemStart, itemEnd, itemBlock, itemName, itemValue Dim namePos, nameStart, nameEnd, valuePos, valueStart, valueEnd Dim currentPos, hasData hasData = False ' Declare loop variables outside the loop to avoid "Name redefined" error Dim numericValue, progressClass, displayValue, isWaste ' Find all items with "Level" in the name (toner, ink, drums, maintenance kits, etc.) currentPos = 1 Do While currentPos > 0 itemStart = InStr(currentPos, suppliesJSON, "{""itemid""") If itemStart = 0 Then Exit Do itemEnd = InStr(itemStart + 1, suppliesJSON, "},") If itemEnd = 0 Then itemEnd = InStr(itemStart + 1, suppliesJSON, "}]") End If If itemEnd = 0 Then Exit Do itemBlock = Mid(suppliesJSON, itemStart, itemEnd - itemStart + 1) ' Extract name namePos = InStr(itemBlock, """name"":""") If namePos > 0 Then nameStart = namePos + 8 nameEnd = InStr(nameStart, itemBlock, """") itemName = Mid(itemBlock, nameStart, nameEnd - nameStart) Else itemName = "" End If ' Only process items with "Level" in the name If InStr(1, itemName, "Level", 1) > 0 Then ' Extract value (lastvalue) valuePos = InStr(itemBlock, """lastvalue"":""") If valuePos > 0 Then valueStart = valuePos + 13 valueEnd = InStr(valueStart, itemBlock, """") itemValue = Mid(itemBlock, valueStart, valueEnd - valueStart) ' Try to convert to numeric On Error Resume Next numericValue = CDbl(itemValue) If Err.Number = 0 Then ' Check if this is a waste cartridge (invert the logic) isWaste = (InStr(1, itemName, "Waste", 1) > 0) If isWaste Then ' For waste cartridges: 0 = OK (100% capacity), 1 = Replace (0% capacity) ' If binary (0 or 1), convert to percentage first If numericValue <= 1 Then ' Binary value: 0 or 1 displayValue = 100 - (numericValue * 100) Else ' Percentage value: invert it displayValue = 100 - numericValue End If ' Color logic for waste capacity If displayValue < 10 Then progressClass = "bg-danger" ' Red for critical (< 10% capacity remaining) ElseIf displayValue < 25 Then progressClass = "bg-warning" ' Yellow for low (< 25% capacity remaining) Else progressClass = "bg-success" ' Green for good (>= 25% capacity remaining) End If Else ' Normal supplies: show value as-is displayValue = numericValue ' Normal color logic If numericValue < 10 Then progressClass = "bg-danger" ' Red for critical (< 10%) ElseIf numericValue < 25 Then progressClass = "bg-warning" ' Yellow for low (< 25%) Else progressClass = "bg-success" ' Green for good (>= 25%) End If End If ' Display supply level with progress bar Response.Write("
") Response.Write("
") Response.Write("" & Server.HTMLEncode(itemName) & "") Response.Write("" & Round(displayValue, 1) & "%") Response.Write("
") Response.Write("
") Response.Write("
" & Round(displayValue, 1) & "%
") Response.Write("
") Response.Write("
") hasData = True End If Err.Clear On Error Goto 0 End If End If currentPos = itemEnd + 1 Loop If Not hasData Then Response.Write("
No supply level data available for this printer in Zabbix (IP: " & printerIP & ")
") End If End If %>
" placeholder="<%=Server.HTMLEncode(rs("serialnumber") & "")%>">
" placeholder="<%=Server.HTMLEncode(rs("serialnumber") & "")%>" onchange="updateFQDN()">
" placeholder="<%=Server.HTMLEncode(rs("fqdn") & "")%>">
" placeholder="<%=Server.HTMLEncode(rs("printercsfname") & "")%>">
" placeholder="e.g., 012345"> Leading zeros are preserved
" placeholder="<%=Server.HTMLEncode(rs("printerwindowsname") & "")%>"> Auto-updates when you change the associated machine
" placeholder="e.g., drivers/HP/LJ400.exe"> Path to specific driver installer (leave blank to use universal driver)
<% Dim currentMapTop, currentMapLeft ' Use printer-specific map coordinates (not machine coordinates) If IsNull(rs("printer_maptop")) Or rs("printer_maptop") = "" Then currentMapTop = "50" Else currentMapTop = rs("printer_maptop") End If If IsNull(rs("printer_mapleft")) Or rs("printer_mapleft") = "" Then currentMapLeft = "50" Else currentMapLeft = rs("printer_mapleft") End If %>
Current position: X=<%=Server.HTMLEncode(currentMapLeft)%>, Y=<%=Server.HTMLEncode(currentMapTop)%>

Select Printer Location
Click on the map to select a location
<% '============================================================================= ' CLEANUP '============================================================================= objConn.Close %>