<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Sat, Dec 28, 2013 at 5:57 PM, Brian Dolbec <span dir="ltr">&lt;<a href="mailto:dolsen@gentoo.org" target="_blank">dolsen@gentoo.org</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Cleans up all self.mounts, self.mountmap usage.<br>
Replace multiple path additions with one instance at the beginning of the function, reuse the result multiple times.<br>
Add some extra debug prints (to be converted to logging later)<br>
---<br>
 modules/generic_stage_target.py | 94 ++++++++++++++++++++++++++---------------<br>
 modules/stage1_target.py        |  5 ++-<br>
 2 files changed, 63 insertions(+), 36 deletions(-)<br>
<br>
diff --git a/modules/generic_stage_target.py b/modules/generic_stage_target.py<br>
index ce28ab8..c8d31e1 100644<br>
--- a/modules/generic_stage_target.py<br>
+++ b/modules/generic_stage_target.py<br>
@@ -4,6 +4,23 @@ from generic_target import *<br>
 from stat import *<br>
 import catalyst_lock<br>
<br>
+# temporary location.  It will be moved to a<br>
+# new defaults file in a later comit<br>
+TARGET_MOUNTS_DEFAULTS = {<br>
+       &quot;proc&quot;: &quot;/proc&quot;,<br>
+       &quot;dev&quot;: &quot;/dev&quot;,<br>
+       &quot;devpts&quot;: &quot;/dev/pts&quot;,<br>
+       &quot;portdir&quot;: &quot;/usr/portage&quot;,<br>
+       &quot;distdir&quot;: &quot;/usr/portage/distfiles&quot;,<br>
+       &quot;packagedir&quot;: &quot;/usr/portage/packages&quot;,<br>
+       &quot;port_tmpdir&quot;: &quot;/var/tmp/portage&quot;,<br>
+       &quot;kerncache&quot;: &quot;/tmp/kerncache&quot;,<br>
+       &quot;ccache&quot;: &quot;/var/tmp/ccache&quot;,<br>
+       &quot;icecream&quot;: &quot;/usr/lib/icecc/bin&quot;,<br>
+       &quot;port_logdir&quot;: &quot;/var/log/portage&quot;,<br>
+       }<br>
+<br>
+<br>
 class generic_stage_target(generic_target):<br>
        &quot;&quot;&quot;<br>
        This class does all of the chroot setup, copying of files, etc. It is<br>
@@ -173,6 +190,10 @@ class generic_stage_target(generic_target):<br>
                        file_locate(self.settings,[&quot;portage_confdir&quot;],expand=0)<br>
<br>
                &quot;&quot;&quot; Setup our mount points &quot;&quot;&quot;<br>
