/[gli]/branches/qs/src/GLIPortage.py
Gentoo

Diff of /branches/qs/src/GLIPortage.py

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

Revision 1297 Revision 1525
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.
6Gentoo Linux Installer 6Gentoo Linux Installer
7 7
8$Id: GLIPortage.py,v 1.40 2006/02/11 17:26:33 agaffney Exp $ 8$Id: GLIPortage.py,v 1.55 2006/09/13 16:50:23 agaffney Exp $
9""" 9"""
10 10
11import re 11import re
12import os 12import os
13import sys
13import GLIUtility 14import GLIUtility
14from GLIException import GLIException 15from GLIException import GLIException
15 16
16class GLIPortage(object): 17class GLIPortage(object):
17 18
26 def get_deps(self, pkgs): 27 def get_deps(self, pkgs):
27 pkglist = [] 28 pkglist = []
28 if isinstance(pkgs, str): 29 if isinstance(pkgs, str):
29 pkgs = pkgs.split() 30 pkgs = pkgs.split()
30 for pkg in pkgs: 31 for pkg in pkgs:
32 if not pkg: continue
31 if self._debug: self._logger.log("get_deps(): pkg is " + pkg) 33 if self._debug: self._logger.log("get_deps(): pkg is " + pkg)
32 if not self._grp_install or not self.get_best_version_vdb(pkg): 34 if not self._grp_install or not self.get_best_version_vdb(pkg):
33 if self._debug: self._logger.log("get_deps(): grabbing compile deps") 35 if self._debug: self._logger.log("get_deps(): grabbing compile deps")
34 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") 36 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")
35 else: 37 else:
47 if self._debug: self._logger.log("get_deps(): checking to see if " + tmppkg + " is already in pkglist") 49 if self._debug: self._logger.log("get_deps(): checking to see if " + tmppkg + " is already in pkglist")
48 if not tmppkg in pkglist and not self.get_best_version_vdb_chroot("=" + tmppkg): 50 if not tmppkg in pkglist and not self.get_best_version_vdb_chroot("=" + tmppkg):
49 if self._debug: self._logger.log("get_deps(): adding " + tmppkg + " to pkglist") 51 if self._debug: self._logger.log("get_deps(): adding " + tmppkg + " to pkglist")
50 pkglist.append(tmppkg) 52 pkglist.append(tmppkg)
51 if self._debug: self._logger.log("get_deps(): pkglist is " + str(pkglist)) 53 if self._debug: self._logger.log("get_deps(): pkglist is " + str(pkglist))
54 if not pkglist:
55 raise GLIException("GetDepListError", 'fatal', 'get_deps', "Dep list is empty. This usually means there is no portage tree in the chroot")
52 return pkglist 56 return pkglist
53 57
54 def parse_vdb_contents(self, file): 58 def parse_vdb_contents(self, file):
55 entries = [] 59 entries = []
56 try: 60 try:
71 def copy_pkg_to_chroot(self, package, use_root=False, ignore_missing=False): 75 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/', 76 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/', 77 '/opt': '/mnt/livecd/opt/', '/sbin': '/mnt/livecd/sbin/', '/usr': '/mnt/livecd/usr/',
74 '/etc/gconf': '/usr/livecd/gconf/' } 78 '/etc/gconf': '/usr/livecd/gconf/' }
75 79
76 tmpdir = "/var/tmp/portage" 80 tmpdir = "/var/tmp"
77 image_dir = tmpdir + "/" + package.split("/")[1] + "/image" 81 image_dir = tmpdir + "/portage/" + package.split("/")[1] + "/image"
78 root_cmd = "" 82 root_cmd = ""
79 tmp_chroot_dir = self._chroot_dir 83 tmp_chroot_dir = self._chroot_dir
80 portage_tmpdir = "/var/tmp/portage" 84 portage_tmpdir = "/var/tmp"
81 vdb_dir = "/var/db/pkg/" 85 vdb_dir = "/var/db/pkg/"
82 if use_root: 86 if use_root:
83 root_cmd = "ROOT=" + self._chroot_dir 87 root_cmd = "ROOT=" + self._chroot_dir
84 tmp_chroot_dir = "" 88 tmp_chroot_dir = ""
85 portage_tmpdir = self._chroot_dir + "/var/tmp/portage" 89 portage_tmpdir = self._chroot_dir + "/var/tmp"
86 vdb_dir = self._chroot_dir + "/var/db/pkg/" 90 vdb_dir = self._chroot_dir + "/var/db/pkg/"
91
92 # Create /tmp, /var/tmp, and /var/lib/portage with proper permissions
93 oldumask = os.umask(0)
94 if not os.path.exists(self._chroot_dir + "/tmp"):
95 if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): /tmp doesn't exist in chroot...creating with proper permissions")
96 try:
97 os.mkdir(self._chroot_dir + "/tmp", 01777)
98 except:
99 raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Failed to create /tmp in chroot")
100 if not os.path.exists(self._chroot_dir + "/var/tmp"):
101 if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): /var/tmp doesn't exist in chroot...creating with proper permissions")
102 try:
103 os.mkdir(self._chroot_dir + "/var", 0755)
104 except:
105 pass
106 try:
107 os.mkdir(self._chroot_dir + "/var/tmp", 01777)
108 except:
109 raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Failed to create /var/tmp in chroot")
110 if not os.path.exists(self._chroot_dir + "/var/lib/portage"):
111 if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): /var/lib/portage doesn't exist in chroot...creating with proper permissions")
112 try:
113 os.mkdir(self._chroot_dir + "/var/lib", 0755)
114 except:
115 pass
116 try:
117 os.mkdir(self._chroot_dir + "/var/lib/portage", 02750)
118 except:
119 raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Failed to create /var/lib/portage in chroot")
120 os.umask(oldumask)
87 121
88 # Check to see if package is actually in vdb 122 # Check to see if package is actually in vdb
89 if not GLIUtility.is_file("/var/db/pkg/" + package): 123 if not GLIUtility.is_file("/var/db/pkg/" + package):
90 if ignore_missing: 124 if ignore_missing:
91 if self._debug: 125 if self._debug:
94 else: 128 else:
95 raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "There is no vdb entry for " + package) 129 raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "There is no vdb entry for " + package)
96 130
97 # Copy the vdb entry for the package from the LiveCD to the chroot 131 # Copy the vdb entry for the package from the LiveCD to the chroot
98 if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): copying vdb entry for " + package) 132 if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): copying vdb entry for " + 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)): 133 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, logfile=self._compile_logfile, append_log=True)):
100 raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Could not copy vdb entry for " + package) 134 raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Could not copy vdb entry for " + package)
101 135
102 # Create the image dir in the chroot 136 # Create the image dir in the chroot
103 if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): running 'mkdir -p " + self._chroot_dir + image_dir + "'") 137 if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): running 'mkdir -p " + self._chroot_dir + image_dir + "'")
104 if not GLIUtility.exitsuccess(GLIUtility.spawn("mkdir -p " + self._chroot_dir + image_dir)): 138 if not GLIUtility.exitsuccess(GLIUtility.spawn("mkdir -p " + self._chroot_dir + image_dir, logfile=self._compile_logfile, append_log=True)):
105 raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Could not create image dir for " + package) 139 raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Could not create image dir for " + package)
106 140
107 # Create list of files for tar to work with from CONTENTS file in vdb entry 141 # Create list of files for tar to work with from CONTENTS file in vdb entry
108 entries = self.parse_vdb_contents("/var/db/pkg/" + package + "/CONTENTS") 142 entries = self.parse_vdb_contents("/var/db/pkg/" + package + "/CONTENTS")
109 if not entries: 143 if not entries:
110 if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): no files for " + package + "...skipping tar and symlink fixup") 144 if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): no files for " + package + "...skipping tar and symlink fixup")
111 else: 145 else:
112 if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot: files for " + package + ": " + str(entries)) 146# if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot: files for " + package + ": " + str(entries))
113 try: 147 try:
114 tarfiles = open("/tmp/tarfilelist", "w") 148 tarfiles = open("/tmp/tarfilelist", "w")
115 for entry in entries: 149 for entry in entries:
116 parts = entry.split(" ") 150 parts = entry.split(" ")
117# # Hack for symlink crappiness 151# # Hack for symlink crappiness
123 except: 157 except:
124 raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Could not create filelist for " + package) 158 raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Could not create filelist for " + package)
125 159
126 # Use tar to transfer files into IMAGE directory 160 # Use tar to transfer files into IMAGE directory
127 if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): running 'tar -cp --files-from=/tmp/tarfilelist --no-recursion 2>/dev/null | tar -C " + self._chroot_dir + image_dir + " -xp'") 161 if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): running 'tar -cp --files-from=/tmp/tarfilelist --no-recursion 2>/dev/null | tar -C " + self._chroot_dir + image_dir + " -xp'")
128 if not GLIUtility.exitsuccess(GLIUtility.spawn("tar -cp --files-from=/tmp/tarfilelist --no-recursion 2>/dev/null | tar -C " + self._chroot_dir + image_dir + " -xp")): 162 if not GLIUtility.exitsuccess(GLIUtility.spawn("tar -cp --files-from=/tmp/tarfilelist --no-recursion 2>/dev/null | tar -C " + self._chroot_dir + image_dir + " -xp", logfile=self._compile_logfile, append_log=True)):
129 raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Could not execute tar for " + package) 163 raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Could not execute tar for " + package)
164
165 # Fix mode, uid, and gid of directories
166 if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): running find " + self._chroot_dir + image_dir + " -mindepth 1 -type d 2>/dev/null | sed -e 's:^" + self._chroot_dir + image_dir + "::' | grep -v '^$'")
167 dirlist = GLIUtility.spawn("find " + self._chroot_dir + image_dir + " -mindepth 1 -type d 2>/dev/null | sed -e 's:^" + self._chroot_dir + image_dir + "::' | grep -v '^$'", return_output=True)[1].strip().split("\n")
168 if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): found the following directories: " + str(dirlist))
169 if not dirlist or dirlist[0] == "":
170 raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "directory list entry for " + package + "...this shouldn't happen!")
171 for dir in dirlist:
172 dirstat = os.stat(dir)
173 if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): setting mode " + str(dirstat[0]) + " and uid/gid " + str(dirstat[4]) + "/" + str(dirstat[5]) + " for directory " + self._chroot_dir + image_dir + dir)
174 os.chown(self._chroot_dir + image_dir + dir, dirstat[4], dirstat[5])
175 os.chmod(self._chroot_dir + image_dir + dir, dirstat[0])
130 176
131# # More symlink crappiness hacks 177# # More symlink crappiness hacks
132# for symlink in symlinks: 178# for symlink in symlinks:
133## if GLIUtility.is_file(self._chroot_dir + image_dir + symlinks[symlink]): 179## if GLIUtility.is_file(self._chroot_dir + image_dir + symlinks[symlink]):
134# if os.path.islink(self._chroot_dir + image_dir + symlink): 180# if os.path.islink(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)): 183# if not GLIUtility.exitsuccess(GLIUtility.spawn("mv " + self._chroot_dir + image_dir + symlinks[symlink] + " " + self._chroot_dir + image_dir + symlink)):
138# raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Could not fix " + symlink + " symlink ickiness for " + package) 184# raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Could not fix " + symlink + " symlink ickiness for " + package)
139 185
140 # Run pkg_setup 186 # Run pkg_setup
141 if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): running pkg_setup for " + package) 187 if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): running pkg_setup for " + package)
142 if not GLIUtility.exitsuccess(GLIUtility.spawn("env " + root_cmd + " PORTAGE_TMPDIR=" + portage_tmpdir + " ebuild " + vdb_dir + package + "/*.ebuild setup", chroot=tmp_chroot_dir)): 188 if not GLIUtility.exitsuccess(GLIUtility.spawn("env " + root_cmd + " PORTAGE_TMPDIR=" + portage_tmpdir + " FEATURES=noauto ebuild " + vdb_dir + package + "/*.ebuild setup", chroot=tmp_chroot_dir, logfile=self._compile_logfile, append_log=True)):
143 raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Could not execute pkg_setup for " + package) 189 raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Could not execute pkg_setup for " + package)
144 190
145 # Run pkg_preinst 191 # Run pkg_preinst
146 if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): running preinst for " + package) 192 if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): running preinst for " + package)
147 if not GLIUtility.exitsuccess(GLIUtility.spawn("env " + root_cmd + " PORTAGE_TMPDIR=" + portage_tmpdir + " ebuild " + vdb_dir + package + "/*.ebuild preinst", chroot=tmp_chroot_dir)): 193 if not GLIUtility.exitsuccess(GLIUtility.spawn("env " + root_cmd + " PORTAGE_TMPDIR=" + portage_tmpdir + " FEATURES=noauto ebuild " + vdb_dir + package + "/*.ebuild preinst", chroot=tmp_chroot_dir, logfile=self._compile_logfile, append_log=True)):
148 raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Could not execute preinst for " + package) 194 raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Could not execute preinst for " + package)
149 195
150 # Copy files from image_dir to chroot 196 # Copy files from image_dir to chroot
151 if not entries: 197 if not entries:
152 if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): no files for " + package + "...skipping copy from image dir to /") 198 if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): no files for " + package + "...skipping copy from image dir to /")
153 else: 199 else:
154 if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): copying files from " + image_dir + " to / for " + package) 200 if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): copying files from " + image_dir + " to / for " + package)
155# if not GLIUtility.exitsuccess(GLIUtility.spawn("cp -a " + self._chroot_dir + image_dir + "/* " + self._chroot_dir)): 201# 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")): 202 if not GLIUtility.exitsuccess(GLIUtility.spawn("tar -C " + self._chroot_dir + image_dir + "/ -cp . | tar -C " + self._chroot_dir + "/ -xp", logfile=self._compile_logfile, append_log=True)):
157 raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Could not copy files from " + image_dir + " to / for " + package) 203 raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Could not copy files from " + image_dir + " to / for " + package)
158 204
159 # Run pkg_postinst 205 # Run pkg_postinst
160 if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): running postinst for " + package) 206 if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): running postinst for " + package)
161 if not GLIUtility.exitsuccess(GLIUtility.spawn("env " + root_cmd + " PORTAGE_TMPDIR=" + portage_tmpdir + " ebuild " + vdb_dir + package + "/*.ebuild postinst", chroot=tmp_chroot_dir)): 207 if not GLIUtility.exitsuccess(GLIUtility.spawn("env " + root_cmd + " PORTAGE_TMPDIR=" + portage_tmpdir + " FEATURES=noauto ebuild " + vdb_dir + package + "/*.ebuild postinst", chroot=tmp_chroot_dir, logfile=self._compile_logfile, append_log=True)):
162 raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Could not execute postinst for " + package) 208 raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Could not execute postinst for " + package)
163 209
164 # Remove image_dir 210 # Remove image_dir
165 if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): removing " + image_dir + " for " + package) 211 if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): removing " + image_dir + " for " + package)
166 if not GLIUtility.exitsuccess(GLIUtility.spawn("rm -rf " + self._chroot_dir + image_dir)): 212 if not GLIUtility.exitsuccess(GLIUtility.spawn("rm -rf " + self._chroot_dir + image_dir, logfile=self._compile_logfile, append_log=True)):
167 raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Could not remove + " + image_dir + " for " + package) 213 raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Could not remove + " + image_dir + " for " + package)
168 214
169 # Run env-update 215 # Run env-update
170 if not use_root: 216 if not use_root:
171 if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): running env-update inside chroot") 217 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)): 218 if not GLIUtility.exitsuccess(GLIUtility.spawn("env-update", chroot=self._chroot_dir, logfile=self._compile_logfile, append_log=True)):
173 raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Could not run env-update for " + package) 219 raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Could not run env-update for " + package)
174 220
175 def add_pkg_to_world(self, package): 221 def add_pkg_to_world(self, package):
176 if package.find("/") == -1: 222 if package.find("/") == -1:
177 package = self.get_best_version_vdb_chroot(package) 223 package = self.get_best_version_vdb_chroot(package)
209 packages = packages.split() 255 packages = packages.split()
210 self._cc.addNotification("progress", (0, "Calculating dependencies for " + " ".join(packages))) 256 self._cc.addNotification("progress", (0, "Calculating dependencies for " + " ".join(packages)))
211 pkglist = self.get_deps(packages) 257 pkglist = self.get_deps(packages)
212 if self._debug: self._logger.log("install_packages(): pkglist is " + str(pkglist)) 258 if self._debug: self._logger.log("install_packages(): pkglist is " + str(pkglist))
213 for i, pkg in enumerate(pkglist): 259 for i, pkg in enumerate(pkglist):
260 if not pkg: continue
214 if self._debug: self._logger.log("install_packages(): processing package " + pkg) 261 if self._debug: self._logger.log("install_packages(): processing package " + pkg)
215 self._cc.addNotification("progress", (float(i) / len(pkglist), "Emerging " + pkg + " (" + str(i+1) + "/" + str(len(pkglist)) + ")")) 262 self._cc.addNotification("progress", (float(i) / len(pkglist), "Emerging " + pkg + " (" + str(i+1) + "/" + str(len(pkglist)) + ")"))
216 if not self._grp_install or not self.get_best_version_vdb("=" + pkg): 263 if not self._grp_install or not self.get_best_version_vdb("=" + pkg):
217 status = GLIUtility.spawn("emerge -1 =" + pkg, display_on_tty8=True, chroot=self._chroot_dir, logfile=self._compile_logfile, append_log=True) 264 status = GLIUtility.spawn("emerge -1 =" + pkg, display_on_tty8=True, chroot=self._chroot_dir, logfile=self._compile_logfile, append_log=True)
218# status = self._emerge("=" + pkg) 265# status = self._emerge("=" + pkg)
225# raise GLIException("EmergePackageError", "fatal", "emerge", "Could not emerge " + pkg + "!") 272# raise GLIException("EmergePackageError", "fatal", "emerge", "Could not emerge " + pkg + "!")
226 self._cc.addNotification("progress", (float(i+1) / len(pkglist), "Done emerging " + pkg + " (" + str(i+1) + "/" + str(len(pkglist)) + ")")) 273 self._cc.addNotification("progress", (float(i+1) / len(pkglist), "Done emerging " + pkg + " (" + str(i+1) + "/" + str(len(pkglist)) + ")"))
227 if add_to_world: 274 if add_to_world:
228 for package in packages: 275 for package in packages:
229 self.add_pkg_to_world(package) 276 self.add_pkg_to_world(package)
277
278
279def usage(progname):
280 print """
281Usage: %s [-c|--chroot-dir <chroot directory>] [-g|--grp] [-s|--stage3] [-h|--help]
282
283Options:
284
285 -c|--chroot-dir Specifies the directory where your chroot is. This is
286 "/mnt/gentoo" by default.
287
288 -g|--grp Install specified packages and dependencies into chroot
289 by using files from the LiveCD.
290
291 -s|--stage3 Create a stage3 equivelant in the chroot directory by using
292 files from the LiveCD.
293
294 -h|--help Display this help
295""" % (progname)
296
297if __name__ == "__main__":
298 chroot_dir = "/mnt/gentoo"
299 mode = None
300 grp_packages = []
301 progname = sys.argv.pop(0)
302 while len(sys.argv):
303 arg = sys.argv.pop(0)
304 if arg == "-c" or arg == "--chroot-dir":
305 chroot_dir = sys.argv.pop(0)
306 elif arg == "-g" or arg == "--grp":
307 mode = "grp"
308 elif arg == "-s" or arg == "--stage3":
309 mode = "stage3"
310 elif arg == "-h" or arg == "--help":
311 usage(progname)
312 sys.exit(0)
313 elif arg[0] == "-":
314 usage(progname)
315 sys.exit(1)
316 else:
317 grp_packages.append(arg)
318
319 gliportage = GLIPortage(chroot_dir, True, None, False, None, None)
320 if mode == "stage3":
321 if not GLIUtility.is_file("/usr/livecd/systempkgs.txt"):
322 print "Required file /usr/livecd/systempkgs.txt does not exist!"
323 sys.exit(1)
324 try:
325 syspkgs = open("/usr/livecd/systempkgs.txt", "r")
326 systempkgs = syspkgs.readlines()
327 syspkgs.close()
328 except:
329 print "Could not open /usr/livecd/systempkgs.txt!"
330 sys.exit(1)
331
332 # Pre-create /lib (and possible /lib32 and /lib64)
333 if os.path.islink("/lib") and os.readlink("/lib") == "lib64":
334 if not GLIUtility.exitsuccess(GLIUtility.spawn("mkdir " + chroot_dir + "/lib64 && ln -s lib64 " + chroot_dir + "/lib")):
335 print "Could not precreate /lib64 dir and /lib -> /lib64 symlink"
336 sys.exit(1)
337
338 syspkglen = len(systempkgs)
339 for i, pkg in enumerate(systempkgs):
340 pkg = pkg.strip()
341 print "Copying " + pkg + " (" + str(i+1) + "/" + str(syspkglen) + ")"
342 gliportage.copy_pkg_to_chroot(pkg, True, ignore_missing=True)
343 GLIUtility.spawn("cp /etc/make.conf " + chroot_dir + "/etc/make.conf")
344 GLIUtility.spawn("ln -s `readlink /etc/make.profile` " + chroot_dir + "/etc/make.profile")
345 GLIUtility.spawn("cp -f /etc/inittab.old " + chroot_dir + "/etc/inittab")
346
347 # Nasty, nasty, nasty hack because vapier is a tool
348 for tmpfile in ("/etc/passwd", "/etc/group", "/etc/shadow"):
349 GLIUtility.spawn("grep -ve '^gentoo' " + tmpfile + " > " + chroot_dir + tmpfile)
350
351 chrootscript = r"""
352 #!/bin/bash
353
354 source /etc/make.conf
355 export LDPATH="/usr/lib/gcc-lib/${CHOST}/$(cd /usr/lib/gcc-lib/${CHOST} && ls -1 | head -n 1)"
356
357 ldconfig $LDPATH
358 gcc-config 1
359 env-update
360 source /etc/profile
361 modules-update
362 [ -f /usr/bin/binutils-config ] && binutils-config 1
363 source /etc/profile
364 #mount -t proc none /proc
365 #cd /dev
366 #/sbin/MAKEDEV generic-i386
367 #umount /proc
368 [ -f /lib/udev-state/devices.tar.bz2 ] && tar -C /dev -xjf /lib/udev-state/devices.tar.bz2
369 """
370 script = open(chroot_dir + "/tmp/extrastuff.sh", "w")
371 script.write(chrootscript)
372 script.close()
373 GLIUtility.spawn("chmod 755 /tmp/extrastuff.sh && /tmp/extrastuff.sh", chroot=chroot_dir)
374 GLIUtility.spawn("rm -rf /var/tmp/portage/* /usr/portage /tmp/*", chroot=chroot_dir)
375 print "Stage3 equivelant generation complete!"
376 elif mode == "grp":
377 for pkg in grp_packages:
378 if not gliportage.get_best_version_vdb(pkg):
379 print "Package " + pkg + " is not available for install from the LiveCD"
380 continue
381 pkglist = gliportage.get_deps(pkg)
382 for i, tmppkg in enumerate(pkglist):
383 print "Copying " + tmppkg + " (" + str(i+1) + "/" + str(len(pkglist)) + ")"
384 gliportage.copy_pkg_to_chroot(tmppkg)
385 gliportage.add_pkg_to_world(pkg)
386 print "GRP install complete!"
387 else:
388 print "You must specify an operating mode (-g or -s)!"
389 usage(progname)
390 sys.exit(1)

Legend:
Removed from v.1297  
changed lines
  Added in v.1525

  ViewVC Help
Powered by ViewVC 1.1.20