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