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

Contents of /branches/overhaul/src/GLIPortage.py

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1291 - (hide annotations) (download) (as text)
Fri Feb 10 02:01:58 2006 UTC (8 years, 8 months ago) by agaffney
Original Path: trunk/src/GLIPortage.py
File MIME type: text/x-python
File size: 12050 byte(s)
  src/GLIPortage.py:
  use tar to transfer files from image dir to /mnt/gentoo instead of 'cp -a'
  src/GLIStorageDevice.py,src/GLIInstallProfile.py,src/templates/x86AT.py:
  'resized' flag

1 agaffney 1181 """
2     # Copyright 1999-2005 Gentoo Foundation
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
5     # of which can be found in the main directory of this project.
6     Gentoo Linux Installer
7    
8 agaffney 1291 $Id: GLIPortage.py,v 1.39 2006/02/10 02:01:58 agaffney Exp $
9 agaffney 1181 """
10    
11 agaffney 1182 import re
12 agaffney 1216 import os
13 agaffney 1181 import GLIUtility
14 agaffney 1204 from GLIException import GLIException
15 agaffney 1181
16     class GLIPortage(object):
17    
18 agaffney 1205 def __init__(self, chroot_dir, grp_install, logger, debug, cc, compile_logfile):
19 agaffney 1182 self._chroot_dir = chroot_dir
20 agaffney 1189 self._grp_install = grp_install
21 agaffney 1182 self._logger = logger
22     self._debug = debug
23 agaffney 1205 self._cc = cc
24     self._compile_logfile = compile_logfile
25 agaffney 1181
26 agaffney 1183 def get_deps(self, pkgs):
27 agaffney 1189 pkglist = []
28     if isinstance(pkgs, str):
29     pkgs = pkgs.split()
30     for pkg in pkgs:
31 agaffney 1190 if self._debug: self._logger.log("get_deps(): pkg is " + pkg)
32 agaffney 1189 if not self._grp_install or not self.get_best_version_vdb(pkg):
33 agaffney 1190 if self._debug: self._logger.log("get_deps(): grabbing compile deps")
34 agaffney 1208 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 agaffney 1189 else:
36 agaffney 1190 if self._debug: self._logger.log("get_deps(): grabbing binary deps")
37 agaffney 1210 # The runtimedeps.py script generates a package install order that is *very* different from emerge itself
38     # tmppkglist = GLIUtility.spawn("python ../../runtimedeps.py " + self._chroot_dir + " " + pkg, return_output=True)[1].strip().split("\n")
39     tmppkglist = []
40 agaffney 1214 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"):
41 agaffney 1210 if self._debug: self._logger.log("get_deps(): looking at " + tmppkg)
42 agaffney 1211 if self.get_best_version_vdb("=" + tmppkg):
43 agaffney 1210 if self._debug: self._logger.log("get_deps(): package " + tmppkg + " in host vdb...adding to tmppkglist")
44     tmppkglist.append(tmppkg)
45 agaffney 1190 if self._debug: self._logger.log("get_deps(): deplist for " + pkg + ": " + str(tmppkglist))
46 agaffney 1189 for tmppkg in tmppkglist:
47 agaffney 1192 if self._debug: self._logger.log("get_deps(): checking to see if " + tmppkg + " is already in pkglist")
48 agaffney 1194 if not tmppkg in pkglist and not self.get_best_version_vdb_chroot("=" + tmppkg):
49 agaffney 1192 if self._debug: self._logger.log("get_deps(): adding " + tmppkg + " to pkglist")
50 agaffney 1189 pkglist.append(tmppkg)
51 agaffney 1190 if self._debug: self._logger.log("get_deps(): pkglist is " + str(pkglist))
52 agaffney 1189 return pkglist
53 agaffney 1182
54 agaffney 1221 def parse_vdb_contents(self, file):
55     entries = []
56     try:
57     vdbfile = open(file, "r")
58     except:
59     return entries
60     for line in vdbfile.readlines():
61     parts = line.strip().split(" ")
62     if parts[0] == "obj":
63     entries.append(parts[1])
64 agaffney 1222 # elif parts[0] == "dir":
65     # entries.append(parts[1] + "/")
66 agaffney 1221 elif parts[0] == "sym":
67     entries.append(" ".join(parts[1:4]))
68     entries.sort()
69     return entries
70    
71 agaffney 1280 def copy_pkg_to_chroot(self, package, use_root=False, ignore_missing=False):
72 agaffney 1221 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/',
74     '/etc/gconf': '/usr/livecd/gconf/' }
75 agaffney 1182
76 agaffney 1208 tmpdir = "/var/tmp/portage"
77     image_dir = tmpdir + "/" + package.split("/")[1] + "/image"
78 agaffney 1198 root_cmd = ""
79     tmp_chroot_dir = self._chroot_dir
80 agaffney 1204 portage_tmpdir = "/var/tmp/portage"
81 agaffney 1270 vdb_dir = "/var/db/pkg/"
82 agaffney 1198 if use_root:
83     root_cmd = "ROOT=" + self._chroot_dir
84 agaffney 1203 tmp_chroot_dir = ""
85 agaffney 1204 portage_tmpdir = self._chroot_dir + "/var/tmp/portage"
86 agaffney 1270 vdb_dir = self._chroot_dir + "/var/db/pkg/"
87 agaffney 1198
88 agaffney 1280 # 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)
96    
97 agaffney 1182 # 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)
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)):
100     raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Could not copy vdb entry for " + package)
101    
102 agaffney 1208 # 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 + "'")
104     if not GLIUtility.exitsuccess(GLIUtility.spawn("mkdir -p " + self._chroot_dir + image_dir)):
105     raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Could not create image dir for " + package)
106    
107 agaffney 1182 # Create list of files for tar to work with from CONTENTS file in vdb entry
108 agaffney 1221 entries = self.parse_vdb_contents("/var/db/pkg/" + package + "/CONTENTS")
109 agaffney 1208 if not entries:
110     if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): no files for " + package + "...skipping tar and symlink fixup")
111     else:
112     if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot: files for " + package + ": " + str(entries))
113     try:
114     tarfiles = open("/tmp/tarfilelist", "w")
115     for entry in entries:
116     parts = entry.split(" ")
117 agaffney 1222 # # Hack for symlink crappiness
118 agaffney 1221 # for symlink in symlinks:
119     # if parts[0].startswith(symlink):
120     # parts[0] = symlinks[symlink] + parts[0][len(symlink):]
121 agaffney 1208 tarfiles.write(parts[0] + "\n")
122     tarfiles.close()
123     except:
124     raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Could not create filelist for " + package)
125 agaffney 1182
126 agaffney 1208 # Use tar to transfer files into IMAGE directory
127 agaffney 1222 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")):
129 agaffney 1208 raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Could not execute tar for " + package)
130 agaffney 1182
131 agaffney 1221 # # More symlink crappiness hacks
132     # for symlink in symlinks:
133     ## if GLIUtility.is_file(self._chroot_dir + image_dir + symlinks[symlink]):
134     # if os.path.islink(self._chroot_dir + image_dir + symlink):
135     # if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): fixing " + symlink + " symlink ickiness stuff in " + image_dir + " for " + package)
136     # GLIUtility.spawn("rm " + 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)):
138     # raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Could not fix " + symlink + " symlink ickiness for " + package)
139 agaffney 1182
140     # Run pkg_setup
141     if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): running pkg_setup for " + package)
142 agaffney 1269 if not GLIUtility.exitsuccess(GLIUtility.spawn("env " + root_cmd + " PORTAGE_TMPDIR=" + portage_tmpdir + " ebuild " + vdb_dir + package + "/*.ebuild setup", chroot=tmp_chroot_dir)):
143 agaffney 1182 raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Could not execute pkg_setup for " + package)
144    
145     # Run pkg_preinst
146     if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): running preinst for " + package)
147 agaffney 1269 if not GLIUtility.exitsuccess(GLIUtility.spawn("env " + root_cmd + " PORTAGE_TMPDIR=" + portage_tmpdir + " ebuild " + vdb_dir + package + "/*.ebuild preinst", chroot=tmp_chroot_dir)):
148 agaffney 1182 raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Could not execute preinst for " + package)
149    
150     # Copy files from image_dir to chroot
151 agaffney 1208 if not entries:
152 agaffney 1209 if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): no files for " + package + "...skipping copy from image dir to /")
153 agaffney 1208 else:
154     if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): copying files from " + image_dir + " to / for " + package)
155 agaffney 1291 # 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")):
157 agaffney 1208 raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Could not copy files from " + image_dir + " to / for " + package)
158 agaffney 1182
159     # Run pkg_postinst
160     if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): running postinst for " + package)
161 agaffney 1269 if not GLIUtility.exitsuccess(GLIUtility.spawn("env " + root_cmd + " PORTAGE_TMPDIR=" + portage_tmpdir + " ebuild " + vdb_dir + package + "/*.ebuild postinst", chroot=tmp_chroot_dir)):
162 agaffney 1182 raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Could not execute postinst for " + package)
163    
164     # Remove image_dir
165 agaffney 1208 if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): removing " + image_dir + " for " + package)
166 agaffney 1182 if not GLIUtility.exitsuccess(GLIUtility.spawn("rm -rf " + self._chroot_dir + image_dir)):
167     raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Could not remove + " + image_dir + " for " + package)
168    
169     def add_pkg_to_world(self, package):
170     if package.find("/") == -1:
171 agaffney 1195 package = self.get_best_version_vdb_chroot(package)
172 agaffney 1182 if not package: return False
173 agaffney 1205 expr = re.compile('^=?(.+?/.+?)(-\d.+)?$')
174 agaffney 1182 res = expr.match(package)
175     if res:
176     GLIUtility.spawn("echo " + res.group(1) + " >> " + self._chroot_dir + "/var/lib/portage/world")
177    
178 agaffney 1185 def get_best_version_vdb(self, package):
179 agaffney 1285 if package.startswith('='):
180     package = package[1:]
181     if GLIUtility.is_file("/var/db/pkg/" + package):
182     return package
183 agaffney 1286 else:
184     return ""
185 agaffney 1285 else:
186     return GLIUtility.spawn("portageq best_version / " + package, return_output=True)[1].strip()
187 agaffney 1189
188 agaffney 1194 def get_best_version_vdb_chroot(self, package):
189 agaffney 1287 if package.startswith('='):
190     package = package[1:]
191     if GLIUtility.is_file(self._chroot_dir + "/var/db/pkg/" + package):
192     return package
193     else:
194     return ""
195     else:
196     return GLIUtility.spawn("portageq best_version / " + package, chroot=self._chroot_dir, return_output=True)[1].strip()
197 agaffney 1194
198 agaffney 1184 # def get_best_version_tree(self, package):
199     # return portage.best(tree.match(package))
200 agaffney 1205
201     def emerge(self, packages, add_to_world=True):
202     if isinstance(packages, str):
203     packages = packages.split()
204 agaffney 1223 self._cc.addNotification("progress", (0, "Calculating dependencies for " + " ".join(packages)))
205 agaffney 1205 pkglist = self.get_deps(packages)
206     if self._debug: self._logger.log("install_packages(): pkglist is " + str(pkglist))
207     for i, pkg in enumerate(pkglist):
208     if self._debug: self._logger.log("install_packages(): processing package " + pkg)
209 agaffney 1208 self._cc.addNotification("progress", (float(i) / len(pkglist), "Emerging " + pkg + " (" + str(i+1) + "/" + str(len(pkglist)) + ")"))
210     if not self._grp_install or not self.get_best_version_vdb("=" + pkg):
211 agaffney 1205 status = GLIUtility.spawn("emerge -1 =" + pkg, display_on_tty8=True, chroot=self._chroot_dir, logfile=self._compile_logfile, append_log=True)
212     # status = self._emerge("=" + pkg)
213     if not GLIUtility.exitsuccess(status):
214     raise GLIException("EmergePackageError", "fatal", "emerge", "Could not emerge " + pkg + "!")
215     else:
216     # try:
217     self.copy_pkg_to_chroot(pkg)
218     # except:
219     # raise GLIException("EmergePackageError", "fatal", "emerge", "Could not emerge " + pkg + "!")
220 agaffney 1208 self._cc.addNotification("progress", (float(i+1) / len(pkglist), "Done emerging " + pkg + " (" + str(i+1) + "/" + str(len(pkglist)) + ")"))
221 agaffney 1205 if add_to_world:
222     for package in packages:
223     self.add_pkg_to_world(package)

Properties

Name Value
svn:eol-style native

  ViewVC Help
Powered by ViewVC 1.1.20