Gentoo Archives: gentoo-portage-dev

From: Zac Medico <zmedico@g.o>
To: gentoo-portage-dev@l.g.o
Cc: Zac Medico <zmedico@g.o>
Subject: [gentoo-portage-dev] [PATCH v3] emerge: check for writable /var/db/pkg (490732)
Date: Wed, 19 Nov 2014 15:49:09
Message-Id: 1416412140-21699-1-git-send-email-zmedico@gentoo.org
In Reply to: [gentoo-portage-dev] [PATCH v2] emerge: check for writable /var/db/pkg (490732) by Zac Medico
1 If there are packages to be merged or unmerge, then bail out early
2 if /var/db/pkg is not writable (in order to avoid a fatal EROFS error
3 which would otherwise occur later on). Behavior remains unchanged for
4 --pretend mode. For --ask mode, it will bail out just after the last
5 relevant --ask prompt.
6
7 In contrast to the writeable_check module, which operates on files just
8 before they are merged, the new vardbapi.writable check is performed
9 before anything has been built (much earlier).
10
11 X-Gentoo-Bug: 490732
12 X-Gentoo-Bug-URL: https://bugs.gentoo.org/show_bug.cgi?id=490732
13 ---
14 PATCH v3 fixes emerge --unmerge --pretend to succeed when /var/db/pkg
15 is not writable (--pretend actions may still be useful when operating
16 with a readonly filesystem).
17
18 pym/_emerge/actions.py | 15 +++++++++++++++
19 pym/_emerge/unmerge.py | 9 +++++++++
20 pym/portage/dbapi/vartree.py | 12 ++++++++++++
21 3 files changed, 36 insertions(+)
22
23 diff --git a/pym/_emerge/actions.py b/pym/_emerge/actions.py
24 index 48b0826..6f7dfe0 100644
25 --- a/pym/_emerge/actions.py
26 +++ b/pym/_emerge/actions.py
27 @@ -428,6 +428,21 @@ def action_build(settings, trees, mtimedb,
28 # least show warnings about missed updates and such.
29 mydepgraph.display_problems()
30
31 + if not Scheduler._opts_no_self_update.intersection(myopts):
32 +
33 + eroots = set()
34 + for x in mydepgraph.altlist():
35 + if isinstance(x, Package) and x.operation == "merge":
36 + eroots.add(x.root)
37 +
38 + for eroot in eroots:
39 + if not trees[eroot]["vartree"].dbapi.writable:
40 + writemsg_level("!!! %s\n" %
41 + _("Read-only file system: %s") %
42 + trees[eroot]["vartree"].dbapi._dbroot,
43 + level=logging.ERROR, noiselevel=-1)
44 + return 1
45 +
46 if ("--resume" in myopts):
47 favorites=mtimedb["resume"]["favorites"]
48
49 diff --git a/pym/_emerge/unmerge.py b/pym/_emerge/unmerge.py
50 index df29000..7f6d82a 100644
51 --- a/pym/_emerge/unmerge.py
52 +++ b/pym/_emerge/unmerge.py
53 @@ -10,6 +10,7 @@ import textwrap
54 import portage
55 from portage import os
56 from portage.dbapi._expand_new_virt import expand_new_virt
57 +from portage.localization import _
58 from portage.output import bold, colorize, darkgreen, green
59 from portage._sets import SETPREFIX
60 from portage._sets.base import EditablePackageSet
61 @@ -536,6 +537,7 @@ def unmerge(root_config, myopts, unmerge_action,
62 if "--pretend" in myopts:
63 #we're done... return
64 return os.EX_OK
65 +
66 if "--ask" in myopts:
67 uq = UserQuery(myopts)
68 if uq.query("Would you like to unmerge these packages?",
69 @@ -546,6 +548,13 @@ def unmerge(root_config, myopts, unmerge_action,
70 print("Quitting.")
71 print()
72 return 128 + signal.SIGINT
73 +
74 + if not vartree.dbapi.writable:
75 + writemsg_level("!!! %s\n" %
76 + _("Read-only file system: %s") % vartree.dbapi._dbroot,
77 + level=logging.ERROR, noiselevel=-1)
78 + return 1
79 +
80 #the real unmerging begins, after a short delay unless we're raging....
81 if not unmerge_action == "rage-clean" and clean_delay and not autoclean:
82 countdown(int(settings["CLEAN_DELAY"]), ">>> Unmerging")
83 diff --git a/pym/portage/dbapi/vartree.py b/pym/portage/dbapi/vartree.py
84 index 0fd1bd9..df031cd 100644
85 --- a/pym/portage/dbapi/vartree.py
86 +++ b/pym/portage/dbapi/vartree.py
87 @@ -33,6 +33,7 @@ portage.proxy.lazyimport.lazyimport(globals(),
88 'portage.util.env_update:env_update',
89 'portage.util.listdir:dircache,listdir',
90 'portage.util.movefile:movefile',
91 + 'portage.util.path:first_existing',
92 'portage.util.writeable_check:get_ro_checker',
93 'portage.util._dyn_libs.PreservedLibsRegistry:PreservedLibsRegistry',
94 'portage.util._dyn_libs.LinkageMapELF:LinkageMapELF@LinkageMap',
95 @@ -189,6 +190,17 @@ class vardbapi(dbapi):
96 self._cached_counter = None
97
98 @property
99 + def writable(self):
100 + """
101 + Check if var/db/pkg is writable, or permissions are sufficient
102 + to create it if it does not exist yet.
103 + @rtype: bool
104 + @return: True if var/db/pkg is writable or can be created,
105 + False otherwise
106 + """
107 + return os.access(first_existing(self._dbroot), os.W_OK)
108 +
109 + @property
110 def root(self):
111 warnings.warn("The root attribute of "
112 "portage.dbapi.vartree.vardbapi"
113 --
114 2.0.4

Replies