From fa834f88b89f1d13a70988f83fdcecd3e573e98c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=2E=C3=87a=C4=9Flar=20Onur?= Date: Wed, 16 Jan 2008 13:36:32 +0000 Subject: [PATCH] revert --- pisi/comariface.py | 136 +++++++++++++++++++++------------------------ 1 file changed, 63 insertions(+), 73 deletions(-) diff --git a/pisi/comariface.py b/pisi/comariface.py index 3ae2ee7f..09efd28a 100644 --- a/pisi/comariface.py +++ b/pisi/comariface.py @@ -25,46 +25,19 @@ class Error(pisi.Error): pass try: - import dbus + import comar except ImportError: - raise Error(_("dbus-python package is not fully installed")) + raise Error(_("comar package is not fully installed")) -def is_char_valid(char): - """Test if char is valid object path character.""" - char = ord(char) - return (char in xrange(65, 91) or - char in xrange(97, 123) or - char in xrange(48, 58) or - char == '_') - -def make_object_path(package): - """Generates DBus object name from package name.""" - object = package - for char in package: - if not is_char_valid(char): - object = object.replace(char, '_') - return object - -def get_iface(package="", model=""): - """Connect to the DBus daemon and return the system interface.""" +def get_comar(): + """Connect to the comar daemon and return the handle""" - """ sockname = "/var/run/comar.socket" # YALI starts comar chrooted in the install target, but uses PiSi outside of # the chroot environment, so PiSi needs to use a different socket path to be # able to connect true comar (usually /mnt/target/var/run/comar.socket). if ctx.comar_sockname: sockname = ctx.comar_sockname - """ - - if package: - obj_path = "/package/%s" % package - else: - obj_path = "/" - if model: - obj_interface = "tr.org.pardus.comar.%s" % model - else: - obj_interface = "tr.org.pardus.comar" # This function is sometimes called when comar has recently started # or restarting after an update. So we give comar a chance to become @@ -72,40 +45,71 @@ def get_iface(package="", model=""): timeout = 7 while timeout > 0: try: - bus = dbus.SystemBus() - obj = bus.get_object("tr.org.pardus.comar", obj_path) - iface = dbus.Interface(obj, dbus_interface=obj_interface) - return iface - except dbus.DBusException: + com = comar.Link(sockname) + return com + except comar.CannotConnect: pass time.sleep(0.2) timeout -= 0.2 - raise Error(_("cannot connect to dbus")) + raise Error(_("cannot connect to comar")) + +def wait_for_result(com, package_name=None): + multiple = False + while True: + try: + reply = com.read_cmd() + except select.error: + if ctx.keyboard_interrupt_pending(): + return + raise + except comar.LinkClosed: + # Comar postInstall does a "service comar restart" which cuts + # our precious communication link, so we waitsss + if package_name == "comar": + try: + get_comar() + except Error: + raise Error, _("Could not restart comar") + return + else: + if ctx.keyboard_interrupt_pending(): + return + raise Error, _("connection with comar unexpectedly closed") + + cmd = reply[0] + if cmd == com.RESULT and not multiple: + return + elif cmd == com.NONE and not multiple: + # no post/pre function, that is ok + return + elif cmd == com.RESULT_START: + multiple = True + elif cmd == com.RESULT_END: + return + elif cmd == com.FAIL: + raise Error, _("Configuration error: %s") % reply[2] + elif cmd == com.ERROR: + raise Error, _("Script error: %s") % reply[2] + elif cmd == com.DENIED: + raise Error, _("comar denied our access") def post_install(package_name, provided_scripts, scriptpath, metapath, filepath, fromVersion, fromRelease, toVersion, toRelease): """Do package's post install operations""" ctx.ui.info(_("Configuring %s package") % package_name) self_post = False - sys_iface = get_iface() - object_name = make_object_path(package_name) + com = get_comar() for script in provided_scripts: ctx.ui.debug(_("Registering %s comar script") % script.om) if script.om == "System.Package": self_post = True - try: - sys_iface.register(object_name, script.om, os.path.join(scriptpath, script.script)) - except dbus.DBusException, exception: - raise Error, _("Script error: %s") % exception + com.register(script.om, package_name, os.path.join(scriptpath, script.script)) + wait_for_result(com) ctx.ui.debug(_("Calling post install handlers")) - for handler in sys_iface.listModelApplications("System.PackageHandler"): - iface = get_iface(handler, "System.PackageHandler") - try: - iface.setupPackage(metapath, filepath) - except dbus.DBusException, exception: - raise Error, _("Script error: %s") % exception + com.call("System.PackageHandler.setupPackage", [ "metapath", metapath, "filepath", filepath ]) + wait_for_result(com) if self_post: args = { @@ -115,37 +119,23 @@ def post_install(package_name, provided_scripts, scriptpath, metapath, filepath, "toRelease": toRelease, } ctx.ui.debug(_("Running package's post install script")) - try: - iface = get_iface(object_name, "System.Package") - iface.postInstall(fromVersion, toVersion, fromRelease, toRelease) - except dbus.DBusException, exception: - raise Error, _("Script error: %s") % exception + com.call_package("System.Package.postInstall", package_name, args) + wait_for_result(com, package_name) def pre_remove(package_name, metapath, filepath): """Do package's pre removal operations""" ctx.ui.info(_("Configuring %s package for removal") % package_name) - sys_iface = get_iface() - object_name = make_object_path(package_name) + com = get_comar() - if "System.Package" in sys_iface.listApplicationModels(object_name): - ctx.ui.debug(_("Running package's pre remove script")) - iface = get_iface(handler_application, "System.PackageHandler") - try: - iface.preRemove() - except dbus.DBusException, exception: - raise Error, _("Script error: %s") % exception + ctx.ui.debug(_("Running package's pre remove script")) + com.call_package("System.Package.preRemove", package_name) + wait_for_result(com) ctx.ui.debug(_("Calling pre remove handlers")) - for handler in sys_iface.listModelApplications("System.PackageHandler"): - iface = get_iface(handler, "System.PackageHandler") - try: - iface.cleanupPackage(metapath, filepath) - except dbus.DBusException, exception: - raise Error, _("Script error: %s") % exception + com.call("System.PackageHandler.cleanupPackage", [ "metapath", metapath, "filepath", filepath ]) + wait_for_result(com) ctx.ui.debug(_("Unregistering comar scripts")) - try: - sys_iface.remove(object_name) - except dbus.DBusException, exception: - raise Error, _("Script error: %s") % exception + com.remove(package_name) + wait_for_result(com)