summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEd Bartosh <ed.bartosh@linux.intel.com>2015-06-27 18:24:50 +0300
committerRichard Purdie <richard.purdie@linuxfoundation.org>2015-07-02 23:08:38 +0100
commit0ef9cdd1ec20d5eed06fe0148de4b996f7c7a75c (patch)
tree3a22ad684dab54322c1a60f04c9d85ed81daef1b
parenta49a42270046edd460f9619368a6fbeae4d3f58d (diff)
downloadpoky-0ef9cdd1ec20d5eed06fe0148de4b996f7c7a75c.tar.gz
wic: Refactor fstab update code
Made the code to backup and restore fstab only if it's modified. Cleaned up the code. Made it more pythonic. Improved code readability by moving code from several tiny methods into one place. (From OE-Core rev: e663b1857fd2975585003bfa4739f8f84c652708) Signed-off-by: Ed Bartosh <ed.bartosh@linux.intel.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
-rw-r--r--scripts/lib/wic/imager/direct.py83
1 files changed, 30 insertions, 53 deletions
diff --git a/scripts/lib/wic/imager/direct.py b/scripts/lib/wic/imager/direct.py
index 58a9e9d906..561c396c28 100644
--- a/scripts/lib/wic/imager/direct.py
+++ b/scripts/lib/wic/imager/direct.py
@@ -90,74 +90,50 @@ class DirectImageCreator(BaseImageCreator):
90 return realnum + 1 90 return realnum + 1
91 return realnum 91 return realnum
92 92
93 def __write_fstab(self, image_rootfs): 93 def _write_fstab(self, image_rootfs):
94 """overriden to generate fstab (temporarily) in rootfs. This is called 94 """overriden to generate fstab (temporarily) in rootfs. This is called
95 from _create, make sure it doesn't get called from 95 from _create, make sure it doesn't get called from
96 BaseImage.create() 96 BaseImage.create()
97 """ 97 """
98 if image_rootfs is None: 98 if not image_rootfs:
99 return None 99 return
100
101 fstab_path = image_rootfs + "/etc/fstab"
102 if not os.path.isfile(fstab_path):
103 return
100 104
101 fstab = image_rootfs + "/etc/fstab" 105 with open(fstab_path) as fstab:
102 if not os.path.isfile(fstab): 106 fstab_lines = fstab.readlines()
103 return None
104 107
105 parts = self._get_parts() 108 if self._update_fstab(fstab_lines, self._get_parts()):
109 shutil.copyfile(fstab_path, fstab_path + ".orig")
106 110
107 self._save_fstab(fstab) 111 with open(fstab_path, "w") as fstab:
108 fstab_lines = self._get_fstab(fstab, parts) 112 fstab.writelines(fstab_lines)
109 self._update_fstab(fstab_lines, parts)
110 self._write_fstab(fstab, fstab_lines)
111 113
112 return fstab 114 return fstab_path
113 115
114 def _update_fstab(self, fstab_lines, parts): 116 def _update_fstab(self, fstab_lines, parts):
115 """Assume partition order same as in wks""" 117 """Assume partition order same as in wks"""
116 for num, p in enumerate(parts, 1): 118 updated = False
119 for num, part in enumerate(parts, 1):
117 pnum = self.__get_part_num(num, parts) 120 pnum = self.__get_part_num(num, parts)
118 if not p.mountpoint or p.mountpoint == "/" or p.mountpoint == "/boot" or pnum == 0: 121 if not pnum or not part.mountpoint \
122 or part.mountpoint in ("/", "/boot"):
119 continue 123 continue
120 124
121 part = ''
122 # mmc device partitions are named mmcblk0p1, mmcblk0p2.. 125 # mmc device partitions are named mmcblk0p1, mmcblk0p2..
123 if p.disk.startswith('mmcblk'): 126 prefix = 'p' if part.disk.startswith('mmcblk') else ''
124 part = 'p' 127 device_name = "/dev/%s%s%d" % (part.disk, prefix, pnum)
125 128
126 device_name = "/dev/" + p.disk + part + str(pnum) 129 opts = part.fsopts if part.fsopts else "defaults"
127 130 line = "\t".join([device_name, part.mountpoint, part.fstype,
128 opts = "defaults" 131 opts, "0", "0"]) + "\n"
129 if p.fsopts:
130 opts = p.fsopts
131
132 fstab_entry = device_name + "\t" + \
133 p.mountpoint + "\t" + \
134 p.fstype + "\t" + \
135 opts + "\t0\t0\n"
136 fstab_lines.append(fstab_entry)
137
138 def _write_fstab(self, fstab, fstab_lines):
139 fstab = open(fstab, "w")
140 for line in fstab_lines:
141 fstab.write(line)
142 fstab.close()
143
144 def _save_fstab(self, fstab):
145 """Save the current fstab in rootfs"""
146 shutil.copyfile(fstab, fstab + ".orig")
147
148 def _restore_fstab(self, fstab):
149 """Restore the saved fstab in rootfs"""
150 if fstab is None:
151 return
152 shutil.move(fstab + ".orig", fstab)
153 132
154 def _get_fstab(self, fstab, parts): 133 fstab_lines.append(line)
155 """Return the desired contents of /etc/fstab.""" 134 updated = True
156 f = open(fstab, "r")
157 fstab_contents = f.readlines()
158 f.close()
159 135
160 return fstab_contents 136 return updated
161 137
162 def set_bootimg_dir(self, bootimg_dir): 138 def set_bootimg_dir(self, bootimg_dir):
163 """ 139 """
@@ -250,7 +226,7 @@ class DirectImageCreator(BaseImageCreator):
250 if not self.ks.handler.bootloader.source and p.mountpoint == "/boot": 226 if not self.ks.handler.bootloader.source and p.mountpoint == "/boot":
251 self.ks.handler.bootloader.source = p.source 227 self.ks.handler.bootloader.source = p.source
252 228
253 fstab = self.__write_fstab(self.rootfs_dir.get("ROOTFS_DIR")) 229 fstab_path = self._write_fstab(self.rootfs_dir.get("ROOTFS_DIR"))
254 230
255 for p in parts: 231 for p in parts:
256 # need to create the filesystems in order to get their 232 # need to create the filesystems in order to get their
@@ -277,7 +253,8 @@ class DirectImageCreator(BaseImageCreator):
277 part_type=p.part_type, 253 part_type=p.part_type,
278 uuid=p.uuid) 254 uuid=p.uuid)
279 255
280 self._restore_fstab(fstab) 256 if fstab_path:
257 shutil.move(fstab_path + ".orig", fstab_path)
281 258
282 self.__image.layout_partitions(self.ptable_format) 259 self.__image.layout_partitions(self.ptable_format)
283 260