Files
hwacheon-network-viewer/serve.py
T

57 lines
2.4 KiB
Python

#!/usr/bin/env python3
"""Serve the bundled Hwacheon viewer locally, or on the LAN with --lan."""
import argparse
from functools import partial
from http.server import SimpleHTTPRequestHandler,ThreadingHTTPServer
from pathlib import Path
import sys
ROOT=Path(__file__).resolve().parent
class Handler(SimpleHTTPRequestHandler):
def end_headers(self):
self.send_header('Cache-Control','no-store')
self.send_header('X-Content-Type-Options','nosniff')
self.send_header('Referrer-Policy','no-referrer')
super().end_headers()
def list_directory(self,path):
self.send_error(403,'Directory listing disabled')
return None
def translate_path(self,path):
root=(ROOT/'web').resolve()
candidate=Path(super().translate_path(path)).resolve()
if not candidate.is_relative_to(root):return str(root/'__not_found__')
return str(candidate)
def parse_args(argv=None):
parser=argparse.ArgumentParser(description=__doc__)
parser.add_argument('--port',type=int,default=8080)
parser.add_argument('--lan',action='store_true',help='Internal LAN sharing: bind 0.0.0.0 instead of the default 127.0.0.1')
args=parser.parse_args(argv)
if not 1 <= args.port <= 65535:
parser.error('--port must be between 1 and 65535')
return args
def main(args=None):
if args is None:
args=parse_args()
if not (ROOT/'web/data/network.json').is_file():
print('web/data/network.json이 없습니다. 제출 파일 구성을 확인하세요.',file=sys.stderr)
return 1
handler=partial(Handler,directory=str(ROOT/'web'))
host='0.0.0.0' if args.lan else '127.0.0.1'
try:server=ThreadingHTTPServer((host,args.port),handler)
except OSError as e:
print(f'서버를 시작할 수 없습니다: {e}. --port 8081 등 다른 포트를 지정하세요.',file=sys.stderr)
return 1
print(f'화천군 관망도: http://127.0.0.1:{args.port}',flush=True)
if args.lan:
print(f'내부 공유 모드: {host}:{args.port} · Windows LAN 전달/방화벽 설정 필요 · 로그인 없음',flush=True)
else:
print('로컬 모드: 127.0.0.1에만 바인딩합니다.',flush=True)
print('종료: Ctrl+C',flush=True)
try:server.serve_forever()
except KeyboardInterrupt:pass
finally:server.server_close()
return 0
if __name__=='__main__':raise SystemExit(main())