check if PORTAGE_TMPDIR is mounted readonly/noexec (bug #219957)
authorZac Medico <zmedico@gentoo.org>
Fri, 2 May 2008 03:33:09 +0000 (03:33 -0000)
committerZac Medico <zmedico@gentoo.org>
Fri, 2 May 2008 03:33:09 +0000 (03:33 -0000)
(trunk r10069)

svn path=/main/branches/2.1.2/; revision=10076

pym/portage.py

index 34bb0a4a14766bfdf3c86ef92181d2b3626ce06d..d7f4bbbd524e913094e1108ea4554bc75b751a95 100644 (file)
@@ -4725,6 +4725,34 @@ def doebuild(myebuild, mydo, myroot, mysettings, debug=0, listonly=0,
                        writemsg("does not exist.  Please create this directory or " + \
                                "correct your PORTAGE_TMPDIR setting.\n", noiselevel=-1)
                        return 1
+               
+               # as some people use a separate PORTAGE_TMPDIR mount
+               # we prefer that as the checks below would otherwise be pointless
+               # for those people.
+               if os.path.exists(os.path.join(mysettings["PORTAGE_TMPDIR"], "portage")):
+                       checkdir = os.path.join(mysettings["PORTAGE_TMPDIR"], "portage")
+               else:
+                       checkdir = mysettings["PORTAGE_TMPDIR"]
+
+               if not os.access(checkdir, os.W_OK):
+                       writemsg("%s is not writable.\n" % checkdir + \
+                               "Likely cause is that you've mounted it as readonly.\n" \
+                               , noiselevel=-1)
+                       return 1
+               else:
+                       from tempfile import NamedTemporaryFile
+                       fd = NamedTemporaryFile(prefix="exectest-", dir=checkdir)
+                       os.chmod(fd.name, 0755)
+                       if not os.access(fd.name, os.X_OK):
+                               writemsg("Can not execute files in %s\n" % checkdir + \
+                                       "Likely cause is that you've mounted it with one of the\n" + \
+                                       "following mount options: 'noexec', 'user', 'users'\n\n" + \
+                                       "Please make sure that portage can execute files in this direxctory.\n" \
+                                       , noiselevel=-1)
+                               fd.close()
+                               return 1
+                       fd.close()
+               del checkdir
 
                if mydo == "unmerge":
                        return unmerge(mysettings["CATEGORY"],