ohmyzsh/plugins/shell-proxy/proxy.py
jiayang lai cc0f7eee90 fix: Code review fixes for multiple Python files
Fixed the following issues:

1. gitstatus.py:
   - Fixed broad IOError exception handling to catch specific OSError/FileNotFoundError
   - Fixed unused variable warning by using _ for ignored stderr

2. proxy.py:
   - Fixed os.path.expandvars usage that doesn't expand ~, changed to os.path.expanduser
   - Fixed check_output call that was incorrectly passing a file path instead of command list
   - Fixed missing space in env variable assignment for aliases

3. update_emoji.py:
   - Fixed file handle leaks by using with statements for file operations
   - Removed unnecessary .keys() call in dict iteration

4. cheatsheet.py:
   - Fixed parse() function to handle lines without '=' character
   - Fixed inefficient list comprehension using any() instead
   - Fixed shadowing of built-in 'cheatsheet' function name

5. ssh-agent.py:
   - Modernized string formatting from .format() to f-string

6. ssh-proxy.py:
   - Fixed next() call without default value that crashes when no proxy env vars set
   - Fixed missing exit code propagation from subprocess.call

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-19 16:33:21 +08:00

91 lines
2.6 KiB
Python
Executable file

#!/usr/bin/env python3
import os
import sys
from subprocess import check_output, list2cmdline
cwd = os.path.dirname(__file__)
ssh_agent = os.path.join(cwd, "ssh-agent.py")
proxy_env = "SHELLPROXY_URL"
no_proxy_env = "SHELLPROXY_NO_PROXY"
proxy_config = os.environ.get("SHELLPROXY_CONFIG") or os.path.expanduser("~/.config/proxy")
usage="""shell-proxy: no proxy configuration found.
Set `{env}` or create a config file at `{config}`
See the plugin README for more information.""".format(env=proxy_env, config=proxy_config)
def get_http_proxy():
default_proxy = os.environ.get(proxy_env)
no_proxy = os.environ.get(no_proxy_env)
if default_proxy and no_proxy:
return default_proxy, no_proxy
if os.path.isfile(proxy_config):
proxy_configdata = [line.strip() for line in check_output(["cat", proxy_config]).decode("utf-8").splitlines()]
if len(proxy_configdata) >= 1:
if not default_proxy:
default_proxy = proxy_configdata[0]
if len(proxy_configdata) == 2 and not no_proxy:
no_proxy = proxy_configdata[1]
if default_proxy:
return default_proxy, no_proxy
print(usage, file=sys.stderr)
sys.exit(1)
def make_proxies(url: str, no_proxy: str):
proxies = {"%s_PROXY" % _: url for _ in ("HTTP", "HTTPS", "FTP", "RSYNC", "ALL")}
proxies.update({name.lower(): value for (name, value) in proxies.items()})
proxies["GIT_SSH"] = ssh_agent
if no_proxy:
proxies.update({"NO_PROXY": no_proxy, "no_proxy": no_proxy})
return proxies
def merge(mapping: dict):
return ("%s=%s" % _ for _ in mapping.items())
class CommandSet:
proxies = make_proxies(*get_http_proxy())
aliases = {
_: "env __SSH_PROGRAM_NAME__=%s -- %s" % (_, ssh_agent)
for _ in ("ssh", "sftp", "scp", "slogin", "ssh-copy-id")
}
def enable(self):
cmdline("export", *merge(self.proxies))
cmdline("alias", *merge(self.aliases))
def disable(self):
cmdline("unset", *self.proxies.keys())
cmdline("unalias", *self.aliases.keys())
def status(self):
proxies = (
"%11s = %s" % (name, os.environ[name])
for name in self.proxies.keys()
if name in os.environ
)
for _ in proxies:
cmdline("echo", _)
def usage(self):
print("usage: proxy {enable,disable,status}", file=sys.stderr)
def cmdline(*items):
print(list2cmdline(items))
def main():
command = CommandSet()
if len(sys.argv) == 1:
command.usage()
sys.exit(1)
getattr(command, sys.argv[1], command.usage)()
if __name__ == "__main__":
main()