Add standalone Hwacheon network viewer
This commit is contained in:
commit
d64b820ae2
15 files changed
+748
No files matched your search
@@ -0,0 +1,56 @@
|
||||
#!/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())
|
||||
Reference in new issue
Block a user