From 0d4933f13558503fd3016327041fa756db8a500c Mon Sep 17 00:00:00 2001 From: Nick Shirokov Date: Sat, 8 Aug 2026 15:46:22 +0300 Subject: [PATCH] =?UTF-8?q?feat(web-info):=20=D0=BF=D1=80=D0=BE=D0=B2?= =?UTF-8?q?=D0=B5=D1=80=D0=BA=D0=B0=20TCP-=D0=BF=D0=BE=D1=80=D1=82=D0=B0?= =?UTF-8?q?=20Apache?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Статус строился только по наличию процесса httpd: при живом процессе и не поднявшемся сервере (занятый порт, битый конфиг) навык рапортовал «Запущен». Теперь порт из Listen проверяется TCP-коннектом на 127.0.0.1 с таймаутом 1 с — «(слушается)» / «(не отвечает)». Сами публикации намеренно не опрашиваются: запрос к /{AppName} поднимает сеанс веб-клиента 1С и занимает лицензию, а публикаций может быть много. Co-Authored-By: Claude Opus 5 (1M context) --- .claude/skills/web-info/SKILL.md | 7 +++++-- .claude/skills/web-info/scripts/web-info.ps1 | 21 ++++++++++++++++++-- .claude/skills/web-info/scripts/web-info.py | 13 ++++++++++-- 3 files changed, 35 insertions(+), 6 deletions(-) diff --git a/.claude/skills/web-info/SKILL.md b/.claude/skills/web-info/SKILL.md index f0be7b92..6b43eaeb 100644 --- a/.claude/skills/web-info/SKILL.md +++ b/.claude/skills/web-info/SKILL.md @@ -43,6 +43,7 @@ powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/web-info.ps1" <па | В выводе | Что значит | |----------|------------| | `Status: Остановлен` | Apache не запущен — публикации в `httpd.conf` есть, но URL-ы не отвечают. Поднимается повторным `/web-publish` | +| `Port: 9191 (не отвечает)` | Порт из `httpd.conf` не слушается. При `Status: Запущен` — процесс жив, но сервер не поднялся: смотри ошибки ниже (занятый порт, битый конфиг) | | `[WARN] Обнаружен сторонний Apache` | На машине работает чужой экземпляр — может держать порт; наши команды им не управляют | | `[WS HTTP OData]` | Что опубликовано для базы: SOAP-сервисы, HTTP-сервисы, стандартный OData | | `+ext` (`WS+ext`) | Публикуются и сервисы, поставляемые расширениями конфигурации | @@ -54,8 +55,10 @@ powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/web-info.ps1" <па иначе они вытесняют содержательное. Записи могут быть давними — смотри дату в строке. Путь к журналу печатается рядом: нужен полный контекст или отсеянные уровни — читай файл напрямую. -Публикация в списке не означает, что база отвечает: `/web-info` читает `httpd.conf` и дескрипторы, -а не опрашивает URL-ы. Если нужно убедиться — дёрни URL. +Проверяется только TCP-порт Apache. Публикация в списке не означает, что база отвечает: состав +берётся из `httpd.conf` и дескрипторов, сами URL-ы не опрашиваются. Причина не в лени: запрос к +`/{AppName}` поднимает сеанс веб-клиента 1С и занимает лицензию, а публикаций может быть много. +Нужно убедиться в конкретной базе — дёрни её URL осознанно, помня про лицензию. ## Примеры diff --git a/.claude/skills/web-info/scripts/web-info.ps1 b/.claude/skills/web-info/scripts/web-info.ps1 index 1cc7d084..f616e812 100644 --- a/.claude/skills/web-info/scripts/web-info.ps1 +++ b/.claude/skills/web-info/scripts/web-info.ps1 @@ -1,4 +1,4 @@ -# web-info v1.2 — Apache & 1C publication status +# web-info v1.3 — Apache & 1C publication status # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills <# .SYNOPSIS @@ -82,7 +82,24 @@ $port = "—" if ($confContent -match '(?m)^Listen\s+(\d+)') { $port = $Matches[1] } -Write-Host "Port: $port" +# Проверяем именно TCP-порт: запрос к публикации поднял бы сеанс 1С и занял лицензию +$portState = "" +if ($port -ne "—") { + $client = New-Object System.Net.Sockets.TcpClient + try { + $async = $client.BeginConnect("127.0.0.1", [int]$port, $null, $null) + if ($async.AsyncWaitHandle.WaitOne(1000) -and $client.Connected) { + $portState = " (слушается)" + } else { + $portState = " (не отвечает)" + } + } catch { + $portState = " (не отвечает)" + } finally { + $client.Close() + } +} +Write-Host "Port: $port$portState" # Extract wsap24 path if ($confContent -match 'LoadModule\s+_1cws_module\s+"([^"]+)"') { diff --git a/.claude/skills/web-info/scripts/web-info.py b/.claude/skills/web-info/scripts/web-info.py index 44b7b6fc..7f4e34cf 100644 --- a/.claude/skills/web-info/scripts/web-info.py +++ b/.claude/skills/web-info/scripts/web-info.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# web-info v1.2 — Apache & 1C publication status +# web-info v1.3 — Apache & 1C publication status # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills """ @@ -11,6 +11,7 @@ import argparse import os import re +import socket import sys import psutil @@ -92,7 +93,15 @@ def main(): m = re.search(r'(?m)^Listen\s+(\d+)', conf_content) if m: port = m.group(1) - print(f'Port: {port}') + # Проверяем именно TCP-порт: запрос к публикации поднял бы сеанс 1С и занял лицензию + port_state = '' + if port != '—': + try: + with socket.create_connection(('127.0.0.1', int(port)), timeout=1): + port_state = ' (слушается)' + except OSError: + port_state = ' (не отвечает)' + print(f'Port: {port}{port_state}') # Extract wsap24 path m = re.search(r'LoadModule\s+_1cws_module\s+"([^"]+)"', conf_content)