| … | |
… | |
| 3 | # This source code is distributed under the terms of version 2 of the GNU |
3 | # This source code is distributed under the terms of version 2 of the GNU |
| 4 | # General Public License as published by the Free Software Foundation, a copy |
4 | # General Public License as published by the Free Software Foundation, a copy |
| 5 | # of which can be found in the main directory of this project. |
5 | # of which can be found in the main directory of this project. |
| 6 | Gentoo Linux Installer |
6 | Gentoo Linux Installer |
| 7 | |
7 | |
| 8 | $Id: GLIPortage.py,v 1.32 2006/01/07 17:12:00 agaffney Exp $ |
8 | $Id: GLIPortage.py,v 1.40 2006/02/11 17:26:33 agaffney Exp $ |
| 9 | """ |
9 | """ |
| 10 | |
10 | |
| 11 | import re |
11 | import re |
| 12 | import os |
12 | import os |
| 13 | import GLIUtility |
13 | import GLIUtility |
| … | |
… | |
| 66 | elif parts[0] == "sym": |
66 | elif parts[0] == "sym": |
| 67 | entries.append(" ".join(parts[1:4])) |
67 | entries.append(" ".join(parts[1:4])) |
| 68 | entries.sort() |
68 | entries.sort() |
| 69 | return entries |
69 | return entries |
| 70 | |
70 | |
| 71 | def copy_pkg_to_chroot(self, package, use_root=False): |
71 | def copy_pkg_to_chroot(self, package, use_root=False, ignore_missing=False): |
| 72 | symlinks = { '/bin': '/mnt/livecd/bin/', '/boot': '/mnt/livecd/boot/', '/lib': '/mnt/livecd/lib/', |
72 | symlinks = { '/bin': '/mnt/livecd/bin/', '/boot': '/mnt/livecd/boot/', '/lib': '/mnt/livecd/lib/', |
| 73 | '/opt': '/mnt/livecd/opt/', '/sbin': '/mnt/livecd/sbin/', '/usr': '/mnt/livecd/usr/', |
73 | '/opt': '/mnt/livecd/opt/', '/sbin': '/mnt/livecd/sbin/', '/usr': '/mnt/livecd/usr/', |
| 74 | '/etc/gconf': '/usr/livecd/gconf/' } |
74 | '/etc/gconf': '/usr/livecd/gconf/' } |
| 75 | |
75 | |
| 76 | tmpdir = "/var/tmp/portage" |
76 | tmpdir = "/var/tmp/portage" |
| 77 | image_dir = tmpdir + "/" + package.split("/")[1] + "/image" |
77 | image_dir = tmpdir + "/" + package.split("/")[1] + "/image" |
| 78 | root_cmd = "" |
78 | root_cmd = "" |
| 79 | tmp_chroot_dir = self._chroot_dir |
79 | tmp_chroot_dir = self._chroot_dir |
| 80 | portage_tmpdir = "/var/tmp/portage" |
80 | portage_tmpdir = "/var/tmp/portage" |
|
|
81 | vdb_dir = "/var/db/pkg/" |
| 81 | if use_root: |
82 | if use_root: |
| 82 | root_cmd = "ROOT=" + self._chroot_dir |
83 | root_cmd = "ROOT=" + self._chroot_dir |
| 83 | tmp_chroot_dir = "" |
84 | tmp_chroot_dir = "" |
| 84 | portage_tmpdir = self._chroot_dir + "/var/tmp/portage" |
85 | portage_tmpdir = self._chroot_dir + "/var/tmp/portage" |
|
|
86 | vdb_dir = self._chroot_dir + "/var/db/pkg/" |
|
|
87 | |
|
|
88 | # Check to see if package is actually in vdb |
|
|
89 | if not GLIUtility.is_file("/var/db/pkg/" + package): |
|
|
90 | if ignore_missing: |
|
|
91 | if self._debug: |
|
|
92 | self._logger.log("DEBUG: copy_pkg_to_chroot(): package " + package + " does not have a vdb entry but ignore_missing=True...ignoring error") |
|
|
93 | return |
|
|
94 | else: |
|
|
95 | raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "There is no vdb entry for " + package) |
| 85 | |
96 | |
| 86 | # Copy the vdb entry for the package from the LiveCD to the chroot |
97 | # Copy the vdb entry for the package from the LiveCD to the chroot |
| 87 | if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): copying vdb entry for " + package) |
98 | if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): copying vdb entry for " + package) |
| 88 | if not GLIUtility.exitsuccess(GLIUtility.spawn("mkdir -p " + self._chroot_dir + "/var/db/pkg/" + package + " && cp -a /var/db/pkg/" + package + "/* " + self._chroot_dir + "/var/db/pkg/" + package)): |
99 | if not GLIUtility.exitsuccess(GLIUtility.spawn("mkdir -p " + self._chroot_dir + "/var/db/pkg/" + package + " && cp -a /var/db/pkg/" + package + "/* " + self._chroot_dir + "/var/db/pkg/" + package)): |
| 89 | raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Could not copy vdb entry for " + package) |
100 | raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Could not copy vdb entry for " + package) |
| … | |
… | |
| 126 | # if not GLIUtility.exitsuccess(GLIUtility.spawn("mv " + self._chroot_dir + image_dir + symlinks[symlink] + " " + self._chroot_dir + image_dir + symlink)): |
137 | # if not GLIUtility.exitsuccess(GLIUtility.spawn("mv " + self._chroot_dir + image_dir + symlinks[symlink] + " " + self._chroot_dir + image_dir + symlink)): |
| 127 | # raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Could not fix " + symlink + " symlink ickiness for " + package) |
138 | # raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Could not fix " + symlink + " symlink ickiness for " + package) |
| 128 | |
139 | |
| 129 | # Run pkg_setup |
140 | # Run pkg_setup |
| 130 | if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): running pkg_setup for " + package) |
141 | if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): running pkg_setup for " + package) |
| 131 | if not GLIUtility.exitsuccess(GLIUtility.spawn("env " + root_cmd + " PORTAGE_TMPDIR=" + portage_tmpdir + " ebuild /var/db/pkg/" + package + "/*.ebuild setup", chroot=tmp_chroot_dir)): |
142 | if not GLIUtility.exitsuccess(GLIUtility.spawn("env " + root_cmd + " PORTAGE_TMPDIR=" + portage_tmpdir + " ebuild " + vdb_dir + package + "/*.ebuild setup", chroot=tmp_chroot_dir)): |
| 132 | raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Could not execute pkg_setup for " + package) |
143 | raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Could not execute pkg_setup for " + package) |
| 133 | |
144 | |
| 134 | # Run pkg_preinst |
145 | # Run pkg_preinst |
| 135 | if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): running preinst for " + package) |
146 | if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): running preinst for " + package) |
| 136 | if not GLIUtility.exitsuccess(GLIUtility.spawn("env " + root_cmd + " PORTAGE_TMPDIR=" + portage_tmpdir + " ebuild /var/db/pkg/" + package + "/*.ebuild preinst", chroot=tmp_chroot_dir)): |
147 | if not GLIUtility.exitsuccess(GLIUtility.spawn("env " + root_cmd + " PORTAGE_TMPDIR=" + portage_tmpdir + " ebuild " + vdb_dir + package + "/*.ebuild preinst", chroot=tmp_chroot_dir)): |
| 137 | raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Could not execute preinst for " + package) |
148 | raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Could not execute preinst for " + package) |
| 138 | |
149 | |
| 139 | # Copy files from image_dir to chroot |
150 | # Copy files from image_dir to chroot |
| 140 | if not entries: |
151 | if not entries: |
| 141 | if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): no files for " + package + "...skipping copy from image dir to /") |
152 | if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): no files for " + package + "...skipping copy from image dir to /") |
| 142 | else: |
153 | else: |
| 143 | if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): copying files from " + image_dir + " to / for " + package) |
154 | if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): copying files from " + image_dir + " to / for " + package) |
| 144 | if not GLIUtility.exitsuccess(GLIUtility.spawn("cp -a " + self._chroot_dir + image_dir + "/* " + self._chroot_dir)): |
155 | # if not GLIUtility.exitsuccess(GLIUtility.spawn("cp -a " + self._chroot_dir + image_dir + "/* " + self._chroot_dir)): |
|
|
156 | if not GLIUtility.exitsuccess(GLIUtility.spawn("tar -C " + self._chroot_dir + image_dir + "/ -c . | tar -C " + self._chroot_dir + "/ -x")): |
| 145 | raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Could not copy files from " + image_dir + " to / for " + package) |
157 | raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Could not copy files from " + image_dir + " to / for " + package) |
| 146 | |
158 | |
| 147 | # Run pkg_postinst |
159 | # Run pkg_postinst |
| 148 | if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): running postinst for " + package) |
160 | if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): running postinst for " + package) |
| 149 | if not GLIUtility.exitsuccess(GLIUtility.spawn("env " + root_cmd + " PORTAGE_TMPDIR=" + portage_tmpdir + " ebuild /var/db/pkg/" + package + "/*.ebuild postinst", chroot=tmp_chroot_dir)): |
161 | if not GLIUtility.exitsuccess(GLIUtility.spawn("env " + root_cmd + " PORTAGE_TMPDIR=" + portage_tmpdir + " ebuild " + vdb_dir + package + "/*.ebuild postinst", chroot=tmp_chroot_dir)): |
| 150 | raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Could not execute postinst for " + package) |
162 | raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Could not execute postinst for " + package) |
| 151 | |
163 | |
| 152 | # Remove image_dir |
164 | # Remove image_dir |
| 153 | if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): removing " + image_dir + " for " + package) |
165 | if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): removing " + image_dir + " for " + package) |
| 154 | if not GLIUtility.exitsuccess(GLIUtility.spawn("rm -rf " + self._chroot_dir + image_dir)): |
166 | if not GLIUtility.exitsuccess(GLIUtility.spawn("rm -rf " + self._chroot_dir + image_dir)): |
| 155 | raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Could not remove + " + image_dir + " for " + package) |
167 | raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Could not remove + " + image_dir + " for " + package) |
|
|
168 | |
|
|
169 | # Run env-update |
|
|
170 | if not use_root: |
|
|
171 | if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): running env-update inside chroot") |
|
|
172 | if not GLIUtility.exitstatus(GLIUtility.spawn("env-update", chroot=self._chroot_dir)): |
|
|
173 | raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Could not run env-update for " + package) |
| 156 | |
174 | |
| 157 | def add_pkg_to_world(self, package): |
175 | def add_pkg_to_world(self, package): |
| 158 | if package.find("/") == -1: |
176 | if package.find("/") == -1: |
| 159 | package = self.get_best_version_vdb_chroot(package) |
177 | package = self.get_best_version_vdb_chroot(package) |
| 160 | if not package: return False |
178 | if not package: return False |
| … | |
… | |
| 162 | res = expr.match(package) |
180 | res = expr.match(package) |
| 163 | if res: |
181 | if res: |
| 164 | GLIUtility.spawn("echo " + res.group(1) + " >> " + self._chroot_dir + "/var/lib/portage/world") |
182 | GLIUtility.spawn("echo " + res.group(1) + " >> " + self._chroot_dir + "/var/lib/portage/world") |
| 165 | |
183 | |
| 166 | def get_best_version_vdb(self, package): |
184 | def get_best_version_vdb(self, package): |
|
|
185 | if package.startswith('='): |
|
|
186 | package = package[1:] |
|
|
187 | if GLIUtility.is_file("/var/db/pkg/" + package): |
|
|
188 | return package |
|
|
189 | else: |
|
|
190 | return "" |
|
|
191 | else: |
| 167 | return GLIUtility.spawn("portageq best_version / " + package, return_output=True)[1].strip() |
192 | return GLIUtility.spawn("portageq best_version / " + package, return_output=True)[1].strip() |
| 168 | |
193 | |
| 169 | def get_best_version_vdb_chroot(self, package): |
194 | def get_best_version_vdb_chroot(self, package): |
|
|
195 | if package.startswith('='): |
|
|
196 | package = package[1:] |
|
|
197 | if GLIUtility.is_file(self._chroot_dir + "/var/db/pkg/" + package): |
|
|
198 | return package |
|
|
199 | else: |
|
|
200 | return "" |
|
|
201 | else: |
| 170 | return GLIUtility.spawn("portageq best_version / " + package, chroot=self._chroot_dir, return_output=True)[1].strip() |
202 | return GLIUtility.spawn("portageq best_version / " + package, chroot=self._chroot_dir, return_output=True)[1].strip() |
| 171 | |
203 | |
| 172 | # def get_best_version_tree(self, package): |
204 | # def get_best_version_tree(self, package): |
| 173 | # return portage.best(tree.match(package)) |
205 | # return portage.best(tree.match(package)) |
| 174 | |
206 | |
| 175 | def emerge(self, packages, add_to_world=True): |
207 | def emerge(self, packages, add_to_world=True): |