-- "Проверь сертификат example.com" → PowerShell TCP connect + parse expiry. local phrase = (jarvis.context.phrase or ""):lower() local domain = jarvis.text.strip_trigger(phrase, { "когда истекает сертификат", "проверь сертификат", "сертификат сайта", "проверь tls", "проверь ssl", "check ssl", "check tls", "check certificate", "перевір сертифікат", }) domain = domain:gsub("^[%s,:%.]+", ""):gsub("%s+$", "") -- Preserve original casing if domain ~= "" then local start = phrase:find(domain, 1, true) if start then domain = phrase:sub(start, start + #domain - 1) end end if domain == "" then return jarvis.cmd.error("Какой домен проверить?") end -- Strip "https://" if user said it domain = domain:gsub("^https?://", ""):gsub("/$", ""):gsub("/.*", "") local ps = string.format([[ $ErrorActionPreference = 'Stop' try { $tcp = New-Object Net.Sockets.TcpClient('%s', 443) $ssl = New-Object Net.Security.SslStream($tcp.GetStream(), $false, { $true }) $ssl.AuthenticateAsClient('%s') $cert = $ssl.RemoteCertificate $cert2 = New-Object Security.Cryptography.X509Certificates.X509Certificate2($cert) $expiry = $cert2.NotAfter $days = ($expiry - (Get-Date)).Days Write-Output ('{0}|{1}|{2}' -f $days, $expiry.ToString('yyyy-MM-dd'), $cert2.Issuer) $ssl.Close() $tcp.Close() } catch { Write-Output ('ERR|' + $_.Exception.Message) } ]], domain, domain) local res = jarvis.system.exec(string.format( 'powershell -NoProfile -Command "%s"', ps:gsub('"', '\\"'):gsub("\r?\n", "; ") )) if not res.success then return jarvis.cmd.error("Не получилось проверить.") end local out = (res.stdout or ""):gsub("^%s+", ""):gsub("%s+$", "") if out:match("^ERR|") then local msg = out:sub(5):sub(1, 100) return jarvis.cmd.error("Не получилось: " .. msg) end local days, date, issuer = out:match("(%-?%d+)|([%d%-]+)|(.+)") if not days then return jarvis.cmd.error("Не распарсил ответ.") end local issuer_short = issuer:match("CN=([^,]+)") or issuer:sub(1, 30) local days_n = tonumber(days) local urgency = "" if days_n < 0 then urgency = "Сертификат уже просрочен!" elseif days_n < 7 then urgency = "СКОРО! " elseif days_n < 30 then urgency = "Скоро. " end return jarvis.cmd.ok(string.format( "%sСертификат %s истекает через %s дней (%s). Выдан: %s.", urgency, domain, days, date, issuer_short ))