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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1280 - (hide annotations) (download) (as text)
Tue Feb 7 02:05:39 2006 UTC (8 years, 6 months ago) by agaffney
Original Path: trunk/src/GLIPortage.py
File MIME type: text/x-python
File size: 11571 byte(s)
  src/GLIPortage, src/GLIArchitectureTemplate.py:
  ignore_missing flag for 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 1280 $Id: GLIPortage.py,v 1.35 2006/02/07 02:05:39 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     if not GLIUtility.exitsuccess(GLIUtility.spawn("cp -a " + self._chroot_dir + image_dir + "/* " + self._chroot_dir)):
156     raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Could not copy files from " + image_dir + " to / for " + package)
157 agaffney 1182
158     # Run pkg_postinst
159     if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): running postinst for " + package)
160 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)):
161 agaffney 1182 raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Could not execute postinst for " + package)
162    
163     # Remove image_dir
164 agaffney 1208 if self._debug: self._logger.log("DEBUG: copy_pkg_to_chroot(): removing " + image_dir + " for " + package)
165 agaffney 1182 if not GLIUtility.exitsuccess(GLIUtility.spawn("rm -rf " + self._chroot_dir + image_dir)):
166     raise GLIException("CopyPackageToChrootError", 'fatal', 'copy_pkg_to_chroot', "Could not remove + " + image_dir + " for " + package)
167    
168     def add_pkg_to_world(self, package):
169     if package.find("/") == -1:
170 agaffney 1195 package = self.get_best_version_vdb_chroot(package)
171 agaffney 1182 if not package: return False
172 agaffney 1205 expr = re.compile('^=?(.+?/.+?)(-\d.+)?$')
173 agaffney 1182 res = expr.match(package)
174     if res:
175     GLIUtility.spawn("echo " + res.group(1) + " >> " + self._chroot_dir + "/var/lib/portage/world")
176    
177 agaffney 1185 def get_best_version_vdb(self, package):
178     return GLIUtility.spawn("portageq best_version / " + package, return_output=True)[1].strip()
179 agaffney 1189
180 agaffney 1194 def get_best_version_vdb_chroot(self, package):
181 agaffney 1195 return GLIUtility.spawn("portageq best_version / " + package, chroot=self._chroot_dir, return_output=True)[1].strip()
182 agaffney 1194
183 agaffney 1184 # def get_best_version_tree(self, package):
184     # return portage.best(tree.match(package))
185 agaffney 1205
186     def emerge(self, packages, add_to_world=True):
187     if isinstance(packages, str):
188     packages = packages.split()
189 agaffney 1223 self._cc.addNotification("progress", (0, "Calculating dependencies for " + " ".join(packages)))
190 agaffney 1205 pkglist = self.get_deps(packages)
191     if self._debug: self._logger.log("install_packages(): pkglist is " + str(pkglist))
192     for i, pkg in enumerate(pkglist):
193     if self._debug: self._logger.log("install_packages(): processing package " + pkg)
194 agaffney 1208 self._cc.addNotification("progress", (float(i) / len(pkglist), "Emerging " + pkg + " (" + str(i+1) + "/" + str(len(pkglist)) + ")"))
195     if not self._grp_install or not self.get_best_version_vdb("=" + pkg):
196 agaffney 1205 status = GLIUtility.spawn("emerge -1 =" + pkg, display_on_tty8=True, chroot=self._chroot_dir, logfile=self._compile_logfile, append_log=True)
197     # status = self._emerge("=" + pkg)
198     if not GLIUtility.exitsuccess(status):
199     raise GLIException("EmergePackageError", "fatal", "emerge", "Could not emerge " + pkg + "!")
200     else:
201     # try:
202     self.copy_pkg_to_chroot(pkg)
203     # except:
204     # raise GLIException("EmergePackageError", "fatal", "emerge", "Could not emerge " + pkg + "!")
205 agaffney 1208 self._cc.addNotification("progress", (float(i+1) / len(pkglist), "Done emerging " + pkg + " (" + str(i+1) + "/" + str(len(pkglist)) + ")"))
206 agaffney 1205 if add_to_world:
207     for package in packages:
208     self.add_pkg_to_world(package)

Properties

Name Value
svn:eol-style native

  ViewVC Help
Powered by ViewVC 1.1.20