示例#1
0
    def commit(self, changeset, pkgpaths):

        prog = iface.getProgress(self, True)
        prog.start()
        prog.setTopic(_("Committing transaction..."))
        prog.set(0, len(changeset))
        prog.show()

        # Compute upgrading/upgraded packages
        upgrading = {}
        upgraded = {}
        for pkg in changeset.keys():
            if changeset.get(pkg) is INSTALL:
                upgpkgs = [
                    upgpkg for prv in pkg.provides for upg in prv.upgradedby
                    for upgpkg in upg.packages if upgpkg.installed
                ]
                upgpkgs.extend([
                    prvpkg for upg in pkg.upgrades for prv in upg.providedby
                    for prvpkg in prv.packages if prvpkg.installed
                ])
                if upgpkgs:
                    for upgpkg in upgpkgs:
                        # If any upgraded package will stay in the system,
                        # this is not really an upgrade for rpm.
                        if changeset.get(upgpkg) is not REMOVE:
                            break
                    else:
                        upgrading[pkg] = True
                        for upgpkg in upgpkgs:
                            upgraded[upgpkg] = True
                            if upgpkg in changeset:
                                del changeset[upgpkg]

        # FIXME (20050321): Solaris rpm 4.1 hack
        if sys.platform[:5] == "sunos":
            rpm.addMacro("_dbPath", sysconf.get("rpm-root", "/"))
            ts = rpm.TransactionSet()
        else:
            ts = rpm.ts(sysconf.get("rpm-root", "/"))

        if not sysconf.get("rpm-check-signatures", False):
            ts.setVSFlags(rpm._RPMVSF_NOSIGNATURES)

        # Let's help RPM, since it doesn't do a good
        # ordering job on erasures.
        try:
            sorter = ChangeSetSorter(changeset)
            sorted = sorter.getSorted()
            forcerpmorder = False
        except LoopError:
            lines = [_("Found unbreakable loops:")]
            for path in sorter.getLoopPaths(sorter.getLoops()):
                path = [
                    "%s [%s]" % (pkg, op is INSTALL and "I" or "R")
                    for pkg, op in path
                ]
                lines.append("    " + " -> ".join(path))
            lines.append(_("Will ask RPM to order it."))
            iface.error("\n".join(lines))
            sys.exit(1)
            forcerpmorder = True
        del sorter

        packages = 0
        reinstall = False
        for pkg, op in sorted:
            if op is INSTALL:
                if pkg.installed:
                    reinstall = True
                loader = [x for x in pkg.loaders if not x.getInstalled()][0]
                info = loader.getInfo(pkg)
                mode = pkg in upgrading and "u" or "i"
                path = pkgpaths[pkg][0]
                fd = os.open(path, os.O_RDONLY)
                try:
                    h = ts.hdrFromFdno(fd)
                except rpm.error, e:
                    os.close(fd)
                    raise Error, "%s: %s" % (os.path.basename(path), e)
                os.close(fd)
                ts.addInstall(h, (info, path), mode)
                packages += 1
            else:
                loader = [x for x in pkg.loaders if x.getInstalled()][0]
                offset = pkg.loaders[loader]
                try:
                    ts.addErase(offset)
                except rpm.error, e:
                    raise Error, "%s-%s: %s" % \
                                 (pkg.name, pkg.version, unicode(e))
