mirror of
https://github.com/Nikolay-Shirokov/cc-1c-skills.git
synced 2026-07-23 13:11:05 +03:00
fix(python): add stdout UTF-8 encoding for Windows compatibility
Python on Windows defaults to cp1251 for piped stdout, which cannot handle Unicode box-drawing characters used in info/analysis output. Added sys.stdout.reconfigure(encoding="utf-8") to all 59 Python scripts. Tested on real config data: epf-init, epf-validate, cf-info, cf-validate, meta-info, form-info, role-info, skd-info, subsystem-info — all passing. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.6
parent
86a959a354
commit
d6abb2b651
@@ -1,117 +1,118 @@
|
||||
#!/usr/bin/env python3
|
||||
# web-stop v1.0 — Stop Apache HTTP Server
|
||||
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
||||
|
||||
"""
|
||||
Остановка Apache HTTP Server.
|
||||
Сначала пытается graceful shutdown, при неудаче — принудительная остановка.
|
||||
"""
|
||||
|
||||
import argparse
|
||||
import os
|
||||
import sys
|
||||
import time
|
||||
|
||||
import psutil
|
||||
|
||||
|
||||
def get_our_httpd(httpd_exe_norm):
|
||||
"""Filter httpd processes by our ApachePath."""
|
||||
result = []
|
||||
if not httpd_exe_norm:
|
||||
return result
|
||||
for p in psutil.process_iter(['pid', 'name', 'exe']):
|
||||
try:
|
||||
if p.info['name'] and 'httpd' in p.info['name'].lower():
|
||||
if p.info['exe'] and os.path.normcase(os.path.normpath(p.info['exe'])) == httpd_exe_norm:
|
||||
result.append(p)
|
||||
except (psutil.NoSuchProcess, psutil.AccessDenied):
|
||||
pass
|
||||
return result
|
||||
|
||||
|
||||
def get_all_httpd():
|
||||
"""Get all httpd processes."""
|
||||
result = []
|
||||
for p in psutil.process_iter(['pid', 'name', 'exe']):
|
||||
try:
|
||||
if p.info['name'] and 'httpd' in p.info['name'].lower():
|
||||
result.append(p)
|
||||
except (psutil.NoSuchProcess, psutil.AccessDenied):
|
||||
pass
|
||||
return result
|
||||
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser(description='Stop Apache HTTP Server', allow_abbrev=False)
|
||||
parser.add_argument('-ApachePath', type=str, default='', help='Apache root (default: tools\\apache24)')
|
||||
args = parser.parse_args()
|
||||
|
||||
# --- Resolve ApachePath ---
|
||||
apache_path = args.ApachePath
|
||||
if not apache_path:
|
||||
script_dir = os.path.dirname(os.path.abspath(__file__))
|
||||
project_root = os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(script_dir))))
|
||||
apache_path = os.path.join(project_root, 'tools', 'apache24')
|
||||
|
||||
# --- Helper: normalize httpd exe path ---
|
||||
httpd_exe = os.path.join(apache_path, 'bin', 'httpd.exe')
|
||||
if os.path.exists(httpd_exe):
|
||||
httpd_exe_norm = os.path.normcase(os.path.normpath(os.path.realpath(httpd_exe)))
|
||||
else:
|
||||
httpd_exe_norm = os.path.normcase(os.path.normpath(httpd_exe))
|
||||
|
||||
# --- Check process (only our Apache) ---
|
||||
httpd_proc = get_our_httpd(httpd_exe_norm)
|
||||
if not httpd_proc:
|
||||
foreign = get_all_httpd()
|
||||
if foreign:
|
||||
print('Наш Apache не запущен')
|
||||
print(f'[WARN] Обнаружен сторонний Apache (PID: {foreign[0].pid})')
|
||||
else:
|
||||
print('Apache не запущен')
|
||||
sys.exit(0)
|
||||
|
||||
pids = ', '.join(str(p.pid) for p in httpd_proc)
|
||||
print(f'Останавливаю Apache (PID: {pids})...')
|
||||
|
||||
# --- Stop our processes ---
|
||||
for p in httpd_proc:
|
||||
try:
|
||||
p.kill()
|
||||
except (psutil.NoSuchProcess, psutil.AccessDenied):
|
||||
pass
|
||||
|
||||
# --- Wait for shutdown ---
|
||||
max_wait = 5
|
||||
elapsed = 0
|
||||
while elapsed < max_wait:
|
||||
time.sleep(1)
|
||||
elapsed += 1
|
||||
check = get_our_httpd(httpd_exe_norm)
|
||||
if not check:
|
||||
print('Apache остановлен')
|
||||
print('Публикации сохранены. Перезапуск: /web-publish <база> Удаление: /web-unpublish --all')
|
||||
sys.exit(0)
|
||||
|
||||
# --- Fallback: force kill ---
|
||||
remaining = get_our_httpd(httpd_exe_norm)
|
||||
if remaining:
|
||||
print('Принудительная остановка...')
|
||||
for p in remaining:
|
||||
try:
|
||||
p.kill()
|
||||
except (psutil.NoSuchProcess, psutil.AccessDenied):
|
||||
pass
|
||||
time.sleep(1)
|
||||
final = get_our_httpd(httpd_exe_norm)
|
||||
if final:
|
||||
print('Error: не удалось остановить Apache', file=sys.stderr)
|
||||
sys.exit(1)
|
||||
|
||||
print('Apache остановлен')
|
||||
print('Публикации сохранены. Перезапуск: /web-publish <база> Удаление: /web-unpublish --all')
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
#!/usr/bin/env python3
|
||||
# web-stop v1.0 — Stop Apache HTTP Server
|
||||
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
||||
|
||||
"""
|
||||
Остановка Apache HTTP Server.
|
||||
Сначала пытается graceful shutdown, при неудаче — принудительная остановка.
|
||||
"""
|
||||
|
||||
import argparse
|
||||
import os
|
||||
import sys
|
||||
import time
|
||||
|
||||
import psutil
|
||||
|
||||
|
||||
def get_our_httpd(httpd_exe_norm):
|
||||
"""Filter httpd processes by our ApachePath."""
|
||||
result = []
|
||||
if not httpd_exe_norm:
|
||||
return result
|
||||
for p in psutil.process_iter(['pid', 'name', 'exe']):
|
||||
try:
|
||||
if p.info['name'] and 'httpd' in p.info['name'].lower():
|
||||
if p.info['exe'] and os.path.normcase(os.path.normpath(p.info['exe'])) == httpd_exe_norm:
|
||||
result.append(p)
|
||||
except (psutil.NoSuchProcess, psutil.AccessDenied):
|
||||
pass
|
||||
return result
|
||||
|
||||
|
||||
def get_all_httpd():
|
||||
"""Get all httpd processes."""
|
||||
result = []
|
||||
for p in psutil.process_iter(['pid', 'name', 'exe']):
|
||||
try:
|
||||
if p.info['name'] and 'httpd' in p.info['name'].lower():
|
||||
result.append(p)
|
||||
except (psutil.NoSuchProcess, psutil.AccessDenied):
|
||||
pass
|
||||
return result
|
||||
|
||||
|
||||
def main():
|
||||
sys.stdout.reconfigure(encoding="utf-8")
|
||||
parser = argparse.ArgumentParser(description='Stop Apache HTTP Server', allow_abbrev=False)
|
||||
parser.add_argument('-ApachePath', type=str, default='', help='Apache root (default: tools\\apache24)')
|
||||
args = parser.parse_args()
|
||||
|
||||
# --- Resolve ApachePath ---
|
||||
apache_path = args.ApachePath
|
||||
if not apache_path:
|
||||
script_dir = os.path.dirname(os.path.abspath(__file__))
|
||||
project_root = os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(script_dir))))
|
||||
apache_path = os.path.join(project_root, 'tools', 'apache24')
|
||||
|
||||
# --- Helper: normalize httpd exe path ---
|
||||
httpd_exe = os.path.join(apache_path, 'bin', 'httpd.exe')
|
||||
if os.path.exists(httpd_exe):
|
||||
httpd_exe_norm = os.path.normcase(os.path.normpath(os.path.realpath(httpd_exe)))
|
||||
else:
|
||||
httpd_exe_norm = os.path.normcase(os.path.normpath(httpd_exe))
|
||||
|
||||
# --- Check process (only our Apache) ---
|
||||
httpd_proc = get_our_httpd(httpd_exe_norm)
|
||||
if not httpd_proc:
|
||||
foreign = get_all_httpd()
|
||||
if foreign:
|
||||
print('Наш Apache не запущен')
|
||||
print(f'[WARN] Обнаружен сторонний Apache (PID: {foreign[0].pid})')
|
||||
else:
|
||||
print('Apache не запущен')
|
||||
sys.exit(0)
|
||||
|
||||
pids = ', '.join(str(p.pid) for p in httpd_proc)
|
||||
print(f'Останавливаю Apache (PID: {pids})...')
|
||||
|
||||
# --- Stop our processes ---
|
||||
for p in httpd_proc:
|
||||
try:
|
||||
p.kill()
|
||||
except (psutil.NoSuchProcess, psutil.AccessDenied):
|
||||
pass
|
||||
|
||||
# --- Wait for shutdown ---
|
||||
max_wait = 5
|
||||
elapsed = 0
|
||||
while elapsed < max_wait:
|
||||
time.sleep(1)
|
||||
elapsed += 1
|
||||
check = get_our_httpd(httpd_exe_norm)
|
||||
if not check:
|
||||
print('Apache остановлен')
|
||||
print('Публикации сохранены. Перезапуск: /web-publish <база> Удаление: /web-unpublish --all')
|
||||
sys.exit(0)
|
||||
|
||||
# --- Fallback: force kill ---
|
||||
remaining = get_our_httpd(httpd_exe_norm)
|
||||
if remaining:
|
||||
print('Принудительная остановка...')
|
||||
for p in remaining:
|
||||
try:
|
||||
p.kill()
|
||||
except (psutil.NoSuchProcess, psutil.AccessDenied):
|
||||
pass
|
||||
time.sleep(1)
|
||||
final = get_our_httpd(httpd_exe_norm)
|
||||
if final:
|
||||
print('Error: не удалось остановить Apache', file=sys.stderr)
|
||||
sys.exit(1)
|
||||
|
||||
print('Apache остановлен')
|
||||
print('Публикации сохранены. Перезапуск: /web-publish <база> Удаление: /web-unpublish --all')
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
|
||||
Reference in New Issue
Block a user