feat(web-info): проверка TCP-порта Apache

Статус строился только по наличию процесса httpd: при живом процессе и
не поднявшемся сервере (занятый порт, битый конфиг) навык рапортовал
«Запущен». Теперь порт из Listen проверяется TCP-коннектом на 127.0.0.1
с таймаутом 1 с — «(слушается)» / «(не отвечает)».

Сами публикации намеренно не опрашиваются: запрос к /{AppName} поднимает
сеанс веб-клиента 1С и занимает лицензию, а публикаций может быть много.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Nick Shirokov
2026-08-08 15:46:22 +03:00
co-authored by Claude Opus 5
parent b8cbb0111a
commit 0d4933f135
3 changed files with 35 additions and 6 deletions
+5 -2
View File
@@ -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 осознанно, помня про лицензию.
## Примеры
+19 -2
View File
@@ -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+"([^"]+)"') {
+11 -2
View File
@@ -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)