示例#2
0
    def commit(self, changeset, pkgpaths):

        prog = iface.getProgress(self, True)
        prog.start()
        prog.setTopic(_("Committing transaction..."))
        prog.set(0, len(changeset))
        prog.show()

        if rhnoptions.hasOption("admin") and \
            rhnoptions.getOption("admin"):
        adminfile = rhnoptions.getOption("admin")
    else:
            adminfile = sysconf.get("solaris-adminfile", "/var/sadm/install/admin/default")

        # Compute upgrade packages
        upgrade = {}
        for pkg in changeset.keys():
            if changeset.get(pkg) is INSTALL:
                upgpkgs = [upgpkg for prv in pkg.provides
                                  for upg in prv.upgradedby
                                  for upgpkg in upg.packages
                                  if upgpkg.installed]
                upgpkgs.extend([prvpkg for upg in pkg.upgrades
                                       for prv in upg.providedby
                                       for prvpkg in prv.packages
                                       if prvpkg.installed])
                if upgpkgs:
                    upgrade[pkg] = True
                    for upgpkg in upgpkgs:
                        if upgpkg in changeset:
                            del changeset[upgpkg]
        try:
            sorter = ChangeSetSorter(changeset)
            sorted = sorter.getSorted()
        except LoopError:
            lines = [_("Found unbreakable loops:")]
            for path in sorter.getLoopPaths(sorter.getLoops()):
                path = ["%s [%s]" % (pkg, op is INSTALL and "I" or "R")
                        for pkg, op in path]
                lines.append("    "+" -> ".join(path))
            iface.error("\n".join(lines))
            sys.exit(-1)
        del sorter

        for pkg, op in sorted:
            if op is INSTALL and pkg in upgrade:
                # Upgrading something
                prog.setSubTopic(pkg, _("Upgrading %s") % pkg.name)
                prog.setSub(pkg, 0, 1, 1)
                prog.show()
                path = pkgpaths[pkg][0]
                status, output = solupgrade(adminfile, path, pkg, prog)
                prog.setSubDone(pkg)
                prog.show()
                if status != 0:
                    iface.warning(_("Got status %d upgrading %s:") % (status, pkg))
                    iface.warning(output)
                else:
                    iface.debug(_("Upgrading %s:") % pkg)
                    iface.debug(output)
            elif op is INSTALL:
                # Normal install
                prog.setSubTopic(pkg, _("Installing %s") % pkg.name)
                prog.setSub(pkg, 0, 1, 1)
                prog.show()
                path = pkgpaths[pkg][0]

                status = 0
                output = ""
                try:
                    status, output = solinstall(adminfile, path, pkg, prog)
                except PatchaddException, pae:
                    # Solaris patch cluster installs are tolerant of failed
                    # patches, and we should be too.  Just warn the user and
                    # keep going.
                    iface.warning( \
                        _("\nWARNING:  Installation of patch %s failed.\n%s") \
                            % (pkg.name, str(pae)))

                prog.setSubDone(pkg)
                prog.show()
                if status != 0:
                    iface.warning(_("Got status %d installing %s:") % (status, pkg))
                    iface.warning(output)
                else:
                    iface.debug(_("Installing %s:") % pkg)
                    iface.debug(output)
            else:
                # Remove
                prog.setSubTopic(pkg, _("Removing %s") % pkg.name)
                prog.setSub(pkg, 0, 1, 1)
                prog.show()
                status, output = solremove(adminfile, pkg, prog)
                prog.setSubDone(pkg)
                prog.show()
                if status != 0:
                    iface.warning(_("Got status %d removing %s:") % (status, pkg))
                    iface.warning(output)
                else:
                    iface.debug(_("Removing %s:") % pkg)
                    iface.debug(output)
