From f024367e89db95dafbcab9a56d4824c90e896b93 Mon Sep 17 00:00:00 2001 From: Faik Uygur Date: Thu, 27 Mar 2008 13:48:53 +0000 Subject: [PATCH] Not before a working Pardus 2008 system to develop pisi --- comar-dbus.patch | 289 +++++++++++++++++++++++++++++++++++++++ pisi/api.py | 25 ++-- pisi/atomicoperations.py | 2 +- pisi/comariface.py | 177 ++++++++++-------------- pisi/context.py | 3 +- pisi/fetcher.py | 2 +- 6 files changed, 379 insertions(+), 119 deletions(-) create mode 100644 comar-dbus.patch diff --git a/comar-dbus.patch b/comar-dbus.patch new file mode 100644 index 00000000..d5ecd633 --- /dev/null +++ b/comar-dbus.patch @@ -0,0 +1,289 @@ +Index: pisi/comariface.py +=================================================================== +--- pisi/comariface.py (revision 17303) ++++ pisi/comariface.py (working copy) +@@ -13,6 +13,7 @@ + import os + import time + import select ++import string + + import gettext + __trans = gettext.translation('pisi', fallback=True) +@@ -25,117 +26,147 @@ + 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.""" ++ return char in string.ascii_letters + string.digits + "_" ++ ++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, '_') ++ if object[0].isdigit(): ++ object = '_%s' % object ++ return object ++ ++def get_iface(package="", model=""): ++ """Connect to the DBus daemon and return the system interface.""" + +- sockname = "/var/run/comar.socket" ++ sockname = "unix:path=/var/run/dbus/system_bus_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 ++ # able to connect true dbus (and comar). ++ # (usually unix:path=/var/run/dbus/system_bus_socket) ++ if ctx.dbus_sockname: ++ sockname = ctx.dbus_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.bus.BusConnection(address_or_type=sockname) ++ obj = bus.get_object(ctx.comar_destination, obj_path, introspect=False) ++ 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_service = False ++ 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) ++ elif script.om == "System.Service": ++ sys_service = False ++ try: ++ sys_iface.register(object_name, script.om, os.path.join(scriptpath, script.script)) ++ except dbus.DBusException, exception: ++ raise Error, _("Script error: %s") % exception ++ if sys_service: ++ try: ++ iface = get_iface(object_name, "System.Service") ++ iface.registerState() ++ 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, timeout=300) ++ except dbus.DBusException, exception: ++ # Do nothing if setupPackage method is not defined in package script ++ if not (exception._dbus_error_name.startswith("tr.org.pardus.comar") and ++ exception._dbus_error_name.split('tr.org.pardus.comar.')[1] == 'python.missing'): ++ raise Error, _("Script error: %s") % exception + + if self_post: +- args = { +- "fromVersion": fromVersion, +- "fromRelease": fromRelease, +- "toVersion": toVersion, +- "toRelease": toRelease, +- } ++ if not fromVersion: ++ fromVersion = "" ++ if not fromRelease: ++ fromRelease = "" ++ + 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, fromRelease, toVersion, toRelease, timeout=300) ++ except dbus.DBusException, exception: ++ # Do nothing if postInstall method is not defined in package script ++ if not (exception._dbus_error_name.startswith("tr.org.pardus.comar") and ++ exception._dbus_error_name.split('tr.org.pardus.comar.')[1] == 'python.missing'): ++ raise Error, _("Script error: %s") % exception ++ ++ if package_name == 'comar': ++ pisi.api.set_comar_destination('tr.org.pardus.comar.new') + + 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(object_name, "System.Package") ++ try: ++ iface.preRemove(timeout=300) ++ except dbus.DBusException, exception: ++ # Do nothing if preRemove method is not defined in package script ++ if not (exception._dbus_error_name.startswith("tr.org.pardus.comar") and ++ exception._dbus_error_name.split('tr.org.pardus.comar.')[1] == 'python.missing'): ++ 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, timeout=300) ++ except dbus.DBusException, exception: ++ # Do nothing if cleanupPackage method is not defined in package script ++ if not (exception._dbus_error_name.startswith("tr.org.pardus.comar") and ++ exception._dbus_error_name.split('tr.org.pardus.comar.')[1] == 'python.missing'): ++ 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 +Index: pisi/api.py +=================================================================== +--- pisi/api.py (revision 17303) ++++ pisi/api.py (working copy) +@@ -72,13 +72,20 @@ + """ + ctx.comar = enable + +-def set_comar_sockname(sockname): ++def set_comar_destination(destination): + """ +- Set comar socket file ++ Set comar bus destination ++ @param destination: Path to bus destination of COMAR ++ """ ++ ctx.comar_destination = destination ++ ++def set_dbus_sockname(sockname): ++ """ ++ Set dbus socket file + Used by YALI +- @param sockname: Path to comar socket file ++ @param sockname: Path to dbus socket file + """ +- ctx.comar_sockname = sockname ++ ctx.dbus_sockname = sockname + + def set_options(options): + """ +Index: pisi/atomicoperations.py +=================================================================== +--- pisi/atomicoperations.py (revision 17303) ++++ pisi/atomicoperations.py (working copy) +@@ -152,7 +152,7 @@ + # check comar + if self.metadata.package.providesComar and ctx.comar: + import pisi.comariface as comariface +- comariface.get_comar() ++ comariface.get_iface() + + def check_relations(self): + # check dependencies +Index: pisi/context.py +=================================================================== +--- pisi/context.py (revision 17303) ++++ pisi/context.py (working copy) +@@ -38,7 +38,8 @@ + stderr = None + + comar = True +-comar_sockname = None ++comar_destination = "tr.org.pardus.comar" ++dbus_sockname = None + + # Bug #2879 + # FIXME: Maybe we can create a simple rollback mechanism. There are other diff --git a/pisi/api.py b/pisi/api.py index 8980d798..d0fddfd9 100644 --- a/pisi/api.py +++ b/pisi/api.py @@ -73,20 +73,13 @@ def set_comar(enable): """ ctx.comar = enable -def set_comar_destination(destination): +def set_comar_sockname(sockname): """ - Set comar bus destination - @param destination: Path to bus destination of COMAR - """ - ctx.comar_destination = destination - -def set_dbus_sockname(sockname): - """ - Set dbus socket file + Set comar socket file Used by YALI - @param sockname: Path to dbus socket file + @param sockname: Path to comar socket file """ - ctx.dbus_sockname = sockname + ctx.comar_sockname = sockname def set_options(options): """ @@ -246,6 +239,16 @@ def search_source(terms, lang=None, repo=None): sourcedb = pisi.db.sourcedb.SourceDB() return sourcedb.search_spec(terms, lang, repo) +def search_installed(terms, lang=None): + """ + Return a list of components that contains all the given terms either in its name, summary or + description -> list_of_strings + @param terms: a list of terms used to search components -> list_of_strings + @param lang: language of the summary and description + """ + installdb = pisi.db.installdb.InstallDB() + return installdb.search_package(terms, lang) + def search_component(terms, lang=None, repo=None): """ Return a list of components that contains all the given terms either in its name, summary or diff --git a/pisi/atomicoperations.py b/pisi/atomicoperations.py index f3874945..5dfaa37f 100644 --- a/pisi/atomicoperations.py +++ b/pisi/atomicoperations.py @@ -152,7 +152,7 @@ class Install(AtomicOperation): # check comar if self.metadata.package.providesComar and ctx.comar: import pisi.comariface as comariface - comariface.get_iface() + comariface.get_comar() def check_relations(self): # check dependencies diff --git a/pisi/comariface.py b/pisi/comariface.py index 160be280..09efd28a 100644 --- a/pisi/comariface.py +++ b/pisi/comariface.py @@ -13,7 +13,6 @@ import os import time import select -import string import gettext __trans = gettext.translation('pisi', fallback=True) @@ -26,43 +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.""" - return char in string.ascii_letters + string.digits + "_" - -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, '_') - if object[0].isdigit(): - object = '_%s' % object - 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/dbus/system_bus_socket" + 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 dbus (and comar). - # (usually /var/run/dbus/system_bus_socket) - if ctx.dbus_sockname: - sockname = ctx.dbus_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" + # able to connect true comar (usually /mnt/target/var/run/comar.socket). + if ctx.comar_sockname: + sockname = ctx.comar_sockname # This function is sometimes called when comar has recently started # or restarting after an update. So we give comar a chance to become @@ -70,103 +45,97 @@ def get_iface(package="", model=""): timeout = 7 while timeout > 0: try: - bus = dbus.bus.BusConnection(address_or_type="unix:path=%s" % sockname) - obj = bus.get_object(ctx.comar_destination, obj_path, introspect=False) - 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_service = 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 - elif script.om == "System.Service": - sys_service = False - try: - sys_iface.register(object_name, script.om, os.path.join(scriptpath, script.script)) - except dbus.DBusException, exception: - raise Error, _("Script error: %s") % exception - if sys_service: - try: - iface = get_iface(object_name, "System.Service") - iface.registerState() - 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, timeout=300) - except dbus.DBusException, exception: - # Do nothing if setupPackage method is not defined in package script - if not (exception._dbus_error_name.startswith("tr.org.pardus.comar") and - exception._dbus_error_name.split('tr.org.pardus.comar.')[1] == 'python.missing'): - raise Error, _("Script error: %s") % exception + com.call("System.PackageHandler.setupPackage", [ "metapath", metapath, "filepath", filepath ]) + wait_for_result(com) if self_post: - if not fromVersion: - fromVersion = "" - if not fromRelease: - fromRelease = "" - + args = { + "fromVersion": fromVersion, + "fromRelease": fromRelease, + "toVersion": toVersion, + "toRelease": toRelease, + } ctx.ui.debug(_("Running package's post install script")) - try: - iface = get_iface(object_name, "System.Package") - iface.postInstall(fromVersion, fromRelease, toVersion, toRelease, timeout=300) - except dbus.DBusException, exception: - # Do nothing if postInstall method is not defined in package script - if not (exception._dbus_error_name.startswith("tr.org.pardus.comar") and - exception._dbus_error_name.split('tr.org.pardus.comar.')[1] == 'python.missing'): - raise Error, _("Script error: %s") % exception - - if package_name == 'comar': - pisi.api.set_comar_destination('tr.org.pardus.comar.new') + 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(object_name, "System.Package") - try: - iface.preRemove(timeout=300) - except dbus.DBusException, exception: - # Do nothing if preRemove method is not defined in package script - if not (exception._dbus_error_name.startswith("tr.org.pardus.comar") and - exception._dbus_error_name.split('tr.org.pardus.comar.')[1] == 'python.missing'): - 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, timeout=300) - except dbus.DBusException, exception: - # Do nothing if cleanupPackage method is not defined in package script - if not (exception._dbus_error_name.startswith("tr.org.pardus.comar") and - exception._dbus_error_name.split('tr.org.pardus.comar.')[1] == 'python.missing'): - 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) diff --git a/pisi/context.py b/pisi/context.py index 4e146ad6..3da73019 100644 --- a/pisi/context.py +++ b/pisi/context.py @@ -38,8 +38,7 @@ stdout = None stderr = None comar = True -comar_destination = "tr.org.pardus.comar" -dbus_sockname = None +comar_sockname = None # Bug #2879 # FIXME: Maybe we can create a simple rollback mechanism. There are other diff --git a/pisi/fetcher.py b/pisi/fetcher.py index f39971ed..0834b9cf 100644 --- a/pisi/fetcher.py +++ b/pisi/fetcher.py @@ -170,7 +170,7 @@ class Fetcher: def _get_proxies(self): proxies = {} - + if ctx.config.values.general.http_proxy and self.url.scheme() == "http": proxies[pisi.uri.URI(ctx.config.values.general.http_proxy).scheme()] = ctx.config.values.general.http_proxy