#!/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())