Estou tentando trazer partes do processo "apt-get upgrade" em um Raspberry Pi para um LCD de 20x4 que é a tela principal do dispositivo em que estou trabalhando. Estou executando o Raspbian 9 "Stretch".
Minha interface do usuário é escrita em python e, portanto, estou usando o python-apt para fornecer a interface para que eu controle e obtenha o status dos processos apt e dpkg.
Eu obtive a maioria disto trabalhando em um simples código de prova de conceito, mas eu acertei um obstáculo com a classe "InstallProgress" e não obtive nenhum sucesso nas funções "processing" ou "dpkg_status_change". Estou implementando isso via subclasses.
A melhor documentação que encontrei foi aqui , mas estou presa . Quaisquer dicas seriam bem vindas. Obrigado!
Aqui está o meu código PoC:
class myProgress(apt.progress.base.AcquireProgress):
def done(self, oPkg):
print "Done with ", oPkg.description, " ", self.fetched_bytes, " of ", self.total_bytes
def fetch(self, oPkg):
print "Fetching ", oPkg.shortdesc
def start(self):
print "Starting fetch process."
def stop(self):
print "Completed fetch process."
class myInstall(apt.progress.base.InstallProgress):
def start_update(self):
print "Package Update is starting."
def finish_update(self):
print "Package Update is complete. ", str(self.percent), "% done."
def processing(self, pkg, stage):
print "Processing ", str(pkg), " at stage ", str(stage), "."
def dpkg_status_change(self, pkg, stage):
print "Dpkg processing ", str(pkg), " at stage ", str(stage), "."
oCache=apt.cache.Cache()
oAcqProgress = myProgress()
oInstProgress = myInstall()
oCache.update( oAcqProgress )
oCache.open(None)
oCache.clear()
oCache.upgrade(dist_upgrade=True)
if (oCache.dpkg_journal_dirty == True):
print "Dirty journal. Fix this first!"
if len(oCache.get_changes()) > 0:
print "Updates found."
for pkg in oCache.get_changes():
print pkg.name, pkg.is_upgradable, pkg.marked_upgrade
print str(oCache.install_count), " marked for install."
print str(humanize.naturalsize(oCache.required_download)), "bytes require download."
oCache.commit( oAcqProgress, oInstProgress )
Aqui está o meu exemplo de saída:
Starting fetch process.
Fetching Release.gpg
Done with http://mirror.rit.edu/debian stretch Release.gpg 0 of 1
Completed fetch process.
Updates found.
wget True True
1 marked for install.
799.7 kB bytes require download.
Starting fetch process.
Fetching wget
Done with http://mirror.rit.edu/debian stretch/main amd64 wget amd64 1.18-5+deb9u1 0 of 799710
Completed fetch process.
Package Update is starting.
Reading changelogs... Done
(Reading database ... 40636 files and directories currently installed.)
Preparing to unpack .../wget_1.18-5+deb9u1_amd64.deb ...
Unpacking wget (1.18-5+deb9u1) over (1.18-5) ...
Setting up wget (1.18-5+deb9u1) ...
Processing triggers for man-db (2.7.6.1-2) ...
Package Update is complete. 83.3333 % done.
* Observe que os resultados do dpkg (linhas 14 - 19) estão em seu formato normal de texto dpkg.
Tags apt python debian raspbian raspberry-pi