reset_admin_password.py 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. import argparse
  2. import logging
  3. import requests
  4. from gpustack.client.generated_clientset import ClientSet
  5. from gpustack.cmd.start import get_gpustack_env
  6. from gpustack.schemas.users import UserUpdate
  7. from gpustack.security import generate_secure_password
  8. logger = logging.getLogger(__name__)
  9. def setup_reset_admin_password_cmd(subparsers: argparse._SubParsersAction):
  10. parser: argparse.ArgumentParser = subparsers.add_parser(
  11. "reset-admin-password",
  12. help="Reset the admin user's password.",
  13. )
  14. parser.add_argument(
  15. "-s",
  16. "--server-url",
  17. type=str,
  18. help="Server to connect to.",
  19. default=get_gpustack_env("SERVER_URL"),
  20. )
  21. parser.add_argument(
  22. "--api-key",
  23. type=str,
  24. help="API Key to connect server.",
  25. default=get_gpustack_env("API_KEY"),
  26. )
  27. parser.set_defaults(func=run)
  28. def run(args):
  29. try:
  30. # default using api port instead of web port
  31. server_url = None
  32. server_urls = ["http://localhost", "http://localhost:30080"]
  33. if args.server_url is not None:
  34. server_url = args.server_url
  35. else:
  36. for url in server_urls:
  37. if test_url_accessible(url):
  38. server_url = url
  39. break
  40. if server_url is None:
  41. raise Exception(
  42. "Cannot connect to local gpustack server. Please specify --server-url"
  43. )
  44. api_key = None
  45. if args.api_key is not None:
  46. api_key = args.api_key
  47. client = ClientSet(
  48. base_url=server_url,
  49. api_key=api_key,
  50. )
  51. user_me = client.users.get("me")
  52. user_update = UserUpdate(**user_me.model_dump())
  53. reset_password = generate_secure_password()
  54. user_update.password = reset_password
  55. user_update.require_password_change = True
  56. client.users.update("me", user_update)
  57. print(f"Reset admin password: {reset_password}")
  58. except Exception as e:
  59. logger.fatal(f"Failed to reset admin password: {e}")
  60. def test_url_accessible(url: str) -> bool:
  61. try:
  62. resp = requests.get(f"{url}/healthz", timeout=2)
  63. return resp.status_code == 200
  64. except Exception:
  65. return False