示例#3
0
    def commit(self, changeset, pkgpaths):

        prog = iface.getProgress(self, True)
        prog.start()
        prog.setTopic(_("Committing transaction..."))
        prog.set(0, len(changeset))
        prog.show()

        # Compute upgrading/upgraded packages
        upgrading = {}
        upgraded = {}
        for pkg in changeset.keys():
            if changeset.get(pkg) is INSTALL:
                upgpkgs = [upgpkg for prv in pkg.provides
                                  for upg in prv.upgradedby
                                  for upgpkg in upg.packages
                                  if upgpkg.installed]
                upgpkgs.extend([prvpkg for upg in pkg.upgrades
                                       for prv in upg.providedby
                                       for prvpkg in prv.packages
                                       if prvpkg.installed])
                if upgpkgs:
                    for upgpkg in upgpkgs:
                        # If any upgraded package will stay in the system,
                        # this is not really an upgrade for rpm.
                        if changeset.get(upgpkg) is not REMOVE:
                            break
                    else:
                        upgrading[pkg] = True
                        for upgpkg in upgpkgs:
                            upgraded[upgpkg] = True
                            if upgpkg in changeset:
                                del changeset[upgpkg]

        # FIXME (20050321): Solaris rpm 4.1 hack 
        if sys.platform[:5] == "sunos":
            rpm.addMacro("_dbPath", sysconf.get("rpm-root", "/"))
            ts = rpm.TransactionSet()
        else:
            ts = rpm.ts(sysconf.get("rpm-root", "/"))

        if not sysconf.get("rpm-check-signatures", False):
            ts.setVSFlags(rpm._RPMVSF_NOSIGNATURES)

        # Let's help RPM, since it doesn't do a good
        # ordering job on erasures.
        try:
            sorter = ChangeSetSorter(changeset)
            sorted = sorter.getSorted()
            forcerpmorder = False
        except LoopError:
            lines = [_("Found unbreakable loops:")]
            for path in sorter.getLoopPaths(sorter.getLoops()):
                path = ["%s [%s]" % (pkg, op is INSTALL and "I" or "R")
                        for pkg, op in path]
                lines.append("    "+" -> ".join(path))
            lines.append(_("Will ask RPM to order it."))
            iface.error("\n".join(lines))
            sys.exit(1)
            forcerpmorder = True
        del sorter

        packages = 0
        reinstall = False
        for pkg, op in sorted:
            if op is INSTALL:
                if pkg.installed:
                    reinstall = True
                loader = [x for x in pkg.loaders if not x.getInstalled()][0]
                info = loader.getInfo(pkg)
                mode = pkg in upgrading and "u" or "i"
                path = pkgpaths[pkg][0]
                fd = os.open(path, os.O_RDONLY)
                try:
                    h = ts.hdrFromFdno(fd)
                except rpm.error, e:
                    os.close(fd)
                    raise Error, "%s: %s" % (os.path.basename(path), e)
                os.close(fd)
                ts.addInstall(h, (info, path), mode)
                packages += 1
            else:
                loader = [x for x in pkg.loaders if x.getInstalled()][0]
                offset = pkg.loaders[loader]
                try:
                    ts.addErase(offset)
                except rpm.error, e:
                    raise Error, "%s-%s: %s" % \
                                 (pkg.name, pkg.version, unicode(e))
示例#4
0
文件: pm.py 项目: T-D-Oe/spacewalk
    def commit(self, changeset, pkgpaths):

        prog = iface.getProgress(self, True)
        prog.start()
        prog.setTopic(_("Committing transaction..."))
        prog.set(0, len(changeset))
        prog.show()

        if rhnoptions.hasOption("admin") and \
            rhnoptions.getOption("admin"):
		adminfile = rhnoptions.getOption("admin")
	else:
            adminfile = sysconf.get("solaris-adminfile", "/var/sadm/install/admin/default")

        # Compute upgrade packages
        upgrade = {}
        for pkg in changeset.keys():
            if changeset.get(pkg) is INSTALL:
                upgpkgs = [upgpkg for prv in pkg.provides
                                  for upg in prv.upgradedby
                                  for upgpkg in upg.packages
                                  if upgpkg.installed]
                upgpkgs.extend([prvpkg for upg in pkg.upgrades
                                       for prv in upg.providedby
                                       for prvpkg in prv.packages
                                       if prvpkg.installed])
                if upgpkgs:
                    upgrade[pkg] = True
                    for upgpkg in upgpkgs:
                        if upgpkg in changeset:
                            del changeset[upgpkg]
        try:
            sorter = ChangeSetSorter(changeset)
            sorted = sorter.getSorted()
        except LoopError:
            lines = [_("Found unbreakable loops:")]
            for path in sorter.getLoopPaths(sorter.getLoops()):
                path = ["%s [%s]" % (pkg, op is INSTALL and "I" or "R")
                        for pkg, op in path]
                lines.append("    "+" -> ".join(path))
            iface.error("\n".join(lines))
            sys.exit(-1)
        del sorter

        for pkg, op in sorted:
            if op is INSTALL and pkg in upgrade:
                # Upgrading something
                prog.setSubTopic(pkg, _("Upgrading %s") % pkg.name)
                prog.setSub(pkg, 0, 1, 1)
                prog.show()
                path = pkgpaths[pkg][0]
                status, output = solupgrade(adminfile, path, pkg, prog)
                prog.setSubDone(pkg)
                prog.show()
                if status != 0:
                    iface.warning(_("Got status %d upgrading %s:") % (status, pkg))
                    iface.warning(output)
                else:
                    iface.debug(_("Upgrading %s:") % pkg)
                    iface.debug(output)
            elif op is INSTALL:
                # Normal install
                prog.setSubTopic(pkg, _("Installing %s") % pkg.name)
                prog.setSub(pkg, 0, 1, 1)
                prog.show()
                path = pkgpaths[pkg][0]

                status = 0
                output = ""
                try:
                    status, output = solinstall(adminfile, path, pkg, prog)
                except PatchaddException, pae:
                    # Solaris patch cluster installs are tolerant of failed
                    # patches, and we should be too.  Just warn the user and
                    # keep going.
                    iface.warning( \
                        _("\nWARNING:  Installation of patch %s failed.\n%s") \
                            % (pkg.name, str(pae)))

                prog.setSubDone(pkg)
                prog.show()
                if status != 0:
                    iface.warning(_("Got status %d installing %s:") % (status, pkg))
                    iface.warning(output)
                else:
                    iface.debug(_("Installing %s:") % pkg)
                    iface.debug(output)
            else:
                # Remove
                prog.setSubTopic(pkg, _("Removing %s") % pkg.name)
                prog.setSub(pkg, 0, 1, 1)
                prog.show()
                status, output = solremove(adminfile, pkg, prog)
                prog.setSubDone(pkg)
                prog.show()
                if status != 0:
                    iface.warning(_("Got status %d removing %s:") % (status, pkg))
                    iface.warning(output)
                else:
                    iface.debug(_("Removing %s:") % pkg)
                    iface.debug(output)
