diff options
| author | Jennifer Leech <jenn@lindenlab.com> | 2008-06-26 19:08:51 +0000 | 
|---|---|---|
| committer | Jennifer Leech <jenn@lindenlab.com> | 2008-06-26 19:08:51 +0000 | 
| commit | d32c8825b63ca8dc9f1571aefea01cc89eba36e6 (patch) | |
| tree | 6f888fc1110cc63b7ba46a5823eb8befd9419964 /scripts | |
| parent | 68edae3f801f633037cf5cee063f65abe081c912 (diff) | |
svn merge -r89701:90677 svn+ssh://svn/svn/linden/branches/install-dev-binaries/s3-build -> release
Diffstat (limited to 'scripts')
| -rwxr-xr-x | scripts/install.py | 96 | 
1 files changed, 79 insertions, 17 deletions
diff --git a/scripts/install.py b/scripts/install.py index 9f7945264d..adb1b24e25 100755 --- a/scripts/install.py +++ b/scripts/install.py @@ -38,9 +38,11 @@ import md5  import optparse  import os  import pprint +import shutil  import sys  import tarfile -import urllib +import tempfile +import urllib2  import urlparse  from sets import Set as set, ImmutableSet as frozenset @@ -107,7 +109,7 @@ class InstallFile(object):              print "Found matching package:", self.filename              return          print "Downloading",self.url,"to local file",self.filename -        urllib.urlretrieve(self.url, self.filename) +        file(self.filename, 'wb').write(urllib2.urlopen(self.url).read())          if self.md5sum and not self._is_md5sum_match():              raise RuntimeError("Error matching md5 for %s" % self.url) @@ -383,7 +385,7 @@ windows/i686/vs/2003 -- specify a windows visual studio 2003 package"""                  if arg == 'platform':                       print platform_help_str                  kwargs[arg] = raw_input("Package "+arg+":") -        path = kwargs['platform'].split('/') +        #path = kwargs['platform'].split('/')          return self._update_installable(name, kwargs['platform'],                           kwargs['url'], kwargs['md5sum']) @@ -420,12 +422,12 @@ windows/i686/vs/2003 -- specify a windows visual studio 2003 package"""              self._licenses[name] = LicenseDefinition({})          else:              print "Updating license '" + name + "'." -        license  = self._licenses[name]._definition +        the_license  = self._licenses[name]._definition          for field in ('url', 'text'):              multiline = False              if field == 'text':                  multiline = True -            self._update_field(license, field, kwargs[field], multiline) +            self._update_field(the_license, field, kwargs[field], multiline)          self._install_changed = True          return True @@ -512,7 +514,7 @@ windows/i686/vs/2003 -- specify a windows visual studio 2003 package"""      def _install(self, to_install, install_dir):          for ifile in to_install:              tar = tarfile.open(ifile.filename, 'r') -            print "Extracting",ifile.filename,"to destination",install_dir +            print "Extracting",ifile.filename,"to",install_dir              if not self._dryrun:                  # *NOTE: try to call extractall, which first appears                  # in python 2.5. Phoenix 2008-01-28 @@ -546,6 +548,8 @@ windows/i686/vs/2003 -- specify a windows visual studio 2003 package"""          """          # The ordering of steps in the method is to help reduce the          # likelihood that we break something. +        install_dir = os.path.realpath(install_dir) +        cache_dir = os.path.realpath(cache_dir)          _mkdir(install_dir)          _mkdir(cache_dir)          to_install = self._build_ifiles(platform, cache_dir) @@ -556,6 +560,60 @@ windows/i686/vs/2003 -- specify a windows visual studio 2003 package"""              ifile.fetch_local()          self._install(to_install, install_dir) +class SCPOrHTTPHandler(urllib2.BaseHandler): +    """Evil hack to allow both the build system and developers consume +    proprietary binaries. +    To use http, export the environment variable: +    INSTALL_USE_HTTP_FOR_SCP=true +    """ +    def __init__(self, scp_binary): +        self._scp = scp_binary +        self._dir = None + +    def scp_open(self, request): +        #scp:codex.lindenlab.com:/local/share/install_pkgs/package.tar.bz2 +        remote = request.get_full_url()[4:] +        if os.getenv('INSTALL_USE_HTTP_FOR_SCP', None) == 'true': +            return self.do_http(remote) +        try: +            return self.do_scp(remote) +        except: +            self.cleanup() +            raise + +    def do_http(self, remote): +        url = remote.split(':',1) +        if not url[1].startswith('/'): +            # in case it's in a homedir or something +            url.insert(1, '/') +        url.insert(0, "http://") +        url = ''.join(url) +        print "Using HTTP:",url +        return urllib2.urlopen(url) + +    def do_scp(self, remote): +        if not self._dir: +            self._dir = tempfile.mkdtemp() +        local = os.path.join(self._dir, remote.split('/')[-1:][0]) +        command = [] +        for part in (self._scp, remote, local): +            if ' ' in part: +                # I hate shell escaping. +                part.replace('\\', '\\\\') +                part.replace('"', '\\"') +                command.append('"%s"' % part) +            else: +                command.append(part) +        #print "forking:", command +        rv = os.system(' '.join(command)) +        if rv != 0: +            raise RuntimeError("Cannot fetch: %s" % remote) +        return file(local, 'rb') + +    def cleanup(self): +        if self._dir: +            shutil.rmtree(self._dir) +  #  # *NOTE: PULLED FROM PYTHON 2.5 tarfile.py Phoenix 2008-01-28 @@ -634,7 +692,6 @@ def _default_installable_cache():      user = _getuser()      cache_dir = "/var/tmp/%s/install.cache" % user      if _get_platform() == 'windows': -        import tempfile          cache_dir = os.path.join(tempfile.gettempdir(), \                                   'install.cache.%s' % user)      return cache_dir @@ -866,6 +923,12 @@ Ignored if --add-installable or --add-installable-package is not specified.""")          help="""Remove the installables specified in the arguments. Just like \  during installation, if no installables are listed then all installed \  installables are removed.""") +    parser.add_option( +        '--scp',  +        type='string', +        default='scp', +        dest='scp', +        help="Specify the path to your scp program.")      return parser.parse_args() @@ -880,18 +943,10 @@ def main():      # Handle the queries for information      #      if options.list_installed: -        print "installed list:" -        inst = installer.list_installed() -        inst.sort() -        for i in inst: -            print ' ', i +        print "installed list:", installer.list_installed()          return 0      if options.list_installables: -        print "installable list:", -        inst = installer.list_installables() -        inst.sort() -        for i in inst: -            print ' ', i +        print "installable list:", installer.list_installables()          return 0      if options.detail_installable:          try: @@ -997,12 +1052,19 @@ def main():                  if not installer.is_valid_license(installable):                      return 1 +        # Set up the 'scp' handler +        opener = urllib2.build_opener() +        scp_or_http = SCPOrHTTPHandler(options.scp) +        opener.add_handler(scp_or_http) +        urllib2.install_opener(opener) +          # Do the work of installing the requested installables.          installer.install(              install_installables,              options.platform,              options.install_dir,              options.cache_dir) +        scp_or_http.cleanup()      # save out any changes      installer.save()  | 
