Martin von Löwis avatar Martin von Löwis committed efc76b0

Initial version.

Comments (0)

Files changed (4)

+syntax: glob
+MANIFEST
+dist
+
+import pypissh;pypissh.monkeypatch()
+import subprocess, socket
+from httplib import HTTPConnection
+import urllib2
+from urllib2 import *
+
+class PipeSocket:
+    def __init__(self, proc):
+        self.proc = proc
+        self.filecount = 0
+
+    def write(self, data):
+        return self.proc.stdin.write(data)
+
+    def read(self, amt=None):
+        return self.proc.stdout.read(amt)
+
+    def readline(self):
+        return self.proc.stdout.readline()
+
+    def sendall(self, data):
+        return self.write(data)
+
+    def makefile(self, mode, buffering=0):
+        self.filecount += 1
+        return self
+
+    def close(self):
+        if self.filecount:
+            self.filecount -= 1
+            return
+        self.proc.stdout.close()
+        self.proc.stdin.close()
+        self.proc.wait()
+
+class HTTPSSHConnection(HTTPConnection):
+    def __init__(self, host, timeout=None):
+        self.user, self.host = host.split('@')
+        HTTPConnection.__init__(self, self.host, timeout=timeout)
+        self.debuglevel = 1
+
+    def connect(self):
+        p = subprocess.Popen(['ssh', '-T', '-l', self.user, self.host],
+                             stdin=subprocess.PIPE, stdout=subprocess.PIPE)
+        self.sock = PipeSocket(p)
+
+class HTTPSSHHandler(AbstractHTTPHandler):
+    def httpssh_open(self, req):
+        return self.do_open(HTTPSSHConnection, req)
+
+def build_opener(*handlers):
+    return urllib2.build_opener(HTTPSSHHandler, *handlers)
+
+_opener = None
+def urlopen(url, data=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT):
+    global _opener
+    if _opener is None:
+        _opener = build_opener()
+    return _opener.open(url, data, timeout)
+
+def monkeypatch():
+    import pypissh # ourselves
+    from distutils.command import register, upload
+    from distutils.config import PyPIRCCommand
+    register.urllib2 = pypissh
+    upload.urlopen = urlopen
+    PyPIRCCommand.DEFAULT_REPOSITORY = 'httpssh://submit@pypi.python.org/pypi'
+
+if __name__=='__main__':
+    #import pdb; pdb.set_trace()
+    f = urlopen('httpssh://submit@pypi.python.org/pypi')
+    print f.read()
+
+#!/usr/bin/env python
+import sys, os
+from distutils.core import setup
+from distutils.command.install_data import install_data
+
+class install_sitepackages(install_data):
+    def finalize_options(self):
+        self.warn_dir = 0
+        if os.sep == '/':
+            self.install_dir = os.path.join(sys.prefix, "lib", 
+                                            "python"+sys.version[:3],
+                                            "site-packages")
+        else:
+            self.install_dir = os.path.join(sys.prefix, "lib", "site-packages")
+
+setup(name='pypissh',
+      version='1.0',
+      description='PyPI SSH Access',
+      author='Martin v. Loewis',
+      author_email='martin@v.loewis.de',
+      url='http://pypi.python.org/pypi/pypissh',
+      py_modules=['pypissh'],
+      data_files=['pypissh.pth'],
+      cmdclass = {'install_data':install_sitepackages},
+     )
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.