2013-02-10 8 views
7

Ich überprüfe diesen Code von python_apt vorgesehen, aber es scheint ein bisschen veraltet zu sein:Wie überprüft man den Fortschritt von commit() in python_apt mit der Klasse apt.progress?

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

Alles, was ich bin versucht, hier zu tun ist, um den Fortschritt der commit() Methode folgen; Derzeit, wenn wir commit() aufrufen und fprogress und iprogress übergeben, kann ich auf der Konsole sehen, dass alle Pakete in pkg_list korrekt heruntergeladen werden, scheint das Problem danach zu kommen.

Programm läuft weiter und es löst nicht dpkg_status_change(), wie ich glaube, sollte es?

Ich habe keine Möglichkeit zu wissen, ob die Installation mehrerer Pakete erfolgreich war?

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... 

Antwort

2

Offenbar mit python_aptcommit() ist ein Schmerz arbeiten, landete ich warte mit subprocess bis alles (wie es sein soll) zu beenden und die Ausgabe am Ende zu analysieren, um zu überprüfen, dass das Paket in der Tat aufgerüstet wurde.

In _apt_update() ich überprüfen, um sicherzustellen, dass das System online ist, bevor Sie eine apt-get update versucht, dann mit er die Installation der in zu _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 
bestanden Paket gehen