Subject: Re: [vserver] VServer on ARM / Fedora 13 - IT WORKS! :-D
From: Gordan Bobic <gordan@bobich.net>
Date: Thu, 24 Mar 2011 14:17:01 +0000
Thu, 24 Mar 2011 14:17:01 +0000
Gordan Bobic wrote:
> I know my past posts on the subject haven't met much in terms of 
> responses, but I thought I'd post this anyway.
> 
> As of version dietlibc-0.33-0.1600.20110311.fc16, dietlibc now builds 
> cleanly on ARM, and util-vserver-0.30.216-0.pre2955 builds cleanly 
> against it on ARM. Prior to the mentioned version of dietlibc, 
> util-vserver didn't build against it correctly on ARM and had to be 
> built against glibc, which was problematic.
> 
> I am currently running 2.6.36.2-vs2.3.0.36.38.2 on F13 (with F13 guests) 
> on ARM with dietlibc-0.33-0.1600.20110311.fc16 and 
> util-vserver-0.30.216-0.pre2955, and as far as I can tell, everything 
> works perfectly.

Almost forgot - here's the yum patch against yum-3.2.27-4.fc13. It's 
based on the el6 patch, but that didn't apply cleanly (it looks like the 
F13 yum is slightly more up to date and more cleaned up so some of the 
hunks are redundant). It works for me, but if somebody could verify that 
it is OK, it would be appreciated.

Gordan


Patch for yum-3.2.27-14.el6_0.1

diff --git a/cli.py b/cli.py
index cebbae3..cdb0129 100644
--- a/cli.py
+++ b/cli.py
@@ -1347,13 +1347,14 @@ class YumOptionParser(OptionParser):
     def getRoot(self,opts):
         # If the conf file is inside the  installroot - use that.
         # otherwise look for it in the normal root
+        if opts.conffile==None:
+            opts.conffile = '/etc/yum/yum.conf'
+            if opts.installroot:
+                if os.access(opts.installroot+opts.conffile, os.R_OK):
+                    opts.conffile = opts.installroot+opts.conffile
+                elif os.access(opts.installroot+'/etc/yum.conf', os.R_OK):
+                    opts.conffile = opts.installroot+'/etc/yum.conf'
         if opts.installroot:
-            if os.access(opts.installroot+'/'+opts.conffile, os.R_OK):
-                opts.conffile = opts.installroot+'/'+opts.conffile
-            elif opts.conffile == '/etc/yum/yum.conf':
-                # check if /installroot/etc/yum.conf exists.
-                if os.access(opts.installroot+'/etc/yum.conf', os.R_OK):
-                    opts.conffile = opts.installroot+'/etc/yum.conf'         
             root=opts.installroot
         else:
             root = '/'
