diff options
Diffstat (limited to 'scripts/lib/mic/utils/proxy.py')
-rw-r--r-- | scripts/lib/mic/utils/proxy.py | 183 |
1 files changed, 183 insertions, 0 deletions
diff --git a/scripts/lib/mic/utils/proxy.py b/scripts/lib/mic/utils/proxy.py new file mode 100644 index 0000000000..91451a2d01 --- /dev/null +++ b/scripts/lib/mic/utils/proxy.py @@ -0,0 +1,183 @@ +#!/usr/bin/python -tt +# +# Copyright (c) 2010, 2011 Intel, Inc. +# +# This program is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the Free +# Software Foundation; version 2 of the License +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., 59 +# Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +import os +import urlparse + +_my_proxies = {} +_my_noproxy = None +_my_noproxy_list = [] + +def set_proxy_environ(): + global _my_noproxy, _my_proxies + if not _my_proxies: + return + for key in _my_proxies.keys(): + os.environ[key + "_proxy"] = _my_proxies[key] + if not _my_noproxy: + return + os.environ["no_proxy"] = _my_noproxy + +def unset_proxy_environ(): + for env in ('http_proxy', + 'https_proxy', + 'ftp_proxy', + 'all_proxy'): + if env in os.environ: + del os.environ[env] + + ENV=env.upper() + if ENV in os.environ: + del os.environ[ENV] + +def _set_proxies(proxy = None, no_proxy = None): + """Return a dictionary of scheme -> proxy server URL mappings. + """ + + global _my_noproxy, _my_proxies + _my_proxies = {} + _my_noproxy = None + proxies = [] + if proxy: + proxies.append(("http_proxy", proxy)) + if no_proxy: + proxies.append(("no_proxy", no_proxy)) + + # Get proxy settings from environment if not provided + if not proxy and not no_proxy: + proxies = os.environ.items() + + # Remove proxy env variables, urllib2 can't handle them correctly + unset_proxy_environ() + + for name, value in proxies: + name = name.lower() + if value and name[-6:] == '_proxy': + if name[0:2] != "no": + _my_proxies[name[:-6]] = value + else: + _my_noproxy = value + +def _ip_to_int(ip): + ipint=0 + shift=24 + for dec in ip.split("."): + ipint |= int(dec) << shift + shift -= 8 + return ipint + +def _int_to_ip(val): + ipaddr="" + shift=0 + for i in range(4): + dec = val >> shift + dec &= 0xff + ipaddr = ".%d%s" % (dec, ipaddr) + shift += 8 + return ipaddr[1:] + +def _isip(host): + if host.replace(".", "").isdigit(): + return True + return False + +def _set_noproxy_list(): + global _my_noproxy, _my_noproxy_list + _my_noproxy_list = [] + if not _my_noproxy: + return + for item in _my_noproxy.split(","): + item = item.strip() + if not item: + continue + + if item[0] != '.' and item.find("/") == -1: + # Need to match it + _my_noproxy_list.append({"match":0,"needle":item}) + + elif item[0] == '.': + # Need to match at tail + _my_noproxy_list.append({"match":1,"needle":item}) + + elif item.find("/") > 3: + # IP/MASK, need to match at head + needle = item[0:item.find("/")].strip() + ip = _ip_to_int(needle) + netmask = 0 + mask = item[item.find("/")+1:].strip() + + if mask.isdigit(): + netmask = int(mask) + netmask = ~((1<<(32-netmask)) - 1) + ip &= netmask + else: + shift=24 + netmask=0 + for dec in mask.split("."): + netmask |= int(dec) << shift + shift -= 8 + ip &= netmask + + _my_noproxy_list.append({"match":2,"needle":ip,"netmask":netmask}) + +def _isnoproxy(url): + (scheme, host, path, parm, query, frag) = urlparse.urlparse(url) + + if '@' in host: + user_pass, host = host.split('@', 1) + + if ':' in host: + host, port = host.split(':', 1) + + hostisip = _isip(host) + for item in _my_noproxy_list: + if hostisip and item["match"] <= 1: + continue + + if item["match"] == 2 and hostisip: + if (_ip_to_int(host) & item["netmask"]) == item["needle"]: + return True + + if item["match"] == 0: + if host == item["needle"]: + return True + + if item["match"] == 1: + if host.rfind(item["needle"]) > 0: + return True + + return False + +def set_proxies(proxy = None, no_proxy = None): + _set_proxies(proxy, no_proxy) + _set_noproxy_list() + set_proxy_environ() + +def get_proxy_for(url): + if url.startswith('file:') or _isnoproxy(url): + return None + + type = url[0:url.index(":")] + proxy = None + if _my_proxies.has_key(type): + proxy = _my_proxies[type] + elif _my_proxies.has_key("http"): + proxy = _my_proxies["http"] + else: + proxy = None + + return proxy |