示例#1
0
文件: homebrew.py 项目: emulbreh/ecs
 def get_missing_prerequisites(self, packages):
     prerequisites = list(self.get_prerequisites(packages))
     for pkgline in prerequisites:
         pkgname = packageline_split(pkgline)[4]
         result = local("brew list %s &>/dev/null; echo $?" % pkgname)
         if not result.strip() == '0':
             yield pkgline
示例#2
0
文件: windows.py 项目: emulbreh/ecs
 def get_missing_prerequisites(self, packages):        
     prerequisites = list(self.get_prerequisites(packages))
     
     for pkgline in prerequisites:
         (name, pkgtype, platform, resource, url, opt1, opt2) = packageline_split(pkgline)
 
         if opt1 == "unzipflat" or opt1 == "unzipflatroot" or opt1 == "unzipflatsecond":
             if not len(list(which(opt2))):
                 yield pkgline
         
         elif opt1 in ['exec', 'msiexec']:
             full_path = None
             warn("Information: searching c:\ for %s, this may take a while" % opt2)
             for root, dirs, files in os.walk("C:\\"):
                 for file in files:
                     if file == opt2:
                         full_path = os.path.join(root, file)
                         warn("Information: found %s at %s" % (opt2, full_path))
                         break
                 if full_path:
                     break
             if not full_path:
                 yield pkgline
         else:
             raise NotImplementedError
示例#3
0
文件: base.py 项目: emulbreh/ecs
 def get_prerequisites(self, packages):
     for packageline in packages.splitlines():
         (name, pkgtype, platform, resource, _, _, _) = packageline_split(packageline)
         if name is None:
             continue
         if pkgtype == 'req' and re.match(self.platform, platform) and re.match(self.resource, resource):
             yield packageline
示例#4
0
文件: apt.py 项目: emulbreh/ecs
 def get_missing_prerequisites(self, packages):
     prerequisites = list(self.get_prerequisites(packages))
     for pkgline in prerequisites:
         pkgname = ' '.join(packageline_split(pkgline)[4].split(','))
         with settings(warn_only=True):
             result = local("dpkg -l %s >/dev/null 2>/dev/null" % pkgname)
         if result.failed:
             yield pkgline
示例#5
0
文件: base.py 项目: emulbreh/ecs
 def get_packages(self, packages):
     for pkgline in packages.splitlines():
         (name, pkgtype, platform, resource, url, opt1, opt2) = packageline_split(pkgline)
         if name is None:
             continue
         if re.match(self.platform, platform):
             if pkgtype == 'inst' or pkgtype == 'instbin':
                 yield pkgline
示例#6
0
文件: zypper.py 项目: emulbreh/ecs
 def get_missing_prerequisites(self, packages):
     prerequisites = list(self.get_prerequisites(packages))
     for pkgline in prerequisites:
         pkgname = packageline_split(pkgline)[4]
         with settings(warn_only=True):
             # using the rpm tool directly is much faster then using zypper
             result = local("rpm -q %s >/dev/null 2>/dev/null" % pkgname)
         if result.failed:
             yield pkgline
示例#7
0
文件: openbsd.py 项目: natano/ecs
 def get_missing_prerequisites(self, packages):
     prerequisites = list(self.get_prerequisites(packages))
     cmd = "pkg_info|sed -r 's/^(.*)-[0123456789]+.*/\\1/'"
     installed_packages = local(cmd).splitlines()
     for pkgline in prerequisites:
         pkgname = packageline_split(pkgline)[4]
         if "--" in pkgname:
             pkgname, flavor = pkgname.split("--", 1)
         if not pkgname in installed_packages:
             yield pkgline
示例#8
0
文件: base.py 项目: emulbreh/ecs
 def install_prerequisites(self, packages, use_sudo=True):
     sudooption = "sudo" if use_sudo else ""
     pkg_list = ' '.join([packageline_split(x)[4] for x in self.get_missing_prerequisites(packages)])
     if pkg_list:
         with settings(warn_only=True):
             result = local("%s %s %s %s %s" % (sudooption, self.env_vars, self.pkgmanager, self.pkgmanageroptions, pkg_list))
         print(result.stdout)
         if result.failed:
             print(result.stderr)
             abort("Install of prerequisites failed")