+               # initialize our target mounts.<br>
+               # later I plan to make these configurable so the<br>
+               # defaults can be easily overridden if desired.<br>
+               self.target_mounts = TARGET_MOUNTS_DEFAULTS.copy()<br>
                if &quot;SNAPCACHE&quot; in self.settings:<br>
                        self.mounts=[&quot;proc&quot;, &quot;dev&quot;, &quot;portdir&quot;, &quot;distdir&quot;, &quot;port_tmpdir&quot;]<br>
                        self.mountmap={&quot;proc&quot;:&quot;/proc&quot;, &quot;dev&quot;:&quot;/dev&quot;, &quot;devpts&quot;:&quot;/dev/pts&quot;,<br>
@@ -219,17 +240,18 @@ class generic_stage_target(generic_target):<br>
                        self.mounts.append(&quot;ccache&quot;)<br>
                        self.mountmap[&quot;ccache&quot;] = ccdir<br>
                        &quot;&quot;&quot; for the chroot: &quot;&quot;&quot;<br>
-                       self.env[&quot;CCACHE_DIR&quot;]=&quot;/var/tmp/ccache&quot;<br>
+                       self.env[&quot;CCACHE_DIR&quot;] = self.target_mounts[&quot;ccache&quot;]<br>
<br>
                if &quot;ICECREAM&quot; in self.settings:<br>
                        self.mounts.append(&quot;/var/cache/icecream&quot;)<br>
                        self.mountmap[&quot;/var/cache/icecream&quot;]=&quot;/var/cache/icecream&quot;<br>
-                       self.env[&quot;PATH&quot;]=&quot;/usr/lib/icecc/bin:&quot;+self.env[&quot;PATH&quot;]<br>
+                       self.env[&quot;PATH&quot;] = self.target_mounts[&quot;icecream&quot;] + &quot;:&quot; + \<br>
+                               self.env[&quot;PATH&quot;]<br></blockquote><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">                if &quot;port_logdir&quot; in self.settings:<br>

-                       self.mounts.append(&quot;/var/log/portage&quot;)<br>
-                       self.mountmap[&quot;/var/log/portage&quot;]=self.settings[&quot;port_logdir&quot;]<br>
-                       self.env[&quot;PORT_LOGDIR&quot;]=&quot;/var/log/portage&quot;<br>
+                       self.mounts.append(&quot;port_logdir&quot;)<br>
+                       self.mountmap[&quot;port_logdir&quot;]=self.settings[&quot;port_logdir&quot;]<br>
+                       self.env[&quot;PORT_LOGDIR&quot;]=self.target_mounts[&quot;port_logdir&quot;]<br>
                        self.env[&quot;PORT_LOGDIR_CLEAN&quot;]=&#39;find &quot;${PORT_LOGDIR}&quot; -type f ! -name &quot;summary.log*&quot; -mtime +30 -delete&#39;<br></blockquote><div><br></div><div>I&#39;ve avoided commenting on + in strings, as my understanding was that we were not doing style fixups in these CLs. I would argue that in general, any time you use string + string in python, you are doing it wrong (e.g. your code is not &#39;pythonic&#39;)</div>
<div><br></div><div>You can use</div><div><br></div><div>&quot;%s:%s&quot; % (string1, string2) or &quot;:&quot;.join(string1, string2)</div><div><br></div><div>Either are fine, and are nominally better than string + string + string.</div>
<div><br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
        def override_cbuild(self):<br>
@@ -603,33 +625,34 @@ class generic_stage_target(generic_target):<br>
                                &quot;kill-chroot-pids script failed.&quot;,env=self.env)<br>
<br>
        def mount_safety_check(self):<br>
-               mypath=self.settings[&quot;chroot_path&quot;]<br>
-<br>
                &quot;&quot;&quot;<br>
                Check and verify that none of our paths in mypath are mounted. We don&#39;t<br>
                want to clean up with things still mounted, and this allows us to check.<br>
                Returns 1 on ok, 0 on &quot;something is still mounted&quot; case.<br>
                &quot;&quot;&quot;<br>
<br>
-               if not os.path.exists(mypath):<br>
+               if not os.path.exists(self.settings[&quot;chroot_path&quot;]):<br>
                        return<br>
<br>
+               print &quot;self.mounts =&quot;, self.mounts<br>
                for x in self.mounts:<br>
-                       if not os.path.exists(mypath + self.mountmap[x]):<br>
+                       target = normpath(self.settings[&quot;chroot_path&quot;] + self.target_mounts[x])<br>
+                       print &quot;mount_safety_check() x =&quot;, x, target<br>
+                       if not os.path.exists(target):<br>
                                continue<br>
<br>
-                       if ismount(mypath + self.mountmap[x]):<br>
+                       if ismount(target):<br>
                                &quot;&quot;&quot; Something is still mounted &quot;&quot; &quot;&quot;&quot;<br>
                                try:<br>
-                                       print self.mountmap[x] + &quot; is still mounted; performing auto-bind-umount...&quot;,<br>
+                                       print target + &quot; is still mounted; performing auto-bind-umount...&quot;,<br>
                                        &quot;&quot;&quot; Try to umount stuff ourselves &quot;&quot;&quot;<br>
                                        self.unbind()<br>
