do not use python-apt
This commit is contained in:
parent
31e04306b1
commit
6b424dfdf0
@ -4,8 +4,7 @@ import subprocess
|
|||||||
import selectors
|
import selectors
|
||||||
import html
|
import html
|
||||||
import gi
|
import gi
|
||||||
import apt
|
import os
|
||||||
import apt.progress
|
|
||||||
|
|
||||||
gi.require_version('Gtk', '3.0')
|
gi.require_version('Gtk', '3.0')
|
||||||
gi.require_version('Gdk', '3.0')
|
gi.require_version('Gdk', '3.0')
|
||||||
@ -21,75 +20,6 @@ except ImportError:
|
|||||||
print("ERROR: Could not import Gtk")
|
print("ERROR: Could not import Gtk")
|
||||||
|
|
||||||
|
|
||||||
class AptFetchProgress(apt.progress.base.AcquireProgress):
|
|
||||||
def __init__(self, update_window):
|
|
||||||
super().__init__()
|
|
||||||
self.update_window = update_window
|
|
||||||
|
|
||||||
def done(self, item):
|
|
||||||
super().done(item)
|
|
||||||
self.update_window.append("Done fetching package updates.")
|
|
||||||
|
|
||||||
def fail(self, item):
|
|
||||||
super().fail(item)
|
|
||||||
self.update_window.append(
|
|
||||||
"ERROR: The following item could not be downloaded: %s" % item.uri)
|
|
||||||
|
|
||||||
def fetch(self, item):
|
|
||||||
super().fetch(item)
|
|
||||||
self.update_window.append(
|
|
||||||
"INFO: The following item was downloaded: %s" % item.uri)
|
|
||||||
|
|
||||||
def ims_hit(self, item):
|
|
||||||
super().ims_hit(item)
|
|
||||||
self.update_window.append(
|
|
||||||
"INFO: The following item was found in the cache: %s" % item.uri)
|
|
||||||
|
|
||||||
def media_change(self, str, drive):
|
|
||||||
super().media_change(str, drive)
|
|
||||||
self.update_window.append(
|
|
||||||
"ERROR: Media changes are not supported (str=%s, drive=%s)" %
|
|
||||||
(str, drive))
|
|
||||||
return False
|
|
||||||
|
|
||||||
def pulse(self, owner):
|
|
||||||
super().pulse(owner)
|
|
||||||
return True
|
|
||||||
|
|
||||||
|
|
||||||
class AptInstallProgress(apt.progress.base.InstallProgress):
|
|
||||||
def __init__(self, update_window):
|
|
||||||
super().__init__()
|
|
||||||
self.update_window = update_window
|
|
||||||
self.count = 0
|
|
||||||
|
|
||||||
def conffile(self, current, new):
|
|
||||||
super().conffile(current, new)
|
|
||||||
self.update_window.append_mesg(
|
|
||||||
"WARNING",
|
|
||||||
"The following configuration file was not modified: %s" %
|
|
||||||
current)
|
|
||||||
|
|
||||||
def error(self, pkg, errormsg):
|
|
||||||
super().error(pkg, errormsg)
|
|
||||||
self.update_window.append_mesg(
|
|
||||||
"ERROR",
|
|
||||||
"Installation of package %s failed: %s" % (pkg, errormsg))
|
|
||||||
|
|
||||||
def processing(self, pkg, stage):
|
|
||||||
super().error(pkg, stage)
|
|
||||||
self.update_window.append_mesg(
|
|
||||||
"INFO",
|
|
||||||
"Processing package %s, stage %s" % (pkg, stage))
|
|
||||||
|
|
||||||
def dpkg_status_change(self, pkg, status):
|
|
||||||
super().dpkg_status_change(pkg, status)
|
|
||||||
print("dpkg_status_change: pkg=%s status=%s" % (pkg, status))
|
|
||||||
self.update_window.append_mesg(
|
|
||||||
"INFO",
|
|
||||||
"Package %s is now has status %s" % (pkg, status))
|
|
||||||
|
|
||||||
|
|
||||||
class UpdateWindow(Gtk.ApplicationWindow):
|
class UpdateWindow(Gtk.ApplicationWindow):
|
||||||
def clear(self):
|
def clear(self):
|
||||||
self.buffer.set_text("")
|
self.buffer.set_text("")
|
||||||
@ -146,9 +76,11 @@ class UpdateWindow(Gtk.ApplicationWindow):
|
|||||||
def insert(self, text, iter):
|
def insert(self, text, iter):
|
||||||
self.buffer.insert(iter, text + "\n")
|
self.buffer.insert(iter, text + "\n")
|
||||||
|
|
||||||
def run(self, args, ignore_stderr=False, output_msg=None, empty_msg=None):
|
def run(self, args, ignore_stderr=False, output_msg=None,
|
||||||
|
empty_msg=None, env={}):
|
||||||
p = subprocess.Popen(
|
p = subprocess.Popen(
|
||||||
args, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=False)
|
args, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=False,
|
||||||
|
env=dict(os.environ, **env))
|
||||||
|
|
||||||
sel = selectors.DefaultSelector()
|
sel = selectors.DefaultSelector()
|
||||||
sel.register(p.stdout, selectors.EVENT_READ)
|
sel.register(p.stdout, selectors.EVENT_READ)
|
||||||
@ -163,10 +95,10 @@ class UpdateWindow(Gtk.ApplicationWindow):
|
|||||||
|
|
||||||
if data:
|
if data:
|
||||||
if key.fileobj is p.stdout:
|
if key.fileobj is p.stdout:
|
||||||
self.append(data)
|
self.append_mesg("STDOUT", data)
|
||||||
output = True
|
output = True
|
||||||
elif not ignore_stderr:
|
elif not ignore_stderr:
|
||||||
self.append(data)
|
self.append_mesg("STDERR", data)
|
||||||
|
|
||||||
exit_code = p.poll()
|
exit_code = p.poll()
|
||||||
|
|
||||||
@ -181,23 +113,43 @@ class UpdateWindow(Gtk.ApplicationWindow):
|
|||||||
done = True
|
done = True
|
||||||
break
|
break
|
||||||
|
|
||||||
if not error:
|
if error:
|
||||||
|
return False
|
||||||
|
else:
|
||||||
if output:
|
if output:
|
||||||
if output_msg is not None:
|
if output_msg is not None:
|
||||||
self.prepend_mesg("INFO", output_msg)
|
self.prepend_mesg("INFO", output_msg)
|
||||||
elif empty_msg is not None:
|
elif empty_msg is not None:
|
||||||
self.append_mesg("INFO", empty_msg)
|
self.append_mesg("INFO", empty_msg)
|
||||||
|
|
||||||
|
return True
|
||||||
|
|
||||||
|
def lock(self):
|
||||||
|
self.update_button.set_sensitive(False)
|
||||||
|
self.upgrade_button.set_sensitive(False)
|
||||||
|
self.list_button.set_sensitive(False)
|
||||||
|
|
||||||
|
def unlock(self):
|
||||||
|
self.update_button.set_sensitive(True)
|
||||||
|
self.upgrade_button.set_sensitive(True)
|
||||||
|
self.list_button.set_sensitive(True)
|
||||||
|
|
||||||
def on_upgrade(self, *args):
|
def on_upgrade(self, *args):
|
||||||
self.cache.open(None)
|
self.clear()
|
||||||
self.cache.upgrade(True)
|
self.run(
|
||||||
self.cache.commit(AptFetchProgress(self), AptInstallProgress(self))
|
['/usr/bin/apt-get', '-y', 'full-upgrade'],
|
||||||
|
env={'DEBIAN_FRONTEND': 'noninteractive'})
|
||||||
|
self.append_mesg("INFO", "Upgrade done.")
|
||||||
|
|
||||||
def on_update(self, *args):
|
def on_update(self, *args):
|
||||||
self.cache.update()
|
self.clear()
|
||||||
|
self.run(
|
||||||
|
['/usr/bin/apt-get', '-y', 'update'],
|
||||||
|
env={'DEBIAN_FRONTEND': 'noninteractive'})
|
||||||
self.append_mesg("INFO", "The package cache was updated.")
|
self.append_mesg("INFO", "The package cache was updated.")
|
||||||
|
|
||||||
def on_list(self, *args):
|
def on_list(self, *args):
|
||||||
|
self.clear()
|
||||||
self.run(
|
self.run(
|
||||||
['/usr/bin/apt', '-qq', 'list', '--upgradable'],
|
['/usr/bin/apt', '-qq', 'list', '--upgradable'],
|
||||||
ignore_stderr=True,
|
ignore_stderr=True,
|
||||||
@ -208,7 +160,9 @@ class UpdateWindow(Gtk.ApplicationWindow):
|
|||||||
self.app.quit()
|
self.app.quit()
|
||||||
|
|
||||||
def __init__(self, app):
|
def __init__(self, app):
|
||||||
super(UpdateWindow, self).__init__(application=app, title="Simple APT Update")
|
super(UpdateWindow, self).__init__(
|
||||||
|
application=app,
|
||||||
|
title="Simple APT Update")
|
||||||
self.app = app
|
self.app = app
|
||||||
self.init_ui()
|
self.init_ui()
|
||||||
|
|
||||||
@ -255,19 +209,13 @@ class UpdateWindow(Gtk.ApplicationWindow):
|
|||||||
self.scrolledwindow.add(text_view)
|
self.scrolledwindow.add(text_view)
|
||||||
hbox.pack_start(self.scrolledwindow, True, True, 0)
|
hbox.pack_start(self.scrolledwindow, True, True, 0)
|
||||||
|
|
||||||
self.cache = apt.Cache()
|
|
||||||
self.cache.update()
|
|
||||||
self.append_mesg("INFO", "The package cache was updated.")
|
|
||||||
|
|
||||||
self.on_update()
|
|
||||||
self.clear()
|
|
||||||
self.on_list()
|
|
||||||
|
|
||||||
|
|
||||||
def on_activate(app):
|
def on_activate(app):
|
||||||
win = UpdateWindow(app)
|
win = UpdateWindow(app)
|
||||||
win.present()
|
win.present()
|
||||||
win.show_all()
|
win.show_all()
|
||||||
|
win.on_update()
|
||||||
|
win.on_list()
|
||||||
|
|
||||||
|
|
||||||
app = Gtk.Application(application_id='org.linuxfoo.SimpleAptUpdate')
|
app = Gtk.Application(application_id='org.linuxfoo.SimpleAptUpdate')
|
||||||
|
Loading…
Reference in New Issue
Block a user