@@ -1394,7 +1395,6 @@ class YumOptionParser(OptionParser):
                 action="store_true",
                 help=_("run entirely from system cache, don't update cache"))
         group.add_option("-c", "--config", dest="conffile",
-                default='/etc/yum/yum.conf',
                 help=_("config file location"), metavar='[config file]')
         group.add_option("-R", "--randomwait", dest="sleeptime", type='int',
                 default=None,
diff --git a/yum/__init__.py b/yum/__init__.py
index 978815d..916c8d6 100644
--- a/yum/__init__.py
+++ b/yum/__init__.py
@@ -399,8 +399,7 @@ class YumBase(depsolve.Depsolve):
             # this check makes sure that our dirs exist properly.
             # if they aren't in the installroot then don't prepend the installroot
path
             # if we don't do this then anaconda likes to not  work.
-            if os.path.exists(self.conf.installroot+'/'+reposdir):
-                reposdir = self.conf.installroot + '/' + reposdir
+            reposdir = self.conf.getRootedPath(reposdir)
 
             if os.path.isdir(reposdir):
                 for repofn in sorted(glob.glob('%s/*.repo' % reposdir)):
@@ -1379,9 +1378,7 @@ class YumBase(depsolve.Depsolve):
         if self.conf.uid != 0:
             return
             
-        root = self.conf.installroot
-        lockfile = root + '/' + lockfile # lock in the chroot
-        lockfile = os.path.normpath(lockfile) # get rid of silly preceding extra /
+        lockfile = self.conf.lockfile
         
         mypid=str(os.getpid())    
         while not self._lock(lockfile, mypid, 0644):
diff --git a/yum/config.py b/yum/config.py
index 975172a..603aacc 100644
--- a/yum/config.py
+++ b/yum/config.py
@@ -604,6 +604,26 @@ class StartupConf(BaseConfig):
     syslog_facility = Option('LOG_DAEMON')
     persistdir = Option('/var/lib/yum')
     
+    def getRootedPath(self, path, enforce_default=False, defaults_to_host=False):
+        instroot = getattr(self, 'installroot', None)
+        if instroot==None:
+            return path
+
+        if   path.startswith('hostfs://'):   res = path[9:]
+        elif path.startswith('chrootfs://'): res = instroot + '/' + path[11:]
+        else:
+            tmp = instroot + '/' + path
+
+            if enforce_default:
+                if defaults_to_host:    res = path
+                else:                   res = tmp
+            else:
+                if os.path.exists(tmp): res = tmp
+                elif defaults_to_host:  res = path
+                else:                   res = tmp
+
+        return res
+
 class YumConf(StartupConf):
     '''
     Configuration option definitions for yum.conf\'s [main] section.
@@ -617,6 +637,7 @@ class YumConf(StartupConf):
 
     keepcache = BoolOption(True)
     logfile = Option('/var/log/yum.log')
+    lockfile = Option('/var/run/yum.pid')
     reposdir = ListOption(['/etc/yum/repos.d', '/etc/yum.repos.d'])
 
     commands = ListOption()
@@ -832,7 +853,10 @@ def readStartupConfig(configfile, root):
     # Stuff this here to avoid later re-parsing
     startupconf._parser = parser
     # setup the release ver here
-    startupconf.releasever = _getsysver(startupconf.installroot, startupconf.distroverpkg)
+    try:
+        startupconf.releasever = _getsysver(startupconf.installroot, startupconf.distroverpkg)
+    except:
+        startupconf.releasever = ""
     uuidfile = '%s/%s/uuid' % (startupconf.installroot, startupconf.persistdir)
     startupconf.uuid = get_uuid(uuidfile)
 
@@ -859,9 +883,9 @@ def readMainConfig(startupconf):
     yumconf.populate(startupconf._parser, 'main')
 
     # Apply the installroot to directory options
-    for option in ('cachedir', 'logfile', 'persistdir'):
+    for option in ('cachedir', 'logfile', 'persistdir', 'lockfile'):
         path = getattr(yumconf, option)
-        ir_path = yumconf.installroot + path
+        ir_path = yumconf.getRootedPath(path)
         ir_path = ir_path.replace('//', '/') # os.path.normpath won't fix this and
                                              # it annoys me
         ir_path = varReplace(ir_path, yumvars)
diff --git a/yum/history.py b/yum/history.py
index 32eed2c..64b6695 100644
--- a/yum/history.py
+++ b/yum/history.py
@@ -176,10 +176,7 @@ class YumHistory:
         self._conn = None
         
         self.conf = yum.misc.GenericHolder()
-        if not os.path.normpath(db_path).startswith(root):
-            self.conf.db_path  = os.path.normpath(root + '/' + db_path)
-        else:
-            self.conf.db_path = os.path.normpath('/' + db_path)
+        self.conf.db_path  = db_path
         self.conf.writable = False
 
         if not os.path.exists(self.conf.db_path):
diff --git a/yum/rpmsack.py b/yum/rpmsack.py
index 878e8d4..1938f1a 100644
--- a/yum/rpmsack.py
+++ b/yum/rpmsack.py
@@ -151,13 +151,8 @@ class RPMDBPackageSack(PackageSackBase):
         self._get_pro_cache = {}
         self._get_req_cache  = {}
         self._loaded_gpg_keys = False
-        if cachedir is None:
-            cachedir = misc.getCacheDir()
-        self.setCacheDir(cachedir)
-        if not os.path.normpath(persistdir).startswith(self.root):
-            self._persistdir = root +  '/' + persistdir
-        else:
-            self._persistdir = persistdir
+        self._cachedir = persistdir + "/rpmdb-indexes"
+        self._persistdir = persistdir
         self._have_cached_rpmdbv_data = None
         self._cached_conflicts_data = None
         # Store the result of what happens, if a transaction completes.
@@ -217,14 +212,6 @@ class RPMDBPackageSack(PackageSackBase):
         self._have_cached_rpmdbv_data = None
         self._cached_conflicts_data = None
 
-    def setCacheDir(self, cachedir):
-        """ Sets the internal cachedir value for the rpmdb, to be the
-            "installed" directory from this parent. """
-        if not os.path.normpath(cachedir).startswith(self.root):
-            self._cachedir = self.root + '/' + cachedir + "/installed/"
-        else:
-            self._cachedir = '/' + cachedir + "/installed/"
-
     def readOnlyTS(self):
         if not self.ts:
             self.ts =  initReadOnlyTransaction(root=self.root)
@@ -861,7 +848,7 @@ class RPMDBPackageSack(PackageSackBase):
         # http://lists.rpm.org/pipermail/rpm-maint/2007-November/001719.html
         # ...if anything gets implemented, we should change.
         rpmdbvfname = self._cachedir + "/version"
-        rpmdbfname  = self.root + "/var/lib/rpm/Packages"
+        rpmdbfname  = self.root + rpm.expandMacro("%_dbpath/Packages")
 
         if os.path.exists(rpmdbvfname) and os.path.exists(rpmdbfname):
             # See if rpmdb has "changed" ...
diff --git a/yum/rpmtrans.py b/yum/rpmtrans.py
index 0340153..a544b9c 100644
--- a/yum/rpmtrans.py
+++ b/yum/rpmtrans.py
@@ -243,7 +243,10 @@ class RPMTransaction:
     def _scriptout(self, data):
         msgs = self._scriptOutput()
         self.display.scriptout(data, msgs)
-        self.base.history.log_scriptlet_output(data, msgs)
+        try:
+            self.base.history.log_scriptlet_output(data, msgs)
+        except:
+            self.display.errorlog('could not log scriptlet output')
 
     def __del__(self):
         self._shutdownOutputLogging()