diff options
| -rw-r--r-- | scripts/lib/wic/imager/direct.py | 83 |
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 | ||
