Added some tree scrubs to the code;

This commit is contained in:
Martin Gracik 2009-09-29 14:41:39 +02:00
parent 272ec190c7
commit d58f206122
6 changed files with 424 additions and 394 deletions

View File

@ -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")

View File

@ -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))

View File

@ -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', '*'),

View File

@ -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()

View File

@ -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()

View File

@ -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)