示例#5
0
        if rpmlogfile is not None:
            try:
                rpmlog = open(rpmlogfile, 'w')
                rpm.setLogFile(rpmlog)
            except (IOError, OSError), e:
                raise Error, "%s: %s" % (rpmlogfile, unicode(e))

        # Let's help RPM, since it doesn't do a good
        # ordering job on erasures.
        try:
            sorter = ChangeSetSorter(changeset)
            sorted = sorter.getSorted()
            forcerpmorder = False
        except LoopError:
            lines = [_("Found unbreakable loops:")]
            for path in sorter.getLoopPaths(sorter.getLoops()):
                path = [
                    "%s [%s]" % (pkg, op is INSTALL and "I" or "R")
                    for pkg, op in path
                ]
                lines.append("    " + " -> ".join(path))
            lines.append(_("Will ask RPM to order it."))
            iface.error("\n".join(lines))
            sorted = [(pkg, changeset[pkg]) for pkg in changeset]
            forcerpmorder = True
        del sorter

        packages = 0
        reinstall = False
        for pkg, op in sorted:
            if op is INSTALL:
示例#6
0
文件: pm.py 项目: KortanZ/linux
        if rpmlogfile is not None:
            try:
                rpmlog = open(rpmlogfile, 'w')
                rpm.setLogFile(rpmlog)
            except (IOError, OSError), e:
                raise Error, "%s: %s" % (rpmlogfile, unicode(e))

        # Let's help RPM, since it doesn't do a good
        # ordering job on erasures.
        try:
            sorter = ChangeSetSorter(changeset)
            sorted = sorter.getSorted()
            forcerpmorder = False
        except LoopError:
            lines = [_("Found unbreakable loops:")]
            for path in sorter.getLoopPaths(sorter.getLoops()):
                path = ["%s [%s]" % (pkg, op is INSTALL and "I" or "R")
                        for pkg, op in path]
                lines.append("    "+" -> ".join(path))
            lines.append(_("Will ask RPM to order it."))
            iface.error("\n".join(lines))
            sorted = [(pkg, changeset[pkg]) for pkg in changeset]
            forcerpmorder = True
        del sorter

        packages = 0
        reinstall = False
        for pkg, op in sorted:
            if op is INSTALL:
                if pkg.installed:
                    reinstall = True