2013-02-10 15 views
7

mam sprawdzanie ten kod dostarczony przez python_apt ale wydaje się być nieco przestarzały:Jak sprawdzić postęp commit() w python_apt za pomocą klasy apt.progress?

https://github.com/jolicloud/python-apt/blob/master/doc/examples/inst.py

All I m próby zrobienia jest śledzić postęp sposobu commit(); obecnie, gdy zadzwonimy pod numer commit() i przekazujemy fprogress i iprogress, widzę na konsoli, że wszystkie pakiety w pkg_list są pobierane poprawnie, problem wydaje się pochodzić po tym.

Program kontynuuje wykonywanie i nie uruchamia się dpkg_status_change(), jak sądzę, powinien?

Nie mam pojęcia, czy instalacja wielu pakietów zakończyła się sukcesem?

import apt 
from apt.progress.base import InstallProgress 

    class InstallStatusUpdate(InstallProgress): 

      def conffile(self, current, new): 
       print "conffile prompt: %s %s" % (current, new) 

      def processing(self, pkg, stage): 
       print "Processing ", pkg, " stage: ", stage 

      def error(self, pkg, errormsg): 
       print "Package ", pkg, " error: ", errormsg 

      def finish_update(self): 
       print "Installation is complete" 

      def status_change(self, pkg, percent, status): 
       print "Package: ", pkg, " at ", percent, " -> ", status 

      def dpkg_status_change(self, pkg, status): 
       print "Package ", pkg, ", Status: ", status 



    def install_updates(self, pkg_list): 
      fprogress = apt.progress.TextFetchProgress() 
      iprogress = InstallStatusUpdate() 

      cache_tmp = apt.Cache() 
      cache_tmp.update() 
      cache_tmp.open(None) 

      for pkg in pkg_list: 
       try: 
        self.pkgname = cache_tmp[pkg.name] 
        if self.pkgname.is_installed and self.pkgname.is_upgradable: 
         self.pkgname.mark_upgrade() 
        else: 
         self.pkgname.mark_install() 
       except Exception as e: 
        print e.message 

      result = self.pkgname.commit(fprogress, iprogress) 
      #Maybe i'm doing something wrong here but result always = None... 

Odpowiedz

2

Podobno pracuje z python_aptcommit() jest ból, skończyło się za pomocą subprocess czekać na wszystko, aby zakończyć (jak powinno być) i analizować dane wyjściowe na końcu sprawdzić, czy paczka została istotnie zmodernizowane.

W _apt_update() i sprawdzić, czy system jest w trybie online przed przystąpieniem do apt-get update, a następnie postępuj zgodnie ze wskazówkami instalacji he pakietu przeszedł do _apt_install().

def _apt_update(self): 
     import urllib2 

     try: 
      response = urllib2.urlopen('http://74.125.113.99', timeout=1) 
      #We have internet access 
      subprocess.Popen(['apt-get', 'update']) 
      return True 
     except urllib2.URLError as err: pass 
     return False 

def _apt_install(self, pkg, update=True): 
     upgraded = 0 

     if update == True: 
      self._apt_update() 

     proc = subprocess.Popen(['apt-get', 'install', pkg, "-y"], stdout=subprocess.PIPE) 
     for line in proc.stdout: 
      if "upgraded" in line and "newly installed" in line and "to remove" in line: 
       values = line.split(",") 
       for pos in values: 
        key, value = pos.split(" ") 
        if value == "upgraded": 
         upgraded = int(key) 
        break 

     print "Upgraded OK (", upgraded, ")" 
     if upgraded > 0: 
      return True 
     else: 
      return False