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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1297 - (hide annotations) (download) (as text)
Sat Feb 11 17:26:33 2006 UTC (8 years, 7 months ago) by agaffney
Original Path: trunk/src/GLIPortage.py
File MIME type: text/x-python
File size: 12405 byte(s)
  src/GLIPortage.py:
  run env-update at the end of copy_pkg_to_chroot()

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 1297 $Id: GLIPortage.py,v 1.40 2006/02/11 17:26:33 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 agaffney 1297 # 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)
174    
175 agaffney 1182 def add_pkg_to_world(self, package):
176     if package.find("/") == -1:
177 agaffney 1195 package = self.get_best_version_vdb_chroot(package)
178 agaffney 1182 if not package: return False
179 agaffney 1205 expr = re.compile('^=?(.+?/.+?)(-\d.+)?$')
180 agaffney 1182 res = expr.match(package)
181     if res:
182     GLIUtility.spawn("echo " + res.group(1) + " >> " + self._chroot_dir + "/var/lib/portage/world")
183    
184 agaffney 1185 def get_best_version_vdb(self, package):
185 agaffney 1285 if package.startswith('='):
186     package = package[1:]
187     if GLIUtility.is_file("/var/db/pkg/" + package):
188     return package
189 agaffney 1286 else:
190     return ""
191 agaffney 1285 else:
192     return GLIUtility.spawn("portageq best_version / " + package, return_output=True)[1].strip()
193 agaffney 1189
194 agaffney 1194 def get_best_version_vdb_chroot(self, package):
195 agaffney 1287 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:
202     return GLIUtility.spawn("portageq best_version / " + package, chroot=self._chroot_dir, return_output=True)[1].strip()
203 agaffney 1194
204 agaffney 1184 # def get_best_version_tree(self, package):
205     # return portage.best(tree.match(package))
206 agaffney 1205
207     def emerge(self, packages, add_to_world=True):
208     if isinstance(packages, str):
209     packages = packages.split()
210 agaffney 1223 self._cc.addNotification("progress", (0, "Calculating dependencies for " + " ".join(packages)))
211 agaffney 1205 pkglist = self.get_deps(packages)
212     if self._debug: self._logger.log("install_packages(): pkglist is " + str(pkglist))
213     for i, pkg in enumerate(pkglist):
214     if self._debug: self._logger.log("install_packages(): processing package " + pkg)
215 agaffney 1208 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):
217 agaffney 1205 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)
219     if not GLIUtility.exitsuccess(status):
220     raise GLIException("EmergePackageError", "fatal", "emerge", "Could not emerge " + pkg + "!")
221     else:
222     # try:
223     self.copy_pkg_to_chroot(pkg)
224     # except:
225     # raise GLIException("EmergePackageError", "fatal", "emerge", "Could not emerge " + pkg + "!")
226 agaffney 1208 self._cc.addNotification("progress", (float(i+1) / len(pkglist), "Done emerging " + pkg + " (" + str(i+1) + "/" + str(len(pkglist)) + ")"))
227 agaffney 1205 if add_to_world:
228     for package in packages:
229     self.add_pkg_to_world(package)

Properties

Name Value
svn:eol-style native

  ViewVC Help
Powered by ViewVC 1.1.20