<% ' Cached Zabbix API wrapper with background refresh ' Include the base zabbix.asp functions %> <% ' Main cached function - returns data immediately, refreshes in background if stale Function GetPrinterDataCached(hostIP) Dim cacheKey, cacheAge, forceRefresh cacheKey = "zabbix_" & hostIP ' Check if manual refresh was requested forceRefresh = (Request.QueryString("refresh") = "1" And Request.QueryString("ip") = hostIP) If forceRefresh Then ' Clear cache for manual refresh Application.Lock Application(cacheKey) = Empty Application(cacheKey & "_time") = Empty Application(cacheKey & "_refreshing") = "false" Application.Unlock End If ' Check if cache exists If Not IsEmpty(Application(cacheKey)) And Not forceRefresh Then cacheAge = DateDiff("n", Application(cacheKey & "_time"), Now()) ' If cache is stale (>5 min) AND not already refreshing, trigger background update If cacheAge >= 5 And Application(cacheKey & "_refreshing") <> "true" Then ' Mark as refreshing Application.Lock Application(cacheKey & "_refreshing") = "true" Application.Unlock ' Trigger async background refresh (non-blocking) On Error Resume Next Dim http Set http = Server.CreateObject("MSXML2.ServerXMLHTTP.6.0") ' True = async (doesn't block user) http.Open "GET", "http://localhost/refreshzabbixcache.asp?ip=" & Server.URLEncode(hostIP), True http.Send Set http = Nothing On Error Goto 0 End If ' Return cached data immediately (user doesn't wait) GetPrinterDataCached = Application(cacheKey) Exit Function End If ' No cache exists - fetch initial data (first time only, or after manual refresh) Dim freshData, zabbixConnected, pingStatus, tonerJSON zabbixConnected = ZabbixLogin() If zabbixConnected = "1" Then pingStatus = GetPrinterPingStatus(hostIP) tonerJSON = GetPrinterTonerLevels(hostIP) Else pingStatus = "-1" tonerJSON = "" End If ' Store as array: [connected, pingStatus, tonerJSON] Dim resultData(2) resultData(0) = zabbixConnected resultData(1) = pingStatus resultData(2) = tonerJSON ' Cache the result Application.Lock Application(cacheKey) = resultData Application(cacheKey & "_time") = Now() Application(cacheKey & "_refreshing") = "false" Application.Unlock GetPrinterDataCached = resultData End Function ' Helper function to get cache age (for display purposes) Function GetCacheAge(hostIP) Dim cacheKey, cacheTime cacheKey = "zabbix_" & hostIP If IsEmpty(Application(cacheKey & "_time")) Then GetCacheAge = -1 Exit Function End If GetCacheAge = DateDiff("s", Application(cacheKey & "_time"), Now()) End Function ' Clear cache for a specific printer (called by manual refresh) Sub ClearPrinterCache(hostIP) Dim cacheKey cacheKey = "zabbix_" & hostIP Application.Lock Application(cacheKey) = Empty Application(cacheKey & "_time") = Empty Application(cacheKey & "_refreshing") = "false" Application.Unlock End Sub ' Clear all Zabbix cache (admin function) Sub ClearAllZabbixCache() Dim key, keysToRemove(), count, i count = 0 ' First pass: collect keys to remove ReDim keysToRemove(100) ' Initial size For Each key In Application.Contents If Left(key, 7) = "zabbix_" Then keysToRemove(count) = key count = count + 1 If count Mod 100 = 0 Then ReDim Preserve keysToRemove(count + 100) End If End If Next ' Second pass: remove collected keys Application.Lock For i = 0 To count - 1 Application.Contents.Remove(keysToRemove(i)) Next Application.Unlock End Sub %>