Added some tree scrubs to the code;
This commit is contained in:
parent
272ec190c7
commit
d58f206122
@ -461,12 +461,11 @@ class Lorax(object):
|
||||
return True
|
||||
|
||||
def create_install_image(self, type="squashfs"):
|
||||
# scrub the install tree
|
||||
install = images.Install(self.conf)
|
||||
install.run()
|
||||
|
||||
installimg = os.path.join(self.conf.imagesdir, "install.img")
|
||||
|
||||
if os.path.exists(installimg):
|
||||
os.unlink(installimg)
|
||||
|
||||
if type == "squashfs":
|
||||
cmd = "mksquashfs %s %s -all-root -no-fragments -no-progress" \
|
||||
% (self.conf.treedir, installimg)
|
||||
@ -474,8 +473,7 @@ class Lorax(object):
|
||||
err, output = commands.getstatusoutput(cmd)
|
||||
if err:
|
||||
self.se.info(output)
|
||||
# XXX this gives an error on read only filesystem
|
||||
#return False
|
||||
return False
|
||||
|
||||
elif type == "cramfs":
|
||||
if self.conf.buildarch == "sparc64":
|
||||
@ -505,6 +503,11 @@ class Lorax(object):
|
||||
return True
|
||||
|
||||
def create_boot_iso(self):
|
||||
bootiso = os.path.join(self.conf.imagesdir, "boot.iso")
|
||||
|
||||
if os.path.exists(bootiso):
|
||||
os.unlink(bootiso)
|
||||
|
||||
efiboot = os.path.join(self.conf.imagesdir, "efiboot.img")
|
||||
|
||||
if os.path.exists(efiboot):
|
||||
@ -520,9 +523,9 @@ class Lorax(object):
|
||||
biosargs = "-b isolinux/isolinux.bin -c isolinux/boot.cat" \
|
||||
" -no-emul-boot -boot-load-size 4 -boot-info-table"
|
||||
mkisocmd = "mkisofs -v -o %s %s %s -R -J -V %s -T -graft-points" \
|
||||
" isolinux=%s images=%s %s" % (os.path.join(self.conf.imagesdir,
|
||||
"boot.iso"), biosargs, efiargs, self.conf.product,
|
||||
self.conf.isolinuxdir, self.conf.imagesdir, efigraft)
|
||||
" isolinux=%s images=%s %s" % (bootiso, biosargs, efiargs,
|
||||
self.conf.product, self.conf.isolinuxdir, self.conf.imagesdir,
|
||||
efigraft)
|
||||
self.so.debug(mkisocmd)
|
||||
err, out = commands.getstatusoutput(mkisocmd)
|
||||
if err:
|
||||
@ -616,6 +619,10 @@ class Lorax(object):
|
||||
initrd.run()
|
||||
|
||||
self.so.header(":: Creating the install image")
|
||||
|
||||
self.so.info("Scrubbing the install tree")
|
||||
tree.scrub()
|
||||
|
||||
ok = self.create_install_image()
|
||||
if not ok:
|
||||
self.se.error("Unable to create the install image")
|
||||
|
@ -1,341 +0,0 @@
|
||||
import stat
|
||||
import commands
|
||||
import glob
|
||||
import fnmatch
|
||||
import pwd
|
||||
import grp
|
||||
|
||||
|
||||
class Lorax(object):
|
||||
|
||||
def scrub_treedir(self):
|
||||
# XXX here comes a lot of crazy tree modification stuff, beware! XXX
|
||||
|
||||
# create dogtail conf files
|
||||
dogtailconf = os.path.join(self.conf.datadir, 'dogtail', '%gconf.xml')
|
||||
if os.path.isfile(dogtailconf):
|
||||
dst = os.path.join(self.conf.treedir, '.gconf', 'desktop', 'gnome', 'interface')
|
||||
os.makedirs(dst)
|
||||
shutil.copy2(dogtailconf, dst)
|
||||
|
||||
touch(os.path.join(self.conf.treedir, '.gconf', 'desktop', '%gconf.xml'))
|
||||
touch(os.path.join(self.conf.treedir, '.gconf', 'desktop', 'gnome', '%gconf.xml'))
|
||||
|
||||
# XXX wth is this part useful for?
|
||||
|
||||
# XXX this one already exists
|
||||
#os.makedirs(os.path.join(self.conf.treedir, 'lib'))
|
||||
os.makedirs(os.path.join(self.conf.treedir, 'firmware'))
|
||||
os.makedirs(os.path.join(self.conf.treedir, 'modules'))
|
||||
|
||||
# XXX this will overwrite the modules which are installed, why would i want to do that?
|
||||
#os.symlink('/modules', os.path.join(self.conf.treedir, 'lib', 'modules'))
|
||||
#os.symlink('/firmware', os.path.join(self.conf.treedir, 'lib', 'firmware'))
|
||||
|
||||
# create debug dirs
|
||||
os.makedirs(os.path.join(self.conf.treedir, 'usr', 'lib', 'debug'))
|
||||
os.makedirs(os.path.join(self.conf.treedir, 'usr', 'src', 'debug'))
|
||||
|
||||
# copy stubs
|
||||
for file in ('raidstart', 'raidstop', 'losetup', 'list-harddrives', 'loadkeys', 'mknod',
|
||||
'syslogd'):
|
||||
src = os.path.join(self.conf.treedir, 'usr', 'lib', 'anaconda', file + '-stub')
|
||||
dst = os.path.join(self.conf.treedir, 'usr', 'bin', file)
|
||||
shutil.copy2(src, dst)
|
||||
|
||||
# move anaconda executable
|
||||
src = os.path.join(self.conf.treedir, 'usr', 'sbin', 'anaconda')
|
||||
dst = os.path.join(self.conf.treedir, 'usr', 'bin', 'anaconda')
|
||||
shutil.move(src, dst)
|
||||
|
||||
# move anaconda libraries
|
||||
src = os.path.join(self.conf.treedir, 'usr', 'lib', 'anaconda-runtime', 'lib*')
|
||||
dst = os.path.join(self.conf.treedir, 'usr', self.conf.libdir)
|
||||
for name in glob.iglob(src):
|
||||
shutil.move(name, dst)
|
||||
|
||||
# change tree permissions
|
||||
root_uid = pwd.getpwnam('root')[2]
|
||||
root_gid = grp.getgrnam('root')[2]
|
||||
|
||||
for root, files, dirs in os.walk(self.conf.treedir):
|
||||
os.chown(root, root_uid, root_gid)
|
||||
os.chmod(root, 0755)
|
||||
|
||||
for file in files:
|
||||
path = os.path.join(root, file)
|
||||
os.chown(path, root_uid, root_gid)
|
||||
|
||||
mode = os.stat(path).st_mode
|
||||
if (mode & stat.S_IXUSR) or (mode & stat.S_IXGRP) or (mode & stat.S_IXOTH):
|
||||
os.chmod(path, 0555)
|
||||
else:
|
||||
os.chmod(path, 0444)
|
||||
|
||||
# create ld.so.conf
|
||||
ldsoconf = os.path.join(self.conf.treedir, 'etc', 'ld.so.conf')
|
||||
touch(ldsoconf)
|
||||
|
||||
procdir = os.path.join(self.conf.treedir, 'proc')
|
||||
if not os.path.isdir(procdir):
|
||||
os.makedirs(procdir)
|
||||
os.system('mount -t proc proc %s' % procdir)
|
||||
|
||||
f = open(ldsoconf, 'w')
|
||||
f.write('/usr/kerberos/%s\n' % self.conf.libdir)
|
||||
f.close()
|
||||
|
||||
cwd = os.getcwd()
|
||||
os.chdir(self.conf.treedir)
|
||||
os.system('/usr/sbin/chroot %s /sbin/ldconfig' % self.conf.treedir)
|
||||
os.chdir(cwd)
|
||||
|
||||
if self.conf.buildarch not in ('s390', 's390x'):
|
||||
# XXX this is not in usr
|
||||
rm(os.path.join(self.conf.treedir, 'usr', 'sbin', 'ldconfig'))
|
||||
|
||||
# XXX why are we removing this?
|
||||
#rm(os.path.join(self.conf.treedir, 'etc', 'ld.so.conf'))
|
||||
os.system('umount %s' % procdir)
|
||||
|
||||
# figure out the gtk+ theme to keep
|
||||
gtkrc = os.path.join(self.conf.treedir, 'etc', 'gtk-2.0', 'gtkrc')
|
||||
gtk_theme_name = None
|
||||
gtk_engine = None
|
||||
gtk_icon_themes = []
|
||||
|
||||
if os.path.isfile(gtkrc):
|
||||
f = open(gtkrc, 'r')
|
||||
lines = f.readlines()
|
||||
f.close()
|
||||
|
||||
for line in lines:
|
||||
line = line.strip()
|
||||
if line.startswith('gtk-theme-name'):
|
||||
gtk_theme_name = line[line.find('=') + 1:]
|
||||
gtk_theme_name = gtk_theme_name.replace('"', '').strip()
|
||||
|
||||
# find the engine for this theme
|
||||
gtkrc = os.path.join(self.conf.treedir, 'usr', 'share', 'themes',
|
||||
gtk_theme_name, 'gtk-2.0', 'gtkrc')
|
||||
if os.path.isfile(gtkrc):
|
||||
f = open(gtkrc, 'r')
|
||||
engine_lines = f.readlines()
|
||||
f.close()
|
||||
|
||||
for engine_line in engine_lines:
|
||||
engine_line = engine_line.strip()
|
||||
if engine_line.find('engine') != -1:
|
||||
gtk_engine = engine_line[engine_line.find('"') + 1:]
|
||||
gtk_engine = gtk_engine.replace('"', '').strip()
|
||||
break
|
||||
|
||||
elif line.startswith('gtk-icon-theme-name'):
|
||||
icon_theme = line[line.find('=') + 1:]
|
||||
icon_theme = icon_theme.replace('"', '').strip()
|
||||
gtk_icon_themes.append(icon_theme)
|
||||
|
||||
# bring in all inherited themes
|
||||
while True:
|
||||
icon_theme_index = os.path.join(self.conf.treedir, 'usr', 'share', 'icons',
|
||||
icon_theme, 'index.theme')
|
||||
if os.path.isfile(icon_theme_index):
|
||||
inherits = False
|
||||
f = open(icon_theme_index, 'r')
|
||||
icon_lines = f.readlines()
|
||||
f.close()
|
||||
|
||||
for icon_line in icon_lines:
|
||||
icon_line = icon_line.strip()
|
||||
if icon_line.startswith('Inherits='):
|
||||
inherits = True
|
||||
icon_theme = icon_line[icon_line.find('=') + 1:]
|
||||
icon_theme = icon_theme.replace('"', '').strip()
|
||||
gtk_icon_themes.append(icon_theme)
|
||||
break
|
||||
|
||||
if not inherits:
|
||||
break
|
||||
else:
|
||||
break
|
||||
|
||||
# remove themes we don't need
|
||||
theme_path = os.path.join(self.conf.treedir, 'usr', 'share', 'themes')
|
||||
if os.path.isdir(theme_path):
|
||||
for theme in filter(lambda theme: theme != gtk_theme_name, os.listdir(theme_path)):
|
||||
theme = os.path.join(theme_path, theme)
|
||||
shutil.rmtree(theme, ignore_errors=True)
|
||||
|
||||
# remove icons we don't need
|
||||
icon_path = os.path.join(self.conf.treedir, 'usr', 'share', 'icons')
|
||||
if os.path.isdir(icon_path):
|
||||
for icon in filter(lambda icon: icon not in gtk_icon_themes, os.listdir(icon_path)):
|
||||
icon = os.path.join(icon_path, icon)
|
||||
shutil.rmtree(icon, ignore_errors=True)
|
||||
|
||||
# remove engines we don't need
|
||||
tmp_path = os.path.join(self.conf.treedir, 'usr', self.conf.libdir, 'gtk-2.0')
|
||||
if os.path.isdir(tmp_path):
|
||||
fnames = map(lambda fname: os.path.join(tmp_path, fname, 'engines'), os.listdir(tmp_path))
|
||||
dnames = filter(lambda fname: os.path.isdir(fname), fnames)
|
||||
for dir in dnames:
|
||||
engines = filter(lambda engine: engine.find(gtk_engine) == -1, os.listdir(dir))
|
||||
for engine in engines:
|
||||
engine = os.path.join(dir, engine)
|
||||
os.unlink(engine)
|
||||
|
||||
# remove locales
|
||||
langtable = os.path.join(self.conf.treedir, 'usr', 'lib', 'anaconda', 'lang-table')
|
||||
localepath = os.path.join(self.conf.treedir, 'usr', 'share', 'locale')
|
||||
if os.path.isfile(langtable):
|
||||
locales = set()
|
||||
all_locales = set()
|
||||
|
||||
f = open(langtable, 'r')
|
||||
lines = f.readlines()
|
||||
f.close()
|
||||
|
||||
for line in lines:
|
||||
line = line.strip()
|
||||
if not line or line.startswith('#'):
|
||||
continue
|
||||
|
||||
fields = line.split('\t')
|
||||
|
||||
if os.path.isdir(os.path.join(localepath, fields[1])):
|
||||
locales.add(fields[1])
|
||||
|
||||
locale = fields[3].split('.')[0]
|
||||
if os.path.isdir(os.path.join(localepath, locale)):
|
||||
locales.add(locale)
|
||||
|
||||
for locale in os.listdir(localepath):
|
||||
all_locales.add(locale)
|
||||
|
||||
locales_to_remove = list(all_locales.difference(locales))
|
||||
for locale in locales_to_remove:
|
||||
rmpath = os.path.join(localepath, locale)
|
||||
shutil.rmtree(rmpath, ignore_errors=True)
|
||||
|
||||
# fixup joe links
|
||||
joedir = os.path.join(self.conf.treedir, 'etc', 'joe')
|
||||
if os.path.isdir(joedir):
|
||||
os.symlink('jpicorc', os.path.join(joedir, 'picorc'))
|
||||
os.symlink('jpicorc', os.path.join(joedir, 'jnanorc'))
|
||||
os.symlink('jpicorc', os.path.join(joedir, 'nanorc'))
|
||||
os.symlink('jmacsrc', os.path.join(joedir, 'emacsrc'))
|
||||
os.symlink('jmacs', os.path.join(self.conf.treedir, 'usr', 'bin', 'emacs'))
|
||||
os.symlink('jpico', os.path.join(self.conf.treedir, 'usr', 'bin', 'pico'))
|
||||
os.symlink('jpico', os.path.join(self.conf.treedir, 'usr', 'bin', 'nano'))
|
||||
|
||||
# fix up some links for man page related stuff
|
||||
for file in ['nroff', 'groff', 'iconv', 'geqn', 'gtbl', 'gpic', 'grefer']:
|
||||
src = os.path.join('mnt', 'sysimage', 'usr', 'bin', file)
|
||||
dst = os.path.join(self.conf.treedir, 'usr', 'bin', file)
|
||||
if not os.path.isfile(dst):
|
||||
os.symlink(src, dst)
|
||||
|
||||
# create selinux config
|
||||
if os.path.exists(os.path.join(self.conf.treedir, 'etc', 'selinux', 'targeted')):
|
||||
src = os.path.join(self.conf.datadir, 'selinux', 'config')
|
||||
dst = os.path.join(self.conf.treedir, 'etc', 'selinux', 'config')
|
||||
shutil.copy2(src, dst)
|
||||
|
||||
# create libuser.conf
|
||||
src = os.path.join(self.conf.datadir, 'libuser', 'libuser.conf')
|
||||
dst = os.path.join(self.conf.treedir, 'etc', 'libuser.conf')
|
||||
shutil.copy2(src, dst)
|
||||
|
||||
# configure fedorakmod
|
||||
fedorakmodconf = os.path.join(self.conf.treedir, 'etc', 'yum', 'pluginconf.d',
|
||||
'fedorakmod.conf')
|
||||
replace(fedorakmodconf, r'\(installforallkernels\) = 0', r'\1 = 1')
|
||||
|
||||
# fix /etc/man.config to point into /mnt/sysimage
|
||||
manconfig = os.path.join(self.conf.treedir, 'etc', 'man.config')
|
||||
|
||||
# don't change MANPATH_MAP lines now
|
||||
replace(manconfig, r'^MANPATH[^_MAP][ \t]*', r'&/mnt/sysimage')
|
||||
# change MANPATH_MAP lines now
|
||||
replace(manconfig, r'^MANPATH_MAP[ \t]*[a-zA-Z0-9/]*[ \t]*', r'&/mnt/sysimage')
|
||||
|
||||
# move yum repos
|
||||
src = os.path.join(self.conf.treedir, 'etc', 'yum.repos.d')
|
||||
dst = os.path.join(self.conf.treedir, 'etc', 'anaconda.repos.d')
|
||||
shutil.move(src, dst)
|
||||
|
||||
# remove libunicode-lite
|
||||
rm(os.path.join(self.conf.treedir, 'usr', self.conf.libdir, 'libunicode-lite*'))
|
||||
|
||||
# make bash link
|
||||
# XXX already exists
|
||||
#if os.path.isfile(os.path.join(self.conf.treedir, 'bin', 'bash')):
|
||||
# rm(os.path.join(self.conf.treedir, 'bin', 'ash'))
|
||||
# os.symlink('bash', os.path.join(self.conf.treedir, 'bin', 'sh'))
|
||||
|
||||
# make awk link
|
||||
# XXX already exists
|
||||
#if os.path.isfile(os.path.join(self.conf.treedir, 'bin', 'gawk')):
|
||||
# os.symlink('awk', os.path.join(self.conf.treedir, 'bin', 'gawk'))
|
||||
|
||||
# copy bootloaders
|
||||
bootpath = os.path.join(self.conf.treedir, 'usr', 'lib', 'anaconda-runtime', 'boot')
|
||||
if not os.path.isdir(bootpath):
|
||||
os.makedirs(bootpath)
|
||||
|
||||
if self.conf.buildarch in ('i386', 'i586', 'x86_64'):
|
||||
for file in os.listdir(os.path.join(self.conf.treedir, 'boot')):
|
||||
if file.startswith('memtest'):
|
||||
src = os.path.join(self.conf.treedir, 'boot', file)
|
||||
dst = os.path.join(bootpath, file)
|
||||
shutil.copy2(src, dst)
|
||||
elif self.conf.buildarch in ('sparc',):
|
||||
for file in os.listdir(os.path.join(self.conf.treedir, 'boot')):
|
||||
if file.endswith('.b'):
|
||||
src = os.path.join(self.conf.treedir, 'boot', file)
|
||||
dst = os.path.join(bootpath, file)
|
||||
shutil.copy2(src, dst)
|
||||
elif self.conf.buildarch in ('ppc', 'ppc64'):
|
||||
src = os.path.join(self.conf.treedir, 'boot', 'efika.forth')
|
||||
shutil.copy2(src, bootpath)
|
||||
elif self.conf.buildarch in ('alpha',):
|
||||
src = os.path.join(self.conf.treedir, 'boot', 'bootlx')
|
||||
shutil.copy2(src, bootpath)
|
||||
elif self.conf.buildarch in ('ia64',):
|
||||
src = os.path.join(self.conf.treedir, 'boot', 'efi', 'EFI', 'redhat', '*')
|
||||
shutil.copy2(src, bootpath)
|
||||
|
||||
# remove not needed directories
|
||||
# XXX i need this for kernel
|
||||
#for dir in ('boot', 'home', 'root', 'tmp'):
|
||||
# rm(os.path.join(self.conf.treedir, dir))
|
||||
|
||||
# remove not needed files
|
||||
to_remove = set()
|
||||
for root, dirs, files in os.walk(self.conf.treedir):
|
||||
for file in files:
|
||||
path = os.path.join(root, file)
|
||||
if fnmatch.fnmatch(path, '*.a'):
|
||||
if path.find('kernel-wrapper/wrapper.a') == -1:
|
||||
to_remove.add(path)
|
||||
elif fnmatch.fnmatch(path, 'lib*.la'):
|
||||
if path.find('usr/' + self.conf.libdir + '/gtk-2.0') == -1:
|
||||
to_remove.add(path)
|
||||
elif fnmatch.fnmatch(path, '*.py'):
|
||||
to_remove.add(path + 'o')
|
||||
|
||||
rm(path + 'c')
|
||||
os.symlink('/dev/null', path + 'c')
|
||||
|
||||
for file in to_remove:
|
||||
rm(file)
|
||||
|
||||
# nuke some python stuff we don't need
|
||||
for fname in ['idle', 'distutils', 'bsddb', 'lib-old', 'hotshot', 'doctest.py', 'pydoc.py',
|
||||
'site-packages/japanese', 'site-packages/japanese.pth']:
|
||||
rm(os.path.join(self.conf.treedir, fname))
|
||||
|
||||
for fname in ['distutils', 'lib-dynload/japanese', 'encodings', 'compiler', 'email/test',
|
||||
'curses', 'pydoc.py']:
|
||||
rm(os.path.join(self.conf.treedir, 'usr', self.conf.libdir, 'python?.?', 'site-packages',
|
||||
fname))
|
@ -1,31 +1,66 @@
|
||||
#
|
||||
# images.py
|
||||
# lorax images manipulation
|
||||
#
|
||||
# Copyright (C) 2009 Red Hat, Inc.
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 2 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
# Red Hat Author(s): Martin Gracik <mgracik@redhat.com>
|
||||
#
|
||||
|
||||
import stat
|
||||
import commands
|
||||
import pwd
|
||||
import grp
|
||||
|
||||
class Install(object):
|
||||
def __init__(self, config):
|
||||
self.conf = config
|
||||
|
||||
def scrub(self):
|
||||
# change tree permissions
|
||||
root_uid = pwd.getpwnam('root')[2]
|
||||
root_gid = grp.getgrnam('root')[2]
|
||||
|
||||
for root, files, dirs in os.walk(self.conf.treedir):
|
||||
os.chown(root, root_uid, root_gid)
|
||||
os.chmod(root, 0755)
|
||||
|
||||
for file in files:
|
||||
path = os.path.join(root, file)
|
||||
os.chown(path, root_uid, root_gid)
|
||||
|
||||
mode = os.stat(path).st_mode
|
||||
if (mode & stat.S_IXUSR) or (mode & stat.S_IXGRP) or (mode & stat.S_IXOTH):
|
||||
os.chmod(path, 0555)
|
||||
else:
|
||||
os.chmod(path, 0444)
|
||||
|
||||
# create ld.so.conf
|
||||
ldsoconf = os.path.join(self.conf.treedir, 'etc', 'ld.so.conf')
|
||||
touch(ldsoconf)
|
||||
|
||||
procdir = os.path.join(self.conf.treedir, 'proc')
|
||||
if not os.path.isdir(procdir):
|
||||
os.makedirs(procdir)
|
||||
os.system('mount -t proc proc %s' % procdir)
|
||||
|
||||
f = open(ldsoconf, 'w')
|
||||
f.write('/usr/kerberos/%s\n' % self.conf.libdir)
|
||||
f.close()
|
||||
|
||||
cwd = os.getcwd()
|
||||
os.chdir(self.conf.treedir)
|
||||
os.system('/usr/sbin/chroot %s /sbin/ldconfig' % self.conf.treedir)
|
||||
os.chdir(cwd)
|
||||
|
||||
if self.conf.buildarch not in ('s390', 's390x'):
|
||||
# XXX this is not in usr
|
||||
rm(os.path.join(self.conf.treedir, 'usr', 'sbin', 'ldconfig'))
|
||||
|
||||
# XXX why are we removing this?
|
||||
#rm(os.path.join(self.conf.treedir, 'etc', 'ld.so.conf'))
|
||||
os.system('umount %s' % procdir)
|
||||
|
||||
# make bash link
|
||||
# XXX already exists
|
||||
#if os.path.isfile(os.path.join(self.conf.treedir, 'bin', 'bash')):
|
||||
# rm(os.path.join(self.conf.treedir, 'bin', 'ash'))
|
||||
# os.symlink('bash', os.path.join(self.conf.treedir, 'bin', 'sh'))
|
||||
|
||||
# make awk link
|
||||
# XXX already exists
|
||||
#if os.path.isfile(os.path.join(self.conf.treedir, 'bin', 'gawk')):
|
||||
# os.symlink('awk', os.path.join(self.conf.treedir, 'bin', 'gawk'))
|
||||
|
||||
# move bin to usr/bin
|
||||
cp(src_root=self.conf.treedir,
|
||||
src_path=os.path.join('bin', '*'),
|
@ -754,16 +754,3 @@ class EFI(object):
|
||||
# copy the efi image to the output directory
|
||||
dst = os.path.join(self.conf.imagesdir, "efiboot.img")
|
||||
shutil.copy2(efiimage, dst)
|
||||
|
||||
|
||||
class Install(object):
|
||||
|
||||
def __init__(self, config):
|
||||
self.conf = config
|
||||
|
||||
def scrub(self):
|
||||
# XXX all the install tree modification stuff goes here
|
||||
pass
|
||||
|
||||
def run(self):
|
||||
self.scrub()
|
||||
|
@ -22,8 +22,10 @@
|
||||
|
||||
import os
|
||||
import glob
|
||||
import fnmatch
|
||||
import shutil
|
||||
|
||||
from utils.fileutils import copy
|
||||
from utils.fileutils import copy, move, remove, replace, touch
|
||||
|
||||
|
||||
class InstallTree(object):
|
||||
@ -147,3 +149,343 @@ class InstallTree(object):
|
||||
self.remove_modules_broken_links()
|
||||
|
||||
return self.get_kernelfiles()
|
||||
|
||||
|
||||
####################
|
||||
### tree scrubs
|
||||
|
||||
def copy_stubs(self):
|
||||
for file in ("raidstart", "raidstop", "losetup", "list-harddrives",
|
||||
"loadkeys", "mknod", "syslogd"):
|
||||
|
||||
src = os.path.join(self.conf.treedir, "usr", "lib", "anaconda",
|
||||
"%s-stub" % (file,))
|
||||
dst = os.path.join(self.conf.treedir, "usr", "bin", file)
|
||||
|
||||
shutil.copy2(src, dst)
|
||||
|
||||
def create_dogtail_conf(self):
|
||||
dogtailconf = os.path.join(self.conf.datadir, "dogtail", "%gconf.xml")
|
||||
|
||||
if os.path.isfile(dogtailconf):
|
||||
dst = os.path.join(self.conf.treedir, ".gconf", "desktop", "gnome",
|
||||
"interface")
|
||||
|
||||
os.makedirs(dst)
|
||||
shutil.copy2(dogtailconf, dst)
|
||||
|
||||
touch(os.path.join(self.conf.treedir, ".gconf", "desktop",
|
||||
"%gconf.xml"))
|
||||
touch(os.path.join(self.conf.treedir, ".gconf", "desktop", "gnome",
|
||||
"%gconf.xml"))
|
||||
|
||||
def create_libuser_conf(self):
|
||||
src = os.path.join(self.conf.datadir, "libuser", "libuser.conf")
|
||||
dst = os.path.join(self.conf.treedir, "etc", "libuser.conf")
|
||||
shutil.copy2(src, dst)
|
||||
|
||||
def create_selinux_conf(self):
|
||||
if os.path.exists(os.path.join(self.conf.treedir, "etc", "selinux",
|
||||
"targeted")):
|
||||
|
||||
src = os.path.join(self.conf.datadir, "selinux", "config")
|
||||
dst = os.path.join(self.conf.treedir, "etc", "selinux", "config")
|
||||
shutil.copy2(src, dst)
|
||||
|
||||
def configure_fedorakmod(self):
|
||||
fedorakmodconf = os.path.join(self.conf.treedir, "etc", "yum",
|
||||
"pluginconf.d", "fedorakmod.conf")
|
||||
|
||||
replace(fedorakmodconf, r"\(installforallkernels\) = 0", r"\1 = 1")
|
||||
|
||||
def copy_bootloaders(self):
|
||||
bootpath = os.path.join(self.conf.treedir, "usr", "lib",
|
||||
"anaconda-runtime", "boot")
|
||||
|
||||
if not os.path.isdir(bootpath):
|
||||
os.makedirs(bootpath)
|
||||
|
||||
if self.conf.buildarch in ("i386", "i586", "x86_64"):
|
||||
for file in os.listdir(os.path.join(self.conf.treedir, "boot")):
|
||||
if file.startswith("memtest"):
|
||||
src = os.path.join(self.conf.treedir, "boot", file)
|
||||
dst = os.path.join(bootpath, file)
|
||||
shutil.copy2(src, dst)
|
||||
elif self.conf.buildarch == "sparc":
|
||||
for file in os.listdir(os.path.join(self.conf.treedir, "boot")):
|
||||
if file.endswith(".b"):
|
||||
src = os.path.join(self.conf.treedir, "boot", file)
|
||||
dst = os.path.join(bootpath, file)
|
||||
shutil.copy2(src, dst)
|
||||
elif self.conf.buildarch in ("ppc", "ppc64"):
|
||||
src = os.path.join(self.conf.treedir, "boot", "efika.forth")
|
||||
shutil.copy2(src, bootpath)
|
||||
elif self.conf.buildarch == "alpha":
|
||||
src = os.path.join(self.conf.treedir, "boot", "bootlx")
|
||||
shutil.copy2(src, bootpath)
|
||||
elif self.conf.buildarch == "ia64":
|
||||
srcdir = os.path.join(self.conf.treedir, "boot", "efi", "EFI", "redhat")
|
||||
copy(src_root=srcdir, src_path="*",
|
||||
dst_root=bootpath, dst_dir="")
|
||||
|
||||
def move_repos(self):
|
||||
src = os.path.join(self.conf.treedir, "etc", "yum.repos.d")
|
||||
dst = os.path.join(self.conf.treedir, "etc", "anaconda.repos.d")
|
||||
shutil.move(src, dst)
|
||||
|
||||
def move_anaconda_files(self):
|
||||
# move anaconda executable
|
||||
src = os.path.join(self.conf.treedir, "usr", "sbin", "anaconda")
|
||||
dst = os.path.join(self.conf.treedir, "usr", "bin", "anaconda")
|
||||
shutil.move(src, dst)
|
||||
|
||||
# move anaconda libraries
|
||||
srcdir = os.path.join(self.conf.treedir, "usr", "lib", "anaconda-runtime")
|
||||
dst = os.path.join(self.conf.treedir, "usr", self.conf.libdir)
|
||||
move(src_root=srcdir, src_path="lib*",
|
||||
dst_root=dst, dst_path="")
|
||||
|
||||
def create_debug_directories(self):
|
||||
os.makedirs(os.path.join(self.conf.treedir, "usr", "lib", "debug"))
|
||||
os.makedirs(os.path.join(self.conf.treedir, "usr", "src", "debug"))
|
||||
|
||||
def create_modules_symlinks(self):
|
||||
os.makedirs(os.path.join(self.conf.treedir, "modules"))
|
||||
os.makedirs(os.path.join(self.conf.treedir, "firmware"))
|
||||
|
||||
# XXX are we sure we want to do this?
|
||||
remove(os.path.join(self.conf.treedir, "lib", "modules"))
|
||||
remove(os.path.join(self.conf.treedir, "lib", "firmware"))
|
||||
os.symlink("/modules", os.path.join(self.conf.treedir, "lib", "modules"))
|
||||
os.symlink("/firmware", os.path.join(self.conf.treedir, "lib", "firmware"))
|
||||
|
||||
def fix_joe_links(self):
|
||||
joedir = os.path.join(self.conf.treedir, "etc", "joe")
|
||||
|
||||
if os.path.isdir(joedir):
|
||||
os.symlink("jpicorc", os.path.join(joedir, "picorc"))
|
||||
os.symlink("jpicorc", os.path.join(joedir, "jnanorc"))
|
||||
os.symlink("jpicorc", os.path.join(joedir, "nanorc"))
|
||||
os.symlink("jmacsrc", os.path.join(joedir, "emacsrc"))
|
||||
os.symlink("jmacs", os.path.join(self.conf.treedir, "usr", "bin",
|
||||
"emacs"))
|
||||
os.symlink("jpico", os.path.join(self.conf.treedir, "usr", "bin",
|
||||
"pico"))
|
||||
os.symlink("jpico", os.path.join(self.conf.treedir, "usr", "bin",
|
||||
"nano"))
|
||||
|
||||
def fix_man_pages(self):
|
||||
# fix up some links for man page related stuff
|
||||
for file in ["nroff", "groff", "iconv", "geqn", "gtbl", "gpic", "grefer"]:
|
||||
src = os.path.join("mnt", "sysimage", "usr", "bin", file)
|
||||
dst = os.path.join(self.conf.treedir, "usr", "bin", file)
|
||||
if not os.path.isfile(dst):
|
||||
os.symlink(src, dst)
|
||||
|
||||
# fix /etc/man.config to point into /mnt/sysimage
|
||||
manconfig = os.path.join(self.conf.treedir, "etc", "man.config")
|
||||
|
||||
# don't change MANPATH_MAP lines now
|
||||
replace(manconfig, r"^MANPATH[^_MAP][ \t]*", r"&/mnt/sysimage")
|
||||
# change MANPATH_MAP lines now
|
||||
replace(manconfig, r"^MANPATH_MAP[ \t]*[a-zA-Z0-9/]*[ \t]*",
|
||||
r"&/mnt/sysimage")
|
||||
|
||||
def remove_gtk_stuff(self):
|
||||
# figure out the gtk+ theme to keep
|
||||
gtkrc = os.path.join(self.conf.treedir, "etc", "gtk-2.0", "gtkrc")
|
||||
|
||||
gtk_theme_name = None
|
||||
gtk_engine = None
|
||||
gtk_icon_themes = []
|
||||
|
||||
if os.path.isfile(gtkrc):
|
||||
f = open(gtkrc, "r")
|
||||
lines = f.readlines()
|
||||
f.close()
|
||||
|
||||
for line in lines:
|
||||
line = line.strip()
|
||||
if line.startswith("gtk-theme-name"):
|
||||
gtk_theme_name = line[line.find("=") + 1:]
|
||||
gtk_theme_name = gtk_theme_name.replace('"', "").strip()
|
||||
|
||||
# find the engine for this theme
|
||||
gtkrc = os.path.join(self.conf.treedir, "usr", "share",
|
||||
"themes", gtk_theme_name, "gtk-2.0", "gtkrc")
|
||||
if os.path.isfile(gtkrc):
|
||||
f = open(gtkrc, "r")
|
||||
engine_lines = f.readlines()
|
||||
f.close()
|
||||
|
||||
for engine_line in engine_lines:
|
||||
engine_line = engine_line.strip()
|
||||
if engine_line.find("engine") != -1:
|
||||
gtk_engine = engine_line[engine_line.find('"') + 1:]
|
||||
gtk_engine = gtk_engine.replace('"', "").strip()
|
||||
break
|
||||
|
||||
elif line.startswith("gtk-icon-theme-name"):
|
||||
icon_theme = line[line.find("=") + 1:]
|
||||
icon_theme = icon_theme.replace('"', "").strip()
|
||||
gtk_icon_themes.append(icon_theme)
|
||||
|
||||
# bring in all inherited themes
|
||||
while True:
|
||||
icon_theme_index = os.path.join(self.conf.treedir, "usr",
|
||||
"share", "icons", icon_theme, "index.theme")
|
||||
if os.path.isfile(icon_theme_index):
|
||||
inherits = False
|
||||
f = open(icon_theme_index, "r")
|
||||
icon_lines = f.readlines()
|
||||
f.close()
|
||||
|
||||
for icon_line in icon_lines:
|
||||
icon_line = icon_line.strip()
|
||||
if icon_line.startswith("Inherits="):
|
||||
inherits = True
|
||||
icon_theme = icon_line[icon_line.find("=") + 1:]
|
||||
icon_theme = icon_theme.replace('"', "").strip()
|
||||
gtk_icon_themes.append(icon_theme)
|
||||
break
|
||||
|
||||
if not inherits:
|
||||
break
|
||||
else:
|
||||
break
|
||||
|
||||
# remove themes we don't need
|
||||
theme_path = os.path.join(self.conf.treedir, "usr", "share", "themes")
|
||||
if os.path.isdir(theme_path):
|
||||
for theme in filter(lambda theme: theme != gtk_theme_name,
|
||||
os.listdir(theme_path)):
|
||||
|
||||
theme = os.path.join(theme_path, theme)
|
||||
shutil.rmtree(theme, ignore_errors=True)
|
||||
|
||||
# remove icons we don't need
|
||||
icon_path = os.path.join(self.conf.treedir, "usr", "share", "icons")
|
||||
if os.path.isdir(icon_path):
|
||||
for icon in filter(lambda icon: icon not in gtk_icon_themes,
|
||||
os.listdir(icon_path)):
|
||||
|
||||
icon = os.path.join(icon_path, icon)
|
||||
shutil.rmtree(icon, ignore_errors=True)
|
||||
|
||||
# remove engines we don't need
|
||||
tmp_path = os.path.join(self.conf.treedir, "usr", self.conf.libdir,
|
||||
"gtk-2.0")
|
||||
if os.path.isdir(tmp_path):
|
||||
fnames = map(lambda fname: os.path.join(tmp_path, fname, "engines"),
|
||||
os.listdir(tmp_path))
|
||||
dnames = filter(lambda fname: os.path.isdir(fname), fnames)
|
||||
for dir in dnames:
|
||||
engines = filter(lambda engine: engine.find(gtk_engine) == -1,
|
||||
os.listdir(dir))
|
||||
for engine in engines:
|
||||
engine = os.path.join(dir, engine)
|
||||
os.unlink(engine)
|
||||
|
||||
def remove_locales(self):
|
||||
langtable = os.path.join(self.conf.treedir, "usr", "lib", "anaconda",
|
||||
"lang-table")
|
||||
localepath = os.path.join(self.conf.treedir, "usr", "share", "locale")
|
||||
|
||||
if os.path.isfile(langtable):
|
||||
locales = set()
|
||||
all_locales = set()
|
||||
|
||||
f = open(langtable, "r")
|
||||
lines = f.readlines()
|
||||
f.close()
|
||||
|
||||
for line in lines:
|
||||
line = line.strip()
|
||||
if not line or line.startswith("#"):
|
||||
continue
|
||||
|
||||
fields = line.split("\t")
|
||||
|
||||
if os.path.isdir(os.path.join(localepath, fields[1])):
|
||||
locales.add(fields[1])
|
||||
|
||||
locale = fields[3].split(".")[0]
|
||||
if os.path.isdir(os.path.join(localepath, locale)):
|
||||
locales.add(locale)
|
||||
|
||||
for locale in os.listdir(localepath):
|
||||
all_locales.add(locale)
|
||||
|
||||
locales_to_remove = list(all_locales.difference(locales))
|
||||
for locale in locales_to_remove:
|
||||
rmpath = os.path.join(localepath, locale)
|
||||
shutil.rmtree(rmpath, ignore_errors=True)
|
||||
|
||||
def remove_unnecessary_files(self):
|
||||
to_remove = set()
|
||||
|
||||
for root, dirs, files in os.walk(self.conf.treedir):
|
||||
for file in files:
|
||||
path = os.path.join(root, file)
|
||||
|
||||
if fnmatch.fnmatch(path, "*.a"):
|
||||
if path.find("kernel-wrapper/wrapper.a") == -1:
|
||||
to_remove.add(path)
|
||||
elif fnmatch.fnmatch(path, "lib*.la"):
|
||||
if path.find("usr/" + self.conf.libdir + "/gtk-2.0") == -1:
|
||||
to_remove.add(path)
|
||||
elif fnmatch.fnmatch(path, "*.py"):
|
||||
to_remove.add(path + "o")
|
||||
|
||||
try:
|
||||
os.unlink(path + "c")
|
||||
except OSError:
|
||||
pass
|
||||
|
||||
os.symlink("/dev/null", path + "c")
|
||||
|
||||
for file in to_remove:
|
||||
try:
|
||||
os.unlink(file)
|
||||
except OSError:
|
||||
pass
|
||||
|
||||
# remove libunicode-lite
|
||||
remove(os.path.join(self.conf.treedir, "usr", self.conf.libdir,
|
||||
"libunicode-lite*"))
|
||||
|
||||
def remove_python_stuff(self):
|
||||
for fname in ["bsddb", "compiler", "curses", "distutils", "email",
|
||||
"encodings", "hotshot", "idlelib", "test",
|
||||
"doctest.py", "pydoc.py"]:
|
||||
|
||||
remove(os.path.join(self.conf.treedir, "usr", self.conf.libdir,
|
||||
"python?.?", fname))
|
||||
|
||||
def remove_unnecessary_directories(self):
|
||||
for dir in ["boot", "home", "root", "tmp"]:
|
||||
remove(os.path.join(self.conf.treedir, dir))
|
||||
|
||||
def scrub(self):
|
||||
self.copy_stubs()
|
||||
self.create_dogtail_conf()
|
||||
self.create_libuser_conf()
|
||||
self.create_selinux_conf()
|
||||
self.configure_fedorakmod()
|
||||
|
||||
self.copy_bootloaders()
|
||||
self.move_repos()
|
||||
self.move_anaconda_files()
|
||||
|
||||
self.create_debug_directories()
|
||||
self.create_modules_symlinks()
|
||||
|
||||
self.fix_joe_links()
|
||||
self.fix_man_pages()
|
||||
|
||||
self.remove_gtk_stuff()
|
||||
self.remove_locales()
|
||||
self.remove_unnecessary_files()
|
||||
self.remove_python_stuff()
|
||||
|
||||
self.remove_unnecessary_directories()
|
||||
|
@ -97,22 +97,22 @@ class Output(object):
|
||||
def newline(self):
|
||||
self.output.write("\n")
|
||||
|
||||
def banner(self, s, indent_level=0):
|
||||
def banner(self, s):
|
||||
self.writeline(s, color=C_GREEN, type=BOLD)
|
||||
|
||||
def header(self, s, indent_level=0):
|
||||
def header(self, s):
|
||||
self.writeline(s, type=BOLD)
|
||||
|
||||
def info(self, s, indent_level=0):
|
||||
def info(self, s):
|
||||
self.writeline(s)
|
||||
|
||||
def error(self, s, indent_level=0):
|
||||
def error(self, s):
|
||||
self.writeline(s, color=C_RED, type=BOLD)
|
||||
|
||||
def warning(self, s, indent_level=0):
|
||||
def warning(self, s):
|
||||
self.writeline(s, color=C_RED)
|
||||
|
||||
def debug(self, s, indent_level=0):
|
||||
def debug(self, s):
|
||||
if self.verbose:
|
||||
self.writeline(s)
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user