public inbox for gentoo-portage-dev@lists.gentoo.org
 help / color / mirror / Atom feed
* [gentoo-portage-dev] [PATCH] Check for and report read-only filesystems
@ 2014-01-11  3:07 Chris Reffett
  2014-01-11  5:09 ` Brian Dolbec
  2014-01-13 23:24 ` Mike Frysinger
  0 siblings, 2 replies; 17+ messages in thread
From: Chris Reffett @ 2014-01-11  3:07 UTC (permalink / raw
  To: gentoo-portage-dev

[-- Attachment #1: Type: text/plain, Size: 950 bytes --]

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Hi all,
Attached is a patch to test if Portage is going to write to a
read-only filesystem and print out the list of filesystems that need
to be remounted RW. This leaves ${D} intact rather than having some
files moved before hitting the RO filesystem. Fixes bug 378869. Since
git.overlays.gentoo.org is down, I haven't had the chance to rebase
this against latest, but I can resubmit if it doesn't cleanly apply.
This is my first patch to the list, so I apologize if I didn't submit
correctly.

Chris Reffett
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.22 (GNU/Linux)
Comment: Using GnuPG with Thunderbird - http://www.enigmail.net/

iKYEARECAGYFAlLQtYhfFIAAAAAALgAoaXNzdWVyLWZwckBub3RhdGlvbnMub3Bl
bnBncC5maWZ0aGhvcnNlbWFuLm5ldEM2NzU5RjUyMDczREJDQkVDQTBDRkE1NERC
Nzk1QThBNDI2MTgzNTQACgkQ23laikJhg1SCCgCfZIo57KiijmACnDTa2vC9UMAb
9YwAoIhnc/nHDcIXBbzF9Tie3eTJyWpH
=j/1A
-----END PGP SIGNATURE-----

[-- Attachment #2: 0001-Test-for-read-only-filesystems-bail-out-during-prein.patch --]
[-- Type: text/x-patch, Size: 4573 bytes --]

From c464ac5e0007a087def9a96efea9653e508e57c1 Mon Sep 17 00:00:00 2001
From: Chris Reffett <creffett@gentoo.org>
Date: Fri, 10 Jan 2014 09:03:26 -0500
Subject: [PATCH] Test for read-only filesystems, bail out during preinst if
 there are any which will be written to and display a useful error message.
 Fixes bug 378869.

---
 pym/portage/dbapi/vartree.py       | 31 ++++++++++++++++++++++++
 pym/portage/util/checkwriteable.py | 49 ++++++++++++++++++++++++++++++++++++++
 2 files changed, 80 insertions(+)
 create mode 100644 pym/portage/util/checkwriteable.py

diff --git a/pym/portage/dbapi/vartree.py b/pym/portage/dbapi/vartree.py
index ed62323..8ae7014 100644
--- a/pym/portage/dbapi/vartree.py
+++ b/pym/portage/dbapi/vartree.py
@@ -28,6 +28,7 @@ portage.proxy.lazyimport.lazyimport(globals(),
 	'portage.util:apply_secpass_permissions,ConfigProtect,ensure_dirs,' + \
 		'writemsg,writemsg_level,write_atomic,atomic_ofstream,writedict,' + \
 		'grabdict,normalize_path,new_protect_filename',
+	'portage.util.checkwriteable:check_dirs_writeable',
 	'portage.util.digraph:digraph',
 	'portage.util.env_update:env_update',
 	'portage.util.listdir:dircache,listdir',
@@ -3508,6 +3509,8 @@ class dblink(object):
 		
 		This function does the following:
 		
+		calls check_dirs_writeable to verify that no files will be
+		written to read-only filesystems
 		calls self._preserve_libs if FEATURES=preserve-libs
 		calls self._collision_protect if FEATURES=collision-protect
 		calls doebuild(mydo=pkg_preinst)
@@ -3685,6 +3688,7 @@ class dblink(object):
 			eagain_error = False
 
 			myfilelist = []
+			mydirlist = []
 			mylinklist = []
 			paths_with_newlines = []
 			def onerror(e):
@@ -3717,6 +3721,9 @@ class dblink(object):
 					unicode_errors.append(new_parent[ed_len:])
 					break
 
+				relative_path = parent[srcroot_len:]
+				mydirlist.append("/" + relative_path)
+
 				for fname in files:
 					try:
 						fname = _unicode_decode(fname,
@@ -3829,6 +3836,30 @@ class dblink(object):
 			for other in others_in_slot])
 		prepare_build_dirs(settings=self.settings, cleanup=cleanup)
 
+		# Check for read-only filesystems
+		rofilesystems = check_dirs_writeable(mydirlist)
+
+		if rofilesystems:
+			msg = _("One or more files installed to this package are "
+				"set to be installed to read-only filesystems. "
+				"Please mount the filesystems below read-write "
+				"and retry.")
+			msg = textwrap.wrap(msg, 70)
+			msg.append("")
+			for f in rofilesystems:
+				msg.append("\t%s" % os.path.join(destroot,
+					f.lstrip(os.path.sep)))
+			msg.append("")
+			self._elog("eerror", "preinst", msg)
+
+			msg = _("Package '%s' NOT merged due to read-only file systems.") % \
+				self.settings.mycpv
+			msg += _(" If necessary, refer to your elog "
+				"messages for the whole content of the above message.")
+			msg = textwrap.wrap(msg, 70)
+			eerror(msg)
+			return 1
+
 		# check for package collisions
 		blockers = self._blockers
 		if blockers is None:
diff --git a/pym/portage/util/checkwriteable.py b/pym/portage/util/checkwriteable.py
new file mode 100644
index 0000000..9bd9056
--- /dev/null
+++ b/pym/portage/util/checkwriteable.py
@@ -0,0 +1,49 @@
+#-*- coding:utf-8 -*-
+# Copyright 2014 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+
+from __future__ import unicode_literals
+
+import re
+
+from portage.util import writemsg
+from portage.localization import _
+
+
+def check_dirs_writeable(dir_list):
+	"""
+	Use /proc/mounts to check that no directories installed by the ebuild are set to
+	be installed to	a read-only filesystem
+
+	@param dir_list: Directories installed by the ebuild
+	@type dir_list: List
+	@return:
+	1. A list of filesystems which are both set to be written to and are mounted
+	read-only, may be empty.
+	"""
+	ro_filesystems = set()
+	ro_filesystems_written = set()
+
+	try:
+		with open("/proc/mounts") as procmounts:
+			roregex = re.compile(r'(\A|,)ro(\Z|,)')
+			for line in procmounts:
+				if roregex.search(line.split(" ")[3].strip()) is not None:
+					romount = line.split(" ")[1].strip()
+					ro_filesystems.add(romount)
+
+	# If /proc/mounts can't be read, assume that there are no RO
+	# filesystems and return
+	except EnvironmentError:
+		writemsg(_("!!! /proc/mounts cannot be read"))
+		return []
+
+	if not ro_filesystems:
+		return ro_filesystems
+
+	for directory in dir_list:
+		for filesystem in ro_filesystems:
+			if re.match(filesystem, directory):
+				ro_filesystems_written.add(filesystem)
+
+	return ro_filesystems_written
-- 
1.8.5.1


^ permalink raw reply related	[flat|nested] 17+ messages in thread

end of thread, other threads:[~2014-01-22 18:34 UTC | newest]

Thread overview: 17+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-01-11  3:07 [gentoo-portage-dev] [PATCH] Check for and report read-only filesystems Chris Reffett
2014-01-11  5:09 ` Brian Dolbec
2014-01-11 14:22   ` Chris Reffett
2014-01-13 23:24 ` Mike Frysinger
2014-01-17  0:39   ` [gentoo-portage-dev] [PATCH v2] Test for read-only filesystems, bail out during preinst if there are any which will be written to and display a useful error message. Fixes bug 378869 Chris Reffett
2014-01-19  2:00     ` [gentoo-portage-dev] [PATCH v3] " Chris Reffett
2014-01-19  9:17       ` Mike Frysinger
2014-01-19 10:39         ` Alexander Berntsen
2014-01-19 21:43           ` Alec Warner
2014-01-21  3:28           ` Mike Frysinger
2014-01-21  3:53             ` Gordon Pettey
2014-01-21 22:44               ` Mike Frysinger
2014-01-21  0:50         ` [gentoo-portage-dev] [PATCH v4] " Chris Reffett
2014-01-21  3:32           ` Mike Frysinger
2014-01-21  4:00             ` [gentoo-portage-dev] [PATCH v5] " Chris Reffett
2014-01-22  5:24               ` Mike Frysinger
2014-01-22 18:33                 ` [gentoo-portage-dev] [PATCH v6] " Chris Reffett

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox