57 lines
2.4 KiB
Python
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())
|