cli.py 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. import argparse
  2. from typing import Optional
  3. from ocma import connect
  4. def run() -> None:
  5. parser = argparse.ArgumentParser(description="openconnect-microsoft-authenticator")
  6. # add argument
  7. parser.add_argument(
  8. "-u",
  9. "--username",
  10. metavar="username",
  11. type=str,
  12. help="MS Account username.",
  13. required=True,
  14. )
  15. parser.add_argument(
  16. "-p",
  17. "--password",
  18. metavar="password",
  19. type=str,
  20. help="MS Account password. If not provided, it will be read from stdin.",
  21. )
  22. parser.add_argument(
  23. "-m",
  24. "--mfa",
  25. metavar="secret",
  26. type=str,
  27. help="TOTP secret. Required, if you have set up 2FA with your MS account (only TOTP).",
  28. required=False,
  29. )
  30. parser.add_argument(
  31. "--vpn_url",
  32. nargs="?",
  33. metavar="url",
  34. type=str,
  35. help="Login URL",
  36. default="https://vpn.fhnw.ch",
  37. )
  38. parser.add_argument(
  39. "--show-head",
  40. action="store_false",
  41. help="If the browser window should be shown during the authentication process.",
  42. )
  43. parser.add_argument(
  44. "-v",
  45. action="store_true",
  46. help="If verbal messages should be printed to stderr",
  47. )
  48. parser.add_argument(
  49. "--print-to-stdout",
  50. action="store_true",
  51. help="""If the vpn host and cookie should be printed to the stdout. To be used like:\n
  52. \n
  53. eval $( python ocma/cli.py -u [username] -p [password] --print-to-stdout ); \n
  54. [ -n $VPN_COOKIE ] && echo $VPN_COOKIE | sudo openconnect --cookie-on-stdin $VPN_HOST
  55. """,
  56. )
  57. # parse the arguments from standard input
  58. args = parser.parse_args()
  59. username: str = args.username
  60. password: Optional[str] = args.password
  61. mfa_secret: str = args.mfa
  62. vpn_url: str = args.vpn_url
  63. headless: bool = args.show_head
  64. print_to_stdout: bool = args.print_to_stdout
  65. log_messages: bool = args.v
  66. if password is None:
  67. password = input()
  68. if mfa_secret is not None:
  69. try:
  70. connect.get_mfa_code(mfa_secret)
  71. except ValueError as e:
  72. raise ValueError(f"Your MFA secret '{mfa_secret}' is invalid!") from e
  73. cookie = connect.login(
  74. username=username,
  75. password=password,
  76. mfa_secret=mfa_secret,
  77. vpn_site=vpn_url,
  78. headless=headless,
  79. log_messages=log_messages,
  80. )
  81. if print_to_stdout:
  82. print(f"VPN_HOST={cookie.domain}")
  83. print(f"VPN_COOKIE={cookie.cookie}")
  84. if __name__ == "__main__":
  85. run()