80 lines
2.6 KiB
Lua
80 lines
2.6 KiB
Lua
|
|
-- "Проверь сертификат 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
|
|||
|
|
))
|