| """Run the custom non-Streamlit IHSG dashboard.""" |
|
|
| from __future__ import annotations |
|
|
| import argparse |
| import logging |
| import os |
| from pathlib import Path |
| import sys |
|
|
| PROJECT_ROOT = Path(__file__).resolve().parents[1] |
| if str(PROJECT_ROOT) not in sys.path: |
| sys.path.insert(0, str(PROJECT_ROOT)) |
|
|
| logger = logging.getLogger(__name__) |
|
|
|
|
| def parse_args() -> argparse.Namespace: |
| parser = argparse.ArgumentParser(description=__doc__) |
| parser.add_argument("--host", default=os.environ.get("DASHBOARD_HOST", "0.0.0.0")) |
| parser.add_argument( |
| "--port", |
| type=int, |
| default=int(os.environ.get("PORT", os.environ.get("DASHBOARD_PORT", "7860"))), |
| ) |
| parser.add_argument("--static-dir", type=Path, default=Path("web")) |
| return parser.parse_args() |
|
|
|
|
| def main() -> int: |
| from kag.logging import configure_logging |
| from kag.web.api import create_server |
|
|
| args = parse_args() |
| configure_logging() |
|
|
| if not args.static_dir.exists(): |
| logger.error("Static web directory does not exist: %s", args.static_dir) |
| return 1 |
|
|
| server = create_server(host=args.host, port=args.port, static_dir=args.static_dir) |
| logger.info("Custom dashboard running at http://%s:%s", args.host, args.port) |
| try: |
| server.serve_forever() |
| except KeyboardInterrupt: |
| logger.info("Shutting down dashboard server") |
| finally: |
| server.server_close() |
| return 0 |
|
|
|
|
| if __name__ == "__main__": |
| sys.exit(main()) |
|
|