| … | |
… | |
| 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.21 2006/01/02 19:13:13 agaffney Exp $ |
8 | $Id: GLIPortage.py,v 1.22 2006/01/02 22:56:24 agaffney Exp $ |
| 9 | """ |
9 | """ |
| 10 | |
10 | |
| 11 | import re |
11 | import re |
| 12 | import GLIUtility |
12 | import GLIUtility |
| 13 | from GLIException import GLIException |
13 | from GLIException import GLIException |
| … | |
… | |
| 28 | pkgs = pkgs.split() |
28 | pkgs = pkgs.split() |
| 29 | for pkg in pkgs: |
29 | for pkg in pkgs: |
| 30 | if self._debug: self._logger.log("get_deps(): pkg is " + pkg) |
30 | if self._debug: self._logger.log("get_deps(): pkg is " + pkg) |
| 31 | if not self._grp_install or not self.get_best_version_vdb(pkg): |
31 | if not self._grp_install or not self.get_best_version_vdb(pkg): |
| 32 | if self._debug: self._logger.log("get_deps(): grabbing compile deps") |
32 | if self._debug: self._logger.log("get_deps(): grabbing compile deps") |
| 33 | tmppkglist = GLIUtility.spawn("emerge -p " + pkg + r" | grep -e '^\[[a-z]' | cut -d ']' -f2 | sed -e 's:^ ::' -e 's: .\+$::'", chroot=self._chroot_dir, return_output=True)[1].strip().split("\n") |
33 | tmppkglist = GLIUtility.spawn("emerge -p " + pkg + r" 2>/dev/null | grep -e '^\[[a-z]' | cut -d ']' -f2 | sed -e 's:^ ::' -e 's: .\+$::'", chroot=self._chroot_dir, return_output=True)[1].strip().split("\n") |
| 34 | else: |
34 | else: |
| 35 | if self._debug: self._logger.log("get_deps(): grabbing binary deps") |
35 | if self._debug: self._logger.log("get_deps(): grabbing binary deps") |
| 36 | # Until I have a unified method of getting binary and compile deps, I can't reliably merge the deptrees |
36 | # Until I have a unified method of getting binary and compile deps, I can't reliably merge the deptrees |
| 37 | # tmppkglist = GLIUtility.spawn("python ../../runtimedeps.py " + self._chroot_dir + " " + pkg, return_output=True)[1].strip().split("\n") |
37 | tmppkglist = GLIUtility.spawn("python ../../runtimedeps.py " + self._chroot_dir + " " + pkg, return_output=True)[1].strip().split("\n") |
| 38 | tmppkglist = [] |
38 | # tmppkglist = [] |
| 39 | for tmppkg in GLIUtility.spawn("emerge -p " + pkg + r" | grep -e '^\[[a-z]' | cut -d ']' -f2 | sed -e 's:^ ::' -e 's: .\+$::'", chroot=self._chroot_dir, return_output=True)[1].strip().split("\n"): |
39 | # for tmppkg in GLIUtility.spawn("emerge -p " + pkg + r" 2>/dev/null | grep -e '^\[[a-z]' | cut -d ']' -f2 | sed -e 's:^ ::' -e 's: .\+$::'", chroot=self._chroot_dir, return_output=True)[1].strip().split("\n"): |
|
|
40 | # if self._debug: self._logger.log("get_deps(): looking at " + tmppkg) |
| 40 | if self.get_best_version_vdb_chroot("=" + tmppkg): |
41 | # if self.get_best_version_vdb_chroot("=" + tmppkg): |
|
|
42 | # if self._debug: self._logger.log("get_deps(): package " + tmppkg + " in vdb...adding to tmppkglist") |
| 41 | tmppkglist.append(tmppkg) |
43 | # tmppkglist.append(tmppkg) |
| 42 | if self._debug: self._logger.log("get_deps(): deplist for " + pkg + ": " + str(tmppkglist)) |
44 | if self._debug: self._logger.log("get_deps(): deplist for " + pkg + ": " + str(tmppkglist)) |
| 43 | for tmppkg in tmppkglist: |
45 | for tmppkg in tmppkglist: |
| 44 | if self._debug: self._logger.log("get_deps(): checking to see if " + tmppkg + " is already in pkglist") |
46 | if self._debug: self._logger.log("get_deps(): checking to see if " + tmppkg + " is already in pkglist") |
| 45 | if not tmppkg in pkglist and not self.get_best_version_vdb_chroot("=" + tmppkg): |
47 | if not tmppkg in pkglist and not self.get_best_version_vdb_chroot("=" + tmppkg): |
| 46 | if self._debug: self._logger.log("get_deps(): adding " + tmppkg + " to pkglist") |
48 | if self._debug: self._logger.log("get_deps(): adding " + tmppkg + " to pkglist") |
| … | |
… | |
| 51 | def copy_pkg_to_chroot(self, package, use_root=False): |
53 | def copy_pkg_to_chroot(self, package, use_root=False): |
| 52 | symlinks = { '/bin/': '/mnt/livecd/bin/', '/boot/': '/mnt/livecd/boot/', '/lib/': '/mnt/livecd/lib/', |
54 | symlinks = { '/bin/': '/mnt/livecd/bin/', '/boot/': '/mnt/livecd/boot/', '/lib/': '/mnt/livecd/lib/', |
| 53 | '/opt/': '/mnt/livecd/opt/', '/sbin/': '/mnt/livecd/sbin/', '/usr/': '/mnt/livecd/usr/', |
55 | '/opt/': '/mnt/livecd/opt/', '/sbin/': '/mnt/livecd/sbin/', '/usr/': '/mnt/livecd/usr/', |
| 54 | '/etc/gconf/': '/usr/livecd/gconf/' } |
56 | '/etc/gconf/': '/usr/livecd/gconf/' } |
| 55 | |
57 | |
|
|
58 | tmpdir = "/var/tmp/portage" |
|
|
59 | image_dir = tmpdir + "/" + package.split("/")[1] + "/image" |
|
|
60 | |
| 56 | root_cmd = "" |
61 | root_cmd = "" |
| 57 | tmp_chroot_dir = self._chroot_dir |
62 | tmp_chroot_dir = self._chroot_dir |
| 58 | portage_tmpdir = "/var/tmp/portage" |
63 | portage_tmpdir = "/var/tmp/portage" |
| 59 | if use_root: |
64 | if use_root: |
| 60 | root_cmd = "ROOT=" + self._chroot_dir |
65 | root_cmd = "ROOT=" + self._chroot_dir |
| … | |
… | |
| 64 | # Copy the vdb entry for the package from the LiveCD to the chroot |
69 | # Copy the vdb entry for the package from the LiveCD to the chroot |
| 65 | if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): copying vdb entry for " + package) |
70 | if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): copying vdb entry for " + package) |
| 66 | 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)): |
71 | 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)): |
| 67 | raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Could not copy vdb entry for " + package) |
72 | raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Could not copy vdb entry for " + package) |
| 68 | |
73 | |
|
|
74 | # Create the image dir in the chroot |
|
|
75 | if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): running 'mkdir -p " + self._chroot_dir + image_dir + "'") |
|
|
76 | if not GLIUtility.exitsuccess(GLIUtility.spawn("mkdir -p " + self._chroot_dir + image_dir)): |
|
|
77 | raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Could not create image dir for " + package) |
|
|
78 | |
| 69 | # Create list of files for tar to work with from CONTENTS file in vdb entry |
79 | # Create list of files for tar to work with from CONTENTS file in vdb entry |
| 70 | entries = GLIUtility.parse_vdb_contents("/var/db/pkg/" + package + "/CONTENTS") |
80 | entries = GLIUtility.parse_vdb_contents("/var/db/pkg/" + package + "/CONTENTS") |
|
|
81 | if not entries: |
|
|
82 | if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): no files for " + package + "...skipping tar and symlink fixup") |
|
|
83 | else: |
| 71 | if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot: files for " + package + ": " + str(entries)) |
84 | if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot: files for " + package + ": " + str(entries)) |
| 72 | try: |
85 | try: |
| 73 | tarfiles = open("/tmp/tarfilelist", "w") |
86 | tarfiles = open("/tmp/tarfilelist", "w") |
| 74 | for entry in entries: |
87 | for entry in entries: |
| 75 | parts = entry.split(" ") |
88 | parts = entry.split(" ") |
| 76 | # Hack for symlink crappiness |
89 | # Hack for symlink crappiness |
| 77 | for symlink in symlinks: |
90 | for symlink in symlinks: |
| 78 | if parts[0].startswith(symlink): |
91 | if parts[0].startswith(symlink): |
| 79 | parts[0] = symlinks[symlink] + parts[0][len(symlink):] |
92 | parts[0] = symlinks[symlink] + parts[0][len(symlink):] |
| 80 | tarfiles.write(parts[0] + "\n") |
93 | tarfiles.write(parts[0] + "\n") |
| 81 | tarfiles.close() |
94 | tarfiles.close() |
| 82 | except: |
95 | except: |
| 83 | raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Could not create filelist for " + package) |
96 | raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Could not create filelist for " + package) |
| 84 | |
97 | |
| 85 | # Use tar to transfer files into IMAGE directory |
98 | # Use tar to transfer files into IMAGE directory |
| 86 | tmpdir = "/var/tmp/portage" |
|
|
| 87 | image_dir = tmpdir + "/" + package.split("/")[1] + "/image" |
|
|
| 88 | if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): running 'mkdir -p " + self._chroot_dir + image_dir + " && tar -c --files-from=/tmp/tarfilelist --no-recursion 2>/dev/null | tar -C " + self._chroot_dir + image_dir + " -x'") |
99 | if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): running 'tar -c --files-from=/tmp/tarfilelist --no-recursion 2>/dev/null | tar -C " + self._chroot_dir + image_dir + " -x'") |
| 89 | if not GLIUtility.exitsuccess(GLIUtility.spawn("mkdir -p " + self._chroot_dir + image_dir + " && tar -c --files-from=/tmp/tarfilelist --no-recursion 2>/dev/null | tar -C " + self._chroot_dir + image_dir + " -x")): |
100 | if not GLIUtility.exitsuccess(GLIUtility.spawn("tar -c --files-from=/tmp/tarfilelist --no-recursion 2>/dev/null | tar -C " + self._chroot_dir + image_dir + " -x")): |
| 90 | raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Could not execute tar for " + package) |
101 | raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Could not execute tar for " + package) |
| 91 | |
102 | |
| 92 | # More symlink crappiness hacks |
103 | # More symlink crappiness hacks |
| 93 | for symlink in symlinks: |
104 | for symlink in symlinks: |
| 94 | if GLIUtility.is_file(self._chroot_dir + image_dir + symlinks[symlink]): |
105 | if GLIUtility.is_file(self._chroot_dir + image_dir + symlinks[symlink]): |
| 95 | # parts[0] = symlinks[symlink] + parts[len(symlink):] |
|
|
| 96 | if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): fixing /usr/livecd/gconf/ stuff in " + image_dir + " for " + package) |
106 | if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): fixing " + symlink + " symlink ickiness stuff in " + image_dir + " for " + package) |
| 97 | if not GLIUtility.exitsuccess(GLIUtility.spawn("mv " + self._chroot_dir + image_dir + symlinks[symlink] + " " + self._chroot_dir + image_dir + symlink)): |
107 | if not GLIUtility.exitsuccess(GLIUtility.spawn("mv " + self._chroot_dir + image_dir + symlinks[symlink] + " " + self._chroot_dir + image_dir + symlink)): |
| 98 | raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Could not fix /usr/livecd/gconf/ stuff for " + package) |
108 | raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Could not fix /usr/livecd/gconf/ stuff for " + package) |
| 99 | |
109 | |
| 100 | # Run pkg_setup |
110 | # Run pkg_setup |
| 101 | if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): running pkg_setup for " + package) |
111 | if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): running pkg_setup for " + package) |
| 102 | if not GLIUtility.exitsuccess(GLIUtility.spawn("env " + root_cmd + " PORTAGE_TMPDIR=" + portage_tmpdir + " ebuild /var/db/pkg/" + package + "/*.ebuild setup", chroot=tmp_chroot_dir)): |
112 | if not GLIUtility.exitsuccess(GLIUtility.spawn("env " + root_cmd + " PORTAGE_TMPDIR=" + portage_tmpdir + " ebuild /var/db/pkg/" + package + "/*.ebuild setup", chroot=tmp_chroot_dir)): |
| 103 | raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Could not execute pkg_setup for " + package) |
113 | raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Could not execute pkg_setup for " + package) |
| 104 | |
|
|
| 105 | # Run qmerge |
|
|
| 106 | # if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): running qmerge for " + package) |
|
|
| 107 | # if not GLIUtility.exitsuccess(GLIUtility.spawn("env ROOT=" + self._chroot_dir + " PORTAGE_TMPDIR=" + self._chroot_dir + tmpdir + " ebuild " + self._chroot_dir + "/var/db/pkg/" + package + "/*.ebuild qmerge")): |
|
|
| 108 | # raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Could not execute qmerge for " + package) |
|
|
| 109 | |
114 | |
| 110 | # Run pkg_preinst |
115 | # Run pkg_preinst |
| 111 | if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): running preinst for " + package) |
116 | if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): running preinst for " + package) |
| 112 | if not GLIUtility.exitsuccess(GLIUtility.spawn("env " + root_cmd + " PORTAGE_TMPDIR=" + portage_tmpdir + " ebuild /var/db/pkg/" + package + "/*.ebuild preinst", chroot=tmp_chroot_dir)): |
117 | if not GLIUtility.exitsuccess(GLIUtility.spawn("env " + root_cmd + " PORTAGE_TMPDIR=" + portage_tmpdir + " ebuild /var/db/pkg/" + package + "/*.ebuild preinst", chroot=tmp_chroot_dir)): |
| 113 | raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Could not execute preinst for " + package) |
118 | raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Could not execute preinst for " + package) |
| 114 | |
119 | |
| 115 | # Copy files from image_dir to chroot |
120 | # Copy files from image_dir to chroot |
|
|
121 | if not entries: |
|
|
122 | self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): no files for " + package + "...skipping copy from image dir to /") |
|
|
123 | else: |
| 116 | if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): copying files from " + image_dir + " to / for " + package) |
124 | if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): copying files from " + image_dir + " to / for " + package) |
| 117 | if not GLIUtility.exitsuccess(GLIUtility.spawn("cp -a " + self._chroot_dir + image_dir + "/* " + self._chroot_dir)): |
125 | if not GLIUtility.exitsuccess(GLIUtility.spawn("cp -a " + self._chroot_dir + image_dir + "/* " + self._chroot_dir)): |
| 118 | raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Could not copy files from " + image_dir + " to / for " + package) |
126 | raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Could not copy files from " + image_dir + " to / for " + package) |
| 119 | |
127 | |
| 120 | # Run pkg_postinst |
128 | # Run pkg_postinst |
| 121 | if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): running postinst for " + package) |
129 | if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): running postinst for " + package) |
| 122 | if not GLIUtility.exitsuccess(GLIUtility.spawn("env " + root_cmd + " PORTAGE_TMPDIR=" + portage_tmpdir + " ebuild /var/db/pkg/" + package + "/*.ebuild postinst", chroot=tmp_chroot_dir)): |
130 | if not GLIUtility.exitsuccess(GLIUtility.spawn("env " + root_cmd + " PORTAGE_TMPDIR=" + portage_tmpdir + " ebuild /var/db/pkg/" + package + "/*.ebuild postinst", chroot=tmp_chroot_dir)): |
| 123 | raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Could not execute postinst for " + package) |
131 | raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Could not execute postinst for " + package) |
| 124 | |
132 | |
| 125 | # Remove image_dir |
133 | # Remove image_dir |
| 126 | if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): removing + " + image_dir + " for " + package) |
134 | if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): removing " + image_dir + " for " + package) |
| 127 | if not GLIUtility.exitsuccess(GLIUtility.spawn("rm -rf " + self._chroot_dir + image_dir)): |
135 | if not GLIUtility.exitsuccess(GLIUtility.spawn("rm -rf " + self._chroot_dir + image_dir)): |
| 128 | raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Could not remove + " + image_dir + " for " + package) |
136 | raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Could not remove + " + image_dir + " for " + package) |
| 129 | |
137 | |
| 130 | def add_pkg_to_world(self, package): |
138 | def add_pkg_to_world(self, package): |
| 131 | if package.find("/") == -1: |
139 | if package.find("/") == -1: |
| … | |
… | |
| 150 | packages = packages.split() |
158 | packages = packages.split() |
| 151 | pkglist = self.get_deps(packages) |
159 | pkglist = self.get_deps(packages) |
| 152 | if self._debug: self._logger.log("install_packages(): pkglist is " + str(pkglist)) |
160 | if self._debug: self._logger.log("install_packages(): pkglist is " + str(pkglist)) |
| 153 | for i, pkg in enumerate(pkglist): |
161 | for i, pkg in enumerate(pkglist): |
| 154 | if self._debug: self._logger.log("install_packages(): processing package " + pkg) |
162 | if self._debug: self._logger.log("install_packages(): processing package " + pkg) |
| 155 | self._cc.add_notification("progress", (float(i) / len(pkglist), "Emerging " + pkg + " (" + str(i+1) + "/" + str(len(pkglist)) + ")")) |
163 | self._cc.addNotification("progress", (float(i) / len(pkglist), "Emerging " + pkg + " (" + str(i+1) + "/" + str(len(pkglist)) + ")")) |
| 156 | if not self.get_best_version_vdb("=" + pkg): |
164 | if not self._grp_install or not self.get_best_version_vdb("=" + pkg): |
| 157 | status = GLIUtility.spawn("emerge -1 =" + pkg, display_on_tty8=True, chroot=self._chroot_dir, logfile=self._compile_logfile, append_log=True) |
165 | status = GLIUtility.spawn("emerge -1 =" + pkg, display_on_tty8=True, chroot=self._chroot_dir, logfile=self._compile_logfile, append_log=True) |
| 158 | # status = self._emerge("=" + pkg) |
166 | # status = self._emerge("=" + pkg) |
| 159 | if not GLIUtility.exitsuccess(status): |
167 | if not GLIUtility.exitsuccess(status): |
| 160 | raise GLIException("EmergePackageError", "fatal", "emerge", "Could not emerge " + pkg + "!") |
168 | raise GLIException("EmergePackageError", "fatal", "emerge", "Could not emerge " + pkg + "!") |
| 161 | else: |
169 | else: |
| 162 | # try: |
170 | # try: |
| 163 | self.copy_pkg_to_chroot(pkg) |
171 | self.copy_pkg_to_chroot(pkg) |
| 164 | # except: |
172 | # except: |
| 165 | # raise GLIException("EmergePackageError", "fatal", "emerge", "Could not emerge " + pkg + "!") |
173 | # raise GLIException("EmergePackageError", "fatal", "emerge", "Could not emerge " + pkg + "!") |
|
|
174 | self._cc.addNotification("progress", (float(i+1) / len(pkglist), "Done emerging " + pkg + " (" + str(i+1) + "/" + str(len(pkglist)) + ")")) |
| 166 | if add_to_world: |
175 | if add_to_world: |
| 167 | for package in packages: |
176 | for package in packages: |
| 168 | self.add_pkg_to_world(package) |
177 | self.add_pkg_to_world(package) |