From f10bdbf49484f7a652f2378ecee720d5eaa1a21b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bahad=C4=B1r=20Kandemir?= Date: Wed, 16 Jan 2008 13:35:49 +0000 Subject: [PATCH] ComarDBus patch --- comar-dbus.patch | 193 +++++++++++++++++++++++++++++++++++++++++++++ pisi/comariface.py | 136 +++++++++++++++++--------------- 2 files changed, 266 insertions(+), 63 deletions(-) create mode 100644 comar-dbus.patch diff --git a/comar-dbus.patch b/comar-dbus.patch new file mode 100644 index 00000000..dca4dff4 --- /dev/null +++ b/comar-dbus.patch @@ -0,0 +1,193 @@ +Index: comariface.py +=================================================================== +--- comariface.py (revision 16677) ++++ comariface.py (working copy) +@@ -25,91 +25,87 @@ + pass + + try: +- import comar ++ import dbus + except ImportError: +- raise Error(_("comar package is not fully installed")) ++ raise Error(_("dbus-python package is not fully installed")) + +-def get_comar(): +- """Connect to the comar daemon and return the handle""" ++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.""" + ++ """ + 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 + # active in a reasonable time. + timeout = 7 + while timeout > 0: + try: +- com = comar.Link(sockname) +- return com +- except comar.CannotConnect: ++ 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: + pass + time.sleep(0.2) + timeout -= 0.2 +- raise Error(_("cannot connect to comar")) ++ raise Error(_("cannot connect to dbus")) + +-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 +- com = get_comar() ++ sys_iface = get_iface() ++ object_name = make_object_path(package_name) + + for script in provided_scripts: + ctx.ui.debug(_("Registering %s comar script") % script.om) + if script.om == "System.Package": + self_post = True +- com.register(script.om, package_name, os.path.join(scriptpath, script.script)) +- wait_for_result(com) ++ try: ++ sys_iface.register(object_name, script.om, os.path.join(scriptpath, script.script)) ++ except dbus.DBusException, exception: ++ raise Error, _("Script error: %s") % exception + + ctx.ui.debug(_("Calling post install handlers")) +- com.call("System.PackageHandler.setupPackage", [ "metapath", metapath, "filepath", filepath ]) +- wait_for_result(com) ++ 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 + + if self_post: + args = { +@@ -119,23 +115,37 @@ + "toRelease": toRelease, + } + ctx.ui.debug(_("Running package's post install script")) +- com.call_package("System.Package.postInstall", package_name, args) +- wait_for_result(com, package_name) ++ try: ++ iface = get_iface(object_name, "System.Package") ++ iface.postInstall(fromVersion, toVersion, fromRelease, toRelease) ++ except dbus.DBusException, exception: ++ raise Error, _("Script error: %s") % exception + + def pre_remove(package_name, metapath, filepath): + """Do package's pre removal operations""" + + ctx.ui.info(_("Configuring %s package for removal") % package_name) +- com = get_comar() ++ sys_iface = get_iface() ++ object_name = make_object_path(package_name) + +- ctx.ui.debug(_("Running package's pre remove script")) +- com.call_package("System.Package.preRemove", package_name) +- wait_for_result(com) ++ 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(_("Calling pre remove handlers")) +- com.call("System.PackageHandler.cleanupPackage", [ "metapath", metapath, "filepath", filepath ]) +- wait_for_result(com) ++ 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 + + ctx.ui.debug(_("Unregistering comar scripts")) +- com.remove(package_name) +- wait_for_result(com) ++ try: ++ sys_iface.remove(object_name) ++ except dbus.DBusException, exception: ++ raise Error, _("Script error: %s") % exception diff --git a/pisi/comariface.py b/pisi/comariface.py index 09efd28a..3ae2ee7f 100644 --- a/pisi/comariface.py +++ b/pisi/comariface.py @@ -25,19 +25,46 @@ class Error(pisi.Error): pass try: - import comar + import dbus except ImportError: - raise Error(_("comar package is not fully installed")) + raise Error(_("dbus-python package is not fully installed")) -def get_comar(): - """Connect to the comar daemon and return the handle""" +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.""" + """ 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 @@ -45,71 +72,40 @@ def get_comar(): timeout = 7 while timeout > 0: try: - com = comar.Link(sockname) - return com - except comar.CannotConnect: + 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: pass time.sleep(0.2) timeout -= 0.2 - 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") + raise Error(_("cannot connect to dbus")) 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 - com = get_comar() + sys_iface = get_iface() + object_name = make_object_path(package_name) for script in provided_scripts: ctx.ui.debug(_("Registering %s comar script") % script.om) if script.om == "System.Package": self_post = True - com.register(script.om, package_name, os.path.join(scriptpath, script.script)) - wait_for_result(com) + try: + sys_iface.register(object_name, script.om, os.path.join(scriptpath, script.script)) + except dbus.DBusException, exception: + raise Error, _("Script error: %s") % exception ctx.ui.debug(_("Calling post install handlers")) - com.call("System.PackageHandler.setupPackage", [ "metapath", metapath, "filepath", filepath ]) - wait_for_result(com) + 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 if self_post: args = { @@ -119,23 +115,37 @@ def post_install(package_name, provided_scripts, scriptpath, metapath, filepath, "toRelease": toRelease, } ctx.ui.debug(_("Running package's post install script")) - com.call_package("System.Package.postInstall", package_name, args) - wait_for_result(com, package_name) + try: + iface = get_iface(object_name, "System.Package") + iface.postInstall(fromVersion, toVersion, fromRelease, toRelease) + except dbus.DBusException, exception: + raise Error, _("Script error: %s") % exception def pre_remove(package_name, metapath, filepath): """Do package's pre removal operations""" ctx.ui.info(_("Configuring %s package for removal") % package_name) - com = get_comar() + sys_iface = get_iface() + object_name = make_object_path(package_name) - ctx.ui.debug(_("Running package's pre remove script")) - com.call_package("System.Package.preRemove", package_name) - wait_for_result(com) + 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(_("Calling pre remove handlers")) - com.call("System.PackageHandler.cleanupPackage", [ "metapath", metapath, "filepath", filepath ]) - wait_for_result(com) + 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 ctx.ui.debug(_("Unregistering comar scripts")) - com.remove(package_name) - wait_for_result(com) + try: + sys_iface.remove(object_name) + except dbus.DBusException, exception: + raise Error, _("Script error: %s") % exception