-                                       if ismount(mypath + self.mountmap[x]):<br>
-                                               raise CatalystError, &quot;Auto-unbind failed for &quot; + self.mountmap[x]<br>
+                                       if ismount(target):<br>
+                                               raise CatalystError, &quot;Auto-unbind failed for &quot; + target<br>
                                        else:<br>
                                                print &quot;Auto-unbind successful...&quot;<br>
                                except CatalystError:<br>
-                                       raise CatalystError, &quot;Unable to auto-unbind &quot; + self.mountmap[x]<br>
+                                       raise CatalystError, &quot;Unable to auto-unbind &quot; + target<br>
<br>
        def unpack(self):<br>
                unpack=True<br>
@@ -897,12 +920,14 @@ class generic_stage_target(generic_target):<br>
<br>
        def bind(self):<br>
                for x in self.mounts:<br>
-                       if not os.path.exists(self.settings[&quot;chroot_path&quot;] + self.mountmap[x]):<br>
-                               os.makedirs(self.settings[&quot;chroot_path&quot;]+x,0755)<br>
+                       #print &quot;bind(); x =&quot;, x<br>
+                       target = normpath(self.settings[&quot;chroot_path&quot;] + self.target_mounts[x])<br>
+                       if not os.path.exists(target):<br>
+                               os.makedirs(target, 0755)<br>
<br>
                        if not os.path.exists(self.mountmap[x]):<br>
                                if not self.mountmap[x] == &quot;tmpfs&quot;:<br>
-                                       os.makedirs(self.mountmap[x],0755)<br>
+                                       os.makedirs(self.mountmap[x], 0755)<br>
<br>
                        src=self.mountmap[x]<br>
                        #print &quot;bind(); src =&quot;, src<br>
@@ -910,20 +935,22 @@ class generic_stage_target(generic_target):<br>
                                self.snapshot_lock_object.read_lock()<br>
                        if os.uname()[0] == &quot;FreeBSD&quot;:<br>
                                if src == &quot;/dev&quot;:<br>
-                                       retval = os.system(&quot;mount -t devfs none &quot; +<br>
-                                               self.settings[&quot;chroot_path&quot;] + src)<br>
+                                       cmd = &quot;mount -t devfs none &quot; + target<br>
+                                       retval=os.system(cmd)<br></blockquote><div><br></div><div>&quot;because the code use to do it&quot; aside, is there some compelling reason to not use subprocess.Popen here? os.system is probably the worst syscall you can use. It spawns a shell, it will select things like &#39;./mount&#39; over &#39;/usr/bin/mount&#39; because you failed to specify the full path to the binary, its not clear what environment the shell is using.</div>
<div><br></div><div>Even something like:</div><div><br></div><div>import subprocess</div><div>retval = subprocess.call(cmd.split())</div><div><br></div><div>would likely avoid these problems unless you are relying on shell expansion in cmd?</div>
<div><br></div><div><br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
                                else:<br>
-                                       retval = os.system(&quot;mount_nullfs &quot; + src + &quot; &quot; +<br>
-                                               self.settings[&quot;chroot_path&quot;] + src)<br>
+                                       cmd = &quot;mount_nullfs &quot; + src + &quot; &quot; + target<br>
+                                       retval=os.system(cmd)<br>
                        else:<br>
                                if src == &quot;tmpfs&quot;:<br>
                                        if &quot;var_tmpfs_portage&quot; in self.settings:<br>
-                                               retval=os.system(&quot;mount -t tmpfs -o size=&quot;+\<br>
-                                                       self.settings[&quot;var_tmpfs_portage&quot;]+&quot;G &quot;+src+&quot; &quot;+\<br>
-                                                       self.settings[&quot;chroot_path&quot;]+x)<br>
+                                               cmd = &quot;mount -t tmpfs -o size=&quot; + \<br>
+                                                       self.settings[&quot;var_tmpfs_portage&quot;] + &quot;G &quot; + \<br>
+                                                       src + &quot; &quot; + target<br>
+                                               retval=os.system(cmd)<br>
                                else:<br>
