proxy.py 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. #!/usr/bin/env python3
  2. import os
  3. import sys
  4. from subprocess import check_output, list2cmdline
  5. cwd = os.path.dirname(__file__)
  6. ssh_agent = os.path.join(cwd, "ssh-agent.py")
  7. proxy_env = "SHELLPROXY_URL"
  8. no_proxy_env = "SHELLPROXY_NO_PROXY"
  9. proxy_config = os.environ.get("SHELLPROXY_CONFIG") or os.path.expandvars("$HOME/.config/proxy")
  10. usage="""shell-proxy: no proxy configuration found.
  11. Set `{env}` or create a config file at `{config}`
  12. See the plugin README for more information.""".format(env=proxy_env, config=proxy_config)
  13. def get_http_proxy():
  14. default_proxy = os.environ.get(proxy_env)
  15. no_proxy = os.environ.get(no_proxy_env)
  16. if default_proxy and no_proxy:
  17. return default_proxy, no_proxy
  18. if os.path.isfile(proxy_config):
  19. proxy_configdata = [line.strip() for line in check_output(proxy_config).decode("utf-8").splitlines()]
  20. if len(proxy_configdata) >= 1:
  21. if not default_proxy:
  22. default_proxy = proxy_configdata[0]
  23. if len(proxy_configdata) == 2 and not no_proxy:
  24. no_proxy = proxy_configdata[1]
  25. if default_proxy:
  26. return default_proxy, no_proxy
  27. print(usage, file=sys.stderr)
  28. sys.exit(1)
  29. def make_proxies(url: str, no_proxy: str):
  30. proxies = {"%s_PROXY" % _: url for _ in ("HTTP", "HTTPS", "FTP", "RSYNC", "ALL")}
  31. proxies.update({name.lower(): value for (name, value) in proxies.items()})
  32. proxies["GIT_SSH"] = ssh_agent
  33. if no_proxy:
  34. proxies.update({"NO_PROXY": no_proxy, "no_proxy": no_proxy})
  35. return proxies
  36. def merge(mapping: dict):
  37. return ("%s=%s" % _ for _ in mapping.items())
  38. class CommandSet:
  39. proxies = make_proxies(*get_http_proxy())
  40. aliases = {
  41. _: "env __SSH_PROGRAM_NAME__=%s %s" % (_, ssh_agent)
  42. for _ in ("ssh", "sftp", "scp", "slogin", "ssh-copy-id")
  43. }
  44. def enable(self):
  45. cmdline("export", *merge(self.proxies))
  46. cmdline("alias", *merge(self.aliases))
  47. def disable(self):
  48. cmdline("unset", *self.proxies.keys())
  49. cmdline("unalias", *self.aliases.keys())
  50. def status(self):
  51. proxies = (
  52. "%11s = %s" % (name, os.environ[name])
  53. for name in self.proxies.keys()
  54. if name in os.environ
  55. )
  56. for _ in proxies:
  57. cmdline("echo", _)
  58. def usage(self):
  59. print("usage: proxy {enable,disable,status}", file=sys.stderr)
  60. def cmdline(*items):
  61. print(list2cmdline(items))
  62. def main():
  63. command = CommandSet()
  64. if len(sys.argv) == 1:
  65. command.usage()
  66. sys.exit(1)
  67. getattr(command, sys.argv[1], command.usage)()
  68. if __name__ == "__main__":
  69. main()