示例#9
0
文件: windows.py 项目: emulbreh/ecs
 def install_prerequisites(self, packages, use_sudo=True):
     prerequisites = list(self.get_missing_prerequisites(packages))
     if not prerequisites:
         return
         
     for pkgline in prerequisites:
         (name, pkgtype, platform, resource, url, opt1, opt2) = packageline_split(pkgline)
             
         if resource in ["http", "https", "ftp"]:
             url = "".join((resource,":",url))
         elif resource in ["file", "dir"]:
             url = os.path.join(fabdir(), url)
         
         # try to take windows prerequisite package from the fridge (externals/frozen)
         resource, url = try_frozen(resource, url)
                         
         if opt1 in ["unzipflat", "unzipflatroot", "unzipflatsecond"]:        
             print("Information: installing prerequisite %s" % opt2)
             if resource == "file":
                 filename = url
             else:
                 filename, headers = urlretrieve(url)
             C_extract_levels = {'unzipflat': -1, 'unzipflatroot': 0, 'unzipflatsecond': 1}
             self._zip_flatextract(filename, os.path.dirname(get_pythonexe()), C_extract_levels[opt1])
             if resource != "file":
                 os.remove(filename)
     
         elif opt1 in ['exec', 'msiexec']:
             print("Information: installing prerequisite %s" % opt2)
             if resource == "file":
                 filename = url
             else:
                 filename, headers = urlretrieve(url)
             with settings(warn_only=True):
                 if opt1 == "exec":
                     result = local(filename)
                 elif opt1 == "msiexec":
                     result = local("msiexec /i %s" % filename)
                 print(result.stdout)
                 if result.failed:
                     print(result.stderr)
                     abort("Install of prerequisites failed")
             if resource != "file":
                 os.remove(filename)
         else:
             abort("Unimplemented requirement type in line %s" % pkgline)
示例#10
0
文件: base.py 项目: emulbreh/ecs
    def install_packages(self, packages, upgrade=False):
        upgradeoption = ""
        if upgrade: upgradeoption= "--upgrade"
        
        for packageline in self.get_packages(packages):
            (name, pkgtype, platform, resource, url, opt1, opt2) = packageline_split(packageline)
            if resource in ["pypi"]:
                pass
            elif resource in ["http", "https", "ftp"]:
                url = "".join((resource,":",url))
            elif resource in ["file", "dir"]:
                url = os.path.join(fabdir(), url)
            else:
                abort("unimplemented resource %s" % (resource))        

            # try to take package from the fridge (externals/frozen)
            resource, url = try_frozen(resource,url)
            
            if pkgtype == "inst":
                print("Information: installing %s from %s on matching platform %s" % (name, resource, platform))
                if resource in ["pypi", "http", "https", "ftp"]:        
                    with settings(warn_only=True):
                        if resource == "pypi":
                            if sys.platform == "win32":
                                url=url.replace('\\','^')
                            else:
                                url="".join(('"',url,'"'))
                                url=url.replace('\\','')
                        result=local('pip install --no-deps %s %s' % (upgradeoption, url))
                elif resource in ["file", "dir"]:
                    with settings(warn_only=True):
                        result=local('%s --always-copy --always-unzip --no-deps %s' % (self.easy_install, url))
                else:
                    abort("unimplemented resource %s" % (resource))
                _abort_failed(result)
                
            elif pkgtype == "instbin":
                if resource in ["http", "https", "ftp", "file"]:    
                    with settings(warn_only=True):
                        result=local('%s --always-copy --always-unzip --no-deps %s' % (self.easy_install, url))                    
                    _abort_failed(result)
                else:
                    abort("unimplemented resource %s" % (resource))

            else:
                warn("unimplemented package type %s in line: %s" % (pkgtype, packageline))
示例#11
0
文件: fridge.py 项目: emulbreh/ecs
def fridge_refill(appname, flavor="default", refill_behavior= RB_IGNORE):
    '''
    refill fridge: appname, flavor, refill_behavior
    
    refill_behavior= 
    "abort-if-existing" abort if file to be downloaded already exists
    "ignore-if-existing" ignore file to be downloaded if already exists 
    "update-if-different" update file if file to be downloaded is unequal stored file 
    "overwrite-existing" download file and overwrite regardless if already there and equal 
    '''
    if refill_behavior not in REFILL_BEHAVIOR:
        abort("refill behavior can be only one of %s" % str(REFILL_BEHAVIOR))
    
    if not os.path.exists(_fridgedir()):
        os.makedirs(_fridgedir())

    appconfigfile = os.path.join(fabdir(), appname, 'application.py')
    appconfig = import_from(appconfigfile)
    try:
        package_bundles = appconfig.package_bundles
    except AttributeError:
        abort('package_bundles is not defined')  
    try:
        package_bundle = package_bundles[flavor]
    except KeyError:
        abort('No flavor "%s"\n' % flavor)
    
    package_bundle= package_merge(package_bundle)
   
    for line in package_bundle.splitlines():       
        (name, pkgtype, platform, resource, url, opt1, opt2) = packageline_split(line)
        if name is None:
            continue
        if resource not in ['https', 'http', 'ftp', 'pypi']:
            continue
        if resource == "pypi":
            url = url.replace('\\','')
        elif resource in ["http", "https", "ftp"]:
            url = "".join((resource,":",url))

        print "freezing ", name, pkgtype, platform, resource, url, opt1, opt2, " as ", _frozenname(resource, url)
        _transfer_to_fridge(resource, url, refill_behavior)