-                                       retval = os.system(&quot;mount --bind &quot; + src + &quot; &quot; +<br>
-                                               self.settings[&quot;chroot_path&quot;] + src)<br>
+                                       cmd = &quot;mount --bind &quot; + src + &quot; &quot; + target<br>
+                                       #print &quot;bind(); cmd =&quot;, cmd<br>
+                                       retval=os.system(cmd)<br>
                        if retval!=0:<br>
                                self.unbind()<br>
                                raise CatalystError,&quot;Couldn&#39;t bind mount &quot; + src<br>
@@ -935,26 +962,25 @@ class generic_stage_target(generic_target):<br>
                myrevmounts.reverse()<br>
                &quot;&quot;&quot; Unmount in reverse order for nested bind-mounts &quot;&quot;&quot;<br>
                for x in myrevmounts:<br>
-                       if not os.path.exists(mypath + self.mountmap[x]):<br>
+                       target = normpath(mypath + self.target_mounts[x])<br>
+                       if not os.path.exists(target):<br>
                                continue<br>
<br>
-                       if not ismount(mypath + self.mountmap[x]):<br>
+                       if not ismount(target):<br>
                                continue<br>
<br>
-                       retval=os.system(&quot;umount &quot;+\<br>
-                               os.path.join(mypath, self.mountmap[x].lstrip(os.path.sep)))<br>
+                       retval=os.system(&quot;umount &quot; + target)<br>
<br>
                        if retval!=0:<br>
-                               warn(&quot;First attempt to unmount: &quot; + mypath +<br>
-                                       self.mountmap[x] +&quot; failed.&quot;)<br>
+                               warn(&quot;First attempt to unmount: &quot; + target + &quot; failed.&quot;)<br>
                                warn(&quot;Killing any pids still running in the chroot&quot;)<br>
<br>
                                self.kill_chroot_pids()<br>
<br>
-                               retval2 = os.system(&quot;umount &quot; + mypath + self.mountmap[x])<br>
+                               retval2 = os.system(&quot;umount &quot; + target)<br>
                                if retval2!=0:<br>
                                        ouch=1<br>
-                                       warn(&quot;Couldn&#39;t umount bind mount: &quot; + mypath + self.mountmap[x])<br>
+                                       warn(&quot;Couldn&#39;t umount bind mount: &quot; + target)<br>
<br>
                        if &quot;SNAPCACHE&quot; in self.settings and x == &quot;/usr/portage&quot;:<br>
                                try:<br>
diff --git a/modules/stage1_target.py b/modules/stage1_target.py<br>
index aa43926..1e0d874 100644<br>
--- a/modules/stage1_target.py<br>
+++ b/modules/stage1_target.py<br>
@@ -88,8 +88,9 @@ class stage1_target(generic_stage_target):<br>
                        os.makedirs(self.settings[&quot;stage_path&quot;]+&quot;/proc&quot;)<br>
<br>
                # alter the mount mappings to bind mount proc onto it<br>
-               self.mounts.append(&quot;/tmp/stage1root/proc&quot;)<br>
-               self.mountmap[&quot;/tmp/stage1root/proc&quot;]=&quot;/proc&quot;<br>
+               self.mounts.append(&quot;stage1root/proc&quot;)<br>
+               self.target_mounts[&quot;stage1root/proc&quot;] = &quot;/tmp/stage1root/proc&quot;<br>
+               self.mountmap[&quot;stage1root/proc&quot;]=&quot;/proc&quot;<br>
<br>
 def register(foo):<br>
        foo.update({&quot;stage1&quot;:stage1_target})<br>
<span class="HOEnZb"><font color="#888888">--<br>
1.8.3.2<br>
<br>
<br>
</font></span></blockquote></div><br></div></div>